Back to home page

OSCL-LXR

 
 

    


0001 // SPDX-License-Identifier: GPL-2.0-or-later
0002 /*
0003  * mach-davinci/devices.c
0004  *
0005  * DaVinci platform device setup/initialization
0006  */
0007 
0008 #include <linux/init.h>
0009 #include <linux/platform_device.h>
0010 #include <linux/platform_data/i2c-davinci.h>
0011 #include <linux/platform_data/mmc-davinci.h>
0012 #include <linux/platform_data/edma.h>
0013 #include <linux/dma-mapping.h>
0014 #include <linux/io.h>
0015 #include <linux/reboot.h>
0016 
0017 #include "hardware.h"
0018 #include "cputype.h"
0019 #include "mux.h"
0020 #include "davinci.h"
0021 #include "irqs.h"
0022 
0023 #define DAVINCI_I2C_BASE         0x01C21000
0024 #define DAVINCI_ATA_BASE         0x01C66000
0025 #define DAVINCI_MMCSD0_BASE      0x01E10000
0026 #define DM355_MMCSD0_BASE        0x01E11000
0027 #define DM355_MMCSD1_BASE        0x01E00000
0028 #define DM365_MMCSD0_BASE        0x01D11000
0029 #define DM365_MMCSD1_BASE        0x01D00000
0030 
0031 void __iomem  *davinci_sysmod_base;
0032 
0033 void davinci_map_sysmod(void)
0034 {
0035     davinci_sysmod_base = ioremap(DAVINCI_SYSTEM_MODULE_BASE,
0036                           0x800);
0037     /*
0038      * Throw a bug since a lot of board initialization code depends
0039      * on system module availability. ioremap() failing this early
0040      * need careful looking into anyway.
0041      */
0042     BUG_ON(!davinci_sysmod_base);
0043 }
0044 
0045 static struct resource i2c_resources[] = {
0046     {
0047         .start      = DAVINCI_I2C_BASE,
0048         .end        = DAVINCI_I2C_BASE + 0x40,
0049         .flags      = IORESOURCE_MEM,
0050     },
0051     {
0052         .start      = DAVINCI_INTC_IRQ(IRQ_I2C),
0053         .flags      = IORESOURCE_IRQ,
0054     },
0055 };
0056 
0057 static struct platform_device davinci_i2c_device = {
0058     .name           = "i2c_davinci",
0059     .id             = 1,
0060     .num_resources  = ARRAY_SIZE(i2c_resources),
0061     .resource   = i2c_resources,
0062 };
0063 
0064 void __init davinci_init_i2c(struct davinci_i2c_platform_data *pdata)
0065 {
0066     if (cpu_is_davinci_dm644x())
0067         davinci_cfg_reg(DM644X_I2C);
0068 
0069     davinci_i2c_device.dev.platform_data = pdata;
0070     (void) platform_device_register(&davinci_i2c_device);
0071 }
0072 
0073 static struct resource ide_resources[] = {
0074     {
0075         .start      = DAVINCI_ATA_BASE,
0076         .end        = DAVINCI_ATA_BASE + 0x7ff,
0077         .flags      = IORESOURCE_MEM,
0078     },
0079     {
0080         .start      = DAVINCI_INTC_IRQ(IRQ_IDE),
0081         .end        = DAVINCI_INTC_IRQ(IRQ_IDE),
0082         .flags      = IORESOURCE_IRQ,
0083     },
0084 };
0085 
0086 static u64 ide_dma_mask = DMA_BIT_MASK(32);
0087 
0088 static struct platform_device ide_device = {
0089     .name           = "palm_bk3710",
0090     .id             = -1,
0091     .resource       = ide_resources,
0092     .num_resources  = ARRAY_SIZE(ide_resources),
0093     .dev = {
0094         .dma_mask       = &ide_dma_mask,
0095         .coherent_dma_mask      = DMA_BIT_MASK(32),
0096     },
0097 };
0098 
0099 void __init davinci_init_ide(void)
0100 {
0101     if (cpu_is_davinci_dm644x()) {
0102         davinci_cfg_reg(DM644X_HPIEN_DISABLE);
0103         davinci_cfg_reg(DM644X_ATAEN);
0104         davinci_cfg_reg(DM644X_HDIREN);
0105     } else if (cpu_is_davinci_dm646x()) {
0106         /* IRQ_DM646X_IDE is the same as IRQ_IDE */
0107         davinci_cfg_reg(DM646X_ATAEN);
0108     } else {
0109         WARN_ON(1);
0110         return;
0111     }
0112 
0113     platform_device_register(&ide_device);
0114 }
0115 
0116 #if IS_ENABLED(CONFIG_MMC_DAVINCI)
0117 
0118 static u64 mmcsd0_dma_mask = DMA_BIT_MASK(32);
0119 
0120 static struct resource mmcsd0_resources[] = {
0121     {
0122         /* different on dm355 */
0123         .start = DAVINCI_MMCSD0_BASE,
0124         .end   = DAVINCI_MMCSD0_BASE + SZ_4K - 1,
0125         .flags = IORESOURCE_MEM,
0126     },
0127     /* IRQs:  MMC/SD, then SDIO */
0128     {
0129         .start = DAVINCI_INTC_IRQ(IRQ_MMCINT),
0130         .flags = IORESOURCE_IRQ,
0131     }, {
0132         /* different on dm355 */
0133         .start = DAVINCI_INTC_IRQ(IRQ_SDIOINT),
0134         .flags = IORESOURCE_IRQ,
0135     },
0136 };
0137 
0138 static struct platform_device davinci_mmcsd0_device = {
0139     .name = "dm6441-mmc",
0140     .id = 0,
0141     .dev = {
0142         .dma_mask = &mmcsd0_dma_mask,
0143         .coherent_dma_mask = DMA_BIT_MASK(32),
0144     },
0145     .num_resources = ARRAY_SIZE(mmcsd0_resources),
0146     .resource = mmcsd0_resources,
0147 };
0148 
0149 static u64 mmcsd1_dma_mask = DMA_BIT_MASK(32);
0150 
0151 static struct resource mmcsd1_resources[] = {
0152     {
0153         .start = DM355_MMCSD1_BASE,
0154         .end   = DM355_MMCSD1_BASE + SZ_4K - 1,
0155         .flags = IORESOURCE_MEM,
0156     },
0157     /* IRQs:  MMC/SD, then SDIO */
0158     {
0159         .start = DAVINCI_INTC_IRQ(IRQ_DM355_MMCINT1),
0160         .flags = IORESOURCE_IRQ,
0161     }, {
0162         .start = DAVINCI_INTC_IRQ(IRQ_DM355_SDIOINT1),
0163         .flags = IORESOURCE_IRQ,
0164     },
0165 };
0166 
0167 static struct platform_device davinci_mmcsd1_device = {
0168     .name = "dm6441-mmc",
0169     .id = 1,
0170     .dev = {
0171         .dma_mask = &mmcsd1_dma_mask,
0172         .coherent_dma_mask = DMA_BIT_MASK(32),
0173     },
0174     .num_resources = ARRAY_SIZE(mmcsd1_resources),
0175     .resource = mmcsd1_resources,
0176 };
0177 
0178 
0179 void __init davinci_setup_mmc(int module, struct davinci_mmc_config *config)
0180 {
0181     struct platform_device  *pdev = NULL;
0182 
0183     if (WARN_ON(cpu_is_davinci_dm646x()))
0184         return;
0185 
0186     /* REVISIT: update PINMUX, ARM_IRQMUX, and EDMA_EVTMUX here too;
0187      * for example if MMCSD1 is used for SDIO, maybe DAT2 is unused.
0188      *
0189      * FIXME dm6441 (no MMC/SD), dm357 (one), and dm335 (two) are
0190      * not handled right here ...
0191      */
0192     switch (module) {
0193     case 1:
0194         if (cpu_is_davinci_dm355()) {
0195             /* REVISIT we may not need all these pins if e.g. this
0196              * is a hard-wired SDIO device...
0197              */
0198             davinci_cfg_reg(DM355_SD1_CMD);
0199             davinci_cfg_reg(DM355_SD1_CLK);
0200             davinci_cfg_reg(DM355_SD1_DATA0);
0201             davinci_cfg_reg(DM355_SD1_DATA1);
0202             davinci_cfg_reg(DM355_SD1_DATA2);
0203             davinci_cfg_reg(DM355_SD1_DATA3);
0204         } else if (cpu_is_davinci_dm365()) {
0205             /* Configure pull down control */
0206             unsigned v;
0207 
0208             v = __raw_readl(DAVINCI_SYSMOD_VIRT(SYSMOD_PUPDCTL1));
0209             __raw_writel(v & ~0xfc0,
0210                     DAVINCI_SYSMOD_VIRT(SYSMOD_PUPDCTL1));
0211 
0212             mmcsd1_resources[0].start = DM365_MMCSD1_BASE;
0213             mmcsd1_resources[0].end = DM365_MMCSD1_BASE +
0214                             SZ_4K - 1;
0215             mmcsd1_resources[2].start = DAVINCI_INTC_IRQ(
0216                             IRQ_DM365_SDIOINT1);
0217             davinci_mmcsd1_device.name = "da830-mmc";
0218         } else
0219             break;
0220 
0221         pdev = &davinci_mmcsd1_device;
0222         break;
0223     case 0:
0224         if (cpu_is_davinci_dm355()) {
0225             mmcsd0_resources[0].start = DM355_MMCSD0_BASE;
0226             mmcsd0_resources[0].end = DM355_MMCSD0_BASE + SZ_4K - 1;
0227             mmcsd0_resources[2].start = DAVINCI_INTC_IRQ(
0228                             IRQ_DM355_SDIOINT0);
0229 
0230             /* expose all 6 MMC0 signals:  CLK, CMD, DATA[0..3] */
0231             davinci_cfg_reg(DM355_MMCSD0);
0232 
0233             /* enable RX EDMA */
0234             davinci_cfg_reg(DM355_EVT26_MMC0_RX);
0235         } else if (cpu_is_davinci_dm365()) {
0236             mmcsd0_resources[0].start = DM365_MMCSD0_BASE;
0237             mmcsd0_resources[0].end = DM365_MMCSD0_BASE +
0238                             SZ_4K - 1;
0239             mmcsd0_resources[2].start = DAVINCI_INTC_IRQ(
0240                             IRQ_DM365_SDIOINT0);
0241             davinci_mmcsd0_device.name = "da830-mmc";
0242         } else if (cpu_is_davinci_dm644x()) {
0243             /* REVISIT: should this be in board-init code? */
0244             /* Power-on 3.3V IO cells */
0245             __raw_writel(0,
0246                 DAVINCI_SYSMOD_VIRT(SYSMOD_VDD3P3VPWDN));
0247             /*Set up the pull regiter for MMC */
0248             davinci_cfg_reg(DM644X_MSTK);
0249         }
0250 
0251         pdev = &davinci_mmcsd0_device;
0252         break;
0253     }
0254 
0255     if (WARN_ON(!pdev))
0256         return;
0257 
0258     pdev->dev.platform_data = config;
0259     platform_device_register(pdev);
0260 }
0261 
0262 #else
0263 
0264 void __init davinci_setup_mmc(int module, struct davinci_mmc_config *config)
0265 {
0266 }
0267 
0268 #endif
0269 
0270 /*-------------------------------------------------------------------------*/
0271 
0272 static struct resource wdt_resources[] = {
0273     {
0274         .start  = DAVINCI_WDOG_BASE,
0275         .end    = DAVINCI_WDOG_BASE + SZ_1K - 1,
0276         .flags  = IORESOURCE_MEM,
0277     },
0278 };
0279 
0280 static struct platform_device davinci_wdt_device = {
0281     .name       = "davinci-wdt",
0282     .id     = -1,
0283     .num_resources  = ARRAY_SIZE(wdt_resources),
0284     .resource   = wdt_resources,
0285 };
0286 
0287 int davinci_init_wdt(void)
0288 {
0289     return platform_device_register(&davinci_wdt_device);
0290 }
0291 
0292 static struct platform_device davinci_gpio_device = {
0293     .name   = "davinci_gpio",
0294     .id = -1,
0295 };
0296 
0297 int davinci_gpio_register(struct resource *res, int size, void *pdata)
0298 {
0299     davinci_gpio_device.resource = res;
0300     davinci_gpio_device.num_resources = size;
0301     davinci_gpio_device.dev.platform_data = pdata;
0302     return platform_device_register(&davinci_gpio_device);
0303 }