@@ -11,10 +11,10 @@ obj-$(CONFIG_DAVINCI_MUX) += mux.o
obj-$(CONFIG_PCI) += pci-generic.o
# Chip specific
-obj-$(CONFIG_ARCH_DAVINCI_DM644x) += dm644x.o devices.o
-obj-$(CONFIG_ARCH_DAVINCI_DM355) += dm355.o devices.o
-obj-$(CONFIG_ARCH_DAVINCI_DM646x) += dm646x.o devices.o
-obj-$(CONFIG_ARCH_DAVINCI_DM365) += dm365.o devices.o
+obj-$(CONFIG_ARCH_DAVINCI_DM644x) += dm644x.o devices.o platform-resources.o
+obj-$(CONFIG_ARCH_DAVINCI_DM355) += dm355.o devices.o platform-resources.o
+obj-$(CONFIG_ARCH_DAVINCI_DM646x) += dm646x.o devices.o platform-resources.o
+obj-$(CONFIG_ARCH_DAVINCI_DM365) += dm365.o devices.o platform-resources.o
obj-$(CONFIG_ARCH_DAVINCI_DA830) += da830.o devices-da8xx.o
obj-$(CONFIG_ARCH_DAVINCI_DA850) += da850.o devices-da8xx.o
@@ -27,6 +27,9 @@
#include <mach/mmc.h>
#include <mach/time.h>
+#include "clock.h"
+#include "platform-resources.h"
+
#define DAVINCI_I2C_BASE 0x01C21000
#define DAVINCI_MMCSD0_BASE 0x01E10000
#define DM355_MMCSD0_BASE 0x01E11000
@@ -34,20 +37,27 @@
#define DM365_MMCSD0_BASE 0x01D11000
#define DM365_MMCSD1_BASE 0x01D00000
+static const char i2c_name[] = "i2c_davinci";
+
static struct resource i2c_resources[] = {
{
+ .parent = &resource_cfg_root,
+ .name = i2c_name,
.start = DAVINCI_I2C_BASE,
.end = DAVINCI_I2C_BASE + 0x40,
.flags = IORESOURCE_MEM,
},
{
+ .parent = &resource_irq_root,
+ .name = i2c_name,
.start = IRQ_I2C,
+ .end = IRQ_I2C,
.flags = IORESOURCE_IRQ,
},
};
static struct platform_device davinci_i2c_device = {
- .name = "i2c_davinci",
+ .name = i2c_name,
.id = 1,
.num_resources = ARRAY_SIZE(i2c_resources),
.resource = i2c_resources,
@@ -58,42 +68,59 @@ void __init davinci_init_i2c(struct davinci_i2c_platform_data *pdata)
if (cpu_is_davinci_dm644x())
davinci_cfg_reg(DM644X_I2C);
- davinci_i2c_device.dev.platform_data = pdata;
- (void) platform_device_register(&davinci_i2c_device);
+ if (likely(!alloc_platform_resources(&davinci_i2c_device))) {
+ davinci_i2c_device.dev.platform_data = pdata;
+ (void) platform_device_register(&davinci_i2c_device);
+ }
}
#if defined(CONFIG_MMC_DAVINCI) || defined(CONFIG_MMC_DAVINCI_MODULE)
static u64 mmcsd0_dma_mask = DMA_BIT_MASK(32);
+static const char mmc_name[] = "davinci_mmc";
static struct resource mmcsd0_resources[] = {
{
/* different on dm355 */
- .start = DAVINCI_MMCSD0_BASE,
- .end = DAVINCI_MMCSD0_BASE + SZ_4K - 1,
- .flags = IORESOURCE_MEM,
+ .parent = &resource_cfg_root,
+ .name = mmc_name,
+ .start = DAVINCI_MMCSD0_BASE,
+ .end = DAVINCI_MMCSD0_BASE + SZ_4K - 1,
+ .flags = IORESOURCE_MEM,
},
/* IRQs: MMC/SD, then SDIO */
{
- .start = IRQ_MMCINT,
- .flags = IORESOURCE_IRQ,
+ .parent = &resource_irq_root,
+ .name = mmc_name,
+ .start = IRQ_MMCINT,
+ .end = IRQ_MMCINT,
+ .flags = IORESOURCE_IRQ,
}, {
/* different on dm355 */
- .start = IRQ_SDIOINT,
- .flags = IORESOURCE_IRQ,
+ .parent = &resource_irq_root,
+ .name = mmc_name,
+ .start = IRQ_SDIOINT,
+ .end = IRQ_SDIOINT,
+ .flags = IORESOURCE_IRQ,
},
/* DMA channels: RX, then TX */
{
- .start = EDMA_CTLR_CHAN(0, DAVINCI_DMA_MMCRXEVT),
- .flags = IORESOURCE_DMA,
+ .parent = &resource_dma_root,
+ .name = mmc_name,
+ .start = EDMA_CTLR_CHAN(0, DAVINCI_DMA_MMCRXEVT),
+ .end = EDMA_CTLR_CHAN(0, DAVINCI_DMA_MMCRXEVT),
+ .flags = IORESOURCE_DMA,
}, {
- .start = EDMA_CTLR_CHAN(0, DAVINCI_DMA_MMCTXEVT),
- .flags = IORESOURCE_DMA,
+ .parent = &resource_dma_root,
+ .name = mmc_name,
+ .start = EDMA_CTLR_CHAN(0, DAVINCI_DMA_MMCTXEVT),
+ .end = EDMA_CTLR_CHAN(0, DAVINCI_DMA_MMCTXEVT),
+ .flags = IORESOURCE_DMA,
},
};
static struct platform_device davinci_mmcsd0_device = {
- .name = "davinci_mmc",
+ .name = mmc_name,
.id = 0,
.dev = {
.dma_mask = &mmcsd0_dma_mask,
@@ -107,30 +134,42 @@ static u64 mmcsd1_dma_mask = DMA_BIT_MASK(32);
static struct resource mmcsd1_resources[] = {
{
- .start = DM355_MMCSD1_BASE,
- .end = DM355_MMCSD1_BASE + SZ_4K - 1,
- .flags = IORESOURCE_MEM,
+ .parent = &resource_cfg_root,
+ .name = mmc_name,
+ .start = DM355_MMCSD1_BASE,
+ .end = DM355_MMCSD1_BASE + SZ_4K - 1,
+ .flags = IORESOURCE_MEM,
},
/* IRQs: MMC/SD, then SDIO */
{
- .start = IRQ_DM355_MMCINT1,
- .flags = IORESOURCE_IRQ,
+ .parent = &resource_irq_root,
+ .name = mmc_name,
+ .start = IRQ_DM355_MMCINT1,
+ .end = IRQ_DM355_MMCINT1,
+ .flags = IORESOURCE_IRQ,
}, {
- .start = IRQ_DM355_SDIOINT1,
- .flags = IORESOURCE_IRQ,
+ .parent = &resource_irq_root,
+ .name = mmc_name,
+ .start = IRQ_DM355_SDIOINT1,
+ .end = IRQ_DM355_SDIOINT1,
+ .flags = IORESOURCE_IRQ,
},
/* DMA channels: RX, then TX */
{
- .start = EDMA_CTLR_CHAN(0, 30), /* rx */
- .flags = IORESOURCE_DMA,
+ .parent = &resource_dma_root,
+ .name = mmc_name,
+ .start = EDMA_CTLR_CHAN(0, 30), /* rx */
+ .flags = IORESOURCE_DMA,
}, {
- .start = EDMA_CTLR_CHAN(0, 31), /* tx */
- .flags = IORESOURCE_DMA,
+ .parent = &resource_dma_root,
+ .name = mmc_name,
+ .start = EDMA_CTLR_CHAN(0, 31), /* tx */
+ .flags = IORESOURCE_DMA,
},
};
static struct platform_device davinci_mmcsd1_device = {
- .name = "davinci_mmc",
+ .name = mmc_name,
.id = 1,
.dev = {
.dma_mask = &mmcsd1_dma_mask,
@@ -217,8 +256,10 @@ void __init davinci_setup_mmc(int module, struct davinci_mmc_config *config)
if (WARN_ON(!pdev))
return;
- pdev->dev.platform_data = config;
- platform_device_register(pdev);
+ if (likely(!alloc_platform_resources(pdev))) {
+ pdev->dev.platform_data = config;
+ platform_device_register(pdev);
+ }
}
#else
@@ -231,8 +272,12 @@ void __init davinci_setup_mmc(int module, struct davinci_mmc_config *config)
/*-------------------------------------------------------------------------*/
+static const char wdt_name[] = "watchdog";
+
static struct resource wdt_resources[] = {
{
+ .parent = &resource_cfg_root,
+ .name = wdt_name,
.start = DAVINCI_WDOG_BASE,
.end = DAVINCI_WDOG_BASE + SZ_1K - 1,
.flags = IORESOURCE_MEM,
@@ -240,7 +285,7 @@ static struct resource wdt_resources[] = {
};
struct platform_device davinci_wdt_device = {
- .name = "watchdog",
+ .name = wdt_name,
.id = -1,
.num_resources = ARRAY_SIZE(wdt_resources),
.resource = wdt_resources,
@@ -248,7 +293,8 @@ struct platform_device davinci_wdt_device = {
static void davinci_init_wdt(void)
{
- platform_device_register(&davinci_wdt_device);
+ if (likely(!alloc_platform_resources(&davinci_wdt_device)))
+ platform_device_register(&davinci_wdt_device);
}
/*-------------------------------------------------------------------------*/
@@ -41,6 +41,7 @@
#include "clock.h"
#include "mux.h"
+#include "platform-resources.h"
#define DM365_REF_FREQ 24000000 /* 24 MHz on the DM365 EVM */
@@ -621,6 +622,8 @@ EVT_CFG(DM365, EVT3_ASP_RX, 1, 1, 0, false)
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,
@@ -648,11 +651,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,
@@ -678,9 +683,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,
@@ -688,7 +696,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,
@@ -708,28 +716,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,
@@ -737,7 +757,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,
@@ -851,42 +871,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 */
@@ -900,18 +929,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,
@@ -919,26 +956,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,
@@ -960,23 +1004,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,
@@ -1004,7 +1054,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,
@@ -1078,7 +1128,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)
@@ -1090,7 +1141,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)
@@ -1098,17 +1150,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,
@@ -1116,20 +1172,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,
@@ -1138,7 +1200,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,
@@ -1148,28 +1210,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,
@@ -1184,24 +1254,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;
}
@@ -19,11 +19,12 @@
#include <linux/spi/spi.h>
#include <mach/mux.h>
+#include "platform-resources.h"
#include "spi.h"
-static u64 davinci_spi_dma_mask = DMA_BIT_MASK(32);
+static u64 dm365_spi_dma_mask = DMA_BIT_MASK(32);
-enum davinci_spi_resource_index {
+enum dm365_spi_resource_index {
spirsrc_iomem,
spirsrc_irq,
spirsrc_rxdma,
@@ -31,159 +32,217 @@ enum davinci_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 davinci_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,
}
}
};
-static struct platform_device davinci_spi_device[] = {
+static struct platform_device dm365_spi_device[] = {
{
.name = "spi_davinci",
.id = 0,
.dev = {
- .dma_mask = &davinci_spi_dma_mask,
+ .dma_mask = &dm365_spi_dma_mask,
.coherent_dma_mask = DMA_BIT_MASK(32),
},
- .num_resources = ARRAY_SIZE(davinci_spi_resources[0]),
- .resource = davinci_spi_resources[0]
+ .num_resources = ARRAY_SIZE(dm365_spi_resources[0]),
+ .resource = dm365_spi_resources[0]
},
{
.name = "spi_davinci",
.id = 1,
.dev = {
- .dma_mask = &davinci_spi_dma_mask,
+ .dma_mask = &dm365_spi_dma_mask,
.coherent_dma_mask = DMA_BIT_MASK(32),
},
- .num_resources = ARRAY_SIZE(davinci_spi_resources[1]),
- .resource = davinci_spi_resources[1]
+ .num_resources = ARRAY_SIZE(dm365_spi_resources[1]),
+ .resource = dm365_spi_resources[1]
},
{
.name = "spi_davinci",
.id = 2,
.dev = {
- .dma_mask = &davinci_spi_dma_mask,
+ .dma_mask = &dm365_spi_dma_mask,
.coherent_dma_mask = DMA_BIT_MASK(32),
},
- .num_resources = ARRAY_SIZE(davinci_spi_resources[2]),
- .resource = davinci_spi_resources[2]
+ .num_resources = ARRAY_SIZE(dm365_spi_resources[2]),
+ .resource = dm365_spi_resources[2]
},
{
.name = "spi_davinci",
.id = 3,
.dev = {
- .dma_mask = &davinci_spi_dma_mask,
+ .dma_mask = &dm365_spi_dma_mask,
.coherent_dma_mask = DMA_BIT_MASK(32),
},
- .num_resources = ARRAY_SIZE(davinci_spi_resources[3]),
- .resource = davinci_spi_resources[3]
+ .num_resources = ARRAY_SIZE(dm365_spi_resources[3]),
+ .resource = dm365_spi_resources[3]
},
{
.name = "spi_davinci",
.id = 4,
.dev = {
- .dma_mask = &davinci_spi_dma_mask,
+ .dma_mask = &dm365_spi_dma_mask,
.coherent_dma_mask = DMA_BIT_MASK(32),
},
- .num_resources = ARRAY_SIZE(davinci_spi_resources[4]),
- .resource = davinci_spi_resources[4]
+ .num_resources = ARRAY_SIZE(dm365_spi_resources[4]),
+ .resource = dm365_spi_resources[4]
}
};
-struct davinci_spi_pins {
+struct dm365_spi_pins {
int sclk;
int sdi;
int sdo;
@@ -191,7 +250,7 @@ struct davinci_spi_pins {
int sdena1;
};
-static const struct davinci_spi_pins davinci_spi_pinmap[] __initconst = {
+static const struct dm365_spi_pins dm365_spi_pinmap[] __initconst = {
{
.sclk = DM365_SPI0_SCLK,
.sdi = DM365_SPI0_SDI,
@@ -230,13 +289,13 @@ static const struct davinci_spi_pins davinci_spi_pinmap[] __initconst = {
};
void __init davinci_init_spi(struct davinci_spi_unit_desc *unit,
- unsigned int ninfo,
- const struct spi_board_info *info)
+ unsigned int ninfo,
+ const struct spi_board_info *info)
{
int err;
const unsigned int hwunit = unit->spi_hwunit;
- const struct davinci_spi_pins * const pins = &davinci_spi_pinmap[hwunit];
- struct platform_device * const pdev = &davinci_spi_device[hwunit];
+ const struct dm365_spi_pins * const pins = &dm365_spi_pinmap[hwunit];
+ struct platform_device * const pdev = &dm365_spi_device[hwunit];
struct davinci_spi_platform_data * const pdata = &unit->pdata;
davinci_cfg_reg(pins->sclk);
@@ -260,6 +319,11 @@ void __init davinci_init_spi(struct davinci_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,
@@ -272,5 +336,3 @@ void __init davinci_init_spi(struct davinci_spi_unit_desc *unit,
spi_register_board_info(info, ninfo);
}
-
-
@@ -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;
new file mode 100644
@@ -0,0 +1,90 @@
+/*
+ * Copyright (C) 2010 Basler Vision Technologies AG
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation version 2.
+ *
+ * This program is distributed "as is" WITHOUT ANY WARRANTY of any
+ * kind, whether express or implied; without even the implied warranty
+ * of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * Author: Thomas Koeller <thomas.koeller@baslerweb.com>
+ */
+
+#include "platform-resources.h"
+
+/* root resource for configuration register space */
+struct resource resource_cfg_root = {
+ .name = "DM365 peripherals",
+ .start = 0x01c00000,
+ .end = 0x01ffffff,
+ .flags = IORESOURCE_MEM
+};
+
+/* root resource for DMA channels */
+struct resource resource_dma_root = {
+ .name = "DM365 DMA",
+ .start = 0,
+ .end = 63,
+ .flags = IORESOURCE_DMA
+};
+
+/* root resource for DMA event queues */
+struct resource resource_evq_root = {
+ .name = "DM365 EVQ",
+ .start = 0,
+ .end = 3,
+ .flags = IORESOURCE_DMA
+};
+
+/* root resource for IRQ numbers */
+struct resource resource_irq_root = {
+ .name = "DM365 IRQ",
+ .start = 0,
+ .end = 63,
+ .flags = IORESOURCE_IRQ
+};
+
+/* Allocate resources for platform device */
+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];
+ struct resource *parent;
+
+ /*
+ * Memory and I/O resources are automatically allocated
+ * by platform_device_add(), so do not allocate them
+ * here.
+ */
+ if (resource_type(rsrc) == IORESOURCE_IO ||
+ resource_type(rsrc) == IORESOURCE_MEM)
+ continue;
+
+ parent = rsrc->parent;
+ res = request_resource(parent, rsrc);
+ if (likely(!res))
+ continue;
+
+ /* bail out */
+ rsrc->parent = parent;
+ pr_warning("Failed to allocate resource '%s' from '%s'\n",
+ rsrc->name, parent->name);
+ while (--n >= 0) {
+ /* preserve the parent pointer */
+ rsrc = &dev->resource[n];
+ parent = rsrc->parent;
+ release_resource(rsrc);
+ rsrc->parent = parent;
+ }
+
+ return res;
+ }
+
+ return 0;
+}
new file mode 100644
@@ -0,0 +1,30 @@
+/*
+ * Copyright (C) 2010 Basler Vision Technologies AG
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation version 2.
+ *
+ * This program is distributed "as is" WITHOUT ANY WARRANTY of any
+ * kind, whether express or implied; without even the implied warranty
+ * of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * Author: Thomas Koeller <thomas.koeller@baslerweb.com>
+ */
+#ifndef DAVINCI_PLATFORM_RESOURCES_H
+#define DAVINCI_PLATFORM_RESOURCES_H
+
+#include <linux/ioport.h>
+#include <linux/platform_device.h>
+
+/* Root resources */
+extern struct resource
+ resource_cfg_root,
+ resource_dma_root,
+ resource_irq_root,
+ resource_evq_root;
+
+int alloc_platform_resources(const struct platform_device *dev);
+
+#endif /* DAVINCI_PLATFORM_RESOURCES_H */
@@ -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;
@@ -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);
@@ -868,7 +868,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;
@@ -901,7 +901,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;
@@ -936,19 +936,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);
@@ -1088,8 +1080,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:
@@ -68,7 +68,6 @@ static unsigned long wdt_status;
#define WDT_REGION_INITED 2
#define WDT_DEVICE_INITED 3
-static struct resource *wdt_mem;
static void __iomem *wdt_base;
struct clk *wdt_clk;
@@ -222,12 +221,6 @@ static int __devinit davinci_wdt_probe(struct platform_device *pdev)
}
size = res->end - res->start + 1;
- wdt_mem = request_mem_region(res->start, size, pdev->name);
-
- if (wdt_mem == NULL) {
- dev_err(dev, "failed to get memory region\n");
- return -ENOENT;
- }
wdt_base = ioremap(res->start, size);
if (!wdt_base) {
@@ -238,8 +231,6 @@ static int __devinit davinci_wdt_probe(struct platform_device *pdev)
ret = misc_register(&davinci_wdt_miscdev);
if (ret < 0) {
dev_err(dev, "cannot register misc device\n");
- release_resource(wdt_mem);
- kfree(wdt_mem);
} else {
set_bit(WDT_DEVICE_INITED, &wdt_status);
}
@@ -251,12 +242,6 @@ static int __devinit davinci_wdt_probe(struct platform_device *pdev)
static int __devexit davinci_wdt_remove(struct platform_device *pdev)
{
misc_deregister(&davinci_wdt_miscdev);
- if (wdt_mem) {
- release_resource(wdt_mem);
- kfree(wdt_mem);
- wdt_mem = NULL;
- }
-
clk_disable(wdt_clk);
clk_put(wdt_clk);