From 615c02451751af06e86ebfeb3edc5b3a3d5dec55 Mon Sep 17 00:00:00 2001 From: kfx Date: Wed, 11 Jul 2012 18:43:53 +0800 Subject: [PATCH] rk2928: uart init --- arch/arm/mach-rk2928/board-rk2928-fpga.c | 13 ++++ arch/arm/mach-rk2928/devices.c | 80 ++++++++++++++++++++++++ drivers/tty/serial/Kconfig | 2 +- 3 files changed, 94 insertions(+), 1 deletion(-) diff --git a/arch/arm/mach-rk2928/board-rk2928-fpga.c b/arch/arm/mach-rk2928/board-rk2928-fpga.c index 74e21a4631ad..ed5b66e9303f 100644 --- a/arch/arm/mach-rk2928/board-rk2928-fpga.c +++ b/arch/arm/mach-rk2928/board-rk2928-fpga.c @@ -78,6 +78,19 @@ static struct clk_lookup clks[] = { CLK("rk30_i2c.3", "i2c", &xin24m), CLK("rk29xx_spim.0", "spi", &xin24m), CLK("rk29xx_spim.1", "spi", &xin24m), + + CLK("rk_serial.0", "uart_div", &xin24m), + CLK("rk_serial.0", "uart_frac_div", &xin24m), + CLK("rk_serial.0", "uart", &xin24m), + CLK("rk_serial.0", "pclk_uart", &xin24m), + CLK("rk_serial.1", "uart_div", &xin24m), + CLK("rk_serial.1", "uart_frac_div", &xin24m), + CLK("rk_serial.1", "uart", &xin24m), + CLK("rk_serial.1", "pclk_uart", &xin24m), + CLK("rk_serial.2", "uart_div", &xin24m), + CLK("rk_serial.2", "uart_frac_div", &xin24m), + CLK("rk_serial.2", "uart", &xin24m), + CLK("rk_serial.2", "pclk_uart", &xin24m), }; void __init rk30_clock_init(void) diff --git a/arch/arm/mach-rk2928/devices.c b/arch/arm/mach-rk2928/devices.c index 88c89c446b7e..112f302cd6a0 100755 --- a/arch/arm/mach-rk2928/devices.c +++ b/arch/arm/mach-rk2928/devices.c @@ -102,6 +102,85 @@ static void __init rk2928_init_dma(void) { platform_add_devices(rk2928_dmacs, ARRAY_SIZE(rk2928_dmacs)); } + +#ifdef CONFIG_UART0_RK29 +static struct resource resources_uart0[] = { + { + .start = IRQ_UART0, + .end = IRQ_UART0, + .flags = IORESOURCE_IRQ, + }, + { + .start = RK2928_UART0_PHYS, + .end = RK2928_UART0_PHYS + RK2928_UART0_SIZE - 1, + .flags = IORESOURCE_MEM, + }, +}; + +static struct platform_device device_uart0 = { + .name = "rk_serial", + .id = 0, + .num_resources = ARRAY_SIZE(resources_uart0), + .resource = resources_uart0, +}; +#endif + +#ifdef CONFIG_UART1_RK29 +static struct resource resources_uart1[] = { + { + .start = IRQ_UART1, + .end = IRQ_UART1, + .flags = IORESOURCE_IRQ, + }, + { + .start = RK2928_UART1_PHYS, + .end = RK2928_UART1_PHYS + RK2928_UART1_SIZE - 1, + .flags = IORESOURCE_MEM, + }, +}; + +static struct platform_device device_uart1 = { + .name = "rk_serial", + .id = 1, + .num_resources = ARRAY_SIZE(resources_uart1), + .resource = resources_uart1, +}; +#endif + +#ifdef CONFIG_UART2_RK29 +static struct resource resources_uart2[] = { + { + .start = IRQ_UART2, + .end = IRQ_UART2, + .flags = IORESOURCE_IRQ, + }, + { + .start = RK2928_UART2_PHYS, + .end = RK2928_UART2_PHYS + RK2928_UART2_SIZE - 1, + .flags = IORESOURCE_MEM, + }, +}; + +static struct platform_device device_uart2 = { + .name = "rk_serial", + .id = 2, + .num_resources = ARRAY_SIZE(resources_uart2), + .resource = resources_uart2, +}; +#endif + +static void __init rk2928_init_uart(void) +{ +#ifdef CONFIG_UART0_RK29 + platform_device_register(&device_uart0); +#endif +#ifdef CONFIG_UART1_RK29 + platform_device_register(&device_uart1); +#endif +#ifdef CONFIG_UART2_RK29 + platform_device_register(&device_uart2); +#endif +} // i2c #ifdef CONFIG_I2C0_CONTROLLER_RK29 #define I2C0_ADAP_TYPE I2C_RK29_ADAP @@ -414,6 +493,7 @@ static void __init rk2928_init_spim(void) static int __init rk2928_init_devices(void) { rk2928_init_dma(); + rk2928_init_uart(); rk2928_init_i2c(); rk2928_init_spim(); #if defined(CONFIG_FIQ_DEBUGGER) && defined(DEBUG_UART_PHYS) diff --git a/drivers/tty/serial/Kconfig b/drivers/tty/serial/Kconfig index 4763420c6a4a..3405977f4d43 100644 --- a/drivers/tty/serial/Kconfig +++ b/drivers/tty/serial/Kconfig @@ -1555,7 +1555,7 @@ config UART2_DMA_RK29 config UART3_RK29 bool "Serial port 3 support" - depends on SERIAL_RK29 + depends on SERIAL_RK29 && !ARCH_RK2928 config UART3_CTS_RTS_RK29 bool "Serial port 3 CTS/RTS support" -- 2.34.1