Move platform device gear into platform files.
Add some graceful failure paths.

Signed-off-by: Bernard Blackham <[EMAIL PROTECTED]>

Index: linux-davinci-2.6.24.git/arch/arm/mach-davinci/devices.c
===================================================================
--- linux-davinci-2.6.24.git.orig/arch/arm/mach-davinci/devices.c       
2008-02-14 20:30:04.000000000 +0900
+++ linux-davinci-2.6.24.git/arch/arm/mach-davinci/devices.c    2008-02-15 
20:42:58.000000000 +0900
@@ -13,6 +13,7 @@
 #include <linux/kernel.h>
 #include <linux/init.h>
 #include <linux/platform_device.h>
+#include <linux/dma-mapping.h>
 
 #include <asm/hardware.h>
 #include <asm/io.h>
@@ -51,6 +52,46 @@
 
 #endif
 
+
+#if    defined(CONFIG_MMC_DAVINCI) || defined(CONFIG_MMC_DAVINCI_MODULE)
+
+static u64 mmc_dma_mask = DMA_32BIT_MASK;
+
+static struct resource mmc_resources[] = {
+       {
+               .start = DAVINCI_MMC_SD_BASE,
+               .end   = DAVINCI_MMC_SD_BASE + 0x73,
+               .flags = IORESOURCE_MEM,
+       },
+       {
+               .start = IRQ_MMCINT,
+               .flags = IORESOURCE_IRQ,
+       },
+};
+
+static struct platform_device davinci_mmcsd_device = {
+       .name = "davinci_mmc",
+       .id = 1,
+       .dev = {
+               .dma_mask = &mmc_dma_mask,
+               .coherent_dma_mask = DMA_32BIT_MASK,
+       },
+       .num_resources = ARRAY_SIZE(mmc_resources),
+       .resource = mmc_resources,
+};
+
+
+static void davinci_init_mmcsd(void)
+{
+       (void) platform_device_register(&davinci_mmcsd_device);
+}
+
+#else
+
+static void davinci_init_mmcsd(void) {}
+
+#endif
+
 /*-------------------------------------------------------------------------*/
 
 static int __init davinci_init_devices(void)
@@ -59,6 +100,7 @@
         * in alphabetical order so they're easier to sort through.
         */
        davinci_init_i2c();
+       davinci_init_mmcsd();
 
        return 0;
 }
Index: linux-davinci-2.6.24.git/drivers/mmc/host/davinci_mmc.c
===================================================================
--- linux-davinci-2.6.24.git.orig/drivers/mmc/host/davinci_mmc.c        
2008-02-15 20:42:51.000000000 +0900
+++ linux-davinci-2.6.24.git/drivers/mmc/host/davinci_mmc.c     2008-02-15 
20:42:58.000000000 +0900
@@ -30,11 +30,7 @@
  */
 
 #include <linux/module.h>
-#include <linux/tty.h>
 #include <linux/ioport.h>
-#include <linux/init.h>
-#include <linux/console.h>
-#include <linux/blkdev.h>
 #include <linux/platform_device.h>
 #include <linux/clk.h>
 #include <linux/mmc/host.h>
@@ -55,9 +51,8 @@
 
 /* MMCSD Init clock in Hz in opendain mode */
 #define MMCSD_INIT_CLOCK               200000
-#define DRIVER_NAME                    "mmc0"
-#define MMCINT_INTERRUPT               IRQ_MMCINT
-#define MMCSD_REGS_BASE_ADDR           DAVINCI_MMC_SD_BASE
+
+#define DRIVER_NAME                    "davinci_mmc"
 #define TCINTEN                        (0x1<<20)
 
 /* This macro could not be defined to 0 (ZERO) or -ve value.
@@ -478,7 +473,8 @@
                fifo_width_src = W8BIT; /* It's not cared as modeDsr is INCR */
                src_bidx = acnt;
                src_cidx = acnt * bcnt;
-               dst_port = MMCSD_REGS_BASE_ADDR + 0x2C;
+               dst_port = (unsigned int)(host->mem_res->start +
+                               DAVINCI_MMCDXR);
                mode_dst = INCR;
                fifo_width_dst = W8BIT; /* It's not cared as modeDsr is INCR */
                dst_bidx = 0;
