mmc: dw_mmc: convert copy of struct device in struct dw_mci to a reference
authorThomas Abraham <thomas.abraham@linaro.org>
Mon, 17 Sep 2012 18:16:35 +0000 (18:16 +0000)
committerChris Ball <cjb@laptop.org>
Wed, 3 Oct 2012 14:05:13 +0000 (10:05 -0400)
The 'struct dw_mci' maintains a copy of the pdev->dev instance instead of
maintaining a reference to that 'struct device' instance. Any resource
allocated using the device resource management kernel API with the instance
of 'struct device' in 'struct dw_mci' is then incorrect. Fix this by
converting the copy of 'struct device' in 'struct dw_mci' to a reference.

Signed-off-by: Thomas Abraham <thomas.abraham@linaro.org>
Acked-by: Will Newton <will.newton@imgtec.com>
Signed-off-by: Chris Ball <cjb@laptop.org>
drivers/mmc/host/dw_mmc-pci.c
drivers/mmc/host/dw_mmc-pltfm.c
drivers/mmc/host/dw_mmc.c
include/linux/mmc/dw_mmc.h

index f5ab03d32fb9f44c567befaa8d7d45b6de2626b6..edb37e9135ae3741b5bafef61633c2740e01f8f1 100644 (file)
@@ -59,7 +59,7 @@ static int __devinit dw_mci_pci_probe(struct pci_dev *pdev,
 
        host->irq = pdev->irq;
        host->irq_flags = IRQF_SHARED;
-       host->dev = pdev->dev;
+       host->dev = &pdev->dev;
        host->pdata = &pci_board_data;
 
        host->regs = pci_iomap(pdev, PCI_BAR_NO, COMPLETE_BAR);
index a54d3a359ccda2ad90868c295c7e839c28c9e386..528d37b93651dae79a0e50e8f3c76e2c28c85be9 100644 (file)
@@ -43,7 +43,7 @@ static int __devinit dw_mci_pltfm_probe(struct platform_device *pdev)
                goto err_free;
        }
 
-       host->dev = pdev->dev;
+       host->dev = &pdev->dev;
        host->irq_flags = 0;
        host->pdata = pdev->dev.platform_data;
        ret = -ENOMEM;
