* [PATCH] mmc: davinci: Drop pointer to mmc_host from mmc_davinci_host
@ 2020-09-20 20:49 Amey Narkhede
2020-09-24 12:49 ` Ulf Hansson
0 siblings, 1 reply; 3+ messages in thread
From: Amey Narkhede @ 2020-09-20 20:49 UTC (permalink / raw)
To: ulf.hansson
Cc: gustavoars, mirq-linux, ameynarkhede03, linux-mmc, linux-kernel
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 <ameynarkhede03@gmail.com>
---
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.
^ permalink raw reply related [flat|nested] 3+ messages in thread
* Re: [PATCH] mmc: davinci: Drop pointer to mmc_host from mmc_davinci_host
2020-09-20 20:49 [PATCH] mmc: davinci: Drop pointer to mmc_host from mmc_davinci_host Amey Narkhede
@ 2020-09-24 12:49 ` Ulf Hansson
2020-09-25 11:31 ` Ulf Hansson
0 siblings, 1 reply; 3+ messages in thread
From: Ulf Hansson @ 2020-09-24 12:49 UTC (permalink / raw)
To: Amey Narkhede
Cc: Gustavo A. R. Silva, Michał Mirosław, linux-mmc,
Linux Kernel Mailing List
On Sun, 20 Sep 2020 at 22:51, Amey Narkhede <ameynarkhede03@gmail.com> wrote:
>
> 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 <ameynarkhede03@gmail.com>
Applied for next, thanks!
Kind regards
Uffe
> ---
> 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.
^ permalink raw reply [flat|nested] 3+ messages in thread
* Re: [PATCH] mmc: davinci: Drop pointer to mmc_host from mmc_davinci_host
2020-09-24 12:49 ` Ulf Hansson
@ 2020-09-25 11:31 ` Ulf Hansson
0 siblings, 0 replies; 3+ messages in thread
From: Ulf Hansson @ 2020-09-25 11:31 UTC (permalink / raw)
To: Amey Narkhede
Cc: Gustavo A. R. Silva, Michał Mirosław, linux-mmc,
Linux Kernel Mailing List
On Thu, 24 Sep 2020 at 14:49, Ulf Hansson <ulf.hansson@linaro.org> wrote:
>
> On Sun, 20 Sep 2020 at 22:51, Amey Narkhede <ameynarkhede03@gmail.com> wrote:
> >
> > 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 <ameynarkhede03@gmail.com>
>
> Applied for next, thanks!
Turned out that this one did cause build errors, so I have dropped it
from my next branch.
Please re-spin a v2 and make sure to run a build test before you submit again.
[...]
Kind regards
Uffe
^ permalink raw reply [flat|nested] 3+ messages in thread
end of thread, other threads:[~2020-09-25 11:32 UTC | newest]
Thread overview: 3+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2020-09-20 20:49 [PATCH] mmc: davinci: Drop pointer to mmc_host from mmc_davinci_host Amey Narkhede
2020-09-24 12:49 ` Ulf Hansson
2020-09-25 11:31 ` Ulf Hansson
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).