From 44fcde3cc9ae8ea18c0f6118511eb868a5d427a0 Mon Sep 17 00:00:00 2001
From: Jaikumar Ganesh <jaikumar@google.com>
Date: Fri, 19 Nov 2010 18:23:29 -0800
Subject: [PATCH] serial: tegra_hsuart: Use resources instead of platform data.

Use resources to pass data to tegra_hsuart to set
mapbase, irq.

Signed-off-by: Jaikumar Ganesh <jaikumar@google.com>
---
 arch/arm/mach-tegra/devices.c | 85 ++++++++++++++++++++---------------
 arch/arm/mach-tegra/devices.h | 10 ++---
 drivers/serial/tegra_hsuart.c | 19 ++++++--
 3 files changed, 70 insertions(+), 44 deletions(-)

diff --git a/arch/arm/mach-tegra/devices.c b/arch/arm/mach-tegra/devices.c
index d976fc49ec52..8059e039fc01 100644
--- a/arch/arm/mach-tegra/devices.c
+++ b/arch/arm/mach-tegra/devices.c
@@ -638,102 +638,117 @@ struct platform_device tegra_pwfm3_device = {
 	.resource	= &tegra_pwfm3_resource,
 };
 
-static struct plat_serial8250_port tegra_uart0_port[] = {
+static struct resource tegra_uarta_resources[] = {
 	[0] = {
-		.mapbase	= TEGRA_UARTA_BASE,
-		.membase	= IO_ADDRESS(TEGRA_UARTA_BASE),
-		.irq		= INT_UARTA,
+		.start 	= TEGRA_UARTA_BASE,
+		.end	= TEGRA_UARTA_BASE + TEGRA_UARTA_SIZE - 1,
+		.flags	= IORESOURCE_MEM,
 	},
 	[1] = {
-		.flags		= 0,
+		.start	= INT_UARTA,
+		.end	= INT_UARTA,
+		.flags	= IORESOURCE_IRQ,
 	},
 };
 
-static struct plat_serial8250_port tegra_uart1_port[] = {
+static struct resource tegra_uartb_resources[]= {
 	[0] = {
-		.mapbase	= TEGRA_UARTB_BASE,
-		.membase	= IO_ADDRESS(TEGRA_UARTB_BASE),
-		.irq		= INT_UARTB,
+		.start 	= TEGRA_UARTB_BASE,
+		.end	= TEGRA_UARTB_BASE + TEGRA_UARTB_SIZE - 1,
+		.flags	= IORESOURCE_MEM,
 	},
 	[1] = {
-		.flags		= 0,
+		.start	= INT_UARTB,
+		.end	= INT_UARTB,
+		.flags	= IORESOURCE_IRQ,
 	},
 };
 
-static struct plat_serial8250_port tegra_uart2_port[] = {
+static struct resource tegra_uartc_resources[] = {
 	[0] = {
-		.mapbase	= TEGRA_UARTC_BASE,
-		.membase	= IO_ADDRESS(TEGRA_UARTC_BASE),
-		.irq		= INT_UARTC,
+		.start 	= TEGRA_UARTC_BASE,
+		.end	= TEGRA_UARTC_BASE + TEGRA_UARTC_SIZE - 1,
+		.flags	= IORESOURCE_MEM,
 	},
 	[1] = {
-		.flags		= 0,
+		.start	= INT_UARTC,
+		.end	= INT_UARTC,
+		.flags	= IORESOURCE_IRQ,
 	},
 };
 
-static struct plat_serial8250_port tegra_uart3_port[] = {
+static struct resource tegra_uartd_resources[] = {
 	[0] = {
-		.mapbase	= TEGRA_UARTD_BASE,
-		.membase	= IO_ADDRESS(TEGRA_UARTD_BASE),
-		.irq		= INT_UARTD,
+		.start 	= TEGRA_UARTD_BASE,
+		.end	= TEGRA_UARTD_BASE + TEGRA_UARTD_SIZE - 1,
+		.flags	= IORESOURCE_MEM,
 	},
 	[1] = {
-		.flags		= 0,
+		.start	= INT_UARTD,
+		.end	= INT_UARTD,
+		.flags	= IORESOURCE_IRQ,
 	},
 };
 
-static struct plat_serial8250_port tegra_uart4_port[] = {
+static struct resource tegra_uarte_resources[] = {
 	[0] = {
-		.mapbase	= TEGRA_UARTE_BASE,
-		.membase	= IO_ADDRESS(TEGRA_UARTE_BASE),
-		.irq		= INT_UARTE,
+		.start 	= TEGRA_UARTE_BASE,
+		.end	= TEGRA_UARTE_BASE + TEGRA_UARTE_SIZE - 1,
+		.flags	= IORESOURCE_MEM,
 	},
 	[1] = {
-		.flags		= 0,
+		.start	= INT_UARTE,
+		.end	= INT_UARTE,
+		.flags	= IORESOURCE_IRQ,
 	},
 };
 
-struct platform_device tegra_uart0_device = {
+struct platform_device tegra_uarta_device = {
 	.name	= "tegra_uart",
 	.id	= 0,
+	.num_resources	= ARRAY_SIZE(tegra_uarta_resources),
+	.resource	= tegra_uarta_resources,
 	.dev	= {
-		.platform_data		= tegra_uart0_port,
 		.coherent_dma_mask	= DMA_BIT_MASK(32),
 	},
 };
 
-struct platform_device tegra_uart1_device = {
+struct platform_device tegra_uartb_device = {
 	.name	= "tegra_uart",
 	.id	= 1,
+	.num_resources	= ARRAY_SIZE(tegra_uartb_resources),
+	.resource	= tegra_uartb_resources,
 	.dev	= {
-		.platform_data		= tegra_uart1_port,
 		.coherent_dma_mask	= DMA_BIT_MASK(32),
 	},
 };
 
-struct platform_device tegra_uart2_device = {
+struct platform_device tegra_uartc_device = {
 	.name	= "tegra_uart",
 	.id	= 2,
+	.num_resources	= ARRAY_SIZE(tegra_uartc_resources),
+	.resource	= tegra_uartc_resources,
 	.dev	= {
-		.platform_data		= tegra_uart2_port,
 		.coherent_dma_mask	= DMA_BIT_MASK(32),
 	},
 };
 
-struct platform_device tegra_uart3_device = {
+struct platform_device tegra_uartd_device = {
 	.name	= "tegra_uart",
 	.id	= 3,
+	.num_resources	= ARRAY_SIZE(tegra_uartd_resources),
+	.resource	= tegra_uartd_resources,
 	.dev	= {
-		.platform_data		= tegra_uart3_port,
 		.coherent_dma_mask	= DMA_BIT_MASK(32),
 	},
 };
 
-struct platform_device tegra_uart4_device = {
+struct platform_device tegra_uarte_device = {
 	.name	= "tegra_uart",
 	.id	= 4,
+	.num_resources	= ARRAY_SIZE(tegra_uarte_resources),
+	.resource	= tegra_uarte_resources,
 	.dev	= {
-		.platform_data		= tegra_uart4_port,
 		.coherent_dma_mask	= DMA_BIT_MASK(32),
 	},
 };
diff --git a/arch/arm/mach-tegra/devices.h b/arch/arm/mach-tegra/devices.h
index d309313bf7dc..cbf141682989 100644
--- a/arch/arm/mach-tegra/devices.h
+++ b/arch/arm/mach-tegra/devices.h
@@ -50,11 +50,11 @@ extern struct platform_device tegra_pwfm1_device;
 extern struct platform_device tegra_pwfm2_device;
 extern struct platform_device tegra_pwfm3_device;
 extern struct platform_device tegra_otg_device;
-extern struct platform_device tegra_uart0_device;
-extern struct platform_device tegra_uart1_device;
-extern struct platform_device tegra_uart2_device;
-extern struct platform_device tegra_uart3_device;
-extern struct platform_device tegra_uart4_device;
+extern struct platform_device tegra_uarta_device;
+extern struct platform_device tegra_uartb_device;
+extern struct platform_device tegra_uartc_device;
+extern struct platform_device tegra_uartd_device;
+extern struct platform_device tegra_uarte_device;
 extern struct platform_device tegra_spdif_device;
 extern struct platform_device tegra_grhost_device;
 extern struct platform_device tegra_spdif_device;
diff --git a/drivers/serial/tegra_hsuart.c b/drivers/serial/tegra_hsuart.c
index 292863ccaaa0..09f5f454683c 100644
--- a/drivers/serial/tegra_hsuart.c
+++ b/drivers/serial/tegra_hsuart.c
@@ -1221,8 +1221,8 @@ static int __devexit tegra_uart_remove(struct platform_device *pdev)
 static int tegra_uart_probe(struct platform_device *pdev)
 {
 	struct tegra_uart_port *t;
-	struct plat_serial8250_port *pdata = pdev->dev.platform_data;
 	struct uart_port *u;
+	struct resource *resource;
 	int ret;
 	char name[64];
 	if (pdev->id < 0 || pdev->id > tegra_uart_driver.nr) {
@@ -1242,9 +1242,20 @@ static int tegra_uart_probe(struct platform_device *pdev)
 	u->ops = &tegra_uart_ops;
 	u->type = ~PORT_UNKNOWN;
 	u->fifosize = 32;
-	u->mapbase = pdata->mapbase;
-	u->membase = pdata->membase;
-	u->irq = pdata->irq;
+
+	resource = platform_get_resource(pdev, IORESOURCE_MEM, 0);
+	if (unlikely(!resource))
+		return -ENXIO;
+
+	u->mapbase = resource->start;
+	u->membase = IO_ADDRESS(u->mapbase);
+	if (unlikely(!u->membase))
+		return -ENOMEM;
+
+	u->irq = platform_get_irq(pdev, 0);
+	if (unlikely(u->irq < 0))
+		return -ENXIO;
+
 	u->regshift = 2;
 
 	t->clk = clk_get(&pdev->dev, NULL);
-- 
2.34.1