index 36f98c09715e96bf55d2d2ef72cf45028ff18071..a18e73c7305ea3075d5d47786b095d9a4df199b1 100644 (file)
@@ -266,7 +266,7 @@ static void dw_mci_start_command(struct dw_mci *host,
                                 struct mmc_command *cmd, u32 cmd_flags)
 {
        host->cmd = cmd;
-       dev_vdbg(&host->dev,
+       dev_vdbg(host->dev,
                 "start command: ARGR=0x%08x CMDR=0x%08x\n",
                 cmd->arg, cmd_flags);
 
@@ -308,7 +308,7 @@ static void dw_mci_dma_cleanup(struct dw_mci *host)
 
        if (data)
                if (!data->host_cookie)
-                       dma_unmap_sg(&host->dev,
+                       dma_unmap_sg(host->dev,
                                     data->sg,
                                     data->sg_len,
                                     dw_mci_get_dma_dir(data));
@@ -334,7 +334,7 @@ static void dw_mci_idmac_complete_dma(struct dw_mci *host)
 {
        struct mmc_data *data = host->data;
 
-       dev_vdbg(&host->dev, "DMA complete\n");
+       dev_vdbg(host->dev, "DMA complete\n");
 
        host->dma_ops->cleanup(host);
 
@@ -414,13 +414,13 @@ static int dw_mci_idmac_init(struct dw_mci *host)
        dma_support = (mci_readl(host, HCON) >> 16) & 0x3;
 
        if (!dma_support || dma_support > 2) {
-               dev_err(&host->dev,
+               dev_err(host->dev,
                        "Host Controller does not support IDMA Tx.\n");
                host->dma_ops = NULL;
                return -ENODEV;
        }
 
-       dev_info(&host->dev, "Using internal DMA controller.\n");
+       dev_info(host->dev, "Using internal DMA controller.\n");
 
        /* Forward link the descriptor list */
        for (i = 0, p = host->sg_cpu; i < host->ring_size - 1; i++, p++)
@@ -476,7 +476,7 @@ static int dw_mci_pre_dma_transfer(struct dw_mci *host,
                        return -EINVAL;
        }
 
-       sg_len = dma_map_sg(&host->dev,
+       sg_len = dma_map_sg(host->dev,
                            data->sg,
                            data->sg_len,
                            dw_mci_get_dma_dir(data));
@@ -519,7 +519,7 @@ static void dw_mci_post_req(struct mmc_host *mmc,
                return;
 
        if (data->host_cookie)
-               dma_unmap_sg(&slot->host->dev,
+               dma_unmap_sg(slot->host->dev,
                             data->sg,
                             data->sg_len,
                             dw_mci_get_dma_dir(data));
@@ -545,7 +545,7 @@ static int dw_mci_submit_data_dma(struct dw_mci *host, struct mmc_data *data)
 
        host->using_dma = 1;
 
-       dev_vdbg(&host->dev,
+       dev_vdbg(host->dev,
                 "sd sg_cpu: %#lx sg_dma: %#lx sg_len: %d\n",
                 (unsigned long)host->sg_cpu, (unsigned long)host->sg_dma,
                 sg_len);
@@ -939,12 +939,12 @@ static void dw_mci_request_end(struct dw_mci *host, struct mmc_request *mrq)
                slot = list_entry(host->queue.next,
                                  struct dw_mci_slot, queue_node);
                list_del(&slot->queue_node);
-               dev_vdbg(&host->dev, "list not empty: %s is next\n",
+               dev_vdbg(host->dev, "list not empty: %s is next\n",
                         mmc_hostname(slot->mmc));
                host->state = STATE_SENDING_CMD;
                dw_mci_start_request(host, slot);
        } else {
-               dev_vdbg(&host->dev, "list empty\n");
+               dev_vdbg(host->dev, "list empty\n");
                host->state = STATE_IDLE;
        }
 
@@ -1083,7 +1083,7 @@ static void dw_mci_tasklet_func(unsigned long priv)
                                        data->bytes_xfered = 0;
                                        data->error = -ETIMEDOUT;
                                } else {
-                                       dev_err(&host->dev,
+                                       dev_err(host->dev,
                                                "data FIFO error "
                                                "(status=%08x)\n",
                                                status);
@@ -1772,7 +1772,7 @@ static int dw_mci_init_slot(struct dw_mci *host, unsigned int id)
        struct mmc_host *mmc;
        struct dw_mci_slot *slot;
 
-       mmc = mmc_alloc_host(sizeof(struct dw_mci_slot), &host->dev);
+       mmc = mmc_alloc_host(sizeof(struct dw_mci_slot), host->dev);
        if (!mmc)
                return -ENOMEM;
 
@@ -1884,10 +1884,10 @@ static void dw_mci_cleanup_slot(struct dw_mci_slot *slot, unsigned int id)
 static void dw_mci_init_dma(struct dw_mci *host)
 {
        /* Alloc memory for sg translation */
-       host->sg_cpu = dma_alloc_coherent(&host->dev, PAGE_SIZE,
+       host->sg_cpu = dma_alloc_coherent(host->dev, PAGE_SIZE,
                                          &host->sg_dma, GFP_KERNEL);
        if (!host->sg_cpu) {
-               dev_err(&host->dev, "%s: could not alloc DMA memory\n",
+               dev_err(host->dev, "%s: could not alloc DMA memory\n",
                        __func__);
                goto no_dma;
        }
@@ -1903,12 +1903,12 @@ static void dw_mci_init_dma(struct dw_mci *host)
        if (host->dma_ops->init && host->dma_ops->start &&
            host->dma_ops->stop && host->dma_ops->cleanup) {
                if (host->dma_ops->init(host)) {
-                       dev_err(&host->dev, "%s: Unable to initialize "
+                       dev_err(host->dev, "%s: Unable to initialize "
                                "DMA Controller.\n", __func__);
                        goto no_dma;
                }
        } else {
-               dev_err(&host->dev, "DMA initialization not found.\n");
+               dev_err(host->dev, "DMA initialization not found.\n");
                goto no_dma;
        }
 
@@ -1916,7 +1916,7 @@ static void dw_mci_init_dma(struct dw_mci *host)
        return;
 
 no_dma:
-       dev_info(&host->dev, "Using PIO mode.\n");
+       dev_info(host->dev, "Using PIO mode.\n");
        host->use_dma = 0;
        return;
 }
@@ -1948,19 +1948,19 @@ int dw_mci_probe(struct dw_mci *host)
        u32 fifo_size;
 
        if (!host->pdata || !host->pdata->init) {
-               dev_err(&host->dev,
+               dev_err(host->dev,
                        "Platform data must supply init function\n");
                return -ENODEV;
        }
 
        if (!host->pdata->select_slot && host->pdata->num_slots > 1) {
-               dev_err(&host->dev,
+               dev_err(host->dev,
                        "Platform data must supply select_slot function\n");
                return -ENODEV;
        }
 
        if (!host->pdata->bus_hz) {
-               dev_err(&host->dev,
+               dev_err(host->dev,
                        "Platform data must supply bus speed\n");
                return -ENODEV;
        }
@@ -1998,7 +1998,7 @@ int dw_mci_probe(struct dw_mci *host)
        }
 
        /* Reset all blocks */
-       if (!mci_wait_reset(&host->dev, host))
+       if (!mci_wait_reset(host->dev, host))
                return -ENODEV;
 
        host->dma_ops = host->pdata->dma_ops;
@@ -2065,7 +2065,7 @@ int dw_mci_probe(struct dw_mci *host)
         * Need to check the version-id and set data-offset for DATA register.
         */
        host->verid = SDMMC_GET_VERID(mci_readl(host, VERID));
-       dev_info(&host->dev, "Version ID is %04x\n", host->verid);
+       dev_info(host->dev, "Version ID is %04x\n", host->verid);
 
        if (host->verid < DW_MMC_240A)
                host->data_offset = DATA_OFFSET;
@@ -2082,12 +2082,12 @@ int dw_mci_probe(struct dw_mci *host)
                   DW_MCI_ERROR_FLAGS | SDMMC_INT_CD);
        mci_writel(host, CTRL, SDMMC_CTRL_INT_ENABLE); /* Enable mci interrupt */
 
-       dev_info(&host->dev, "DW MMC controller at irq %d, "
+       dev_info(host->dev, "DW MMC controller at irq %d, "
                 "%d bit host data width, "
                 "%u deep fifo\n",
                 host->irq, width, fifo_size);
        if (host->quirks & DW_MCI_QUIRK_IDMAC_DTO)
-               dev_info(&host->dev, "Internal DMAC interrupt fix enabled.\n");
+               dev_info(host->dev, "Internal DMAC interrupt fix enabled.\n");
 
        return 0;
 
@@ -2106,7 +2106,7 @@ err_workqueue:
 err_dmaunmap:
        if (host->use_dma && host->dma_ops->exit)
                host->dma_ops->exit(host);
-       dma_free_coherent(&host->dev, PAGE_SIZE,
+       dma_free_coherent(host->dev, PAGE_SIZE,
                          host->sg_cpu, host->sg_dma);
 
        if (host->vmmc) {
@@ -2125,7 +2125,7 @@ void dw_mci_remove(struct dw_mci *host)
        mci_writel(host, INTMASK, 0); /* disable all mmc interrupt first */
 
        for (i = 0; i < host->num_slots; i++) {
-               dev_dbg(&host->dev, "remove slot %d\n", i);
+               dev_dbg(host->dev, "remove slot %d\n", i);
                if (host->slot[i])
                        dw_mci_cleanup_slot(host->slot[i], i);
        }
@@ -2136,7 +2136,7 @@ void dw_mci_remove(struct dw_mci *host)
 
        free_irq(host->irq, host);
        destroy_workqueue(host->card_workqueue);
-       dma_free_coherent(&host->dev, PAGE_SIZE, host->sg_cpu, host->sg_dma);
+       dma_free_coherent(host->dev, PAGE_SIZE, host->sg_cpu, host->sg_dma);
 
        if (host->use_dma && host->dma_ops->exit)
                host->dma_ops->exit(host);
@@ -2188,7 +2188,7 @@ int dw_mci_resume(struct dw_mci *host)
        if (host->vmmc)
                regulator_enable(host->vmmc);
 
-       if (!mci_wait_reset(&host->dev, host)) {
+       if (!mci_wait_reset(host->dev, host)) {
                ret = -ENODEV;
                return ret;
        }
index 7a7ebd367cfdd2591e01b3c69346c4c43464b74e..a37a573fa13cefe079c4381f8ddffeb7ee9784c4 100644 (file)
@@ -156,7 +156,7 @@ struct dw_mci {
        u32                     fifoth_val;
        u16                     verid;
        u16                     data_offset;
-       struct device           dev;
+       struct device           *dev;
        struct dw_mci_board     *pdata;
        struct dw_mci_slot      *slot[MAX_MCI_SLOTS];