diff mbox

[4/4] DM365: Add platform resource management

Message ID 1270738918-30050-6-git-send-email-thomas.koeller@baslerweb.com (mailing list archive)
State Changes Requested
Headers show

Commit Message

thomas.koeller@baslerweb.com April 8, 2010, 3:01 p.m. UTC
None
diff mbox

Patch

diff --git a/arch/arm/mach-davinci/dm365.c b/arch/arm/mach-davinci/dm365.c
index 0813dce..33be53e 100644
--- a/arch/arm/mach-davinci/dm365.c
+++ b/arch/arm/mach-davinci/dm365.c
@@ -617,6 +617,74 @@  EVT_CFG(DM365,	EVT3_ASP_RX,         1,     1,    0,     false)
 #endif
 };
 
+/* root resource for configuration register space */
+struct resource resource_cfg_root = {
+	.name	= "DM365 peripherals",
+	.start	= 0x01c00000,
+	.end	= 0x01ffffff,
+	.flags	= IORESOURCE_MEM
+};
+EXPORT_SYMBOL(resource_cfg_root);
+
+/* root resource for DMA channels */
+struct resource resource_dma_root = {
+	.name	= "DM365 DMA",
+	.start	= 0,
+	.end	= 63,
+	.flags	= IORESOURCE_DMA
+};
+EXPORT_SYMBOL(resource_dma_root);
+
+/* root resource for DMA event queues */
+struct resource resource_evq_root = {
+	.name	= "DM365 EVQ",
+	.start	= 0,
+	.end	= 3,
+	.flags	= IORESOURCE_DMA
+};
+EXPORT_SYMBOL(resource_evq_root);
+
+/* root resource for IRQ numbers */
+struct resource resource_irq_root = {
+	.name	= "DM365 IRQ",
+	.start	= 0,
+	.end	= 63,
+	.flags	= IORESOURCE_IRQ
+};
+EXPORT_SYMBOL(resource_irq_root);
+
+/* Allocate resources for platform device */
+static int alloc_platform_resources(const struct platform_device *dev)
+{
+	int n;
+
+	for (n = 0; n < dev->num_resources; ++n) {
+		int res;
+		struct resource *rsrc = &dev->resource[n];
+
+		res = request_resource(rsrc->parent, rsrc);
+		if (likely(!res))
+			continue;
+
+		/* bail out */
+		pr_warning("Resource allocation failed for '%s'\n", rsrc->name);
+		while (--n >= 0) {
+			struct resource *parent;
+
+			/* preserve the parent pointer */
+			rsrc = &dev->resource[n];
+			parent = rsrc->parent;
+			release_resource(rsrc);
+			rsrc->parent = parent;
+		}
+
+		return res;
+	}
+
+	return 0;
+}
+
+
 static u64 dm365_spi_dma_mask = DMA_BIT_MASK(32);
 
 enum dm365_spi_resource_index {
@@ -627,100 +695,158 @@  enum dm365_spi_resource_index {
 	spirsrc_evqdma
 };
 
+static const char
+	spi0_name[] = "SPI0",
+	spi1_name[] = "SPI1",
+	spi2_name[] = "SPI2",
+	spi3_name[] = "SPI3",
+	spi4_name[] = "SPI4";
 
-static struct resource dm365_spi_resources[spirsrc_evqdma + 1][5] = {
-	{
+
+static struct resource
+dm365_spi_resources[spirsrc_evqdma + 1][5] = {
+	[0] = {
 		[spirsrc_iomem] = {
+			.name	= spi0_name,
+			.parent	= &resource_cfg_root,
 			.start	= 0x01c66000,
 			.end	= 0x01c667ff,
 			.flags	= IORESOURCE_MEM,
 		},
 		[spirsrc_irq] = {
+			.name	= spi0_name,
+			.parent	= &resource_irq_root,
 			.flags	= IORESOURCE_IRQ,
 		},
 		[spirsrc_rxdma] = {
+			.name	= spi0_name,
+			.parent	= &resource_dma_root,
 			.flags	= IORESOURCE_DMA | IORESOURCE_DMA_RX_CHAN,
 		},
 		[spirsrc_txdma] = {
+			.name	= spi0_name,
+			.parent	= &resource_dma_root,
 			.flags	= IORESOURCE_DMA | IORESOURCE_DMA_TX_CHAN,
 		},
 		[spirsrc_evqdma] = {
+			.name	= spi0_name,
+			.parent	= &resource_evq_root,
 			.flags	= IORESOURCE_DMA | IORESOURCE_DMA_EVENT_Q,
 		}
 	},
-	{
+	[1] = {
 		[spirsrc_iomem] = {
+			.name	= spi1_name,
+			.parent	= &resource_cfg_root,
 			.start	= 0x01c66800,
 			.end	= 0x01c66fff,
 			.flags	= IORESOURCE_MEM,
 		},
 		[spirsrc_irq] = {
+			.name	= spi1_name,
+			.parent	= &resource_irq_root,
 			.flags	= IORESOURCE_IRQ,
 		},
 		[spirsrc_rxdma] = {
+			.name	= spi1_name,
+			.parent	= &resource_dma_root,
 			.flags	= IORESOURCE_DMA | IORESOURCE_DMA_RX_CHAN,
 		},
 		[spirsrc_txdma] = {
+			.name	= spi1_name,
+			.parent	= &resource_dma_root,
 			.flags	= IORESOURCE_DMA | IORESOURCE_DMA_TX_CHAN,
 		},
 		[spirsrc_evqdma] = {
+			.name	= spi1_name,
+			.parent	= &resource_evq_root,
 			.flags	= IORESOURCE_DMA | IORESOURCE_DMA_EVENT_Q,
 		}
 	},
-	{
+	[2] = {
 		[spirsrc_iomem] = {
+			.name	= spi2_name,
+			.parent	= &resource_cfg_root,
 			.start	= 0x01c67800,
 			.end	= 0x01c67fff,
 			.flags	= IORESOURCE_MEM,
 		},
 		[spirsrc_irq] = {
+			.name	= spi2_name,
+			.parent	= &resource_irq_root,
 			.flags	= IORESOURCE_IRQ,
 		},
 		[spirsrc_rxdma] = {
+			.name	= spi2_name,
+			.parent	= &resource_dma_root,
 			.flags	= IORESOURCE_DMA | IORESOURCE_DMA_RX_CHAN,
 		},
 		[spirsrc_txdma] = {
+			.name	= spi2_name,
+			.parent	= &resource_dma_root,
 			.flags	= IORESOURCE_DMA | IORESOURCE_DMA_TX_CHAN,
 		},
 		[spirsrc_evqdma] = {
+			.name	= spi2_name,
+			.parent	= &resource_evq_root,
 			.flags	= IORESOURCE_DMA | IORESOURCE_DMA_EVENT_Q,
 		}
 	},
-	{
+	[3] = {
 		[spirsrc_iomem] = {
+			.name	= spi3_name,
+			.parent	= &resource_cfg_root,
 			.start	= 0x01c68000,
 			.end	= 0x01c687ff,
 			.flags	= IORESOURCE_MEM,
 		},
 		[spirsrc_irq] = {
+			.name	= spi3_name,
+			.parent	= &resource_irq_root,
 			.flags	= IORESOURCE_IRQ,
 		},
 		[spirsrc_rxdma] = {
+			.name	= spi3_name,
+			.parent	= &resource_dma_root,
 			.flags	= IORESOURCE_DMA | IORESOURCE_DMA_RX_CHAN,
 		},
 		[spirsrc_txdma] = {
+			.name	= spi3_name,
+			.parent	= &resource_dma_root,
 			.flags	= IORESOURCE_DMA | IORESOURCE_DMA_TX_CHAN,
 		},
 		[spirsrc_evqdma] = {
+			.name	= spi3_name,
+			.parent	= &resource_evq_root,
 			.flags	= IORESOURCE_DMA | IORESOURCE_DMA_EVENT_Q,
 		}
 	},
-	{
+	[4] = {
 		[spirsrc_iomem] = {
+			.name	= spi4_name,
+			.parent	= &resource_cfg_root,
 			.start	= 0x01c23000,
 			.end	= 0x01c237ff,
 			.flags	= IORESOURCE_MEM,
 		},
 		[spirsrc_irq] = {
+			.name	= spi4_name,
+			.parent	= &resource_irq_root,
 			.flags	= IORESOURCE_IRQ,
 		},
 		[spirsrc_rxdma] = {
+			.name	= spi4_name,
+			.parent	= &resource_dma_root,
 			.flags	= IORESOURCE_DMA | IORESOURCE_DMA_RX_CHAN,
 		},
 		[spirsrc_txdma] = {
+			.name	= spi4_name,
+			.parent	= &resource_dma_root,
 			.flags	= IORESOURCE_DMA | IORESOURCE_DMA_TX_CHAN,
 		},
 		[spirsrc_evqdma] = {
+			.name	= spi4_name,
+			.parent	= &resource_evq_root,
 			.flags	= IORESOURCE_DMA | IORESOURCE_DMA_EVENT_Q,
 		}
 	}
@@ -856,6 +982,11 @@  void __init dm365_init_spi(struct dm365_spi_unit_desc *unit,
 	pdev->resource[spirsrc_evqdma].start =
 	pdev->resource[spirsrc_evqdma].end = unit->dma_evtq;
 
+	if (alloc_platform_resources(pdev)) {
+		pr_err("Resource allocation failed for SPI%u\n", hwunit);
+		return;
+	};
+
 	pr_debug("Creating SPI%u: irq = %u, dma_rx = %u, dma_tx = %u, "
 		"dma_evq = %u",
 		hwunit, unit->irq, unit->dma_rx_chan, unit->dma_tx_chan,
@@ -874,6 +1005,8 @@  void __init dm365_init_spi(struct dm365_spi_unit_desc *unit,
 static u64 dm365_ipipeif_dma_mask = DMA_BIT_MASK(32);
 static struct resource dm365_ipipeif_resources[] = {
 	{
+		.name		= "IPIPEIF",
+		.parent		= &resource_cfg_root,
 		.start          = 0x01C71200,
 		.end            = 0x01C71200 + 0x60,
 		.flags          = IORESOURCE_MEM,
@@ -901,11 +1034,13 @@  static struct davinci_osd_platform_data dm365_osd_pdata = {
 
 static struct resource dm365_osd_resources[] = {
 	{
+		.parent		= &resource_irq_root,
 		.start          = IRQ_VENCINT,
 		.end            = IRQ_VENCINT,
 		.flags          = IORESOURCE_IRQ,
 	},
 	{
+		.parent		= &resource_cfg_root,
 		.start          = DM365_OSD_REG_BASE,
 		.end            = DM365_OSD_REG_BASE + OSD_REG_SIZE,
 		.flags          = IORESOURCE_MEM,
@@ -931,9 +1066,12 @@  static struct davinci_venc_platform_data dm365_venc_pdata = {
 	.soc = DM36x,
 };
 
+static const char venc_name[] = "davinci_venc";
 
 static struct resource dm365_venc_resources[] = {
 	{
+		.name		= venc_name,
+		.parent		= &resource_cfg_root,
 		.start          = DM365_VENC_REG_BASE,
 		.end            = DM365_VENC_REG_BASE + 0x180,
 		.flags          = IORESOURCE_MEM,
@@ -941,7 +1079,7 @@  static struct resource dm365_venc_resources[] = {
 };
 
 static struct platform_device dm365_venc_dev = {
-	.name		= "davinci_venc",
+	.name		= venc_name,
 	.id		= -1,
 	.num_resources	= ARRAY_SIZE(dm365_venc_resources),
 	.resource	= dm365_venc_resources,
@@ -961,28 +1099,40 @@  static struct emac_platform_data dm365_emac_pdata = {
 	.version		= EMAC_VERSION_2,
 };
 
+static const char emac_name[] = "davinci_emac";
+
 static struct resource dm365_emac_resources[] = {
 	{
+		.name	= emac_name,
+		.parent	= &resource_cfg_root,
 		.start	= DM365_EMAC_BASE,
 		.end	= DM365_EMAC_BASE + 0x47ff,
 		.flags	= IORESOURCE_MEM,
 	},
 	{
+		.name	= emac_name,
+		.parent	= &resource_irq_root,
 		.start	= IRQ_DM365_EMAC_RXTHRESH,
 		.end	= IRQ_DM365_EMAC_RXTHRESH,
 		.flags	= IORESOURCE_IRQ,
 	},
 	{
+		.name	= emac_name,
+		.parent	= &resource_irq_root,
 		.start	= IRQ_DM365_EMAC_RXPULSE,
 		.end	= IRQ_DM365_EMAC_RXPULSE,
 		.flags	= IORESOURCE_IRQ,
 	},
 	{
+		.name	= emac_name,
+		.parent	= &resource_irq_root,
 		.start	= IRQ_DM365_EMAC_TXPULSE,
 		.end	= IRQ_DM365_EMAC_TXPULSE,
 		.flags	= IORESOURCE_IRQ,
 	},
 	{
+		.name	= emac_name,
+		.parent	= &resource_irq_root,
 		.start	= IRQ_DM365_EMAC_MISCPULSE,
 		.end	= IRQ_DM365_EMAC_MISCPULSE,
 		.flags	= IORESOURCE_IRQ,
@@ -990,7 +1140,7 @@  static struct resource dm365_emac_resources[] = {
 };
 
 static struct platform_device dm365_emac_device = {
-	.name		= "davinci_emac",
+	.name		= emac_name,
 	.id		= 1,
 	.dev = {
 		.platform_data	= &dm365_emac_pdata,
@@ -1104,42 +1254,51 @@  static struct edma_soc_info dm365_edma_info[] = {
 static struct resource edma_resources[] = {
 	{
 		.name	= "edma_cc0",
+		.parent	= &resource_cfg_root,
 		.start	= 0x01c00000,
 		.end	= 0x01c00000 + SZ_64K - 1,
 		.flags	= IORESOURCE_MEM,
 	},
 	{
 		.name	= "edma_tc0",
+		.parent	= &resource_cfg_root,
 		.start	= 0x01c10000,
 		.end	= 0x01c10000 + SZ_1K - 1,
 		.flags	= IORESOURCE_MEM,
 	},
 	{
 		.name	= "edma_tc1",
+		.parent	= &resource_cfg_root,
 		.start	= 0x01c10400,
 		.end	= 0x01c10400 + SZ_1K - 1,
 		.flags	= IORESOURCE_MEM,
 	},
 	{
 		.name	= "edma_tc2",
+		.parent	= &resource_cfg_root,
 		.start	= 0x01c10800,
 		.end	= 0x01c10800 + SZ_1K - 1,
 		.flags	= IORESOURCE_MEM,
 	},
 	{
 		.name	= "edma_tc3",
+		.parent	= &resource_cfg_root,
 		.start	= 0x01c10c00,
 		.end	= 0x01c10c00 + SZ_1K - 1,
 		.flags	= IORESOURCE_MEM,
 	},
 	{
 		.name	= "edma0",
+		.parent	= &resource_irq_root,
 		.start	= IRQ_CCINT0,
+		.end	= IRQ_CCINT0,
 		.flags	= IORESOURCE_IRQ,
 	},
 	{
 		.name	= "edma0_err",
+		.parent	= &resource_irq_root,
 		.start	= IRQ_CCERRINT,
+		.end	= IRQ_CCERRINT,
 		.flags	= IORESOURCE_IRQ,
 	},
 	/* not using TC*_ERR */
@@ -1153,18 +1312,26 @@  static struct platform_device dm365_edma_device = {
 	.resource		= edma_resources,
 };
 
+static const char asp_name[] = "davinci-asp";
+
 static struct resource dm365_asp_resources[] = {
 	{
+		.name	= asp_name,
+		.parent	= &resource_cfg_root,
 		.start	= DAVINCI_DM365_ASP0_BASE,
 		.end	= DAVINCI_DM365_ASP0_BASE + SZ_8K - 1,
 		.flags	= IORESOURCE_MEM,
 	},
 	{
+		.name	= asp_name,
+		.parent	= &resource_dma_root,
 		.start	= DAVINCI_DMA_ASP0_TX,
 		.end	= DAVINCI_DMA_ASP0_TX,
 		.flags	= IORESOURCE_DMA,
 	},
 	{
+		.name	= asp_name,
+		.parent	= &resource_dma_root,
 		.start	= DAVINCI_DMA_ASP0_RX,
 		.end	= DAVINCI_DMA_ASP0_RX,
 		.flags	= IORESOURCE_DMA,
@@ -1172,26 +1339,33 @@  static struct resource dm365_asp_resources[] = {
 };
 
 static struct platform_device dm365_asp_device = {
-	.name		= "davinci-asp",
+	.name		= asp_name,
 	.id		= 0,
 	.num_resources	= ARRAY_SIZE(dm365_asp_resources),
 	.resource	= dm365_asp_resources,
 };
 
+static const char rtc_name[] = "rtc_davinci";
+
 static struct resource dm365_rtc_resources[] = {
 	{
-		.start = DM365_RTC_BASE,
-		.end = DM365_RTC_BASE + SZ_1K - 1,
-		.flags = IORESOURCE_MEM,
+		.name	= rtc_name,
+		.parent	= &resource_cfg_root,
+		.start	= DM365_RTC_BASE,
+		.end	= DM365_RTC_BASE + SZ_1K - 1,
+		.flags	= IORESOURCE_MEM,
 	},
 	{
-		.start = IRQ_DM365_RTCINT,
-		.flags = IORESOURCE_IRQ,
+		.name = rtc_name,
+		.parent	= &resource_irq_root,
+		.start	= IRQ_DM365_RTCINT,
+		.end	= IRQ_DM365_RTCINT,
+		.flags	= IORESOURCE_IRQ,
 	},
 };
 
 static struct platform_device dm365_rtc_device = {
-	.name = "rtc_davinci",
+	.name = rtc_name,
 	.id = 0,
 	.num_resources = ARRAY_SIZE(dm365_rtc_resources),
 	.resource = dm365_rtc_resources,
@@ -1213,23 +1387,29 @@  static struct map_desc dm365_io_desc[] = {
 	},
 };
 
+static const char ks_name[] = "davinci_keyscan";
+
 static struct resource dm365_ks_resources[] = {
 	{
 		/* registers */
-		.start = DM365_KEYSCAN_BASE,
-		.end = DM365_KEYSCAN_BASE + SZ_1K - 1,
-		.flags = IORESOURCE_MEM,
+		.name	= ks_name,
+		.parent	= &resource_cfg_root,
+		.start	= DM365_KEYSCAN_BASE,
+		.end	= DM365_KEYSCAN_BASE + SZ_1K - 1,
+		.flags	= IORESOURCE_MEM,
 	},
 	{
 		/* interrupt */
-		.start = IRQ_DM365_KEYINT,
-		.end = IRQ_DM365_KEYINT,
-		.flags = IORESOURCE_IRQ,
+		.start	= IRQ_DM365_KEYINT,
+		.parent	= &resource_irq_root,
+		.start	= IRQ_DM365_KEYINT,
+		.end	= IRQ_DM365_KEYINT,
+		.flags	= IORESOURCE_IRQ,
 	},
 };
 
 static struct platform_device dm365_ks_device = {
-	.name		= "davinci_keyscan",
+	.name		= ks_name,
 	.id		= 0,
 	.num_resources	= ARRAY_SIZE(dm365_ks_resources),
 	.resource	= dm365_ks_resources,
@@ -1257,7 +1437,7 @@  static void __iomem *dm365_psc_bases[] = {
 	IO_ADDRESS(DAVINCI_PWR_SLEEP_CNTRL_BASE),
 };
 
-struct davinci_timer_info dm365_timer_info = {
+static struct davinci_timer_info dm365_timer_info = {
 	.timers		= davinci_timer_instance,
 	.clockevent_id	= T0_BOT,
 	.clocksource_id	= T0_TOP,
@@ -1331,7 +1511,8 @@  void __init dm365_init_asp(struct snd_platform_data *pdata)
 	davinci_cfg_reg(DM365_EVT2_ASP_TX);
 	davinci_cfg_reg(DM365_EVT3_ASP_RX);
 	dm365_asp_device.dev.platform_data = pdata;
-	platform_device_register(&dm365_asp_device);
+	if (!alloc_platform_resources(&dm365_asp_device))
+		platform_device_register(&dm365_asp_device);
 }
 
 void __init dm365_init_ks(struct davinci_ks_platform_data *pdata)
@@ -1343,7 +1524,8 @@  void __init dm365_init_ks(struct davinci_ks_platform_data *pdata)
 void __init dm365_init_rtc(void)
 {
 	davinci_cfg_reg(DM365_INT_PRTCSS);
-	platform_device_register(&dm365_rtc_device);
+	if (!alloc_platform_resources(&dm365_rtc_device))
+		platform_device_register(&dm365_rtc_device);
 }
 
 void __init dm365_init(void)
@@ -1351,17 +1533,21 @@  void __init dm365_init(void)
 	davinci_common_init(&davinci_soc_info_dm365);
 }
 
+static const char vpss_name[] = "vpss";
+
 static struct resource dm365_vpss_resources[] = {
 	{
 		/* VPSS ISP5 Base address */
-		.name           = "vpss",
+		.name           = vpss_name,
+		.parent		= &resource_cfg_root,
 		.start          = 0x01c70000,
 		.end            = 0x01c70000 + 0xff,
 		.flags          = IORESOURCE_MEM,
 	},
 	{
 		/* VPSS CLK Base address */
-		.name           = "vpss",
+		.name           = vpss_name,
+		.parent		= &resource_cfg_root,
 		.start          = 0x01c70200,
 		.end            = 0x01c70200 + 0xff,
 		.flags          = IORESOURCE_MEM,
@@ -1369,20 +1555,26 @@  static struct resource dm365_vpss_resources[] = {
 };
 
 static struct platform_device dm365_vpss_device = {
-       .name                   = "vpss",
+       .name                   = vpss_name,
        .id                     = -1,
        .dev.platform_data      = "dm365_vpss",
        .num_resources          = ARRAY_SIZE(dm365_vpss_resources),
        .resource               = dm365_vpss_resources,
 };
 
+static const char cptr_name[] = CAPTURE_DRV_NAME;
+
 static struct resource vpfe_resources[] = {
 	{
+		.name		= cptr_name,
+		.parent		= &resource_irq_root,
 		.start          = IRQ_VDINT0,
 		.end            = IRQ_VDINT0,
 		.flags          = IORESOURCE_IRQ,
 	},
 	{
+		.name		= cptr_name,
+		.parent		= &resource_irq_root,
 		.start          = IRQ_VDINT1,
 		.end            = IRQ_VDINT1,
 		.flags          = IORESOURCE_IRQ,
@@ -1391,7 +1583,7 @@  static struct resource vpfe_resources[] = {
 
 static u64 vpfe_capture_dma_mask = DMA_BIT_MASK(32);
 static struct platform_device vpfe_capture_dev = {
-	.name           = CAPTURE_DRV_NAME,
+	.name           = cptr_name,
 	.id             = -1,
 	.num_resources  = ARRAY_SIZE(vpfe_resources),
 	.resource       = vpfe_resources,
@@ -1401,28 +1593,36 @@  static struct platform_device vpfe_capture_dev = {
 	},
 };
 
+static const char isif_name[] = "dm365_isif";
+
 static struct resource isif_resource[] = {
 	/* ISIF Base address */
 	{
+		.name		= isif_name,
+		.parent		= &resource_cfg_root,
 		.start          = 0x01c71000,
 		.end            = 0x01c71000 + 0x1ff,
 		.flags          = IORESOURCE_MEM,
 	},
 	/* ISIF Linearization table 0 */
 	{
+		.name		= isif_name,
+		.parent		= &resource_cfg_root,
 		.start          = 0x1C7C000,
 		.end            = 0x1C7C000 + 0x2ff,
 		.flags          = IORESOURCE_MEM,
 	},
 	/* ISIF Linearization table 1 */
 	{
+		.name		= isif_name,
+		.parent		= &resource_cfg_root,
 		.start          = 0x1C7C400,
 		.end            = 0x1C7C400 + 0x2ff,
 		.flags          = IORESOURCE_MEM,
 	},
 };
 static struct platform_device dm365_isif_dev = {
-	.name           = "dm365_isif",
+	.name           = isif_name,
 	.id             = -1,
 	.num_resources  = ARRAY_SIZE(isif_resource),
 	.resource       = isif_resource,
@@ -1437,24 +1637,35 @@  static int __init dm365_init_devices(void)
 	if (!cpu_is_davinci_dm365())
 		return 0;
 
+	if (request_resource(&iomem_resource, &resource_cfg_root))
+		BUG();
+
 	davinci_cfg_reg(DM365_INT_EDMA_CC);
-	platform_device_register(&dm365_edma_device);
-	platform_device_register(&dm365_emac_device);
+	if (!alloc_platform_resources(&dm365_edma_device))
+		platform_device_register(&dm365_edma_device);
+	if (!alloc_platform_resources(&dm365_emac_device))
+		platform_device_register(&dm365_emac_device);
 
 	/*
 	* setup Mux configuration for vpfe input and register
 	* vpfe capture platform device
 	*/
-	platform_device_register(&dm365_vpss_device);
-	platform_device_register(&dm365_ipipeif_dev);
-	platform_device_register(&dm365_isif_dev);
-	platform_device_register(&vpfe_capture_dev);
+	if (!alloc_platform_resources(&dm365_vpss_device))
+		platform_device_register(&dm365_vpss_device);
+	if (!alloc_platform_resources(&dm365_ipipeif_dev))
+		platform_device_register(&dm365_ipipeif_dev);
+	if (!alloc_platform_resources(&dm365_isif_dev))
+		platform_device_register(&dm365_isif_dev);
+	if (!alloc_platform_resources(&vpfe_capture_dev))
+		platform_device_register(&vpfe_capture_dev);
 
 	/* Register OSD device */
-	platform_device_register(&dm365_osd_dev);
+	if (!alloc_platform_resources(&dm365_osd_dev))
+		platform_device_register(&dm365_osd_dev);
 
 	/* Register VENC device */
-	platform_device_register(&dm365_venc_dev);
+	if (!alloc_platform_resources(&dm365_venc_dev))
+		platform_device_register(&dm365_venc_dev);
 
 	return 0;
 }
diff --git a/arch/arm/mach-davinci/dma.c b/arch/arm/mach-davinci/dma.c
index 5cd48fa..8abc707 100644
--- a/arch/arm/mach-davinci/dma.c
+++ b/arch/arm/mach-davinci/dma.c
@@ -1430,14 +1430,6 @@  static int __init edma_probe(struct platform_device *pdev)
 			found = 1;
 
 		len[j] = resource_size(r[j]);
-
-		r[j] = request_mem_region(r[j]->start, len[j],
-			dev_name(&pdev->dev));
-		if (!r[j]) {
-			status = -EBUSY;
-			goto fail1;
-		}
-
 		edmacc_regs_base[j] = ioremap(r[j]->start, len[j]);
 		if (!edmacc_regs_base[j]) {
 			status = -EBUSY;
diff --git a/arch/arm/mach-davinci/include/mach/dm365.h b/arch/arm/mach-davinci/include/mach/dm365.h
index 3d2a823..2cd1134 100644
--- a/arch/arm/mach-davinci/include/mach/dm365.h
+++ b/arch/arm/mach-davinci/include/mach/dm365.h
@@ -14,6 +14,7 @@ 
 #define __ASM_ARCH_DM665_H
 
 #include <linux/platform_device.h>
+#include <linux/ioport.h>
 #include <mach/hardware.h>
 #include <media/davinci/vpfe_capture.h>
 #include <mach/emac.h>
@@ -33,6 +34,13 @@ 
 /* Base of key scan register bank */
 #define DM365_KEYSCAN_BASE		(0x01C69400)
 
+/* Root resources */
+extern struct resource
+	resource_cfg_root,
+	resource_dma_root,
+	resource_irq_root,
+	resource_evq_root;
+
 void __init dm365_init(void);
 void __init dm365_init_asp(struct snd_platform_data *pdata);
 void __init dm365_init_rtc(void);
diff --git a/drivers/i2c/busses/i2c-davinci.c b/drivers/i2c/busses/i2c-davinci.c
index 67d88cc..4327ad9 100755
--- a/drivers/i2c/busses/i2c-davinci.c
+++ b/drivers/i2c/busses/i2c-davinci.c
@@ -520,7 +520,7 @@  static int davinci_i2c_probe(struct platform_device *pdev)
 {
 	struct davinci_i2c_dev *dev;
 	struct i2c_adapter *adap;
-	struct resource *mem, *irq, *ioarea;
+	struct resource *mem, *irq;
 	int r;
 
 	/* NOTE: driver uses the static register mapping */
@@ -536,13 +536,6 @@  static int davinci_i2c_probe(struct platform_device *pdev)
 		return -ENODEV;
 	}
 
-	ioarea = request_mem_region(mem->start, resource_size(mem),
-				    pdev->name);
-	if (!ioarea) {
-		dev_err(&pdev->dev, "I2C region already claimed\n");
-		return -EBUSY;
-	}
-
 	dev = kzalloc(sizeof(struct davinci_i2c_dev), GFP_KERNEL);
 	if (!dev) {
 		r = -ENOMEM;
diff --git a/drivers/mmc/host/davinci_mmc.c b/drivers/mmc/host/davinci_mmc.c
index 1bf0587..cf69c2e 100644
--- a/drivers/mmc/host/davinci_mmc.c
+++ b/drivers/mmc/host/davinci_mmc.c
@@ -1183,9 +1183,7 @@  static int __init davinci_mmcsd_probe(struct platform_device *pdev)
 
 	ret = -EBUSY;
 	mem_size = resource_size(r);
-	mem = request_mem_region(r->start, mem_size, pdev->name);
-	if (!mem)
-		goto out;
+	mem = r;
 
 	ret = -ENOMEM;
 	mmc = mmc_alloc_host(sizeof(struct mmc_davinci_host), &pdev->dev);
diff --git a/drivers/spi/davinci_spi.c b/drivers/spi/davinci_spi.c
index 02e1a76..a5211d8 100644
--- a/drivers/spi/davinci_spi.c
+++ b/drivers/spi/davinci_spi.c
@@ -874,7 +874,7 @@  static irqreturn_t davinci_spi_irq(s32 irq, void *context_data)
 	return ret;
 }
 
-resource_size_t davinci_spi_get_dma_by_flag(struct platform_device *dev,
+static resource_size_t davinci_spi_get_dma_by_flag(struct platform_device *dev,
 		unsigned long flag)
 {
 	struct resource *r;
@@ -907,7 +907,7 @@  static int davinci_spi_probe(struct platform_device *pdev)
 	struct spi_master *master;
 	struct davinci_spi *davinci_spi;
 	struct davinci_spi_platform_data *pdata;
-	struct resource *r, *mem;
+	struct resource *r;
 	resource_size_t dma_rx_chan = DAVINCI_SPI_NO_RESOURCE;
 	resource_size_t	dma_tx_chan = DAVINCI_SPI_NO_RESOURCE;
 	resource_size_t	dma_eventq = DAVINCI_SPI_NO_RESOURCE;
@@ -942,19 +942,11 @@  static int davinci_spi_probe(struct platform_device *pdev)
 	davinci_spi->pbase = r->start;
 	davinci_spi->region_size = resource_size(r);
 	davinci_spi->pdata = pdata;
-
-	mem = request_mem_region(r->start, davinci_spi->region_size,
-					pdev->name);
-	if (mem == NULL) {
-		ret = -EBUSY;
-		goto free_master;
-	}
-
 	davinci_spi->base = (struct davinci_spi_reg __iomem *)
 			ioremap(r->start, davinci_spi->region_size);
 	if (davinci_spi->base == NULL) {
 		ret = -ENOMEM;
-		goto release_region;
+		goto free_master;
 	}
 
 	davinci_spi->irq = platform_get_irq(pdev, 0);
@@ -1094,8 +1086,6 @@  err1:
 	free_irq(davinci_spi->irq, davinci_spi);
 unmap_io:
 	iounmap(davinci_spi->base);
-release_region:
-	release_mem_region(davinci_spi->pbase, davinci_spi->region_size);
 free_master:
 	kfree(master);
 err: