linux-arm-kernel.lists.infradead.org archive mirror
 help / color / mirror / Atom feed
* [PATCH v2 0/5] ARM: davinci: fix UART clock enabling
@ 2013-05-28  8:28 Manjunathappa, Prakash
  2013-05-28  8:28 ` [PATCH v2 1/5] ARM: davinci: uart: move to devid based clk_get Manjunathappa, Prakash
                   ` (4 more replies)
  0 siblings, 5 replies; 13+ messages in thread
From: Manjunathappa, Prakash @ 2013-05-28  8:28 UTC (permalink / raw)
  To: linux-arm-kernel

Patch series addresses below issues:
1) Do clk_get on dev_id when there is single clock for a module
2) Fix garbled UART log with DT kernel on da850-evm.
3) Cleanup of serila platform code.

Applies on top of v3.9-rc9 of Linus's.
Tested on da850-evm. Able to see proper bootup log and console on UART2.

Since v1:
Change names of platform data names appropriately.
Added 5/5: platform code cleanup.

Manjunathappa, Prakash (5):
  ARM: davinci: uart: move to devid based clk_get
  ARM: davinci: da850: override device name of UART in DT kernel
  ARM: davinci: da850: do not specify clock_frequency for UART DT node
  ARM: davinci: da8xx: remove da8xx_uart_clk_enable
  ARM: davinci: serial: platform code cleanup

 arch/arm/boot/dts/da850.dtsi                   |    3 -
 arch/arm/mach-davinci/board-da830-evm.c        |    6 +--
 arch/arm/mach-davinci/board-da850-evm.c        |    6 +--
 arch/arm/mach-davinci/board-dm355-evm.c        |    6 +--
 arch/arm/mach-davinci/board-dm355-leopard.c    |    6 +--
 arch/arm/mach-davinci/board-dm365-evm.c        |    6 +--
 arch/arm/mach-davinci/board-dm644x-evm.c       |    6 +--
 arch/arm/mach-davinci/board-dm646x-evm.c       |    6 +--
 arch/arm/mach-davinci/board-mityomapl138.c     |    6 +--
 arch/arm/mach-davinci/board-neuros-osd2.c      |    6 +--
 arch/arm/mach-davinci/board-omapl138-hawk.c    |    6 +--
 arch/arm/mach-davinci/board-sffsdr.c           |    7 +--
 arch/arm/mach-davinci/da830.c                  |    7 +--
 arch/arm/mach-davinci/da850.c                  |    7 +--
 arch/arm/mach-davinci/da8xx-dt.c               |   11 +----
 arch/arm/mach-davinci/devices-da8xx.c          |   41 +++++++++++++-----
 arch/arm/mach-davinci/devices-tnetv107x.c      |   36 +++++++++++-----
 arch/arm/mach-davinci/dm355.c                  |   48 ++++++++++++++-------
 arch/arm/mach-davinci/dm365.c                  |   36 ++++++++++------
 arch/arm/mach-davinci/dm644x.c                 |   48 ++++++++++++++-------
 arch/arm/mach-davinci/dm646x.c                 |   47 ++++++++++++++-------
 arch/arm/mach-davinci/include/mach/common.h    |    1 -
 arch/arm/mach-davinci/include/mach/da8xx.h     |    2 +-
 arch/arm/mach-davinci/include/mach/serial.h    |   14 ++++---
 arch/arm/mach-davinci/include/mach/tnetv107x.h |    3 +-
 arch/arm/mach-davinci/serial.c                 |   54 +++++++++---------------
 arch/arm/mach-davinci/tnetv107x.c              |    8 ++--
 27 files changed, 227 insertions(+), 206 deletions(-)

-- 
1.7.4.1

^ permalink raw reply	[flat|nested] 13+ messages in thread

* [PATCH v2 1/5] ARM: davinci: uart: move to devid based clk_get
  2013-05-28  8:28 [PATCH v2 0/5] ARM: davinci: fix UART clock enabling Manjunathappa, Prakash
