davinci: Move serial platform_device into SoC-specific files
Currently, there is one set of platform_device and platform_data structures for all DaVinci SoCs. The differences in the data between the various SoCs is handled by davinci_serial_init() by checking the SoC type. However, as new SoCs appear, this routine will become more & more cluttered. To clean up the routine and make it easier to add support for new SoCs, move the platform_device and platform_data structures into the SoC-specific code and use the SoC infrastructure to provide access to the data. In the process, fix a bug where the wrong irq is used for uart2 of the dm646x. Signed-off-by: Mark A. Greer <mgreer@mvista.com> Signed-off-by: Kevin Hilman <khilman@deeprootsystems.com>
This commit is contained in:
committed by
Kevin Hilman
parent
a994955cc0
commit
65e866a974
@@ -11,6 +11,7 @@
|
|||||||
#include <linux/kernel.h>
|
#include <linux/kernel.h>
|
||||||
#include <linux/init.h>
|
#include <linux/init.h>
|
||||||
#include <linux/clk.h>
|
#include <linux/clk.h>
|
||||||
|
#include <linux/serial_8250.h>
|
||||||
#include <linux/platform_device.h>
|
#include <linux/platform_device.h>
|
||||||
#include <linux/dma-mapping.h>
|
#include <linux/dma-mapping.h>
|
||||||
#include <linux/gpio.h>
|
#include <linux/gpio.h>
|
||||||
@@ -27,6 +28,7 @@
|
|||||||
#include <mach/mux.h>
|
#include <mach/mux.h>
|
||||||
#include <mach/irqs.h>
|
#include <mach/irqs.h>
|
||||||
#include <mach/time.h>
|
#include <mach/time.h>
|
||||||
|
#include <mach/serial.h>
|
||||||
#include <mach/common.h>
|
#include <mach/common.h>
|
||||||
|
|
||||||
#include "clock.h"
|
#include "clock.h"
|
||||||
@@ -630,6 +632,44 @@ struct davinci_timer_info dm355_timer_info = {
|
|||||||
.clocksource_id = T0_TOP,
|
.clocksource_id = T0_TOP,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
static struct plat_serial8250_port dm355_serial_platform_data[] = {
|
||||||
|
{
|
||||||
|
.mapbase = DAVINCI_UART0_BASE,
|
||||||
|
.irq = IRQ_UARTINT0,
|
||||||
|
.flags = UPF_BOOT_AUTOCONF | UPF_SKIP_TEST |
|
||||||
|
UPF_IOREMAP,
|
||||||
|
.iotype = UPIO_MEM,
|
||||||
|
.regshift = 2,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
.mapbase = DAVINCI_UART1_BASE,
|
||||||
|
.irq = IRQ_UARTINT1,
|
||||||
|
.flags = UPF_BOOT_AUTOCONF | UPF_SKIP_TEST |
|
||||||
|
UPF_IOREMAP,
|
||||||
|
.iotype = UPIO_MEM,
|
||||||
|
.regshift = 2,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
.mapbase = DM355_UART2_BASE,
|
||||||
|
.irq = IRQ_DM355_UARTINT2,
|
||||||
|
.flags = UPF_BOOT_AUTOCONF | UPF_SKIP_TEST |
|
||||||
|
UPF_IOREMAP,
|
||||||
|
.iotype = UPIO_MEM,
|
||||||
|
.regshift = 2,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
.flags = 0
|
||||||
|
},
|
||||||
|
};
|
||||||
|
|
||||||
|
static struct platform_device dm355_serial_device = {
|
||||||
|
.name = "serial8250",
|
||||||
|
.id = PLAT8250_DEV_PLATFORM,
|
||||||
|
.dev = {
|
||||||
|
.platform_data = dm355_serial_platform_data,
|
||||||
|
},
|
||||||
|
};
|
||||||
|
|
||||||
static struct davinci_soc_info davinci_soc_info_dm355 = {
|
static struct davinci_soc_info davinci_soc_info_dm355 = {
|
||||||
.io_desc = dm355_io_desc,
|
.io_desc = dm355_io_desc,
|
||||||
.io_desc_num = ARRAY_SIZE(dm355_io_desc),
|
.io_desc_num = ARRAY_SIZE(dm355_io_desc),
|
||||||
@@ -651,6 +691,7 @@ static struct davinci_soc_info davinci_soc_info_dm355 = {
|
|||||||
.gpio_base = IO_ADDRESS(DAVINCI_GPIO_BASE),
|
.gpio_base = IO_ADDRESS(DAVINCI_GPIO_BASE),
|
||||||
.gpio_num = 104,
|
.gpio_num = 104,
|
||||||
.gpio_irq = IRQ_DM355_GPIOBNK0,
|
.gpio_irq = IRQ_DM355_GPIOBNK0,
|
||||||
|
.serial_dev = &dm355_serial_device,
|
||||||
};
|
};
|
||||||
|
|
||||||
void __init dm355_init(void)
|
void __init dm355_init(void)
|
||||||
|
@@ -11,6 +11,7 @@
|
|||||||
#include <linux/kernel.h>
|
#include <linux/kernel.h>
|
||||||
#include <linux/init.h>
|
#include <linux/init.h>
|
||||||
#include <linux/clk.h>
|
#include <linux/clk.h>
|
||||||
|
#include <linux/serial_8250.h>
|
||||||
#include <linux/platform_device.h>
|
#include <linux/platform_device.h>
|
||||||
#include <linux/gpio.h>
|
#include <linux/gpio.h>
|
||||||
|
|
||||||
@@ -24,6 +25,7 @@
|
|||||||
#include <mach/psc.h>
|
#include <mach/psc.h>
|
||||||
#include <mach/mux.h>
|
#include <mach/mux.h>
|
||||||
#include <mach/time.h>
|
#include <mach/time.h>
|
||||||
|
#include <mach/serial.h>
|
||||||
#include <mach/common.h>
|
#include <mach/common.h>
|
||||||
|
|
||||||
#include "clock.h"
|
#include "clock.h"
|
||||||
@@ -573,6 +575,44 @@ struct davinci_timer_info dm644x_timer_info = {
|
|||||||
.clocksource_id = T0_TOP,
|
.clocksource_id = T0_TOP,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
static struct plat_serial8250_port dm644x_serial_platform_data[] = {
|
||||||
|
{
|
||||||
|
.mapbase = DAVINCI_UART0_BASE,
|
||||||
|
.irq = IRQ_UARTINT0,
|
||||||
|
.flags = UPF_BOOT_AUTOCONF | UPF_SKIP_TEST |
|
||||||
|
UPF_IOREMAP,
|
||||||
|
.iotype = UPIO_MEM,
|
||||||
|
.regshift = 2,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
.mapbase = DAVINCI_UART1_BASE,
|
||||||
|
.irq = IRQ_UARTINT1,
|
||||||
|
.flags = UPF_BOOT_AUTOCONF | UPF_SKIP_TEST |
|
||||||
|
UPF_IOREMAP,
|
||||||
|
.iotype = UPIO_MEM,
|
||||||
|
.regshift = 2,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
.mapbase = DAVINCI_UART2_BASE,
|
||||||
|
.irq = IRQ_UARTINT2,
|
||||||
|
.flags = UPF_BOOT_AUTOCONF | UPF_SKIP_TEST |
|
||||||
|
UPF_IOREMAP,
|
||||||
|
.iotype = UPIO_MEM,
|
||||||
|
.regshift = 2,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
.flags = 0
|
||||||
|
},
|
||||||
|
};
|
||||||
|
|
||||||
|
static struct platform_device dm644x_serial_device = {
|
||||||
|
.name = "serial8250",
|
||||||
|
.id = PLAT8250_DEV_PLATFORM,
|
||||||
|
.dev = {
|
||||||
|
.platform_data = dm644x_serial_platform_data,
|
||||||
|
},
|
||||||
|
};
|
||||||
|
|
||||||
static struct davinci_soc_info davinci_soc_info_dm644x = {
|
static struct davinci_soc_info davinci_soc_info_dm644x = {
|
||||||
.io_desc = dm644x_io_desc,
|
.io_desc = dm644x_io_desc,
|
||||||
.io_desc_num = ARRAY_SIZE(dm644x_io_desc),
|
.io_desc_num = ARRAY_SIZE(dm644x_io_desc),
|
||||||
@@ -594,6 +634,7 @@ static struct davinci_soc_info davinci_soc_info_dm644x = {
|
|||||||
.gpio_base = IO_ADDRESS(DAVINCI_GPIO_BASE),
|
.gpio_base = IO_ADDRESS(DAVINCI_GPIO_BASE),
|
||||||
.gpio_num = 71,
|
.gpio_num = 71,
|
||||||
.gpio_irq = IRQ_GPIOBNK0,
|
.gpio_irq = IRQ_GPIOBNK0,
|
||||||
|
.serial_dev = &dm644x_serial_device,
|
||||||
};
|
};
|
||||||
|
|
||||||
void __init dm644x_init(void)
|
void __init dm644x_init(void)
|
||||||
|
@@ -11,6 +11,7 @@
|
|||||||
#include <linux/kernel.h>
|
#include <linux/kernel.h>
|
||||||
#include <linux/init.h>
|
#include <linux/init.h>
|
||||||
#include <linux/clk.h>
|
#include <linux/clk.h>
|
||||||
|
#include <linux/serial_8250.h>
|
||||||
#include <linux/platform_device.h>
|
#include <linux/platform_device.h>
|
||||||
#include <linux/gpio.h>
|
#include <linux/gpio.h>
|
||||||
|
|
||||||
@@ -24,6 +25,7 @@
|
|||||||
#include <mach/psc.h>
|
#include <mach/psc.h>
|
||||||
#include <mach/mux.h>
|
#include <mach/mux.h>
|
||||||
#include <mach/time.h>
|
#include <mach/time.h>
|
||||||
|
#include <mach/serial.h>
|
||||||
#include <mach/common.h>
|
#include <mach/common.h>
|
||||||
|
|
||||||
#include "clock.h"
|
#include "clock.h"
|
||||||
@@ -552,6 +554,44 @@ struct davinci_timer_info dm646x_timer_info = {
|
|||||||
.clocksource_id = T0_TOP,
|
.clocksource_id = T0_TOP,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
static struct plat_serial8250_port dm646x_serial_platform_data[] = {
|
||||||
|
{
|
||||||
|
.mapbase = DAVINCI_UART0_BASE,
|
||||||
|
.irq = IRQ_UARTINT0,
|
||||||
|
.flags = UPF_BOOT_AUTOCONF | UPF_SKIP_TEST |
|
||||||
|
UPF_IOREMAP,
|
||||||
|
.iotype = UPIO_MEM32,
|
||||||
|
.regshift = 2,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
.mapbase = DAVINCI_UART1_BASE,
|
||||||
|
.irq = IRQ_UARTINT1,
|
||||||
|
.flags = UPF_BOOT_AUTOCONF | UPF_SKIP_TEST |
|
||||||
|
UPF_IOREMAP,
|
||||||
|
.iotype = UPIO_MEM32,
|
||||||
|
.regshift = 2,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
.mapbase = DAVINCI_UART2_BASE,
|
||||||
|
.irq = IRQ_DM646X_UARTINT2,
|
||||||
|
.flags = UPF_BOOT_AUTOCONF | UPF_SKIP_TEST |
|
||||||
|
UPF_IOREMAP,
|
||||||
|
.iotype = UPIO_MEM32,
|
||||||
|
.regshift = 2,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
.flags = 0
|
||||||
|
},
|
||||||
|
};
|
||||||
|
|
||||||
|
static struct platform_device dm646x_serial_device = {
|
||||||
|
.name = "serial8250",
|
||||||
|
.id = PLAT8250_DEV_PLATFORM,
|
||||||
|
.dev = {
|
||||||
|
.platform_data = dm646x_serial_platform_data,
|
||||||
|
},
|
||||||
|
};
|
||||||
|
|
||||||
static struct davinci_soc_info davinci_soc_info_dm646x = {
|
static struct davinci_soc_info davinci_soc_info_dm646x = {
|
||||||
.io_desc = dm646x_io_desc,
|
.io_desc = dm646x_io_desc,
|
||||||
.io_desc_num = ARRAY_SIZE(dm646x_io_desc),
|
.io_desc_num = ARRAY_SIZE(dm646x_io_desc),
|
||||||
@@ -573,6 +613,7 @@ static struct davinci_soc_info davinci_soc_info_dm646x = {
|
|||||||
.gpio_base = IO_ADDRESS(DAVINCI_GPIO_BASE),
|
.gpio_base = IO_ADDRESS(DAVINCI_GPIO_BASE),
|
||||||
.gpio_num = 43, /* Only 33 usable */
|
.gpio_num = 43, /* Only 33 usable */
|
||||||
.gpio_irq = IRQ_DM646X_GPIOBNK0,
|
.gpio_irq = IRQ_DM646X_GPIOBNK0,
|
||||||
|
.serial_dev = &dm646x_serial_device,
|
||||||
};
|
};
|
||||||
|
|
||||||
void __init dm646x_init(void)
|
void __init dm646x_init(void)
|
||||||
|
@@ -61,6 +61,7 @@ struct davinci_soc_info {
|
|||||||
void __iomem *gpio_base;
|
void __iomem *gpio_base;
|
||||||
unsigned gpio_num;
|
unsigned gpio_num;
|
||||||
unsigned gpio_irq;
|
unsigned gpio_irq;
|
||||||
|
struct platform_device *serial_dev;
|
||||||
};
|
};
|
||||||
|
|
||||||
extern struct davinci_soc_info davinci_soc_info;
|
extern struct davinci_soc_info davinci_soc_info;
|
||||||
|
@@ -30,6 +30,6 @@ struct davinci_uart_config {
|
|||||||
unsigned int enabled_uarts;
|
unsigned int enabled_uarts;
|
||||||
};
|
};
|
||||||
|
|
||||||
extern void davinci_serial_init(struct davinci_uart_config *);
|
extern int davinci_serial_init(struct davinci_uart_config *);
|
||||||
|
|
||||||
#endif /* __ASM_ARCH_SERIAL_H */
|
#endif /* __ASM_ARCH_SERIAL_H */
|
||||||
|
@@ -33,6 +33,8 @@
|
|||||||
#include <mach/serial.h>
|
#include <mach/serial.h>
|
||||||
#include <mach/irqs.h>
|
#include <mach/irqs.h>
|
||||||
#include <mach/cputype.h>
|
#include <mach/cputype.h>
|
||||||
|
#include <mach/common.h>
|
||||||
|
|
||||||
#include "clock.h"
|
#include "clock.h"
|
||||||
|
|
||||||
static inline unsigned int serial_read_reg(struct plat_serial8250_port *up,
|
static inline unsigned int serial_read_reg(struct plat_serial8250_port *up,
|
||||||
@@ -49,44 +51,6 @@ static inline void serial_write_reg(struct plat_serial8250_port *p, int offset,
|
|||||||
__raw_writel(value, IO_ADDRESS(p->mapbase) + offset);
|
__raw_writel(value, IO_ADDRESS(p->mapbase) + offset);
|
||||||
}
|
}
|
||||||
|
|
||||||
static struct plat_serial8250_port serial_platform_data[] = {
|
|
||||||
{
|
|
||||||
.mapbase = DAVINCI_UART0_BASE,
|
|
||||||
.irq = IRQ_UARTINT0,
|
|
||||||
.flags = UPF_BOOT_AUTOCONF | UPF_SKIP_TEST |
|
|
||||||
UPF_IOREMAP,
|
|
||||||
.iotype = UPIO_MEM,
|
|
||||||
.regshift = 2,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
.mapbase = DAVINCI_UART1_BASE,
|
|
||||||
.irq = IRQ_UARTINT1,
|
|
||||||
.flags = UPF_BOOT_AUTOCONF | UPF_SKIP_TEST |
|
|
||||||
UPF_IOREMAP,
|
|
||||||
.iotype = UPIO_MEM,
|
|
||||||
.regshift = 2,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
.mapbase = DAVINCI_UART2_BASE,
|
|
||||||
.irq = IRQ_UARTINT2,
|
|
||||||
.flags = UPF_BOOT_AUTOCONF | UPF_SKIP_TEST |
|
|
||||||
UPF_IOREMAP,
|
|
||||||
.iotype = UPIO_MEM,
|
|
||||||
.regshift = 2,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
.flags = 0
|
|
||||||
},
|
|
||||||
};
|
|
||||||
|
|
||||||
static struct platform_device serial_device = {
|
|
||||||
.name = "serial8250",
|
|
||||||
.id = PLAT8250_DEV_PLATFORM,
|
|
||||||
.dev = {
|
|
||||||
.platform_data = serial_platform_data,
|
|
||||||
},
|
|
||||||
};
|
|
||||||
|
|
||||||
static void __init davinci_serial_reset(struct plat_serial8250_port *p)
|
static void __init davinci_serial_reset(struct plat_serial8250_port *p)
|
||||||
{
|
{
|
||||||
unsigned int pwremu = 0;
|
unsigned int pwremu = 0;
|
||||||
@@ -106,35 +70,22 @@ static void __init davinci_serial_reset(struct plat_serial8250_port *p)
|
|||||||
UART_DM646X_SCR_TX_WATERMARK);
|
UART_DM646X_SCR_TX_WATERMARK);
|
||||||
}
|
}
|
||||||
|
|
||||||
void __init davinci_serial_init(struct davinci_uart_config *info)
|
int __init davinci_serial_init(struct davinci_uart_config *info)
|
||||||
{
|
{
|
||||||
int i;
|
int i;
|
||||||
char name[16];
|
char name[16];
|
||||||
struct clk *uart_clk;
|
struct clk *uart_clk;
|
||||||
struct device *dev = &serial_device.dev;
|
struct davinci_soc_info *soc_info = &davinci_soc_info;
|
||||||
|
struct device *dev = &soc_info->serial_dev->dev;
|
||||||
|
struct plat_serial8250_port *p = dev->platform_data;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Make sure the serial ports are muxed on at this point.
|
* Make sure the serial ports are muxed on at this point.
|
||||||
* You have to mux them off in device drivers later on
|
* You have to mux them off in device drivers later on if not needed.
|
||||||
* if not needed.
|
|
||||||
*/
|
*/
|
||||||
for (i = 0; i < DAVINCI_MAX_NR_UARTS; i++) {
|
for (i = 0; i < DAVINCI_MAX_NR_UARTS; i++, p++) {
|
||||||
struct plat_serial8250_port *p = serial_platform_data + i;
|
if (!(info->enabled_uarts & (1 << i)))
|
||||||
|
|
||||||
if (!(info->enabled_uarts & (1 << i))) {
|
|
||||||
p->flags = 0;
|
|
||||||
continue;
|
continue;
|
||||||
}
|
|
||||||
|
|
||||||
if (cpu_is_davinci_dm646x())
|
|
||||||
p->iotype = UPIO_MEM32;
|
|
||||||
|
|
||||||
if (cpu_is_davinci_dm355()) {
|
|
||||||
if (i == 2) {
|
|
||||||
p->mapbase = (unsigned long)DM355_UART2_BASE;
|
|
||||||
p->irq = IRQ_DM355_UARTINT2;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
sprintf(name, "uart%d", i);
|
sprintf(name, "uart%d", i);
|
||||||
uart_clk = clk_get(dev, name);
|
uart_clk = clk_get(dev, name);
|
||||||
@@ -147,11 +98,6 @@ void __init davinci_serial_init(struct davinci_uart_config *info)
|
|||||||
davinci_serial_reset(p);
|
davinci_serial_reset(p);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
static int __init davinci_init(void)
|
return platform_device_register(soc_info->serial_dev);
|
||||||
{
|
|
||||||
return platform_device_register(&serial_device);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
arch_initcall(davinci_init);
|
|
||||||
|
Reference in New Issue
Block a user