@@ -489,7 +485,8 @@
        } else {
                sync_dev = DAVINCI_DMA_MMCRXEVT;
 
-               src_port = MMCSD_REGS_BASE_ADDR + 0x28;
+               src_port = (unsigned int)(host->mem_res->start +
+                               DAVINCI_MMCDRR);
                mode_src = INCR;
                fifo_width_src = W8BIT;
                src_bidx = 0;
@@ -1255,23 +1252,40 @@
 
 static int davinci_mmcsd_probe(struct platform_device *pdev)
 {
-       struct mmc_davinci_host *host;
-       struct mmc_host *mmc;
-       int ret = 0;
+       struct mmc_davinci_host *host = NULL;
+       struct mmc_host *mmc = NULL;
+       struct resource *r, *mem = NULL;
+       int ret = 0, irq = 0;
+       size_t mem_size;
+
+       ret = -ENODEV;
+       r = platform_get_resource(pdev, IORESOURCE_MEM, 0);
+       irq = platform_get_irq(pdev, 0);
+       if (!r || irq == NO_IRQ)
+               goto out;
+
+       ret = -EBUSY;
+       mem_size = r->end - r->start + 1;
+       mem = request_mem_region(r->start, mem_size, DRIVER_NAME);
+       if (!mem)
+               goto out;
 
+       ret = -ENOMEM;
        mmc = mmc_alloc_host(sizeof(struct mmc_davinci_host), &pdev->dev);
-       if (!mmc) {
-               ret = -ENOMEM;
+       if (!mmc)
                goto out;
-       }
 
        host = mmc_priv(mmc);
        host->mmc = mmc;        /* Important */
 
-       host->base = (void __iomem *)IO_ADDRESS(MMCSD_REGS_BASE_ADDR);
+       host->mem_res = mem;
+       host->base = ioremap(r->start, SZ_4K);
+       if (!host->base)
+               goto out;
 
        spin_lock_init(&host->lock);
 
+       ret = -ENXIO;
        host->clk = clk_get(NULL, "MMCSDCLK");
        if (host->clk) {
                clk_enable(host->clk);
@@ -1281,16 +1295,14 @@
 
        init_mmcsd_host(host);
 
-       if (mmcsd_cfg.use_4bit_mode) {
-               dev_warn(mmc_dev(host->mmc), "Supporting 4-bit mode\n");
+       if (mmcsd_cfg.use_4bit_mode)
                mmc->caps |= MMC_CAP_4_BIT_DATA;
-       } else
-               dev_warn(mmc_dev(host->mmc), "Not Supporting 4-bit mode\n");
 
        mmc->ops = &mmc_davinci_ops;
        mmc->f_min = 312500;
-#ifdef CONFIG_MMC_HIGHSPEED
+#ifdef CONFIG_MMC_HIGHSPEED /* FIXME: no longer used */
        mmc->f_max = 50000000;
+       mmc->caps |= MMC_CAP_MMC_HIGHSPEED;
 #else
        mmc->f_max = 25000000;
 #endif
@@ -1309,19 +1321,15 @@
        dev_dbg(mmc_dev(host->mmc), "max_req_size=%d\n", mmc->max_req_size);
        dev_dbg(mmc_dev(host->mmc), "max_seg_size=%d\n", mmc->max_seg_size);
 
-       if (mmcsd_cfg.use_dma) {
-               dev_dbg(mmc_dev(host->mmc), "Using DMA mode\n");
+       if (mmcsd_cfg.use_dma)
                if (davinci_acquire_dma_channels(host) != 0)
                        goto out;
-       } else
-               dev_dbg(mmc_dev(host->mmc), "Not Using DMA mode\n");
 
        host->use_dma = mmcsd_cfg.use_dma;
-       host->irq = MMCINT_INTERRUPT;
+       host->irq = irq;
        host->sd_support = 1;
-       ret = request_irq(MMCINT_INTERRUPT, mmc_davinci_irq, 0, DRIVER_NAME,
-                       host);
 
+       ret = request_irq(irq, mmc_davinci_irq, 0, DRIVER_NAME, host);
        if (ret)
                goto out;
 
@@ -1334,10 +1342,31 @@
        host->timer.expires = jiffies + MULTIPILER_TO_HZ * HZ;
        add_timer(&host->timer);
 
+       dev_info(mmc_dev(host->mmc), "Using %s, %d-bit mode\n",
+           mmcsd_cfg.use_dma ? "DMA" : "PIO",
+           mmcsd_cfg.use_4bit_mode ? 4 : 1);
+
        return 0;
 
 out:
-       /* TBD: Free other resources too. */
+       if (host) {
+               if (host->edma_ch_details.cnt_chanel)
+                       davinci_release_dma_channels(host);
+
+               if (host->clk) {
+                       clk_disable(host->clk);
+                       clk_put(host->clk);
+               }
+
+               if (host->base)
+                       iounmap(host->base);
+       }
+
+       if (mmc)
+               mmc_free_host(mmc);
+
+       if (mem)
+               release_resource(mem);
 
        return ret;
 }
@@ -1349,21 +1378,26 @@
 
        platform_set_drvdata(pdev, NULL);
        if (host) {
-               mmc_remove_host(host->mmc);
-               free_irq(host->irq, host);
-
                spin_lock_irqsave(&host->lock, flags);
                del_timer(&host->timer);
                spin_unlock_irqrestore(&host->lock, flags);
 
+               mmc_remove_host(host->mmc);
+               free_irq(host->irq, host);
+
                davinci_release_dma_channels(host);
 
                clk_disable(host->clk);
                clk_put(host->clk);
+
+               iounmap(host->base);
+
+               release_resource(host->mem_res);
+
+               mmc_free_host(host->mmc);
        }
 
        return 0;
-
 }
 
 #ifdef CONFIG_PM
@@ -1399,63 +1433,14 @@
        .resume = davinci_mmcsd_resume,
 };
 