@ 2013-05-28  8:28 ` Manjunathappa, Prakash
  2013-06-06 10:32   ` Sekhar Nori
  2013-06-07  5:35   ` Sekhar Nori
  2013-05-28  8:28 ` [PATCH v2 2/5] ARM: davinci: da850: override device name of UART in DT kernel Manjunathappa, Prakash
                   ` (3 subsequent siblings)
  4 siblings, 2 replies; 13+ messages in thread
From: Manjunathappa, Prakash @ 2013-05-28  8:28 UTC (permalink / raw)
  To: linux-arm-kernel

For modules having single clock, clk_get should be done with dev_id.
But current davinci implementation handles multiple instances
of the UART devices with single platform_device_register. Hence clk_get
is based on con_id rather than dev_id, this is not correct. Do
platform_device_register for each instance and clk_get on dev_id.

Signed-off-by: Manjunathappa, Prakash <prakash.pm@ti.com>
---
 arch/arm/mach-davinci/da830.c                  |    8 ++--
 arch/arm/mach-davinci/da850.c                  |    8 ++--
 arch/arm/mach-davinci/devices-da8xx.c          |   41 ++++++++++++++------
 arch/arm/mach-davinci/devices-tnetv107x.c      |   34 ++++++++++++-----
 arch/arm/mach-davinci/dm355.c                  |   49 ++++++++++++++++--------
 arch/arm/mach-davinci/dm365.c                  |   37 +++++++++++-------
 arch/arm/mach-davinci/dm644x.c                 |   49 ++++++++++++++++--------
 arch/arm/mach-davinci/dm646x.c                 |   48 ++++++++++++++++-------
 arch/arm/mach-davinci/include/mach/da8xx.h     |    2 +-
 arch/arm/mach-davinci/include/mach/serial.h    |    4 ++
 arch/arm/mach-davinci/include/mach/tnetv107x.h |    2 +-
 arch/arm/mach-davinci/serial.c                 |   19 ++++++---
 arch/arm/mach-davinci/tnetv107x.c              |    8 ++--
 13 files changed, 205 insertions(+), 104 deletions(-)

diff --git a/arch/arm/mach-davinci/da830.c b/arch/arm/mach-davinci/da830.c
index abbaf02..a3ffd52 100644
--- a/arch/arm/mach-davinci/da830.c
+++ b/arch/arm/mach-davinci/da830.c
@@ -395,9 +395,9 @@ static struct clk_lookup da830_clks[] = {
 	CLK(NULL,		"tptc0",	&tptc0_clk),
 	CLK(NULL,		"tptc1",	&tptc1_clk),
 	CLK("da830-mmc.0",	NULL,		&mmcsd_clk),
-	CLK(NULL,		"uart0",	&uart0_clk),
-	CLK(NULL,		"uart1",	&uart1_clk),
-	CLK(NULL,		"uart2",	&uart2_clk),
+	CLK("serial8250.0",	NULL,		&uart0_clk),
+	CLK("serial8250.1",	NULL,		&uart1_clk),
+	CLK("serial8250.2",	NULL,		&uart2_clk),
 	CLK("spi_davinci.0",	NULL,		&spi0_clk),
 	CLK("spi_davinci.1",	NULL,		&spi1_clk),
 	CLK(NULL,		"ecap0",	&ecap0_clk),
@@ -1199,7 +1199,7 @@ static struct davinci_soc_info davinci_soc_info_da830 = {
 	.gpio_base		= DA8XX_GPIO_BASE,
 	.gpio_num		= 128,
 	.gpio_irq		= IRQ_DA8XX_GPIO0,
-	.serial_dev		= &da8xx_serial_device,
+	.serial_dev		= da8xx_serial_device,
 	.emac_pdata		= &da8xx_emac_pdata,
 };
 
diff --git a/arch/arm/mach-davinci/da850.c b/arch/arm/mach-davinci/da850.c
index 4d69338..7ce691c 100644
--- a/arch/arm/mach-davinci/da850.c
+++ b/arch/arm/mach-davinci/da850.c
@@ -451,9 +451,9 @@ static struct clk_lookup da850_clks[] = {
 	CLK(NULL,		"tpcc1",	&tpcc1_clk),
 	CLK(NULL,		"tptc2",	&tptc2_clk),
 	CLK("pruss_uio",	"pruss",	&pruss_clk),
-	CLK(NULL,		"uart0",	&uart0_clk),
-	CLK(NULL,		"uart1",	&uart1_clk),
-	CLK(NULL,		"uart2",	&uart2_clk),
+	CLK("serial8250.0",	NULL,		&uart0_clk),
+	CLK("serial8250.1",	NULL,		&uart1_clk),
+	CLK("serial8250.2",	NULL,		&uart2_clk),
 	CLK(NULL,		"aintc",	&aintc_clk),
 	CLK(NULL,		"gpio",		&gpio_clk),
 	CLK("i2c_davinci.2",	NULL,		&i2c1_clk),
@@ -1301,7 +1301,7 @@ static struct davinci_soc_info davinci_soc_info_da850 = {
 	.gpio_base		= DA8XX_GPIO_BASE,
 	.gpio_num		= 144,
 	.gpio_irq		= IRQ_DA8XX_GPIO0,
-	.serial_dev		= &da8xx_serial_device,
+	.serial_dev		= da8xx_serial_device,
 	.emac_pdata		= &da8xx_emac_pdata,
 	.sram_dma		= DA8XX_SHARED_RAM_BASE,
 	.sram_len		= SZ_128K,
diff --git a/arch/arm/mach-davinci/devices-da8xx.c b/arch/arm/mach-davinci/devices-da8xx.c
index bf57252..e243d97 100644
--- a/arch/arm/mach-davinci/devices-da8xx.c
+++ b/arch/arm/mach-davinci/devices-da8xx.c
@@ -67,7 +67,7 @@
 void __iomem *da8xx_syscfg0_base;
 void __iomem *da8xx_syscfg1_base;
 
-static struct plat_serial8250_port da8xx_serial_pdata[] = {
+static struct plat_serial8250_port da8xx_serial0_pdata[] = {
 	{
 		.mapbase	= DA8XX_UART0_BASE,
 		.irq		= IRQ_DA8XX_UARTINT0,
@@ -75,7 +75,9 @@ static struct plat_serial8250_port da8xx_serial_pdata[] = {
 					UPF_IOREMAP,
 		.iotype		= UPIO_MEM,
 		.regshift	= 2,
-	},
+	}
+};
+static struct plat_serial8250_port da8xx_serial1_pdata[] = {
 	{
 		.mapbase	= DA8XX_UART1_BASE,
 		.irq		= IRQ_DA8XX_UARTINT1,
@@ -83,7 +85,9 @@ static struct plat_serial8250_port da8xx_serial_pdata[] = {
 					UPF_IOREMAP,
 		.iotype		= UPIO_MEM,
 		.regshift	= 2,
-	},
+	}
+};
+static struct plat_serial8250_port da8xx_serial2_pdata[] = {
 	{
 		.mapbase	= DA8XX_UART2_BASE,
 		.irq		= IRQ_DA8XX_UARTINT2,
@@ -91,18 +95,31 @@ static struct plat_serial8250_port da8xx_serial_pdata[] = {
 					UPF_IOREMAP,
 		.iotype		= UPIO_MEM,
 		.regshift	= 2,
-	},
-	{
-		.flags	= 0,
-	},
+	}
 };
 
-struct platform_device da8xx_serial_device = {
-	.name	= "serial8250",
-	.id	= PLAT8250_DEV_PLATFORM,
-	.dev	= {
-		.platform_data	= da8xx_serial_pdata,
+struct platform_device da8xx_serial_device[] = {
+	{
+		.name	= "serial8250",
+		.id	= PLAT8250_DEV_PLATFORM,
+		.dev	= {
+			.platform_data	= da8xx_serial0_pdata
+		}
 	},
+	{
+		.name	= "serial8250",
+		.id	= PLAT8250_DEV_PLATFORM1,
+		.dev	= {
+			.platform_data	= da8xx_serial1_pdata
+		}
+	},
+	{
+		.name	= "serial8250",
+		.id	= PLAT8250_DEV_PLATFORM2,
+		.dev	= {
+			.platform_data	= da8xx_serial2_pdata
+		}
+	}
 };
 
 static const s8 da8xx_queue_tc_mapping[][2] = {
diff --git a/arch/arm/mach-davinci/devices-tnetv107x.c b/arch/arm/mach-davinci/devices-tnetv107x.c
index cfb194d..35e5594 100644
--- a/arch/arm/mach-davinci/devices-tnetv107x.c
+++ b/arch/arm/mach-davinci/devices-tnetv107x.c
@@ -126,7 +126,7 @@ static struct platform_device edma_device = {
 	.dev.platform_data = tnetv107x_edma_info,
 };
 
-static struct plat_serial8250_port serial_data[] = {
+static struct plat_serial8250_port serial0_platform_data[] = {
 	{
 		.mapbase	= TNETV107X_UART0_BASE,
 		.irq		= IRQ_TNETV107X_UART0,
@@ -135,7 +135,9 @@ static struct plat_serial8250_port serial_data[] = {
 		.type		= PORT_AR7,
 		.iotype		= UPIO_MEM32,
 		.regshift	= 2,
-	},
+	}
+};
+static struct plat_serial8250_port serial1_platform_data[] = {
 	{
 		.mapbase	= TNETV107X_UART1_BASE,
 		.irq		= IRQ_TNETV107X_UART1,
@@ -144,7 +146,9 @@ static struct plat_serial8250_port serial_data[] = {
 		.type		= PORT_AR7,
 		.iotype		= UPIO_MEM32,
 		.regshift	= 2,
-	},
+	}
+};
+static struct plat_serial8250_port serial2_platform_data[] = {
 	{
 		.mapbase	= TNETV107X_UART2_BASE,
 		.irq		= IRQ_TNETV107X_UART2,
@@ -153,16 +157,26 @@ static struct plat_serial8250_port serial_data[] = {
 		.type		= PORT_AR7,
 		.iotype		= UPIO_MEM32,
 		.regshift	= 2,
+	}
+};
+
+
+struct platform_device tnetv107x_serial_device[] = {
+	{
+		.name			= "serial8250",
+		.id			= PLAT8250_DEV_PLATFORM,
+		.dev.platform_data	= serial0_platform_data
 	},
 	{
-		.flags	= 0,
+		.name			= "serial8250",
+		.id			= PLAT8250_DEV_PLATFORM1,
+		.dev.platform_data	= serial1_platform_data
 	},
-};
-
-struct platform_device tnetv107x_serial_device = {
-	.name			= "serial8250",
-	.id			= PLAT8250_DEV_PLATFORM,
-	.dev.platform_data	= serial_data,
+	{
+		.name			= "serial8250",
+		.id			= PLAT8250_DEV_PLATFORM2,
+		.dev.platform_data	= serial2_platform_data
+	}
 };
 
 static struct resource mmc0_resources[] = {
diff --git a/arch/arm/mach-davinci/dm355.c b/arch/arm/mach-davinci/dm355.c
index a11034a..a7ef0e3 100644
--- a/arch/arm/mach-davinci/dm355.c
+++ b/arch/arm/mach-davinci/dm355.c
@@ -357,9 +357,9 @@ static struct clk_lookup dm355_clks[] = {
 	CLK(NULL, "clkout3", &clkout3_clk),
 	CLK(NULL, "arm", &arm_clk),
 	CLK(NULL, "mjcp", &mjcp_clk),
-	CLK(NULL, "uart0", &uart0_clk),
-	CLK(NULL, "uart1", &uart1_clk),
-	CLK(NULL, "uart2", &uart2_clk),
+	CLK("serial8250.0", NULL, &uart0_clk),
+	CLK("serial8250.1", NULL, &uart1_clk),
+	CLK("serial8250.2", NULL, &uart2_clk),
 	CLK("i2c_davinci.1", NULL, &i2c_clk),
 	CLK("davinci-mcbsp.0", NULL, &asp0_clk),
 	CLK("davinci-mcbsp.1", NULL, &asp1_clk),
@@ -922,7 +922,7 @@ static struct davinci_timer_info dm355_timer_info = {
 	.clocksource_id	= T0_TOP,
 };
 
-static struct plat_serial8250_port dm355_serial_platform_data[] = {
+static struct plat_serial8250_port dm355_serial0_platform_data[] = {
 	{
 		.mapbase	= DAVINCI_UART0_BASE,
 		.irq		= IRQ_UARTINT0,
@@ -930,7 +930,9 @@ static struct plat_serial8250_port dm355_serial_platform_data[] = {
 				  UPF_IOREMAP,
 		.iotype		= UPIO_MEM,
 		.regshift	= 2,
-	},
+	}
+};
+static struct plat_serial8250_port dm355_serial1_platform_data[] = {
 	{
 		.mapbase	= DAVINCI_UART1_BASE,
 		.irq		= IRQ_UARTINT1,
@@ -938,7 +940,9 @@ static struct plat_serial8250_port dm355_serial_platform_data[] = {
 				  UPF_IOREMAP,
 		.iotype		= UPIO_MEM,
 		.regshift	= 2,
-	},
+	}
+};
+static struct plat_serial8250_port dm355_serial2_platform_data[] = {
 	{
 		.mapbase	= DM355_UART2_BASE,
 		.irq		= IRQ_DM355_UARTINT2,
@@ -946,18 +950,31 @@ static struct plat_serial8250_port dm355_serial_platform_data[] = {
 				  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 platform_device dm355_serial_device[] = {
+	{
+		.name			= "serial8250",
+		.id			= PLAT8250_DEV_PLATFORM,
+		.dev			= {
+			.platform_data	= dm355_serial0_platform_data
+		}
 	},
+	{
+		.name			= "serial8250",
+		.id			= PLAT8250_DEV_PLATFORM1,
+		.dev			= {
+			.platform_data	= dm355_serial1_platform_data
+		}
+	},
+	{
+		.name			= "serial8250",
+		.id			= PLAT8250_DEV_PLATFORM2,
+		.dev			= {
+			.platform_data	= dm355_serial2_platform_data
+		}
+	}
 };
 
 static struct davinci_soc_info davinci_soc_info_dm355 = {
@@ -981,7 +998,7 @@ static struct davinci_soc_info davinci_soc_info_dm355 = {
 	.gpio_base		= DAVINCI_GPIO_BASE,
 	.gpio_num		= 104,
 	.gpio_irq		= IRQ_DM355_GPIOBNK0,
-	.serial_dev		= &dm355_serial_device,
+	.serial_dev		= dm355_serial_device,
 	.sram_dma		= 0x00010000,
 	.sram_len		= SZ_32K,
 };
diff --git a/arch/arm/mach-davinci/dm365.c b/arch/arm/mach-davinci/dm365.c
index 40fa4fe..abeac28 100644
--- a/arch/arm/mach-davinci/dm365.c
+++ b/arch/arm/mach-davinci/dm365.c
@@ -455,8 +455,8 @@ static struct clk_lookup dm365_clks[] = {
 	CLK("vpss", "master", &vpss_master_clk),
 	CLK("vpss", "slave", &vpss_slave_clk),
 	CLK(NULL, "arm", &arm_clk),
-	CLK(NULL, "uart0", &uart0_clk),
-	CLK(NULL, "uart1", &uart1_clk),
+	CLK("serial8250.0", NULL, &uart0_clk),
+	CLK("serial8250.1", NULL, &uart1_clk),
 	CLK("i2c_davinci.1", NULL, &i2c_clk),
 	CLK("da830-mmc.0", NULL, &mmcsd0_clk),
 	CLK("da830-mmc.1", NULL, &mmcsd1_clk),
@@ -1041,7 +1041,7 @@ static struct davinci_timer_info dm365_timer_info = {
 
 #define DM365_UART1_BASE	(IO_PHYS + 0x106000)
 
-static struct plat_serial8250_port dm365_serial_platform_data[] = {
+static struct plat_serial8250_port dm365_serial0_platform_data[] = {
 	{
 		.mapbase	= DAVINCI_UART0_BASE,
 		.irq		= IRQ_UARTINT0,
@@ -1049,7 +1049,9 @@ static struct plat_serial8250_port dm365_serial_platform_data[] = {
 				  UPF_IOREMAP,
 		.iotype		= UPIO_MEM,
 		.regshift	= 2,
-	},
+	}
+};
+static struct plat_serial8250_port dm365_serial1_platform_data[] = {
 	{
 		.mapbase	= DM365_UART1_BASE,
 		.irq		= IRQ_UARTINT1,
@@ -1057,20 +1059,27 @@ static struct plat_serial8250_port dm365_serial_platform_data[] = {
 				  UPF_IOREMAP,
 		.iotype		= UPIO_MEM,
 		.regshift	= 2,
-	},
-	{
-		.flags		= 0
-	},
+	}
 };
 
-static struct platform_device dm365_serial_device = {
-	.name			= "serial8250",
-	.id			= PLAT8250_DEV_PLATFORM,
-	.dev			= {
-		.platform_data	= dm365_serial_platform_data,
+static struct platform_device dm365_serial_device[] = {
+	{
+		.name			= "serial8250",
+		.id			= PLAT8250_DEV_PLATFORM,
+		.dev			= {
+			.platform_data	= dm365_serial0_platform_data
+		}
 	},
+	{
+		.name			= "serial8250",
+		.id			= PLAT8250_DEV_PLATFORM1,
+		.dev			= {
+			.platform_data	= dm365_serial1_platform_data
+		}
+	}
 };
 
+
 static struct davinci_soc_info davinci_soc_info_dm365 = {
 	.io_desc		= dm365_io_desc,
 	.io_desc_num		= ARRAY_SIZE(dm365_io_desc),
@@ -1093,7 +1102,7 @@ static struct davinci_soc_info davinci_soc_info_dm365 = {
 	.gpio_num		= 104,
 	.gpio_irq		= IRQ_DM365_GPIO0,
 	.gpio_unbanked		= 8,	/* really 16 ... skip muxed GPIOs */
-	.serial_dev		= &dm365_serial_device,
+	.serial_dev		= dm365_serial_device,
 	.emac_pdata		= &dm365_emac_pdata,
 	.sram_dma		= 0x00010000,
 	.sram_len		= SZ_32K,
diff --git a/arch/arm/mach-davinci/dm644x.c b/arch/arm/mach-davinci/dm644x.c
index 4d37d3e..cc68266 100644
--- a/arch/arm/mach-davinci/dm644x.c
+++ b/arch/arm/mach-davinci/dm644x.c
@@ -303,9 +303,9 @@ static struct clk_lookup dm644x_clks[] = {
 	CLK("vpss", "master", &vpss_master_clk),
 	CLK("vpss", "slave", &vpss_slave_clk),
 	CLK(NULL, "arm", &arm_clk),
-	CLK(NULL, "uart0", &uart0_clk),
-	CLK(NULL, "uart1", &uart1_clk),
-	CLK(NULL, "uart2", &uart2_clk),
+	CLK("serial8250.0", NULL, &uart0_clk),
+	CLK("serial8250.1", NULL, &uart1_clk),
+	CLK("serial8250.2", NULL, &uart2_clk),
 	CLK("davinci_emac.1", NULL, &emac_clk),
 	CLK("i2c_davinci.1", NULL, &i2c_clk),
 	CLK("palm_bk3710", NULL, &ide_clk),
@@ -813,7 +813,7 @@ static struct davinci_timer_info dm644x_timer_info = {
 	.clocksource_id	= T0_TOP,
 };
 
-static struct plat_serial8250_port dm644x_serial_platform_data[] = {
+static struct plat_serial8250_port dm644x_serial0_platform_data[] = {
 	{
 		.mapbase	= DAVINCI_UART0_BASE,
 		.irq		= IRQ_UARTINT0,
@@ -821,7 +821,9 @@ static struct plat_serial8250_port dm644x_serial_platform_data[] = {
 				  UPF_IOREMAP,
 		.iotype		= UPIO_MEM,
 		.regshift	= 2,
-	},
+	}
+};
+static struct plat_serial8250_port dm644x_serial1_platform_data[] = {
 	{
 		.mapbase	= DAVINCI_UART1_BASE,
 		.irq		= IRQ_UARTINT1,
@@ -829,7 +831,9 @@ static struct plat_serial8250_port dm644x_serial_platform_data[] = {
 				  UPF_IOREMAP,
 		.iotype		= UPIO_MEM,
 		.regshift	= 2,
-	},
+	}
+};
+static struct plat_serial8250_port dm644x_serial2_platform_data[] = {
 	{
 		.mapbase	= DAVINCI_UART2_BASE,
 		.irq		= IRQ_UARTINT2,
@@ -837,18 +841,31 @@ static struct plat_serial8250_port dm644x_serial_platform_data[] = {
 				  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 platform_device dm644x_serial_device[] = {
+	{
+		.name			= "serial8250",
+		.id			= PLAT8250_DEV_PLATFORM,
+		.dev			= {
+			.platform_data	= dm644x_serial0_platform_data
+		}
 	},
+	{
+		.name			= "serial8250",
+		.id			= PLAT8250_DEV_PLATFORM1,
+		.dev			= {
+			.platform_data	= dm644x_serial1_platform_data
+		}
+	},
+	{
+		.name			= "serial8250",
+		.id			= PLAT8250_DEV_PLATFORM2,
+		.dev			= {
+			.platform_data	= dm644x_serial2_platform_data
+		}
+	}
 };
 
 static struct davinci_soc_info davinci_soc_info_dm644x = {
@@ -872,7 +889,7 @@ static struct davinci_soc_info davinci_soc_info_dm644x = {
 	.gpio_base		= DAVINCI_GPIO_BASE,
 	.gpio_num		= 71,
 	.gpio_irq		= IRQ_GPIOBNK0,
-	.serial_dev		= &dm644x_serial_device,
+	.serial_dev		= dm644x_serial_device,
 	.emac_pdata		= &dm644x_emac_pdata,
 	.sram_dma		= 0x00008000,
 	.sram_len		= SZ_16K,
diff --git a/arch/arm/mach-davinci/dm646x.c b/arch/arm/mach-davinci/dm646x.c
index ac7b431..1fec246 100644
--- a/arch/arm/mach-davinci/dm646x.c
+++ b/arch/arm/mach-davinci/dm646x.c
@@ -342,9 +342,9 @@ static struct clk_lookup dm646x_clks[] = {
 	CLK(NULL, "edma_tc1", &edma_tc1_clk),
 	CLK(NULL, "edma_tc2", &edma_tc2_clk),
 	CLK(NULL, "edma_tc3", &edma_tc3_clk),
-	CLK(NULL, "uart0", &uart0_clk),
-	CLK(NULL, "uart1", &uart1_clk),
-	CLK(NULL, "uart2", &uart2_clk),
+	CLK("serial8250.0", NULL, &uart0_clk),
+	CLK("serial8250.1", NULL, &uart1_clk),
+	CLK("serial8250.2", NULL, &uart2_clk),
 	CLK("i2c_davinci.1", NULL, &i2c_clk),
 	CLK(NULL, "gpio", &gpio_clk),
 	CLK("davinci-mcasp.0", NULL, &mcasp0_clk),
@@ -790,7 +790,7 @@ static struct davinci_timer_info dm646x_timer_info = {
 	.clocksource_id	= T0_TOP,
 };
 
-static struct plat_serial8250_port dm646x_serial_platform_data[] = {
+static struct plat_serial8250_port dm646x_serial0_platform_data[] = {
 	{
 		.mapbase	= DAVINCI_UART0_BASE,
 		.irq		= IRQ_UARTINT0,
@@ -798,7 +798,9 @@ static struct plat_serial8250_port dm646x_serial_platform_data[] = {
 				  UPF_IOREMAP,
 		.iotype		= UPIO_MEM32,
 		.regshift	= 2,
-	},
+	}
+};
+static struct plat_serial8250_port dm646x_serial1_platform_data[] = {
 	{
 		.mapbase	= DAVINCI_UART1_BASE,
 		.irq		= IRQ_UARTINT1,
@@ -806,7 +808,9 @@ static struct plat_serial8250_port dm646x_serial_platform_data[] = {
 				  UPF_IOREMAP,
 		.iotype		= UPIO_MEM32,
 		.regshift	= 2,
-	},
+	}
+};
+static struct plat_serial8250_port dm646x_serial2_platform_data[] = {
 	{
 		.mapbase	= DAVINCI_UART2_BASE,
 		.irq		= IRQ_DM646X_UARTINT2,
@@ -814,19 +818,33 @@ static struct plat_serial8250_port dm646x_serial_platform_data[] = {
 				  UPF_IOREMAP,
 		.iotype		= UPIO_MEM32,
 		.regshift	= 2,
+	}
+};
+
+static struct platform_device dm646x_serial_device[] = {
+	{
+		.name			= "serial8250",
+		.id			= PLAT8250_DEV_PLATFORM,
+		.dev			= {
+			.platform_data	= dm646x_serial0_platform_data
+		}
 	},
 	{
-		.flags		= 0
+		.name			= "serial8250",
+		.id			= PLAT8250_DEV_PLATFORM1,
+		.dev			= {
+			.platform_data	= dm646x_serial1_platform_data
+		}
 	},
+	{
+		.name			= "serial8250",
+		.id			= PLAT8250_DEV_PLATFORM2,
+		.dev			= {
+			.platform_data	= dm646x_serial2_platform_data
+		}
+	}
 };
 
-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 = {
 	.io_desc		= dm646x_io_desc,
@@ -849,7 +867,7 @@ static struct davinci_soc_info davinci_soc_info_dm646x = {
 	.gpio_base		= DAVINCI_GPIO_BASE,
 	.gpio_num		= 43, /* Only 33 usable */
 	.gpio_irq		= IRQ_DM646X_GPIOBNK0,
-	.serial_dev		= &dm646x_serial_device,
+	.serial_dev		= dm646x_serial_device,
 	.emac_pdata		= &dm646x_emac_pdata,
 	.sram_dma		= 0x10010000,
 	.sram_len		= SZ_32K,
diff --git a/arch/arm/mach-davinci/include/mach/da8xx.h b/arch/arm/mach-davinci/include/mach/da8xx.h
index 2e1c9ea..71aa7d0 100644
--- a/arch/arm/mach-davinci/include/mach/da8xx.h
+++ b/arch/arm/mach-davinci/include/mach/da8xx.h
@@ -110,7 +110,7 @@ void da8xx_restart(char mode, const char *cmd);
 void da8xx_rproc_reserve_cma(void);
 int da8xx_register_rproc(void);
 
-extern struct platform_device da8xx_serial_device;
+extern struct platform_device da8xx_serial_device[];
 extern struct emac_platform_data da8xx_emac_pdata;
 extern struct da8xx_lcdc_platform_data sharp_lcd035q3dg01_pdata;
 extern struct da8xx_lcdc_platform_data sharp_lk043t1dg01_pdata;
diff --git a/arch/arm/mach-davinci/include/mach/serial.h b/arch/arm/mach-davinci/include/mach/serial.h
index 62ad300..34d9877 100644
--- a/arch/arm/mach-davinci/include/mach/serial.h
+++ b/arch/arm/mach-davinci/include/mach/serial.h
@@ -44,6 +44,10 @@ struct davinci_uart_config {
 
 extern int davinci_serial_init(struct davinci_uart_config *);
 extern int davinci_serial_setup_clk(unsigned instance, unsigned int *rate);
+extern struct platform_device dm365_serial_device[];
+extern struct platform_device dm355_serial_device[];
+extern struct platform_device dm644x_serial_device[];
+extern struct platform_device dm646x_serial_device[];
 #endif
 
 #endif /* __ASM_ARCH_SERIAL_H */
diff --git a/arch/arm/mach-davinci/include/mach/tnetv107x.h b/arch/arm/mach-davinci/include/mach/tnetv107x.h
index 1656a02..07948a5 100644
--- a/arch/arm/mach-davinci/include/mach/tnetv107x.h
+++ b/arch/arm/mach-davinci/include/mach/tnetv107x.h
@@ -49,7 +49,7 @@ struct tnetv107x_device_info {
 };
 
 extern struct platform_device tnetv107x_wdt_device;
-extern struct platform_device tnetv107x_serial_device;
+extern struct platform_device tnetv107x_serial_device[];
 
 extern void __init tnetv107x_init(void);
 extern void __init tnetv107x_devices_init(struct tnetv107x_device_info *);
diff --git a/arch/arm/mach-davinci/serial.c b/arch/arm/mach-davinci/serial.c
index f262581..57e6150 100644
--- a/arch/arm/mach-davinci/serial.c
+++ b/arch/arm/mach-davinci/serial.c
@@ -76,7 +76,7 @@ int __init davinci_serial_setup_clk(unsigned instance, unsigned int *rate)
 	char name[16];
 	struct clk *clk;
 	struct davinci_soc_info *soc_info = &davinci_soc_info;
-	struct device *dev = &soc_info->serial_dev->dev;
+	struct device *dev = &soc_info->serial_dev[instance].dev;
 
 	sprintf(name, "uart%d", instance);
 	clk = clk_get(dev, name);
@@ -96,19 +96,25 @@ int __init davinci_serial_setup_clk(unsigned instance, unsigned int *rate)
 
 int __init davinci_serial_init(struct davinci_uart_config *info)
 {
-	int i, ret;
+	int i, ret = 0;
 	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;
+	struct device *dev;
+	struct plat_serial8250_port *p;
 
 	/*
 	 * Make sure the serial ports are muxed on at this point.
 	 * You have to mux them off in device drivers later on if not needed.
 	 */
-	for (i = 0; p->flags; i++, p++) {
+	for (i = 0; soc_info->serial_dev[i].dev.platform_data != NULL; i++) {
+		dev = &soc_info->serial_dev[i].dev;
+		p = dev->platform_data;
 		if (!(info->enabled_uarts & (1 << i)))
 			continue;
 
+		ret = platform_device_register(&soc_info->serial_dev[i]);
+		if (ret)
+			continue;
+
 		ret = davinci_serial_setup_clk(i, &p->uartclk);
 		if (ret)
 			continue;
@@ -125,6 +131,5 @@ int __init davinci_serial_init(struct davinci_uart_config *info)
 		if (p->membase && p->type != PORT_AR7)
 			davinci_serial_reset(p);
 	}
-
-	return platform_device_register(soc_info->serial_dev);
+	return ret;
 }
diff --git a/arch/arm/mach-davinci/tnetv107x.c b/arch/arm/mach-davinci/tnetv107x.c
index 3b2a70d..d8a9516 100644
--- a/arch/arm/mach-davinci/tnetv107x.c
+++ b/arch/arm/mach-davinci/tnetv107x.c
@@ -263,7 +263,7 @@ static struct clk_lookup clks[] = {
 	CLK(NULL,		"clk_chipcfg",		&clk_chipcfg),
 	CLK("tnetv107x-ts.0",	NULL,			&clk_tsc),
 	CLK(NULL,		"clk_rom",		&clk_rom),
-	CLK(NULL,		"uart2",		&clk_uart2),
+	CLK("serial8250.2",     NULL,			&clk_uart2),
 	CLK(NULL,		"clk_pktsec",		&clk_pktsec),
 	CLK("tnetv107x-rng.0",	NULL,			&clk_rng),
 	CLK("tnetv107x-pka.0",	NULL,			&clk_pka),
@@ -273,8 +273,8 @@ static struct clk_lookup clks[] = {
 	CLK(NULL,		"clk_gpio",		&clk_gpio),
 	CLK(NULL,		"clk_mdio",		&clk_mdio),
 	CLK("dm6441-mmc.0",	NULL,			&clk_sdio0),
-	CLK(NULL,		"uart0",		&clk_uart0),
-	CLK(NULL,		"uart1",		&clk_uart1),
+	CLK("serial8250.0",	NULL,			&clk_uart0),
+	CLK("serial8250.1",	NULL,			&clk_uart1),
 	CLK(NULL,		"timer0",		&clk_timer0),
 	CLK(NULL,		"timer1",		&clk_timer1),
 	CLK("tnetv107x_wdt.0",	NULL,			&clk_wdt_arm),
@@ -756,7 +756,7 @@ static struct davinci_soc_info tnetv107x_soc_info = {
 	.gpio_type		= GPIO_TYPE_TNETV107X,
 	.gpio_num		= TNETV107X_N_GPIO,
 	.timer_info		= &timer_info,
-	.serial_dev		= &tnetv107x_serial_device,
+	.serial_dev		= tnetv107x_serial_device,
 };
 
 void __init tnetv107x_init(void)
-- 
1.7.4.1

^ permalink raw reply related	[flat|nested] 13+ messages in thread

* [PATCH v2 2/5] ARM: davinci: da850: override device name of UART in DT kernel
  2013-05-28  8:28 [PATCH v2 0/5] ARM: davinci: fix UART clock enabling Manjunathappa, Prakash
  2013-05-28  8:28 ` [PATCH v2 1/5] ARM: davinci: uart: move to devid based clk_get Manjunathappa, Prakash
