The TI DaVinci MMC host driver uses a pointer to get from
the private mmc_davinci_host structure to generic mmc_host
structure. However mmc_host always immediately precedes
mmc_davinci_host in memory hence get the address of that
mmc_host structure using mmc_from_priv() which performs
subtraction(which is cheaper than a dereference) and drop
the unnecessary pointer.

Signed-off-by: Amey Narkhede <[email protected]>
---
 drivers/mmc/host/davinci_mmc.c | 96 ++++++++++++++++++----------------
 1 file changed, 52 insertions(+), 44 deletions(-)

diff --git a/drivers/mmc/host/davinci_mmc.c b/drivers/mmc/host/davinci_mmc.c
index e50a08bce7ef..c607b6a27a03 100644
--- a/drivers/mmc/host/davinci_mmc.c
+++ b/drivers/mmc/host/davinci_mmc.c
@@ -168,7 +168,6 @@ MODULE_PARM_DESC(use_dma, "Whether to use DMA or not. 
Default = 1");
 struct mmc_davinci_host {
        struct mmc_command *cmd;
        struct mmc_data *data;
-       struct mmc_host *mmc;
        struct clk *clk;
        unsigned int mmc_input_clk;
        void __iomem *base;
@@ -270,8 +269,9 @@ static void mmc_davinci_start_command(struct 
mmc_davinci_host *host,
 {
        u32 cmd_reg = 0;
        u32 im_val;
+       struct mmc_host *mmc = mmc_from_priv(host);

-       dev_dbg(mmc_dev(host->mmc), "CMD%d, arg 0x%08x%s\n",
+       dev_dbg(mmc_dev(mmc), "CMD%d, arg 0x%08x%s\n",
                cmd->opcode, cmd->arg,
                ({ char *s;
                switch (mmc_resp_type(cmd)) {
@@ -312,7 +312,7 @@ static void mmc_davinci_start_command(struct 
mmc_davinci_host *host,
                break;
        default:
                cmd_reg |= MMCCMD_RSPFMT_NONE;
-               dev_dbg(mmc_dev(host->mmc), "unknown resp_type %04x\n",
+               dev_dbg(mmc_dev(mmc), "unknown resp_type %04x\n",
                        mmc_resp_type(cmd));
                break;
        }
@@ -402,6 +402,7 @@ static int mmc_davinci_send_dma_request(struct 
mmc_davinci_host *host,
 {
        struct dma_chan *chan;
        struct dma_async_tx_descriptor *desc;
+       struct mmc_host *mmc = mmc_from_priv(host);
        int ret = 0;

        if (host->data_dir == DAVINCI_MMC_DATADIR_WRITE) {
@@ -421,7 +422,7 @@ static int mmc_davinci_send_dma_request(struct 
mmc_davinci_host *host,
                                DMA_MEM_TO_DEV,
                                DMA_PREP_INTERRUPT | DMA_CTRL_ACK);
                if (!desc) {
-                       dev_dbg(mmc_dev(host->mmc),
+                       dev_dbg(mmc_dev(mmc),
                                "failed to allocate DMA TX descriptor");
                        ret = -1;
                        goto out;
@@ -443,7 +444,7 @@ static int mmc_davinci_send_dma_request(struct 
mmc_davinci_host *host,
                                DMA_DEV_TO_MEM,
                                DMA_PREP_INTERRUPT | DMA_CTRL_ACK);
                if (!desc) {
-                       dev_dbg(mmc_dev(host->mmc),
+                       dev_dbg(mmc_dev(mmc),
                                "failed to allocate DMA RX descriptor");
                        ret = -1;
                        goto out;
@@ -460,17 +461,18 @@ static int mmc_davinci_send_dma_request(struct 
mmc_davinci_host *host,
 static int mmc_davinci_start_dma_transfer(struct mmc_davinci_host *host,
                struct mmc_data *data)
 {
+       struct mmc_host *mmc = mmc_from_priv(host);
        int i;
        int mask = rw_threshold - 1;
        int ret = 0;

-       host->sg_len = dma_map_sg(mmc_dev(host->mmc), data->sg, data->sg_len,
+       host->sg_len = dma_map_sg(mmc_dev(mmc), data->sg, data->sg_len,
                                  mmc_get_dma_dir(data));

        /* no individual DMA segment should need a partial FIFO */
        for (i = 0; i < host->sg_len; i++) {
                if (sg_dma_len(data->sg + i) & mask) {
-                       dma_unmap_sg(mmc_dev(host->mmc),
+                       dma_unmap_sg(mmc_dev(mmc),
                                     data->sg, data->sg_len,
                                     mmc_get_dma_dir(data));
                        return -1;
@@ -494,15 +496,17 @@ static void davinci_release_dma_channels(struct 
mmc_davinci_host *host)

 static int davinci_acquire_dma_channels(struct mmc_davinci_host *host)
 {
-       host->dma_tx = dma_request_chan(mmc_dev(host->mmc), "tx");
+       struct mmc_host *mmc = mmc_from_priv(host);
+
+       host->dma_tx = dma_request_chan(mmc_dev(mmc), "tx");
        if (IS_ERR(host->dma_tx)) {
-               dev_err(mmc_dev(host->mmc), "Can't get dma_tx channel\n");
+               dev_err(mmc_dev(mmc), "Can't get dma_tx channel\n");
                return PTR_ERR(host->dma_tx);
        }

-       host->dma_rx = dma_request_chan(mmc_dev(host->mmc), "rx");
+       host->dma_rx = dma_request_chan(mmc_dev(mmc), "rx");
        if (IS_ERR(host->dma_rx)) {
-               dev_err(mmc_dev(host->mmc), "Can't get dma_rx channel\n");
+               dev_err(mmc_dev(mmc), "Can't get dma_rx channel\n");
                dma_release_channel(host->dma_tx);
                return PTR_ERR(host->dma_rx);
        }
@@ -518,6 +522,7 @@ mmc_davinci_prepare_data(struct mmc_davinci_host *host, 
struct mmc_request *req)
        int fifo_lev = (rw_threshold == 32) ? MMCFIFOCTL_FIFOLEV : 0;
        int timeout;
        struct mmc_data *data = req->data;
+       struct mmc_host *mmc = mmc_from_priv(mmc);

        if (host->version == MMC_CTLR_VERSION_2)
                fifo_lev = (rw_threshold == 64) ? MMCFIFOCTL_FIFOLEV : 0;
@@ -530,10 +535,10 @@ mmc_davinci_prepare_data(struct mmc_davinci_host *host, 
struct mmc_request *req)
                return;
        }

-       dev_dbg(mmc_dev(host->mmc), "%s, %d blocks of %d bytes\n",
+       dev_dbg(mmc_dev(mmc), "%s, %d blocks of %d bytes\n",
                (data->flags & MMC_DATA_WRITE) ? "write" : "read",
                data->blocks, data->blksz);
-       dev_dbg(mmc_dev(host->mmc), "  DTO %d cycles + %d ns\n",
+       dev_dbg(mmc_dev(mmc), "  DTO %d cycles + %d ns\n",
                data->timeout_clks, data->timeout_ns);
        timeout = data->timeout_clks +
                (data->timeout_ns / host->ns_in_one_cycle);
@@ -598,7 +603,7 @@ static void mmc_davinci_request(struct mmc_host *mmc, 
struct mmc_request *req)
                cpu_relax();
        }
        if (mmcst1 & MMCST1_BUSY) {
-               dev_err(mmc_dev(host->mmc), "still BUSY? bad ... \n");
+               dev_err(mmc_dev(mmc), "still BUSY? bad ...\n");
                req->cmd->error = -ETIMEDOUT;
                mmc_request_done(mmc, req);
                return;
@@ -688,8 +693,9 @@ static void mmc_davinci_set_ios(struct mmc_host *mmc, 
struct mmc_ios *ios)
        struct mmc_davinci_host *host = mmc_priv(mmc);
        struct platform_device *pdev = to_platform_device(mmc->parent);
        struct davinci_mmc_config *config = pdev->dev.platform_data;
+       struct mmc_host *mmc = mmc_from_priv(host);

-       dev_dbg(mmc_dev(host->mmc),
+       dev_dbg(mmc_dev(mmc),
                "clock %dHz busmode %d powermode %d Vdd %04x\n",
                ios->clock, ios->bus_mode, ios->power_mode,
                ios->vdd);
@@ -707,13 +713,13 @@ static void mmc_davinci_set_ios(struct mmc_host *mmc, 
struct mmc_ios *ios)

        switch (ios->bus_width) {
        case MMC_BUS_WIDTH_8:
-               dev_dbg(mmc_dev(host->mmc), "Enabling 8 bit mode\n");
+               dev_dbg(mmc_dev(mmc), "Enabling 8 bit mode\n");
                writel((readl(host->base + DAVINCI_MMCCTL) &
                        ~MMCCTL_WIDTH_4_BIT) | MMCCTL_WIDTH_8_BIT,
                        host->base + DAVINCI_MMCCTL);
                break;
        case MMC_BUS_WIDTH_4:
-               dev_dbg(mmc_dev(host->mmc), "Enabling 4 bit mode\n");
+               dev_dbg(mmc_dev(mmc), "Enabling 4 bit mode\n");
                if (host->version == MMC_CTLR_VERSION_2)
                        writel((readl(host->base + DAVINCI_MMCCTL) &
                                ~MMCCTL_WIDTH_8_BIT) | MMCCTL_WIDTH_4_BIT,
@@ -724,7 +730,7 @@ static void mmc_davinci_set_ios(struct mmc_host *mmc, 
struct mmc_ios *ios)
                                host->base + DAVINCI_MMCCTL);
                break;
        case MMC_BUS_WIDTH_1:
-               dev_dbg(mmc_dev(host->mmc), "Enabling 1 bit mode\n");
+               dev_dbg(mmc_dev(mmc), "Enabling 1 bit mode\n");
                if (host->version == MMC_CTLR_VERSION_2)
                        writel(readl(host->base + DAVINCI_MMCCTL) &
                                ~(MMCCTL_WIDTH_8_BIT | MMCCTL_WIDTH_4_BIT),
@@ -756,7 +762,7 @@ static void mmc_davinci_set_ios(struct mmc_host *mmc, 
struct mmc_ios *ios)
                        cpu_relax();
                }
                if (lose)
-                       dev_warn(mmc_dev(host->mmc), "powerup timeout\n");
+                       dev_warn(mmc_dev(mmc), "powerup timeout\n");
        }

        /* FIXME on power OFF, reset things ... */
@@ -765,9 +771,10 @@ static void mmc_davinci_set_ios(struct mmc_host *mmc, 
struct mmc_ios *ios)
 static void
 mmc_davinci_xfer_done(struct mmc_davinci_host *host, struct mmc_data *data)
 {
-       host->data = NULL;
+       struct mmc_host *mmc = mmc_from_priv(host);

-       if (host->mmc->caps & MMC_CAP_SDIO_IRQ) {
+       host->data = NULL;
+       if (mmc->caps & MMC_CAP_SDIO_IRQ) {
                /*
                 * SDIO Interrupt Detection work-around as suggested by
                 * Davinci Errata (TMS320DM355 Silicon Revision 1.1 Errata
@@ -776,21 +783,21 @@ mmc_davinci_xfer_done(struct mmc_davinci_host *host, 
struct mmc_data *data)
                if (host->sdio_int && !(readl(host->base + DAVINCI_SDIOST0) &
                                        SDIOST0_DAT1_HI)) {
                        writel(SDIOIST_IOINT, host->base + DAVINCI_SDIOIST);
-                       mmc_signal_sdio_irq(host->mmc);
+                       mmc_signal_sdio_irq(mmc);
                }
        }

        if (host->do_dma) {
                davinci_abort_dma(host);

-               dma_unmap_sg(mmc_dev(host->mmc), data->sg, data->sg_len,
+               dma_unmap_sg(mmc_dev(mmc), data->sg, data->sg_len,
                             mmc_get_dma_dir(data));
                host->do_dma = false;
        }
        host->data_dir = DAVINCI_MMC_DATADIR_NONE;

        if (!data->stop || (host->cmd && host->cmd->error)) {
-               mmc_request_done(host->mmc, data->mrq);
+               mmc_request_done(mmc, data->mrq);
                writel(0, host->base + DAVINCI_MMCIM);
                host->active_request = false;
        } else
@@ -818,7 +825,7 @@ static void mmc_davinci_cmd_done(struct mmc_davinci_host 
*host,
        if (host->data == NULL || cmd->error) {
                if (cmd->error == -ETIMEDOUT)
                        cmd->mrq->cmd->retries = 0;
-               mmc_request_done(host->mmc, cmd->mrq);
+               mmc_request_done(mmc_from_priv(host), cmd->mrq);
                writel(0, host->base + DAVINCI_MMCIM);
                host->active_request = false;
        }
@@ -849,14 +856,15 @@ davinci_abort_data(struct mmc_davinci_host *host, struct 
mmc_data *data)
 static irqreturn_t mmc_davinci_sdio_irq(int irq, void *dev_id)
 {
        struct mmc_davinci_host *host = dev_id;
+       struct mmc_host *mmc = mmc_from_priv(host);
        unsigned int status;

        status = readl(host->base + DAVINCI_SDIOIST);
        if (status & SDIOIST_IOINT) {
-               dev_dbg(mmc_dev(host->mmc),
+               dev_dbg(mmc_dev(mmc),
                        "SDIO interrupt status %x\n", status);
                writel(status | SDIOIST_IOINT, host->base + DAVINCI_SDIOIST);
-               mmc_signal_sdio_irq(host->mmc);
+               mmc_signal_sdio_irq(mmc);
        }
        return IRQ_HANDLED;
 }
@@ -867,11 +875,12 @@ static irqreturn_t mmc_davinci_irq(int irq, void *dev_id)
        unsigned int status, qstatus;
        int end_command = 0;
        int end_transfer = 0;
+       struct mmc_host *mmc = mmc_from_priv(host);
        struct mmc_data *data = host->data;

        if (host->cmd == NULL && host->data == NULL) {
                status = readl(host->base + DAVINCI_MMCST0);
-               dev_dbg(mmc_dev(host->mmc),
+               dev_dbg(mmc_dev(mmc),
                        "Spurious interrupt 0x%04x\n", status);
                /* Disable the interrupt from mmcsd */
                writel(0, host->base + DAVINCI_MMCIM);
@@ -929,7 +938,7 @@ static irqreturn_t mmc_davinci_irq(int irq, void *dev_id)
                        end_transfer = 1;
                        data->bytes_xfered = data->blocks * data->blksz;
                } else {
-                       dev_err(mmc_dev(host->mmc),
+                       dev_err(mmc_dev(mmc),
                                        "DATDNE with no host->data\n");
                }
        }
@@ -939,7 +948,7 @@ static irqreturn_t mmc_davinci_irq(int irq, void *dev_id)
                data->error = -ETIMEDOUT;
                end_transfer = 1;

-               dev_dbg(mmc_dev(host->mmc),
+               dev_dbg(mmc_dev(mmc),
                        "read data timeout, status %x\n",
                        qstatus);

@@ -963,7 +972,7 @@ static irqreturn_t mmc_davinci_irq(int irq, void *dev_id)
                        if (temp == 0x9f)
                                data->error = -ETIMEDOUT;
                }
-               dev_dbg(mmc_dev(host->mmc), "data %s %s error\n",
+               dev_dbg(mmc_dev(mmc), "data %s %s error\n",
                        (qstatus & MMCST0_CRCWR) ? "write" : "read",
                        (data->error == -ETIMEDOUT) ? "timeout" : "CRC");

@@ -973,7 +982,7 @@ static irqreturn_t mmc_davinci_irq(int irq, void *dev_id)
        if (qstatus & MMCST0_TOUTRS) {
                /* Command timeout */
                if (host->cmd) {
-                       dev_dbg(mmc_dev(host->mmc),
+                       dev_dbg(mmc_dev(mmc),
                                "CMD%d timeout, status %x\n",
                                host->cmd->opcode, qstatus);
                        host->cmd->error = -ETIMEDOUT;
@@ -987,7 +996,7 @@ static irqreturn_t mmc_davinci_irq(int irq, void *dev_id)

        if (qstatus & MMCST0_CRCRS) {
                /* Command CRC error */
-               dev_dbg(mmc_dev(host->mmc), "Command CRC error\n");
+               dev_dbg(mmc_dev(mmc), "Command CRC error\n");
                if (host->cmd) {
                        host->cmd->error = -EILSEQ;
                        end_command = 1;
@@ -1035,7 +1044,7 @@ static void mmc_davinci_enable_sdio_irq(struct mmc_host 
*mmc, int enable)
        if (enable) {
                if (!(readl(host->base + DAVINCI_SDIOST0) & SDIOST0_DAT1_HI)) {
                        writel(SDIOIST_IOINT, host->base + DAVINCI_SDIOIST);
-                       mmc_signal_sdio_irq(host->mmc);
+                       mmc_signal_sdio_irq(mmc_from_priv(host));
                } else {
                        host->sdio_int = true;
                        writel(readl(host->base + DAVINCI_SDIOIEN) |
@@ -1068,7 +1077,7 @@ static int mmc_davinci_cpufreq_transition(struct 
notifier_block *nb,
        unsigned long flags;

        host = container_of(nb, struct mmc_davinci_host, freq_transition);
-       mmc = host->mmc;
+       mmc = mmc_from_priv(host);
        mmc_pclk = clk_get_rate(host->clk);

        if (val == CPUFREQ_POSTCHANGE) {
@@ -1215,7 +1224,6 @@ static int davinci_mmcsd_probe(struct platform_device 
*pdev)
                return -ENOMEM;

        host = mmc_priv(mmc);
-       host->mmc = mmc;        /* Important */

        host->mem_res = mem;
        host->base = devm_ioremap(&pdev->dev, mem->start, mem_size);
@@ -1293,10 +1301,10 @@ static int davinci_mmcsd_probe(struct platform_device 
*pdev)
        mmc->max_blk_count      = 65535; /* NBLK is 16 bits */
        mmc->max_req_size       = mmc->max_blk_size * mmc->max_blk_count;

-       dev_dbg(mmc_dev(host->mmc), "max_segs=%d\n", mmc->max_segs);
-       dev_dbg(mmc_dev(host->mmc), "max_blk_size=%d\n", mmc->max_blk_size);
-       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);
+       dev_dbg(mmc_dev(mmc_from_priv(host)), "max_segs=%d\n", mmc->max_segs);
+       dev_dbg(mmc_dev(mmc_from_priv(host)), "max_blk_size=%d\n", 
mmc->max_blk_size);
+       dev_dbg(mmc_dev(mmc_from_priv(host)), "max_req_size=%d\n", 
mmc->max_req_size);
+       dev_dbg(mmc_dev(mmc_from_priv(host)), "max_seg_size=%d\n", 
mmc->max_seg_size);

        platform_set_drvdata(pdev, host);

@@ -1325,7 +1333,7 @@ static int davinci_mmcsd_probe(struct platform_device 
*pdev)

        rename_region(mem, mmc_hostname(mmc));

-       dev_info(mmc_dev(host->mmc), "Using %s, %d-bit mode\n",
+       dev_info(mmc_dev(mmc_from_priv(host)), "Using %s, %d-bit mode\n",
                host->use_dma ? "DMA" : "PIO",
                (mmc->caps & MMC_CAP_4_BIT_DATA) ? 4 : 1);

@@ -1351,12 +1359,13 @@ static int davinci_mmcsd_probe(struct platform_device 
*pdev)
 static int __exit davinci_mmcsd_remove(struct platform_device *pdev)
 {
        struct mmc_davinci_host *host = platform_get_drvdata(pdev);
+       struct mmc_host *mmc = mmc_from_priv(host);

-       mmc_remove_host(host->mmc);
+       mmc_remove_host(mmc);
        mmc_davinci_cpufreq_deregister(host);
        davinci_release_dma_channels(host);
        clk_disable_unprepare(host->clk);
-       mmc_free_host(host->mmc);
+       mmc_free_host(mmc);

        return 0;
 }
@@ -1410,4 +1419,3 @@ MODULE_AUTHOR("Texas Instruments India");
 MODULE_LICENSE("GPL");
 MODULE_DESCRIPTION("MMC/SD driver for Davinci MMC controller");
 MODULE_ALIAS("platform:davinci_mmc");
-
--
2.28.0

I'm a beginer contributor so please let me know
if there are any mistakes.

Reply via email to