-/* FIXME don't be a legacy driver ... register the device as part
- * of cpu-specific board setup.
- */
-static void mmc_release(struct device *dev)
-{
-       /* Nothing to release? */
-}
-
-static u64 mmc_dma_mask = 0xffffffff;
-
-static struct resource mmc_resources[] = {
-       {
-               .start = IO_ADDRESS(MMCSD_REGS_BASE_ADDR),
-               .end = IO_ADDRESS((MMCSD_REGS_BASE_ADDR) + 0x74),
-               .flags = IORESOURCE_MEM,
-       },
-       {
-               .start = MMCINT_INTERRUPT,
-               .flags = IORESOURCE_IRQ,
-       },
-};
-
-static struct platform_device mmc_davinci_device = {
-       .name = DRIVER_NAME,
-       .id = 1,
-       .dev = {
-               .release = mmc_release,
-               .dma_mask = &mmc_dma_mask,
-       },
-       .num_resources = ARRAY_SIZE(mmc_resources),
-       .resource = mmc_resources,
-};
-
 static int davinci_mmcsd_init(void)
 {
-       int ret = 0;
-
-       ret = platform_device_register(&mmc_davinci_device);
-       if (ret != 0)
-               goto free1;
-
-       ret = platform_driver_register(&davinci_mmcsd_driver);
-       if (ret != 0)
-               goto free1;
-
-       return 0;
-
-free1:
-       platform_device_unregister(&mmc_davinci_device);
-
-       return -ENODEV;
+       return platform_driver_register(&davinci_mmcsd_driver);
 }
 
 static void __exit davinci_mmcsd_exit(void)
 {
        platform_driver_unregister(&davinci_mmcsd_driver);
-       platform_device_unregister(&mmc_davinci_device);
 }
 
 module_init(davinci_mmcsd_init);
Index: linux-davinci-2.6.24.git/drivers/mmc/host/davinci_mmc.h
===================================================================
--- linux-davinci-2.6.24.git.orig/drivers/mmc/host/davinci_mmc.h        
2008-02-15 20:42:15.000000000 +0900
+++ linux-davinci-2.6.24.git/drivers/mmc/host/davinci_mmc.h     2008-02-15 
20:42:58.000000000 +0900
@@ -172,6 +172,7 @@
        struct clk *clk;
        unsigned int mmc_input_clk;
        void __iomem *base;
+       struct resource *mem_res;
        int irq;
        unsigned char bus_mode;
 
@@ -179,7 +180,7 @@
 #define DAVINCI_MMC_DATADIR_READ       1
 #define DAVINCI_MMC_DATADIR_WRITE      2
        unsigned char data_dir;
-       u32 *buffer;
+       u8 *buffer;
        u32 bytes_left;
        int power_pin;
 
_______________________________________________
Davinci-linux-open-source mailing list
[email protected]
http://linux.davincidsp.com/mailman/listinfo/davinci-linux-open-source

Reply via email to