@ 2013-05-28  8:28 ` Manjunathappa, Prakash
  2013-05-28  8:28 ` [PATCH v2 3/5] ARM: davinci: da850: do not specify clock_frequency for UART DT node Manjunathappa, Prakash
                   ` (2 subsequent siblings)
  4 siblings, 0 replies; 13+ messages in thread
From: Manjunathappa, Prakash @ 2013-05-28  8:28 UTC (permalink / raw)
  To: linux-arm-kernel

Populate OF_DEV_AUXDATA with desired device name so as to prevent
clk_get failures.

Signed-off-by: Manjunathappa, Prakash <prakash.pm@ti.com>
---
 arch/arm/mach-davinci/da8xx-dt.c |    3 +++
 1 files changed, 3 insertions(+), 0 deletions(-)

diff --git a/arch/arm/mach-davinci/da8xx-dt.c b/arch/arm/mach-davinci/da8xx-dt.c
index 961aea8..e429945 100644
--- a/arch/arm/mach-davinci/da8xx-dt.c
+++ b/arch/arm/mach-davinci/da8xx-dt.c
@@ -47,6 +47,9 @@ static struct of_dev_auxdata da850_auxdata_lookup[] __initdata = {
 	OF_DEV_AUXDATA("ti,da850-ecap", 0x01f07000, "ecap", NULL),
 	OF_DEV_AUXDATA("ti,da850-ecap", 0x01f08000, "ecap", NULL),
 	OF_DEV_AUXDATA("ti,da830-spi", 0x01f0e000, "spi_davinci.1", NULL),
+	OF_DEV_AUXDATA("ns16550a", 0x01c42000, "serial8250.0", NULL),
+	OF_DEV_AUXDATA("ns16550a", 0x01d0c000, "serial8250.1", NULL),
+	OF_DEV_AUXDATA("ns16550a", 0x01d0d000, "serial8250.2", NULL),
 	{}
 };
 
-- 
1.7.4.1

^ permalink raw reply related	[flat|nested] 13+ messages in thread

* [PATCH v2 3/5] ARM: davinci: da850: do not specify clock_frequency for UART DT node
  2013-05-28  8:28 [PATCH v2 0/5] ARM: davinci: fix UART clock enabling Manjunathappa, Prakash
  2013-05-28  8:28 ` [PATCH v2 1/5] ARM: davinci: uart: move to devid based clk_get Manjunathappa, Prakash
  2013-05-28  8:28 ` [PATCH v2 2/5] ARM: davinci: da850: override device name of UART in DT kernel Manjunathappa, Prakash
@ 2013-05-28  8:28 ` Manjunathappa, Prakash
  2013-05-28  8:28 ` [PATCH v2 4/5] ARM: davinci: da8xx: remove da8xx_uart_clk_enable Manjunathappa, Prakash
  2013-05-28  8:28 ` [PATCH v2 5/5] ARM: davinci: serial: platform code cleanup Manjunathappa, Prakash
  4 siblings, 0 replies; 13+ messages in thread
From: Manjunathappa, Prakash @ 2013-05-28  8:28 UTC (permalink / raw)
  To: linux-arm-kernel

DT kernel on da850-evm comes up with garbled UART logs. This is because
of mismatch in actual module clock rate and rate specified(clock-frequency)
in DT blob. kernel should not assume or depend on bootloaders clock
configuration, instead let it find the clock rate at runtime.

Issue discussed here before arriving on this implementation:
"ARM: davinci: da850 evm: update clock rate for UART 1/2 DT nodes"
https://patchwork.kernel.org/patch/2162271/

Signed-off-by: Manjunathappa, Prakash <prakash.pm@ti.com>
---
 arch/arm/boot/dts/da850.dtsi |    3 ---
 1 files changed, 0 insertions(+), 3 deletions(-)

