blob: e1458332284feaa766b05833fdeb6e106e9ec060 [file] [log] [blame]
/**
* linux/arch/arm/mach-parrot7/uart.c - Parrot7 serial port platform
* implementation
*
* Copyright (C) 2012 Parrot S.A.
*
* author: Gregor Boirie <gregor.boirie@parrot.com>
* date: 13-Jun-2012
*
* This file is released under the GPL
*/
#include <linux/platform_device.h>
#include <linux/clkdev.h>
#include <serial/px-uart.h>
#include <mach/irqs.h>
#include <mach/p7.h>
#include "common.h"
#include "clock.h"
static struct resource p7_uart0_res[] = {
[0] = {
.start = P7_UART0,
.end = P7_UART0 + SZ_4K - 1,
.flags = IORESOURCE_MEM
},
[1] = {
.start = P7_UART0_IRQ,
.end = P7_UART0_IRQ,
.flags = IORESOURCE_IRQ
}
};
static struct resource p7_uart1_res[] = {
[0] = {
.start = P7_UART1,
.end = P7_UART1 + SZ_4K - 1,
.flags = IORESOURCE_MEM
},
[1] = {
.start = P7_UART1_IRQ,
.end = P7_UART1_IRQ,
.flags = IORESOURCE_IRQ
}
};
static struct resource p7_uart2_res[] = {
[0] = {
.start = P7_UART2,
.end = P7_UART2 + SZ_4K - 1,
.flags = IORESOURCE_MEM
},
[1] = {
.start = P7_UART2_IRQ,
.end = P7_UART2_IRQ,
.flags = IORESOURCE_IRQ
}
};
static struct resource p7_uart3_res[] = {
[0] = {
.start = P7_UART3,
.end = P7_UART3 + SZ_4K - 1,
.flags = IORESOURCE_MEM
},
[1] = {
.start = P7_UART3_IRQ,
.end = P7_UART3_IRQ,
.flags = IORESOURCE_IRQ
}
};
static struct resource p7_uart4_res[] = {
[0] = {
.start = P7_UART4,
.end = P7_UART4 + SZ_4K - 1,
.flags = IORESOURCE_MEM
},
[1] = {
.start = P7_UART4_IRQ,
.end = P7_UART4_IRQ,
.flags = IORESOURCE_IRQ
}
};
static struct resource p7_uart5_res[] = {
[0] = {
.start = P7_UART5,
.end = P7_UART5 + SZ_4K - 1,
.flags = IORESOURCE_MEM
},
[1] = {
.start = P7_UART5_IRQ,
.end = P7_UART5_IRQ,
.flags = IORESOURCE_IRQ
}
};
static struct resource p7_uart6_res[] = {
[0] = {
.start = P7_UART6,
.end = P7_UART6 + SZ_4K - 1,
.flags = IORESOURCE_MEM
},
[1] = {
.start = P7_UART6_IRQ,
.end = P7_UART6_IRQ,
.flags = IORESOURCE_IRQ
}
};
static struct resource p7_uart7_res[] = {
[0] = {
.start = P7_UART7,
.end = P7_UART7 + SZ_4K - 1,
.flags = IORESOURCE_MEM
},
[1] = {
.start = P7_UART7_IRQ,
.end = P7_UART7_IRQ,
.flags = IORESOURCE_IRQ
}
};
static struct platform_device p7_uart_devs[] = {
{
.name = PXUART_DRV_NAME,
.id = 0,
.resource = p7_uart0_res,
.num_resources = ARRAY_SIZE(p7_uart0_res)
},
{
.name = PXUART_DRV_NAME,
.id = 1,
.resource = p7_uart1_res,
.num_resources = ARRAY_SIZE(p7_uart1_res)
},
{
.name = PXUART_DRV_NAME,
.id = 2,
.resource = p7_uart2_res,
.num_resources = ARRAY_SIZE(p7_uart2_res)
},
{
.name = PXUART_DRV_NAME,
.id = 3,
.resource = p7_uart3_res,
.num_resources = ARRAY_SIZE(p7_uart3_res)
},
{
.name = PXUART_DRV_NAME,
.id = 4,
.resource = p7_uart4_res,
.num_resources = ARRAY_SIZE(p7_uart4_res)
},
{
.name = PXUART_DRV_NAME,
.id = 5,
.resource = p7_uart5_res,
.num_resources = ARRAY_SIZE(p7_uart5_res)
},
{
.name = PXUART_DRV_NAME,
.id = 6,
.resource = p7_uart6_res,
.num_resources = ARRAY_SIZE(p7_uart6_res)
},
{
.name = PXUART_DRV_NAME,
.id = 7,
.resource = p7_uart7_res,
.num_resources = ARRAY_SIZE(p7_uart7_res)
},
};
/**
* p7_init_uart() - Instantiate I2C master controller identified by @bus
* for further driver usage.
*
* @port: UART port identifier
* @pins: array of pin functions and settings
* @pin_cnt: number of element of @pins array
*/
void __init p7_init_uart(int port,
struct pinctrl_map* pins,
size_t pin_cnt)
{
int err;
#ifdef DEBUG
BUG_ON(port >= ARRAY_SIZE(p7_uart_devs));
BUG_ON(! pins);
BUG_ON(! pin_cnt);
#endif
if (port >= ARRAY_SIZE(p7_uart_devs)) {
printk(KERN_ERR "p7 Uart%d do not exist\n", port);
return;
}
err = p7_init_dev(&p7_uart_devs[port], NULL, pins, pin_cnt);
if (err)
panic("p7: failed to init UART %d (%d)\n", port, err);
}