diff --git a/arch/arm/boot/dts/da850.dtsi b/arch/arm/boot/dts/da850.dtsi
index 2c88313..4d43046 100644
--- a/arch/arm/boot/dts/da850.dtsi
+++ b/arch/arm/boot/dts/da850.dtsi
@@ -129,7 +129,6 @@
 		serial0: serial at 1c42000 {
 			compatible = "ns16550a";
 			reg = <0x42000 0x100>;
-			clock-frequency = <150000000>;
 			reg-shift = <2>;
 			interrupts = <25>;
 			status = "disabled";
@@ -137,7 +136,6 @@
 		serial1: serial at 1d0c000 {
 			compatible = "ns16550a";
 			reg = <0x10c000 0x100>;
-			clock-frequency = <150000000>;
 			reg-shift = <2>;
 			interrupts = <53>;
 			status = "disabled";
@@ -145,7 +143,6 @@
 		serial2: serial at 1d0d000 {
 			compatible = "ns16550a";
 			reg = <0x10d000 0x100>;
-			clock-frequency = <150000000>;
 			reg-shift = <2>;
 			interrupts = <61>;
 			status = "disabled";
-- 
1.7.4.1

^ permalink raw reply related	[flat|nested] 13+ messages in thread

* [PATCH v2 4/5] ARM: davinci: da8xx: remove da8xx_uart_clk_enable
  2013-05-28  8:28 [PATCH v2 0/5] ARM: davinci: fix UART clock enabling Manjunathappa, Prakash
                   ` (2 preceding siblings ...)
  2013-05-28  8:28 ` [PATCH v2 3/5] ARM: davinci: da850: do not specify clock_frequency for UART DT node Manjunathappa, Prakash
@ 2013-05-28  8:28 ` Manjunathappa, Prakash
  2013-05-28  8:28 ` [PATCH v2 5/5] ARM: davinci: serial: platform code cleanup Manjunathappa, Prakash
  4 siblings, 0 replies; 13+ messages in thread
From: Manjunathappa, Prakash @ 2013-05-28  8:28 UTC (permalink / raw)
  To: linux-arm-kernel

Serial clocks are enabled from of_platform_serial_setup:of_serial.c,
so remove davinci_serial_setup_clk from here.

Signed-off-by: Manjunathappa, Prakash <prakash.pm@ti.com>
---
 arch/arm/mach-davinci/da8xx-dt.c |    8 --------
 1 files changed, 0 insertions(+), 8 deletions(-)

diff --git a/arch/arm/mach-davinci/da8xx-dt.c b/arch/arm/mach-davinci/da8xx-dt.c
index e429945..9683cbd 100644
--- a/arch/arm/mach-davinci/da8xx-dt.c
+++ b/arch/arm/mach-davinci/da8xx-dt.c
@@ -20,13 +20,6 @@
 
 #define DA8XX_NUM_UARTS	3
 
-static void __init da8xx_uart_clk_enable(void)
-{
-	int i;
-	for (i = 0; i < DA8XX_NUM_UARTS; i++)
-		davinci_serial_setup_clk(i, NULL);
-}
-
 static struct of_device_id da8xx_irq_match[] __initdata = {
 	{ .compatible = "ti,cp-intc", .data = cp_intc_of_init, },
 	{ }
@@ -60,7 +53,6 @@ static void __init da850_init_machine(void)
 	of_platform_populate(NULL, of_default_bus_match_table,
 			     da850_auxdata_lookup, NULL);
 
-	da8xx_uart_clk_enable();
 }
 
 static const char *da850_boards_compat[] __initdata = {
-- 
1.7.4.1

^ permalink raw reply related	[flat|nested] 13+ messages in thread

* [PATCH v2 5/5] ARM: davinci: serial: platform code cleanup
  2013-05-28  8:28 [PATCH v2 0/5] ARM: davinci: fix UART clock enabling Manjunathappa, Prakash
                   ` (3 preceding siblings ...)
  2013-05-28  8:28 ` [PATCH v2 4/5] ARM: davinci: da8xx: remove da8xx_uart_clk_enable Manjunathappa, Prakash
@ 2013-05-28  8:28 ` Manjunathappa, Prakash
  2013-06-05 11:41   ` Sekhar Nori
  4 siblings, 1 reply; 13+ messages in thread
From: Manjunathappa, Prakash @ 2013-05-28  8:28 UTC (permalink / raw)
  To: linux-arm-kernel

1) "struct davinci_uart_config" is introduced to specify
   UART ports brought out or enabled on the board. But
   none of the boards use them for that purpose, so clean
   it up.
2) Have pointer to platform device as a argument for
   davinci_serial_init(), no need of serial_dev in
   struct soc_info now.
3) No need of davinci_serial_setup_clk(), not called from
   multiple places, hence reduce function call overhead.

Signed-off-by: Manjunathappa, Prakash <prakash.pm@ti.com>
Suggested-by: Sekhar Nori <nsekhar@ti.com>
---
 arch/arm/mach-davinci/board-da830-evm.c        |    6 +---
 arch/arm/mach-davinci/board-da850-evm.c        |    6 +---
 arch/arm/mach-davinci/board-dm355-evm.c        |    6 +---
 arch/arm/mach-davinci/board-dm355-leopard.c    |    6 +---
 arch/arm/mach-davinci/board-dm365-evm.c        |    6 +---
 arch/arm/mach-davinci/board-dm644x-evm.c       |    6 +---
 arch/arm/mach-davinci/board-dm646x-evm.c       |    6 +---
 arch/arm/mach-davinci/board-mityomapl138.c     |    6 +---
 arch/arm/mach-davinci/board-neuros-osd2.c      |    6 +---
 arch/arm/mach-davinci/board-omapl138-hawk.c    |    6 +---
 arch/arm/mach-davinci/board-sffsdr.c           |    7 +---
 arch/arm/mach-davinci/da830.c                  |    1 -
 arch/arm/mach-davinci/da850.c                  |    1 -
 arch/arm/mach-davinci/devices-tnetv107x.c      |    2 +-
 arch/arm/mach-davinci/dm355.c                  |    3 +-
 arch/arm/mach-davinci/dm365.c                  |    3 +-
 arch/arm/mach-davinci/dm644x.c                 |    3 +-
 arch/arm/mach-davinci/dm646x.c                 |    3 +-
 arch/arm/mach-davinci/include/mach/common.h    |    1 -
 arch/arm/mach-davinci/include/mach/serial.h    |   10 ++---
 arch/arm/mach-davinci/include/mach/tnetv107x.h |    1 -
 arch/arm/mach-davinci/serial.c                 |   47 +++++++-----------------
 22 files changed, 35 insertions(+), 107 deletions(-)

diff --git a/arch/arm/mach-davinci/board-da830-evm.c b/arch/arm/mach-davinci/board-da830-evm.c
index 1332de8..c4bdc0a 100644
--- a/arch/arm/mach-davinci/board-da830-evm.c
+++ b/arch/arm/mach-davinci/board-da830-evm.c
@@ -185,10 +185,6 @@ static __init void da830_evm_usb_init(void)
 			   __func__, ret);
 }
 
-static struct davinci_uart_config da830_evm_uart_config __initdata = {
-	.enabled_uarts = 0x7,
-};
-
 static const short da830_evm_mcasp1_pins[] = {
 	DA830_AHCLKX1, DA830_ACLKX1, DA830_AFSX1, DA830_AHCLKR1, DA830_AFSR1,
 	DA830_AMUTE1, DA830_AXR1_0, DA830_AXR1_1, DA830_AXR1_2, DA830_AXR1_5,
@@ -630,7 +626,7 @@ static __init void da830_evm_init(void)
 		pr_warning("da830_evm_init: watchdog registration failed: %d\n",
 				ret);
 
-	davinci_serial_init(&da830_evm_uart_config);
+	davinci_serial_init(da8xx_serial_device);
 	i2c_register_board_info(1, da830_evm_i2c_devices,
 			ARRAY_SIZE(da830_evm_i2c_devices));
 
diff --git a/arch/arm/mach-davinci/board-da850-evm.c b/arch/arm/mach-davinci/board-da850-evm.c
index 8a24b6c..9ac76ee 100644
--- a/arch/arm/mach-davinci/board-da850-evm.c
+++ b/arch/arm/mach-davinci/board-da850-evm.c
@@ -746,10 +746,6 @@ static struct davinci_i2c_platform_data da850_evm_i2c_0_pdata = {
 	.bus_delay	= 0,	/* usec */
 };
 
-static struct davinci_uart_config da850_evm_uart_config __initdata = {
-	.enabled_uarts = 0x7,
-};
-
 /* davinci da850 evm audio machine driver */
 static u8 da850_iis_serializer_direction[] = {
 	INACTIVE_MODE,	INACTIVE_MODE,	INACTIVE_MODE,	INACTIVE_MODE,
@@ -1495,7 +1491,7 @@ static __init void da850_evm_init(void)
 				__func__, ret);
 	}
 
-	davinci_serial_init(&da850_evm_uart_config);
+	davinci_serial_init(da8xx_serial_device);
 
 	i2c_register_board_info(1, da850_evm_i2c_devices,
 			ARRAY_SIZE(da850_evm_i2c_devices));
diff --git a/arch/arm/mach-davinci/board-dm355-evm.c b/arch/arm/mach-davinci/board-dm355-evm.c
index c2a0a67..42b23a3 100644
--- a/arch/arm/mach-davinci/board-dm355-evm.c
+++ b/arch/arm/mach-davinci/board-dm355-evm.c
@@ -314,10 +314,6 @@ static struct platform_device *davinci_evm_devices[] __initdata = {
 	&davinci_nand_device,
 };
 
-static struct davinci_uart_config uart_config __initdata = {
-	.enabled_uarts = (1 << 0),
-};
-
 static void __init dm355_evm_map_io(void)
 {
 	dm355_init();
@@ -393,7 +389,7 @@ static __init void dm355_evm_init(void)
 	platform_add_devices(davinci_evm_devices,
 			     ARRAY_SIZE(davinci_evm_devices));
 	evm_init_i2c();
-	davinci_serial_init(&uart_config);
+	davinci_serial_init(dm355_serial_device);
 
 	/* NOTE:  NAND flash timings set by the UBL are slower than
 	 * needed by MT29F16G08FAA chips ... EMIF.A1CR is 0x40400204
diff --git a/arch/arm/mach-davinci/board-dm355-leopard.c b/arch/arm/mach-davinci/board-dm355-leopard.c
index dff4ddc..d9eb1c9 100644
--- a/arch/arm/mach-davinci/board-dm355-leopard.c
+++ b/arch/arm/mach-davinci/board-dm355-leopard.c
@@ -172,10 +172,6 @@ static struct platform_device *davinci_leopard_devices[] __initdata = {
 	&davinci_nand_device,
 };
 
-static struct davinci_uart_config uart_config __initdata = {
-	.enabled_uarts = (1 << 0),
-};
-
 static void __init dm355_leopard_map_io(void)
 {
 	dm355_init();
@@ -251,7 +247,7 @@ static __init void dm355_leopard_init(void)
 	platform_add_devices(davinci_leopard_devices,
 			     ARRAY_SIZE(davinci_leopard_devices));
 	leopard_init_i2c();
-	davinci_serial_init(&uart_config);
+	davinci_serial_init(dm355_serial_device);
 
 	/* NOTE:  NAND flash timings set by the UBL are slower than
 	 * needed by MT29F16G08FAA chips ... EMIF.A1CR is 0x40400204
diff --git a/arch/arm/mach-davinci/board-dm365-evm.c b/arch/arm/mach-davinci/board-dm365-evm.c
index fd38c8d..5f1ec9d 100644
--- a/arch/arm/mach-davinci/board-dm365-evm.c
+++ b/arch/arm/mach-davinci/board-dm365-evm.c
@@ -719,10 +719,6 @@ fail:
 	/* REVISIT export switches: NTSC/PAL (SW5.6), EXTRA1 (SW5.2), etc */
 }
 
-static struct davinci_uart_config uart_config __initdata = {
-	.enabled_uarts = (1 << 0),
-};
-
 static void __init dm365_evm_map_io(void)
 {
 	dm365_init();
@@ -749,7 +745,7 @@ static struct spi_board_info dm365_evm_spi_info[] __initconst = {
 static __init void dm365_evm_init(void)
 {
 	evm_init_i2c();
-	davinci_serial_init(&uart_config);
+	davinci_serial_init(dm365_serial_device);
 
 	dm365evm_emac_configure();
 	dm365evm_mmc_configure();
diff --git a/arch/arm/mach-davinci/board-dm644x-evm.c b/arch/arm/mach-davinci/board-dm644x-evm.c
index a33686a..462812b 100644
--- a/arch/arm/mach-davinci/board-dm644x-evm.c
+++ b/arch/arm/mach-davinci/board-dm644x-evm.c
@@ -726,10 +726,6 @@ static struct platform_device *davinci_evm_devices[] __initdata = {
 	&rtc_dev,
 };
 
-static struct davinci_uart_config uart_config __initdata = {
-	.enabled_uarts = (1 << 0),
-};
-
 static void __init
 davinci_evm_map_io(void)
 {
@@ -791,7 +787,7 @@ static __init void davinci_evm_init(void)
 	davinci_setup_mmc(0, &dm6446evm_mmc_config);
 	dm644x_init_video(&dm644xevm_capture_cfg, &dm644xevm_display_cfg);
 
-	davinci_serial_init(&uart_config);
+	davinci_serial_init(dm644x_serial_device);
 	dm644x_init_asp(&dm644x_evm_snd_data);
 
 	/* irlml6401 switches over 1A, in under 8 msec */
diff --git a/arch/arm/mach-davinci/board-dm646x-evm.c b/arch/arm/mach-davinci/board-dm646x-evm.c
index fbb8e5a..734cc02 100644
--- a/arch/arm/mach-davinci/board-dm646x-evm.c
+++ b/arch/arm/mach-davinci/board-dm646x-evm.c
@@ -749,10 +749,6 @@ static void __init davinci_map_io(void)
 	cdce_clk_init();
 }
 
-static struct davinci_uart_config uart_config __initdata = {
-	.enabled_uarts = (1 << 0),
-};
-
 #define DM646X_EVM_PHY_ID		"davinci_mdio-0:01"
 /*
  * The following EDMA channels/slots are not being used by drivers (for
@@ -792,7 +788,7 @@ static __init void evm_init(void)
 	struct davinci_soc_info *soc_info = &davinci_soc_info;
 
 	evm_init_i2c();
-	davinci_serial_init(&uart_config);
+	davinci_serial_init(dm646x_serial_device);
 	dm646x_init_mcasp0(&dm646x_evm_snd_data[0]);
 	dm646x_init_mcasp1(&dm646x_evm_snd_data[1]);
 
diff --git a/arch/arm/mach-davinci/board-mityomapl138.c b/arch/arm/mach-davinci/board-mityomapl138.c
index 9549d53..cd0f587 100644
--- a/arch/arm/mach-davinci/board-mityomapl138.c
+++ b/arch/arm/mach-davinci/board-mityomapl138.c
@@ -434,10 +434,6 @@ static void __init mityomapl138_setup_nand(void)
 				 ARRAY_SIZE(mityomapl138_devices));
 }
 
-static struct davinci_uart_config mityomapl138_uart_config __initdata = {
-	.enabled_uarts = 0x7,
-};
-
 static const short mityomap_mii_pins[] = {
 	DA850_MII_TXEN, DA850_MII_TXCLK, DA850_MII_COL, DA850_MII_TXD_3,
 	DA850_MII_TXD_2, DA850_MII_TXD_1, DA850_MII_TXD_0, DA850_MII_RXER,
@@ -517,7 +513,7 @@ static void __init mityomapl138_init(void)
 	if (ret)
 		pr_warning("watchdog registration failed: %d\n", ret);
 
-	davinci_serial_init(&mityomapl138_uart_config);
+	davinci_serial_init(da8xx_serial_device);
 
 	ret = da8xx_register_i2c(0, &mityomap_i2c_0_pdata);
 	if (ret)
diff --git a/arch/arm/mach-davinci/board-neuros-osd2.c b/arch/arm/mach-davinci/board-neuros-osd2.c
index 2bc112a..8e156e0 100644
--- a/arch/arm/mach-davinci/board-neuros-osd2.c
+++ b/arch/arm/mach-davinci/board-neuros-osd2.c
@@ -153,10 +153,6 @@ static struct platform_device *davinci_ntosd2_devices[] __initdata = {
 	&ntosd2_leds_dev,
 };
 
-static struct davinci_uart_config uart_config __initdata = {
-	.enabled_uarts = (1 << 0),
-};
-
 static void __init davinci_ntosd2_map_io(void)
 {
 	dm644x_init();
@@ -197,7 +193,7 @@ static __init void davinci_ntosd2_init(void)
 	platform_add_devices(davinci_ntosd2_devices,
 				ARRAY_SIZE(davinci_ntosd2_devices));
 
-	davinci_serial_init(&uart_config);
+	davinci_serial_init(dm644x_serial_device);
 	dm644x_init_asp(&dm644x_ntosd2_snd_data);
 
 	soc_info->emac_pdata->phy_id = NEUROS_OSD2_PHY_ID;
diff --git a/arch/arm/mach-davinci/board-omapl138-hawk.c b/arch/arm/mach-davinci/board-omapl138-hawk.c
index b8c20de..ab98c75 100644
--- a/arch/arm/mach-davinci/board-omapl138-hawk.c
+++ b/arch/arm/mach-davinci/board-omapl138-hawk.c
@@ -286,15 +286,11 @@ usb11_setup_oc_fail:
 	gpio_free(DA850_USB1_VBUS_PIN);
 }
 
-static struct davinci_uart_config omapl138_hawk_uart_config __initdata = {
-	.enabled_uarts = 0x7,
-};
-
 static __init void omapl138_hawk_init(void)
 {
 	int ret;
 
-	davinci_serial_init(&omapl138_hawk_uart_config);
+	davinci_serial_init(da8xx_serial_device);
 
 	omapl138_hawk_config_emac();
 
diff --git a/arch/arm/mach-davinci/board-sffsdr.c b/arch/arm/mach-davinci/board-sffsdr.c
index 739be7e..96ca11b 100644
--- a/arch/arm/mach-davinci/board-sffsdr.c
+++ b/arch/arm/mach-davinci/board-sffsdr.c
@@ -44,6 +44,7 @@
 #include "davinci.h"
 
 #define SFFSDR_PHY_ID		"davinci_mdio-0:01"
+
 static struct mtd_partition davinci_sffsdr_nandflash_partition[] = {
 	/* U-Boot Environment: Block 0
 	 * UBL:                Block 1
@@ -125,10 +126,6 @@ static struct platform_device *davinci_sffsdr_devices[] __initdata = {
 	&davinci_sffsdr_nandflash_device,
 };
 
-static struct davinci_uart_config uart_config __initdata = {
-	.enabled_uarts = (1 << 0),
-};
-
 static void __init davinci_sffsdr_map_io(void)
 {
 	dm644x_init();
@@ -141,7 +138,7 @@ static __init void davinci_sffsdr_init(void)
 	platform_add_devices(davinci_sffsdr_devices,
 			     ARRAY_SIZE(davinci_sffsdr_devices));
 	sffsdr_init_i2c();
-	davinci_serial_init(&uart_config);
+	davinci_serial_init(dm644x_serial_device);
 	soc_info->emac_pdata->phy_id = SFFSDR_PHY_ID;
 	davinci_setup_usb(0, 0); /* We support only peripheral mode. */
 
diff --git a/arch/arm/mach-davinci/da830.c b/arch/arm/mach-davinci/da830.c
index a3ffd52..111613b 100644
--- a/arch/arm/mach-davinci/da830.c
+++ b/arch/arm/mach-davinci/da830.c
@@ -1199,7 +1199,6 @@ static struct davinci_soc_info davinci_soc_info_da830 = {
 	.gpio_base		= DA8XX_GPIO_BASE,
 	.gpio_num		= 128,
 	.gpio_irq		= IRQ_DA8XX_GPIO0,
-	.serial_dev		= da8xx_serial_device,
 	.emac_pdata		= &da8xx_emac_pdata,
 };
 
diff --git a/arch/arm/mach-davinci/da850.c b/arch/arm/mach-davinci/da850.c
index 7ce691c..b1d56e5 100644
--- a/arch/arm/mach-davinci/da850.c
+++ b/arch/arm/mach-davinci/da850.c
@@ -1301,7 +1301,6 @@ static struct davinci_soc_info davinci_soc_info_da850 = {
 	.gpio_base		= DA8XX_GPIO_BASE,
 	.gpio_num		= 144,
 	.gpio_irq		= IRQ_DA8XX_GPIO0,
-	.serial_dev		= da8xx_serial_device,
 	.emac_pdata		= &da8xx_emac_pdata,
 	.sram_dma		= DA8XX_SHARED_RAM_BASE,
 	.sram_len		= SZ_128K,
diff --git a/arch/arm/mach-davinci/devices-tnetv107x.c b/arch/arm/mach-davinci/devices-tnetv107x.c
index 35e5594..549cfad 100644
--- a/arch/arm/mach-davinci/devices-tnetv107x.c
+++ b/arch/arm/mach-davinci/devices-tnetv107x.c
@@ -399,7 +399,7 @@ void __init tnetv107x_devices_init(struct tnetv107x_device_info *info)
 	platform_device_register(&tsc_device);
 
 	if (info->serial_config)
-		davinci_serial_init(info->serial_config);
+		davinci_serial_init(tnetv107x_serial_device);
 
 	for (i = 0; i < 2; i++)
 		if (info->mmc_config[i]) {
diff --git a/arch/arm/mach-davinci/dm355.c b/arch/arm/mach-davinci/dm355.c
index a7ef0e3..006d5aa 100644
--- a/arch/arm/mach-davinci/dm355.c
+++ b/arch/arm/mach-davinci/dm355.c
@@ -953,7 +953,7 @@ static struct plat_serial8250_port dm355_serial2_platform_data[] = {
 	}
 };
 
-static struct platform_device dm355_serial_device[] = {
+struct platform_device dm355_serial_device[] = {
 	{
 		.name			= "serial8250",
 		.id			= PLAT8250_DEV_PLATFORM,
@@ -998,7 +998,6 @@ static struct davinci_soc_info davinci_soc_info_dm355 = {
 	.gpio_base		= DAVINCI_GPIO_BASE,
 	.gpio_num		= 104,
 	.gpio_irq		= IRQ_DM355_GPIOBNK0,
-	.serial_dev		= dm355_serial_device,
 	.sram_dma		= 0x00010000,
 	.sram_len		= SZ_32K,
 };
diff --git a/arch/arm/mach-davinci/dm365.c b/arch/arm/mach-davinci/dm365.c
index abeac28..a8c4c95 100644
--- a/arch/arm/mach-davinci/dm365.c
+++ b/arch/arm/mach-davinci/dm365.c
@@ -1062,7 +1062,7 @@ static struct plat_serial8250_port dm365_serial1_platform_data[] = {
 	}
 };
 
-static struct platform_device dm365_serial_device[] = {
+struct platform_device dm365_serial_device[] = {
 	{
 		.name			= "serial8250",
 		.id			= PLAT8250_DEV_PLATFORM,
@@ -1102,7 +1102,6 @@ static struct davinci_soc_info davinci_soc_info_dm365 = {
 	.gpio_num		= 104,
 	.gpio_irq		= IRQ_DM365_GPIO0,
 	.gpio_unbanked		= 8,	/* really 16 ... skip muxed GPIOs */
-	.serial_dev		= dm365_serial_device,
 	.emac_pdata		= &dm365_emac_pdata,
 	.sram_dma		= 0x00010000,
 	.sram_len		= SZ_32K,
diff --git a/arch/arm/mach-davinci/dm644x.c b/arch/arm/mach-davinci/dm644x.c
index cc68266..f4da786 100644
--- a/arch/arm/mach-davinci/dm644x.c
+++ b/arch/arm/mach-davinci/dm644x.c
@@ -844,7 +844,7 @@ static struct plat_serial8250_port dm644x_serial2_platform_data[] = {
 	}
 };
 
-static struct platform_device dm644x_serial_device[] = {
+struct platform_device dm644x_serial_device[] = {
 	{
 		.name			= "serial8250",
 		.id			= PLAT8250_DEV_PLATFORM,
@@ -889,7 +889,6 @@ static struct davinci_soc_info davinci_soc_info_dm644x = {
 	.gpio_base		= DAVINCI_GPIO_BASE,
 	.gpio_num		= 71,
 	.gpio_irq		= IRQ_GPIOBNK0,
-	.serial_dev		= dm644x_serial_device,
 	.emac_pdata		= &dm644x_emac_pdata,
 	.sram_dma		= 0x00008000,
 	.sram_len		= SZ_16K,
diff --git a/arch/arm/mach-davinci/dm646x.c b/arch/arm/mach-davinci/dm646x.c
index 1fec246..72cc683 100644
--- a/arch/arm/mach-davinci/dm646x.c
+++ b/arch/arm/mach-davinci/dm646x.c
@@ -821,7 +821,7 @@ static struct plat_serial8250_port dm646x_serial2_platform_data[] = {
 	}
 };
 
-static struct platform_device dm646x_serial_device[] = {
+struct platform_device dm646x_serial_device[] = {
 	{
 		.name			= "serial8250",
 		.id			= PLAT8250_DEV_PLATFORM,
@@ -867,7 +867,6 @@ static struct davinci_soc_info davinci_soc_info_dm646x = {
 	.gpio_base		= DAVINCI_GPIO_BASE,
 	.gpio_num		= 43, /* Only 33 usable */
 	.gpio_irq		= IRQ_DM646X_GPIOBNK0,
-	.serial_dev		= dm646x_serial_device,
 	.emac_pdata		= &dm646x_emac_pdata,
 	.sram_dma		= 0x10010000,
 	.sram_len		= SZ_32K,
diff --git a/arch/arm/mach-davinci/include/mach/common.h b/arch/arm/mach-davinci/include/mach/common.h
index b124b77..7f5a2e9 100644
--- a/arch/arm/mach-davinci/include/mach/common.h
+++ b/arch/arm/mach-davinci/include/mach/common.h
@@ -71,7 +71,6 @@ struct davinci_soc_info {
 	unsigned			gpio_unbanked;
 	struct davinci_gpio_controller	*gpio_ctlrs;
 	int				gpio_ctlrs_num;
-	struct platform_device		*serial_dev;
 	struct emac_platform_data	*emac_pdata;
 	dma_addr_t			sram_dma;
 	unsigned			sram_len;
diff --git a/arch/arm/mach-davinci/include/mach/serial.h b/arch/arm/mach-davinci/include/mach/serial.h
index 34d9877..c7303d0 100644
--- a/arch/arm/mach-davinci/include/mach/serial.h
+++ b/arch/arm/mach-davinci/include/mach/serial.h
@@ -15,6 +15,8 @@
 
 #include <mach/hardware.h>
 
+#include <linux/platform_device.h>
+
 #define DAVINCI_UART0_BASE	(IO_PHYS + 0x20000)
 #define DAVINCI_UART1_BASE	(IO_PHYS + 0x20400)
 #define DAVINCI_UART2_BASE	(IO_PHYS + 0x20800)
@@ -37,13 +39,9 @@
 #define UART_DM646X_SCR_TX_WATERMARK	0x08
 
 #ifndef __ASSEMBLY__
-struct davinci_uart_config {
-	/* Bit field of UARTs present; bit 0 --> UART0 */
-	unsigned int enabled_uarts;
-};
 
-extern int davinci_serial_init(struct davinci_uart_config *);
-extern int davinci_serial_setup_clk(unsigned instance, unsigned int *rate);
+extern int davinci_serial_init(struct platform_device *);
+
 extern struct platform_device dm365_serial_device[];
 extern struct platform_device dm355_serial_device[];
 extern struct platform_device dm644x_serial_device[];
diff --git a/arch/arm/mach-davinci/include/mach/tnetv107x.h b/arch/arm/mach-davinci/include/mach/tnetv107x.h
index 07948a5..c68c7a9 100644
--- a/arch/arm/mach-davinci/include/mach/tnetv107x.h
+++ b/arch/arm/mach-davinci/include/mach/tnetv107x.h
@@ -41,7 +41,6 @@
 #include <mach/serial.h>
 
 struct tnetv107x_device_info {
-	struct davinci_uart_config	*serial_config;
 	struct davinci_mmc_config	*mmc_config[2];  /* 2 controllers */
 	struct davinci_nand_pdata	*nand_config[4]; /* 4 chipsels */
 	struct matrix_keypad_platform_data *keypad_config;
diff --git a/arch/arm/mach-davinci/serial.c b/arch/arm/mach-davinci/serial.c
index 57e6150..5e93a73 100644
--- a/arch/arm/mach-davinci/serial.c
+++ b/arch/arm/mach-davinci/serial.c
@@ -70,54 +70,35 @@ static void __init davinci_serial_reset(struct plat_serial8250_port *p)
 				 UART_DM646X_SCR_TX_WATERMARK);
 }
 
-/* Enable UART clock and obtain its rate */
-int __init davinci_serial_setup_clk(unsigned instance, unsigned int *rate)
-{
-	char name[16];
-	struct clk *clk;
-	struct davinci_soc_info *soc_info = &davinci_soc_info;
-	struct device *dev = &soc_info->serial_dev[instance].dev;
-
-	sprintf(name, "uart%d", instance);
-	clk = clk_get(dev, name);
-	if (IS_ERR(clk)) {
-		pr_err("%s:%d: failed to get UART%d clock\n",
-					__func__, __LINE__, instance);
-		return PTR_ERR(clk);
-	}
-
-	clk_prepare_enable(clk);
-
-	if (rate)
-		*rate = clk_get_rate(clk);
-
-	return 0;
-}
-
-int __init davinci_serial_init(struct davinci_uart_config *info)
+int __init davinci_serial_init(struct platform_device *serial_dev)
 {
 	int i, ret = 0;
-	struct davinci_soc_info *soc_info = &davinci_soc_info;
 	struct device *dev;
 	struct plat_serial8250_port *p;
+	struct clk *clk;
 
 	/*
 	 * Make sure the serial ports are muxed on at this point.
 	 * You have to mux them off in device drivers later on if not needed.
 	 */
-	for (i = 0; soc_info->serial_dev[i].dev.platform_data != NULL; i++) {
-		dev = &soc_info->serial_dev[i].dev;
+	for (i = 0; serial_dev[i].dev.platform_data != NULL; i++) {
+		dev = &serial_dev[i].dev;
 		p = dev->platform_data;
-		if (!(info->enabled_uarts & (1 << i)))
-			continue;
 
-		ret = platform_device_register(&soc_info->serial_dev[i]);
+		ret = platform_device_register(&serial_dev[i]);
 		if (ret)
 			continue;
 
-		ret = davinci_serial_setup_clk(i, &p->uartclk);
-		if (ret)
+		clk = clk_get(dev, NULL);
+		if (IS_ERR(clk)) {
+			pr_err("%s:%d: failed to get UART%d clock\n",
+			       __func__, __LINE__, i);
 			continue;
+		}
+
+		clk_prepare_enable(clk);
+
+		p->uartclk = clk_get_rate(clk);
 
 		if (!p->membase && p->mapbase) {
 			p->membase = ioremap(p->mapbase, SZ_4K);
-- 
1.7.4.1

^ permalink raw reply related	[flat|nested] 13+ messages in thread

* [PATCH v2 5/5] ARM: davinci: serial: platform code cleanup
  2013-05-28  8:28 ` [PATCH v2 5/5] ARM: davinci: serial: platform code cleanup Manjunathappa, Prakash
@ 2013-06-05 11:41   ` Sekhar Nori
  2013-06-06 10:25     ` Sekhar Nori
  0 siblings, 1 reply; 13+ messages in thread
From: Sekhar Nori @ 2013-06-05 11:41 UTC (permalink / raw)
  To: linux-arm-kernel


On 5/28/2013 1:58 PM, Manjunathappa, Prakash wrote:
> 1) "struct davinci_uart_config" is introduced to specify
>    UART ports brought out or enabled on the board. But
>    none of the boards use them for that purpose, so clean
>    it up.
> 2) Have pointer to platform device as a argument for
>    davinci_serial_init(), no need of serial_dev in
>    struct soc_info now.
> 3) No need of davinci_serial_setup_clk(), not called from
>    multiple places, hence reduce function call overhead.
> 
> Signed-off-by: Manjunathappa, Prakash <prakash.pm@ti.com>
> Suggested-by: Sekhar Nori <nsekhar@ti.com>

We generally clean up code before undertaking modifications. Is there a
reason why this cannot be done first-up?

Thanks,
Sekhar

^ permalink raw reply	[flat|nested] 13+ messages in thread

* [PATCH v2 5/5] ARM: davinci: serial: platform code cleanup
  2013-06-05 11:41   ` Sekhar Nori
@ 2013-06-06 10:25     ` Sekhar Nori
  0 siblings, 0 replies; 13+ messages in thread
From: Sekhar Nori @ 2013-06-06 10:25 UTC (permalink / raw)
  To: linux-arm-kernel

On 6/5/2013 5:11 PM, Sekhar Nori wrote:
> 
> On 5/28/2013 1:58 PM, Manjunathappa, Prakash wrote:
>> 1) "struct davinci_uart_config" is introduced to specify
>>    UART ports brought out or enabled on the board. But
>>    none of the boards use them for that purpose, so clean
>>    it up.
>> 2) Have pointer to platform device as a argument for
>>    davinci_serial_init(), no need of serial_dev in
>>    struct soc_info now.
>> 3) No need of davinci_serial_setup_clk(), not called from
>>    multiple places, hence reduce function call overhead.
>>
>> Signed-off-by: Manjunathappa, Prakash <prakash.pm@ti.com>
>> Suggested-by: Sekhar Nori <nsekhar@ti.com>
> 
> We generally clean up code before undertaking modifications. Is there a
> reason why this cannot be done first-up?

Never mind this question. I figured it out myself. You need to have the
serial clock setup removed from DT before you can do any reasonable
clean-up and that happens only with 4/5.

Thanks,
Sekhar

^ permalink raw reply	[flat|nested] 13+ messages in thread

* [PATCH v2 1/5] ARM: davinci: uart: move to devid based clk_get
  2013-05-28  8:28 ` [PATCH v2 1/5] ARM: davinci: uart: move to devid based clk_get Manjunathappa, Prakash
@ 2013-06-06 10:32   ` Sekhar Nori
  2013-06-06 10:44     ` Sekhar Nori
  2013-06-07  5:35   ` Sekhar Nori
  1 sibling, 1 reply; 13+ messages in thread
From: Sekhar Nori @ 2013-06-06 10:32 UTC (permalink / raw)
  To: linux-arm-kernel

Hi Prakash,

It appears that this patch was not tested thoroughly. See below:

On 5/28/2013 1:58 PM, Manjunathappa, Prakash wrote:
> For modules having single clock, clk_get should be done with dev_id.
> But current davinci implementation handles multiple instances
> of the UART devices with single platform_device_register. Hence clk_get
> is based on con_id rather than dev_id, this is not correct. Do
> platform_device_register for each instance and clk_get on dev_id.
> 
> Signed-off-by: Manjunathappa, Prakash <prakash.pm@ti.com>
> ---

> -static struct plat_serial8250_port da8xx_serial_pdata[] = {
> +static struct plat_serial8250_port da8xx_serial0_pdata[] = {
>  	{
>  		.mapbase	= DA8XX_UART0_BASE,
>  		.irq		= IRQ_DA8XX_UARTINT0,
> @@ -75,7 +75,9 @@ static struct plat_serial8250_port da8xx_serial_pdata[] = {
>  					UPF_IOREMAP,
>  		.iotype		= UPIO_MEM,
>  		.regshift	= 2,
> -	},
> +	}
> +};
> +static struct plat_serial8250_port da8xx_serial1_pdata[] = {
>  	{
>  		.mapbase	= DA8XX_UART1_BASE,
>  		.irq		= IRQ_DA8XX_UARTINT1,
> @@ -83,7 +85,9 @@ static struct plat_serial8250_port da8xx_serial_pdata[] = {
>  					UPF_IOREMAP,
>  		.iotype		= UPIO_MEM,
>  		.regshift	= 2,
> -	},
> +	}
> +};
> +static struct plat_serial8250_port da8xx_serial2_pdata[] = {
>  	{
>  		.mapbase	= DA8XX_UART2_BASE,
>  		.irq		= IRQ_DA8XX_UARTINT2,
> @@ -91,18 +95,31 @@ static struct plat_serial8250_port da8xx_serial_pdata[] = {
>  					UPF_IOREMAP,
>  		.iotype		= UPIO_MEM,
>  		.regshift	= 2,
> -	},
> -	{
> -		.flags	= 0,
> -	},
> +	}

8250_core.c relies on sentinel value with p->flags = 0 to terminate
looking for more ports. You don't have sentinel values in any of pdata
the arrays you introduced so the code basically goes looking into areas
of memory not its own. This caused bunch of "cannot register port"
errors for me but I can easily imagine more serious errors.

Thanks,
Sekhar

^ permalink raw reply	[flat|nested] 13+ messages in thread

* [PATCH v2 1/5] ARM: davinci: uart: move to devid based clk_get
  2013-06-06 10:32   ` Sekhar Nori
@ 2013-06-06 10:44     ` Sekhar Nori
  2013-06-19  9:20       ` Manjunathappa, Prakash
  0 siblings, 1 reply; 13+ messages in thread
From: Sekhar Nori @ 2013-06-06 10:44 UTC (permalink / raw)
  To: linux-arm-kernel



On 6/6/2013 4:02 PM, Sekhar Nori wrote:
> Hi Prakash,
> 
> It appears that this patch was not tested thoroughly. See below:
> 
> On 5/28/2013 1:58 PM, Manjunathappa, Prakash wrote:
>> For modules having single clock, clk_get should be done with dev_id.
>> But current davinci implementation handles multiple instances
>> of the UART devices with single platform_device_register. Hence clk_get
>> is based on con_id rather than dev_id, this is not correct. Do
>> platform_device_register for each instance and clk_get on dev_id.
>>
>> Signed-off-by: Manjunathappa, Prakash <prakash.pm@ti.com>
>> ---
> 
>> -static struct plat_serial8250_port da8xx_serial_pdata[] = {
>> +static struct plat_serial8250_port da8xx_serial0_pdata[] = {
>>  	{
>>  		.mapbase	= DA8XX_UART0_BASE,
>>  		.irq		= IRQ_DA8XX_UARTINT0,
>> @@ -75,7 +75,9 @@ static struct plat_serial8250_port da8xx_serial_pdata[] = {
>>  					UPF_IOREMAP,
>>  		.iotype		= UPIO_MEM,
>>  		.regshift	= 2,
>> -	},
>> +	}
>> +};
>> +static struct plat_serial8250_port da8xx_serial1_pdata[] = {
>>  	{
>>  		.mapbase	= DA8XX_UART1_BASE,
>>  		.irq		= IRQ_DA8XX_UARTINT1,
>> @@ -83,7 +85,9 @@ static struct plat_serial8250_port da8xx_serial_pdata[] = {
>>  					UPF_IOREMAP,
>>  		.iotype		= UPIO_MEM,
>>  		.regshift	= 2,
>> -	},
>> +	}
>> +};
>> +static struct plat_serial8250_port da8xx_serial2_pdata[] = {
>>  	{
>>  		.mapbase	= DA8XX_UART2_BASE,
>>  		.irq		= IRQ_DA8XX_UARTINT2,
>> @@ -91,18 +95,31 @@ static struct plat_serial8250_port da8xx_serial_pdata[] = {
>>  					UPF_IOREMAP,
>>  		.iotype		= UPIO_MEM,
>>  		.regshift	= 2,
>> -	},
>> -	{
>> -		.flags	= 0,
>> -	},
>> +	}
> 
> 8250_core.c relies on sentinel value with p->flags = 0 to terminate
> looking for more ports. You don't have sentinel values in any of pdata
> the arrays you introduced so the code basically goes looking into areas
> of memory not its own. This caused bunch of "cannot register port"
> errors for me but I can easily imagine more serious errors.

Similarly, you check for platform_data being NULL to go over the list of
serial devices in the code in serial.c you introduced, but don't have a
sentinel when you define the serial device array.

Thanks,
Sekhar

^ permalink raw reply	[flat|nested] 13+ messages in thread

* [PATCH v2 1/5] ARM: davinci: uart: move to devid based clk_get
  2013-05-28  8:28 ` [PATCH v2 1/5] ARM: davinci: uart: move to devid based clk_get Manjunathappa, Prakash
  2013-06-06 10:32   ` Sekhar Nori
@ 2013-06-07  5:35   ` Sekhar Nori
  2013-06-19  9:24     ` Manjunathappa, Prakash
  1 sibling, 1 reply; 13+ messages in thread
From: Sekhar Nori @ 2013-06-07  5:35 UTC (permalink / raw)
  To: linux-arm-kernel

On 5/28/2013 1:58 PM, Manjunathappa, Prakash wrote:
> For modules having single clock, clk_get should be done with dev_id.
> But current davinci implementation handles multiple instances
> of the UART devices with single platform_device_register. Hence clk_get
> is based on con_id rather than dev_id, this is not correct. Do
> platform_device_register for each instance and clk_get on dev_id.
> 
> Signed-off-by: Manjunathappa, Prakash <prakash.pm@ti.com>

> +struct platform_device da8xx_serial_device[] = {
> +	{
> +		.name	= "serial8250",
> +		.id	= PLAT8250_DEV_PLATFORM,
> +		.dev	= {
> +			.platform_data	= da8xx_serial0_pdata
> +		}
>  	},
> +	{
> +		.name	= "serial8250",
> +		.id	= PLAT8250_DEV_PLATFORM1,
> +		.dev	= {
> +			.platform_data	= da8xx_serial1_pdata
> +		}
> +	},
> +	{
> +		.name	= "serial8250",
> +		.id	= PLAT8250_DEV_PLATFORM2,
> +		.dev	= {
> +			.platform_data	= da8xx_serial2_pdata
> +		}
> +	}

You should include trailing ',' when defining structures like these
(except on the sentinel value).

> diff --git a/arch/arm/mach-davinci/include/mach/serial.h b/arch/arm/mach-davinci/include/mach/serial.h
> index 62ad300..34d9877 100644
> --- a/arch/arm/mach-davinci/include/mach/serial.h
> +++ b/arch/arm/mach-davinci/include/mach/serial.h
> @@ -44,6 +44,10 @@ struct davinci_uart_config {
>  
>  extern int davinci_serial_init(struct davinci_uart_config *);
>  extern int davinci_serial_setup_clk(unsigned instance, unsigned int *rate);
> +extern struct platform_device dm365_serial_device[];
> +extern struct platform_device dm355_serial_device[];
> +extern struct platform_device dm644x_serial_device[];
> +extern struct platform_device dm646x_serial_device[];

This patch fails to build because of these extern definitions here.
Looks like they belong to 5/5. Also, add them to the local davinci.h
instead of globally visible serial.h - no need for rest of the kernel to
know about these.

After this is fixed locally, applying this patch to master branch of my
tree leads to the attached crash (sorry about the broken linewrap, I
hope its readable). Please fix this issue along with others that I
already pointed out and resubmit.

Thanks,
Sekhar

Serial: 8250/16550 driver, 3 ports, IRQ sharing disabled
serial8250.0: ttyS0 at MMIO 0x1c20000 (irq = 40) is a 16550A
console [ttyS0] enabled
serial8250 serial8250.0: unable to register port at index 1 (IO0
MEM1c20400 IRQ41): -22
serial8250 serial8250.0: unable to register port at index 2 (IO0
MEM1c20800 IRQ42): -22
Unable to handle kernel paging request at virtual address 019bfcc0
pgd = c0004000
[019bfcc0] *pgd=00000000
Internal error: Oops: 80000005 [#1] PREEMPT ARM
Modules linked in:
CPU: 0 PID: 1 Comm: swapper Not tainted 3.10.0-rc4-08028-gc89afd8-dirty #32
task: cf836000 ti: cf838000 task.ti: cf838000
PC is at 0x19bfcc0
LR is at serial8250_config_port+0x13c/0x668
pc : [<019bfcc0>]    lr : [<c01bb99c>]    psr: 40000093
sp : cf839bd0  ip : cf839bd0  fp : cf839c04
r10: c03f6528  r9 : c0396484  r8 : 00000000
r7 : 20000013  r6 : fffffffe  r5 : 00000001  r4 : c03f6628
r3 : 019bfcc0  r2 : 10000002  r1 : 00000001  r0 : c03f6628
Flags: nZcv  IRQs off  FIQs on  Mode SVC_32  ISA ARM  Segment kernel
Control: 0005317f  Table: 80004000  DAC: 00000017
Process swapper (pid: 1, stack limit = 0xcf8381b8)
Stack: (0xcf839bd0 to 0xcf83a000)
9bc0:                                     cf8acd08 cf838000 c0396484
cf8accb0
9be0: c03ccbf4 c03f6628 cf8acd08 cf838000 c0396484 c03f6528 cf839c94
cf839c08
9c00: c01b6584 c01bb870 cf8e3cfc 0000000f cf8acd08 c03ccbf4 cf839c44
cf839c28
9c20: c0178bf8 c0178d08 0000000f cf8acd08 c03ccacc cf838000 cf839c64
cf839c48
9c40: c02a8150 c005167c 00000000 cf8accb0 cf8acd08 c03ccbf4 cf839c74
cf839c68
9c60: c02a8224 c02a80f4 cf839c94 cf839cd0 c03f6628 00000003 c03f6728
c03f6524
9c80: c0396484 c03f6528 cf839cbc cf839c98 c01ba788 c01b6434 c03aecb0
00000003
9ca0: c03ada80 00000000 00000000 00000000 cf839df4 cf839cc0 c01ba8d8
c01ba518
9cc0: 01c20800 00000000 0000002a ffffffea 01c40800 fec40800 019bfcc0
0000001f
9ce0: c0332db0 ffffffff 00000000 00000000 00000000 019bfcc0 0000001f
00000000
9d00: 000c0000 00000000 00000000 00000000 00000000 00000000 00000000
00000000
9d20: 00000000 00000000 00000000 00000000 00000000 00000000 00000000
00000000
9d40: 00000000 00000002 00000000 00000000 00000000 00000000 00000000
00000000
9d60: 00000001 c03ada80 000000c4 00000000 01c40c00 00000000 00000000
00000000
9d80: 00000000 00000000 00000000 00000000 00000000 00000000 00000000
00000000
9da0: 00000000 00000000 00000000 00000000 00000000 00000000 00000000
00000000
9dc0: 00000000 00000000 00000000 00000000 c00fb518 c03ada80 c03f6d70
c03adab4
9de0: c03ccc40 cfa0da10 cf839e04 cf839df8 c01c472c c01ba7c8 cf839e24
cf839e08
9e00: c01c32f8 c01c4720 c03ada80 c03ccc40 c03adab4 00000000 cf839e44
cf839e28
9e20: c01c352c c01c3284 00000000 00000000 c03ccc40 c01c3498 cf839e6c
cf839e48
9e40: c01c1894 c01c34a8 cf822258 cf894270 cf9b7cf4 c03ccc40 cf9b7cc0
c03cd240
9e60: cf839e7c cf839e70 c01c2e80 c01c1844 cf839eac cf839e80 c01c29fc
c01c2e70
9e80: c0332ed0 00000003 cf839eac c03ccc40 c03f6528 00000003 c02c3ba4
cfa0da10
9ea0: cf839ed4 cf839eb0 c01c3a54 c01c2930 c03ccbf4 c03f6528 00000003
c02c3ba4
9ec0: cfa0da10 00000000 cf839ee4 cf839ed8 c01c49f4 c01c39e4 cf839f0c
cf839ee8
9ee0: c038c0d8 c01c49b8 00000000 c039df5c 00000006 cf838000 c03d39a0
c038bfd0
9f00: cf839f4c cf839f10 c00088c4 c038bfe0 00000006 c0376610 00000000
c034b6ac
9f20: cf839f4c c039df5c 00000006 c03d39a0 c037826c c0396490 c0396484
0000004f
9f40: cf839f94 cf839f50 c0378968 c00087e8 00000006 00000006 c037826c
00000000
9f60: 00000000 00000000 cf839f94 00000000 c02a2a90 00000000 00000000
00000000
9f80: 00000000 00000000 cf839fac cf839f98 c02a2aa0 c0378884 00000000
00000000
9fa0: 00000000 cf839fb0 c00094d0 c02a2aa0 00000000 00000000 00000000
00000000
9fc0: 00000000 00000000 00000000 00000000 00000000 00000000 00000000
00000000
9fe0: 00000000 00000000 00000000 00000000 00000013 00000000 00000000
00000000
Backtrace:
[<c01bb860>] (serial8250_config_port+0x0/0x668) from [<c01b6584>]
(uart_add_one_port+0x160/0x3d4)
[<c01b6424>] (uart_add_one_port+0x0/0x3d4) from [<c01ba788>]
(serial8250_register_8250_port+0x280/0x2b0)
[<c01ba508>] (serial8250_register_8250_port+0x0/0x2b0) from [<c01ba8d8>]
(serial8250_probe+0x120/0x174)
[<c01ba7b8>] (serial8250_probe+0x0/0x174) from [<c01c472c>]
(platform_drv_probe+0x1c/0x20)
 r8:cfa0da10 r7:c03ccc40 r6:c03adab4 r5:c03f6d70 r4:c03ada80
[<c01c4710>] (platform_drv_probe+0x0/0x20) from [<c01c32f8>]
(driver_probe_device+0x84/0x224)
[<c01c3274>] (driver_probe_device+0x0/0x224) from [<c01c352c>]
(__driver_attach+0x94/0x98)
 r7:00000000 r6:c03adab4 r5:c03ccc40 r4:c03ada80
[<c01c3498>] (__driver_attach+0x0/0x98) from [<c01c1894>]
(bus_for_each_dev+0x60/0x90)
 r6:c01c3498 r5:c03ccc40 r4:00000000 r3:00000000
[<c01c1834>] (bus_for_each_dev+0x0/0x90) from [<c01c2e80>]
(driver_attach+0x20/0x28)
 r6:c03cd240 r5:cf9b7cc0 r4:c03ccc40
[<c01c2e60>] (driver_attach+0x0/0x28) from [<c01c29fc>]
(bus_add_driver+0xdc/0x238)
[<c01c2920>] (bus_add_driver+0x0/0x238) from [<c01c3a54>]
(driver_register+0x80/0x154)
 r8:cfa0da10 r7:c02c3ba4 r6:00000003 r5:c03f6528 r4:c03ccc40
[<c01c39d4>] (driver_register+0x0/0x154) from [<c01c49f4>]
(platform_driver_register+0x4c/0x60)
[<c01c49a8>] (platform_driver_register+0x0/0x60) from [<c038c0d8>]
(serial8250_init+0x108/0x160)
[<c038bfd0>] (serial8250_init+0x0/0x160) from [<c00088c4>]
(do_one_initcall+0xec/0x158)
 r8:c038bfd0 r7:c03d39a0 r6:cf838000 r5:00000006 r4:c039df5c
r3:00000000
[<c00087d8>] (do_one_initcall+0x0/0x158) from [<c0378968>]
(kernel_init_freeable+0xf4/0x1b8)
[<c0378874>] (kernel_init_freeable+0x0/0x1b8) from [<c02a2aa0>]
(kernel_init+0x10/0xec)
[<c02a2a90>] (kernel_init+0x0/0xec) from [<c00094d0>]
(ret_from_fork+0x14/0x24)
 r4:00000000 r3:00000000
Code: bad PC value
---[ end trace ad321c8a03a56474 ]---

^ permalink raw reply	[flat|nested] 13+ messages in thread

* [PATCH v2 1/5] ARM: davinci: uart: move to devid based clk_get
  2013-06-06 10:44     ` Sekhar Nori
@ 2013-06-19  9:20       ` Manjunathappa, Prakash
  0 siblings, 0 replies; 13+ messages in thread
From: Manjunathappa, Prakash @ 2013-06-19  9:20 UTC (permalink / raw)
  To: linux-arm-kernel

Hi Sekhar,

Thanks for the review.

On Thu, Jun 06, 2013 at 16:14:19, Nori, Sekhar wrote:
> 
> 
> On 6/6/2013 4:02 PM, Sekhar Nori wrote:
> > Hi Prakash,
> > 
> > It appears that this patch was not tested thoroughly. See below:
> > 
> > On 5/28/2013 1:58 PM, Manjunathappa, Prakash wrote:
> >> For modules having single clock, clk_get should be done with dev_id.
> >> But current davinci implementation handles multiple instances
> >> of the UART devices with single platform_device_register. Hence clk_get
> >> is based on con_id rather than dev_id, this is not correct. Do
> >> platform_device_register for each instance and clk_get on dev_id.
> >>
> >> Signed-off-by: Manjunathappa, Prakash <prakash.pm@ti.com>
> >> ---
> > 
> >> -static struct plat_serial8250_port da8xx_serial_pdata[] = {
> >> +static struct plat_serial8250_port da8xx_serial0_pdata[] = {
> >>  	{
> >>  		.mapbase	= DA8XX_UART0_BASE,
> >>  		.irq		= IRQ_DA8XX_UARTINT0,
> >> @@ -75,7 +75,9 @@ static struct plat_serial8250_port da8xx_serial_pdata[] = {
> >>  					UPF_IOREMAP,
> >>  		.iotype		= UPIO_MEM,
> >>  		.regshift	= 2,
> >> -	},
> >> +	}
> >> +};
> >> +static struct plat_serial8250_port da8xx_serial1_pdata[] = {
> >>  	{
> >>  		.mapbase	= DA8XX_UART1_BASE,
> >>  		.irq		= IRQ_DA8XX_UARTINT1,
> >> @@ -83,7 +85,9 @@ static struct plat_serial8250_port da8xx_serial_pdata[] = {
> >>  					UPF_IOREMAP,
> >>  		.iotype		= UPIO_MEM,
> >>  		.regshift	= 2,
> >> -	},
> >> +	}
> >> +};
> >> +static struct plat_serial8250_port da8xx_serial2_pdata[] = {
> >>  	{
> >>  		.mapbase	= DA8XX_UART2_BASE,
> >>  		.irq		= IRQ_DA8XX_UARTINT2,
> >> @@ -91,18 +95,31 @@ static struct plat_serial8250_port da8xx_serial_pdata[] = {
> >>  					UPF_IOREMAP,
> >>  		.iotype		= UPIO_MEM,
> >>  		.regshift	= 2,
> >> -	},
> >> -	{
> >> -		.flags	= 0,
> >> -	},
> >> +	}
> > 
> > 8250_core.c relies on sentinel value with p->flags = 0 to terminate
> > looking for more ports. You don't have sentinel values in any of pdata
> > the arrays you introduced so the code basically goes looking into areas
> > of memory not its own. This caused bunch of "cannot register port"
> > errors for me but I can easily imagine more serious errors.

Will fix this.

> 
> Similarly, you check for platform_data being NULL to go over the list of
> serial devices in the code in serial.c you introduced, but don't have a
> sentinel when you define the serial device array.
> 

I have fixed this and above, posted patch here:
http://davinci-linux-open-source.1494791.n2.nabble.com/PATCH-v3-0-5-ARM-davinci-fix-UART-clock-enabling-tt7583378.html

Thanks,
Prakash

^ permalink raw reply	[flat|nested] 13+ messages in thread

* [PATCH v2 1/5] ARM: davinci: uart: move to devid based clk_get
  2013-06-07  5:35   ` Sekhar Nori
@ 2013-06-19  9:24     ` Manjunathappa, Prakash
  0 siblings, 0 replies; 13+ messages in thread
From: Manjunathappa, Prakash @ 2013-06-19  9:24 UTC (permalink / raw)
  To: linux-arm-kernel

Hi Sekhar,

On Fri, Jun 07, 2013 at 11:05:47, Nori, Sekhar wrote:
> On 5/28/2013 1:58 PM, Manjunathappa, Prakash wrote:
> > For modules having single clock, clk_get should be done with dev_id.
> > But current davinci implementation handles multiple instances
> > of the UART devices with single platform_device_register. Hence clk_get
> > is based on con_id rather than dev_id, this is not correct. Do
> > platform_device_register for each instance and clk_get on dev_id.
> > 
> > Signed-off-by: Manjunathappa, Prakash <prakash.pm@ti.com>
> 
> > +struct platform_device da8xx_serial_device[] = {
> > +	{
> > +		.name	= "serial8250",
> > +		.id	= PLAT8250_DEV_PLATFORM,
> > +		.dev	= {
> > +			.platform_data	= da8xx_serial0_pdata
> > +		}
> >  	},
> > +	{
> > +		.name	= "serial8250",
> > +		.id	= PLAT8250_DEV_PLATFORM1,
> > +		.dev	= {
> > +			.platform_data	= da8xx_serial1_pdata
> > +		}
> > +	},
> > +	{
> > +		.name	= "serial8250",
> > +		.id	= PLAT8250_DEV_PLATFORM2,
> > +		.dev	= {
> > +			.platform_data	= da8xx_serial2_pdata
> > +		}
> > +	}
> 
> You should include trailing ',' when defining structures like these
> (except on the sentinel value).
> 

Will fix this.

> > diff --git a/arch/arm/mach-davinci/include/mach/serial.h b/arch/arm/mach-davinci/include/mach/serial.h
> > index 62ad300..34d9877 100644
> > --- a/arch/arm/mach-davinci/include/mach/serial.h
> > +++ b/arch/arm/mach-davinci/include/mach/serial.h
> > @@ -44,6 +44,10 @@ struct davinci_uart_config {
> >  
> >  extern int davinci_serial_init(struct davinci_uart_config *);
> >  extern int davinci_serial_setup_clk(unsigned instance, unsigned int *rate);
> > +extern struct platform_device dm365_serial_device[];
> > +extern struct platform_device dm355_serial_device[];
> > +extern struct platform_device dm644x_serial_device[];
> > +extern struct platform_device dm646x_serial_device[];
> 
> This patch fails to build because of these extern definitions here.
> Looks like they belong to 5/5. Also, add them to the local davinci.h
> instead of globally visible serial.h - no need for rest of the kernel to
> know about these.
> 

Moved them to davinci.h and merged it with 5/5.

> After this is fixed locally, applying this patch to master branch of my
> tree leads to the attached crash (sorry about the broken linewrap, I
> hope its readable). Please fix this issue along with others that I
> already pointed out and resubmit.
> 

I do not see this crash any more, with earlier comments fixed. I tested it
on da850-evm for both DT and non-DT boot.

Submitted next version of patch considering all comments:
http://davinci-linux-open-source.1494791.n2.nabble.com/PATCH-v3-0-5-ARM-davinci-fix-UART-clock-enabling-tt7583378.html

Thanks,
Prakash

> Thanks,
> Sekhar
> 
> Serial: 8250/16550 driver, 3 ports, IRQ sharing disabled
> serial8250.0: ttyS0 at MMIO 0x1c20000 (irq = 40) is a 16550A
> console [ttyS0] enabled
> serial8250 serial8250.0: unable to register port at index 1 (IO0
> MEM1c20400 IRQ41): -22
> serial8250 serial8250.0: unable to register port at index 2 (IO0
> MEM1c20800 IRQ42): -22
> Unable to handle kernel paging request at virtual address 019bfcc0
> pgd = c0004000
> [019bfcc0] *pgd=00000000
> Internal error: Oops: 80000005 [#1] PREEMPT ARM
> Modules linked in:
> CPU: 0 PID: 1 Comm: swapper Not tainted 3.10.0-rc4-08028-gc89afd8-dirty #32
> task: cf836000 ti: cf838000 task.ti: cf838000
> PC is at 0x19bfcc0
> LR is at serial8250_config_port+0x13c/0x668
> pc : [<019bfcc0>]    lr : [<c01bb99c>]    psr: 40000093
> sp : cf839bd0  ip : cf839bd0  fp : cf839c04
> r10: c03f6528  r9 : c0396484  r8 : 00000000
> r7 : 20000013  r6 : fffffffe  r5 : 00000001  r4 : c03f6628
> r3 : 019bfcc0  r2 : 10000002  r1 : 00000001  r0 : c03f6628
> Flags: nZcv  IRQs off  FIQs on  Mode SVC_32  ISA ARM  Segment kernel
> Control: 0005317f  Table: 80004000  DAC: 00000017
> Process swapper (pid: 1, stack limit = 0xcf8381b8)
> Stack: (0xcf839bd0 to 0xcf83a000)
> 9bc0:                                     cf8acd08 cf838000 c0396484
> cf8accb0
> 9be0: c03ccbf4 c03f6628 cf8acd08 cf838000 c0396484 c03f6528 cf839c94
> cf839c08
> 9c00: c01b6584 c01bb870 cf8e3cfc 0000000f cf8acd08 c03ccbf4 cf839c44
> cf839c28
> 9c20: c0178bf8 c0178d08 0000000f cf8acd08 c03ccacc cf838000 cf839c64
> cf839c48
> 9c40: c02a8150 c005167c 00000000 cf8accb0 cf8acd08 c03ccbf4 cf839c74
> cf839c68
> 9c60: c02a8224 c02a80f4 cf839c94 cf839cd0 c03f6628 00000003 c03f6728
> c03f6524
> 9c80: c0396484 c03f6528 cf839cbc cf839c98 c01ba788 c01b6434 c03aecb0
> 00000003
> 9ca0: c03ada80 00000000 00000000 00000000 cf839df4 cf839cc0 c01ba8d8
> c01ba518
> 9cc0: 01c20800 00000000 0000002a ffffffea 01c40800 fec40800 019bfcc0
> 0000001f
> 9ce0: c0332db0 ffffffff 00000000 00000000 00000000 019bfcc0 0000001f
> 00000000
> 9d00: 000c0000 00000000 00000000 00000000 00000000 00000000 00000000
> 00000000
> 9d20: 00000000 00000000 00000000 00000000 00000000 00000000 00000000
> 00000000
> 9d40: 00000000 00000002 00000000 00000000 00000000 00000000 00000000
> 00000000
> 9d60: 00000001 c03ada80 000000c4 00000000 01c40c00 00000000 00000000
> 00000000
> 9d80: 00000000 00000000 00000000 00000000 00000000 00000000 00000000
> 00000000
> 9da0: 00000000 00000000 00000000 00000000 00000000 00000000 00000000
> 00000000
> 9dc0: 00000000 00000000 00000000 00000000 c00fb518 c03ada80 c03f6d70
> c03adab4
> 9de0: c03ccc40 cfa0da10 cf839e04 cf839df8 c01c472c c01ba7c8 cf839e24
> cf839e08
> 9e00: c01c32f8 c01c4720 c03ada80 c03ccc40 c03adab4 00000000 cf839e44
> cf839e28
> 9e20: c01c352c c01c3284 00000000 00000000 c03ccc40 c01c3498 cf839e6c
> cf839e48
> 9e40: c01c1894 c01c34a8 cf822258 cf894270 cf9b7cf4 c03ccc40 cf9b7cc0
> c03cd240
> 9e60: cf839e7c cf839e70 c01c2e80 c01c1844 cf839eac cf839e80 c01c29fc
> c01c2e70
> 9e80: c0332ed0 00000003 cf839eac c03ccc40 c03f6528 00000003 c02c3ba4
> cfa0da10
> 9ea0: cf839ed4 cf839eb0 c01c3a54 c01c2930 c03ccbf4 c03f6528 00000003
> c02c3ba4
> 9ec0: cfa0da10 00000000 cf839ee4 cf839ed8 c01c49f4 c01c39e4 cf839f0c
> cf839ee8
> 9ee0: c038c0d8 c01c49b8 00000000 c039df5c 00000006 cf838000 c03d39a0
> c038bfd0
> 9f00: cf839f4c cf839f10 c00088c4 c038bfe0 00000006 c0376610 00000000
> c034b6ac
> 9f20: cf839f4c c039df5c 00000006 c03d39a0 c037826c c0396490 c0396484
> 0000004f
> 9f40: cf839f94 cf839f50 c0378968 c00087e8 00000006 00000006 c037826c
> 00000000
> 9f60: 00000000 00000000 cf839f94 00000000 c02a2a90 00000000 00000000
> 00000000
> 9f80: 00000000 00000000 cf839fac cf839f98 c02a2aa0 c0378884 00000000
> 00000000
> 9fa0: 00000000 cf839fb0 c00094d0 c02a2aa0 00000000 00000000 00000000
> 00000000
> 9fc0: 00000000 00000000 00000000 00000000 00000000 00000000 00000000
> 00000000
> 9fe0: 00000000 00000000 00000000 00000000 00000013 00000000 00000000
> 00000000
> Backtrace:
> [<c01bb860>] (serial8250_config_port+0x0/0x668) from [<c01b6584>]
> (uart_add_one_port+0x160/0x3d4)
> [<c01b6424>] (uart_add_one_port+0x0/0x3d4) from [<c01ba788>]
> (serial8250_register_8250_port+0x280/0x2b0)
> [<c01ba508>] (serial8250_register_8250_port+0x0/0x2b0) from [<c01ba8d8>]
> (serial8250_probe+0x120/0x174)
> [<c01ba7b8>] (serial8250_probe+0x0/0x174) from [<c01c472c>]
> (platform_drv_probe+0x1c/0x20)
>  r8:cfa0da10 r7:c03ccc40 r6:c03adab4 r5:c03f6d70 r4:c03ada80
> [<c01c4710>] (platform_drv_probe+0x0/0x20) from [<c01c32f8>]
> (driver_probe_device+0x84/0x224)
> [<c01c3274>] (driver_probe_device+0x0/0x224) from [<c01c352c>]
> (__driver_attach+0x94/0x98)
>  r7:00000000 r6:c03adab4 r5:c03ccc40 r4:c03ada80
> [<c01c3498>] (__driver_attach+0x0/0x98) from [<c01c1894>]
> (bus_for_each_dev+0x60/0x90)
>  r6:c01c3498 r5:c03ccc40 r4:00000000 r3:00000000
> [<c01c1834>] (bus_for_each_dev+0x0/0x90) from [<c01c2e80>]
> (driver_attach+0x20/0x28)
>  r6:c03cd240 r5:cf9b7cc0 r4:c03ccc40
> [<c01c2e60>] (driver_attach+0x0/0x28) from [<c01c29fc>]
> (bus_add_driver+0xdc/0x238)
> [<c01c2920>] (bus_add_driver+0x0/0x238) from [<c01c3a54>]
> (driver_register+0x80/0x154)
>  r8:cfa0da10 r7:c02c3ba4 r6:00000003 r5:c03f6528 r4:c03ccc40
> [<c01c39d4>] (driver_register+0x0/0x154) from [<c01c49f4>]
> (platform_driver_register+0x4c/0x60)
> [<c01c49a8>] (platform_driver_register+0x0/0x60) from [<c038c0d8>]
> (serial8250_init+0x108/0x160)
> [<c038bfd0>] (serial8250_init+0x0/0x160) from [<c00088c4>]
> (do_one_initcall+0xec/0x158)
>  r8:c038bfd0 r7:c03d39a0 r6:cf838000 r5:00000006 r4:c039df5c
> r3:00000000
> [<c00087d8>] (do_one_initcall+0x0/0x158) from [<c0378968>]
> (kernel_init_freeable+0xf4/0x1b8)
> [<c0378874>] (kernel_init_freeable+0x0/0x1b8) from [<c02a2aa0>]
> (kernel_init+0x10/0xec)
> [<c02a2a90>] (kernel_init+0x0/0xec) from [<c00094d0>]
> (ret_from_fork+0x14/0x24)
>  r4:00000000 r3:00000000
> Code: bad PC value
> ---[ end trace ad321c8a03a56474 ]---
> 

^ permalink raw reply	[flat|nested] 13+ messages in thread

end of thread, other threads:[~2013-06-19  9:24 UTC | newest]

Thread overview: 13+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2013-05-28  8:28 [PATCH v2 0/5] ARM: davinci: fix UART clock enabling Manjunathappa, Prakash
2013-05-28  8:28 ` [PATCH v2 1/5] ARM: davinci: uart: move to devid based clk_get Manjunathappa, Prakash
2013-06-06 10:32   ` Sekhar Nori
2013-06-06 10:44     ` Sekhar Nori
2013-06-19  9:20       ` Manjunathappa, Prakash
2013-06-07  5:35   ` Sekhar Nori
2013-06-19  9:24     ` Manjunathappa, Prakash
2013-05-28  8:28 ` [PATCH v2 2/5] ARM: davinci: da850: override device name of UART in DT kernel Manjunathappa, Prakash
2013-05-28  8:28 ` [PATCH v2 3/5] ARM: davinci: da850: do not specify clock_frequency for UART DT node Manjunathappa, Prakash
2013-05-28  8:28 ` [PATCH v2 4/5] ARM: davinci: da8xx: remove da8xx_uart_clk_enable Manjunathappa, Prakash
2013-05-28  8:28 ` [PATCH v2 5/5] ARM: davinci: serial: platform code cleanup Manjunathappa, Prakash
2013-06-05 11:41   ` Sekhar Nori
2013-06-06 10:25     ` Sekhar Nori

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).