[PATCH 16/18] mmc: meson-gx: improve response reading and sending stop command

Kevin Hilman khilman at baylibre.com
Wed Feb 15 11:34:49 PST 2017


Heiner Kallweit <hkallweit1 at gmail.com> writes:

> Stopping execution at the beginning of command processing (again) is
> not needed as reading SD_EMMC_CMD_RSP implicitely stops execution.
> We just have to take care of the case that a command doesn't return a
> response. Therefore read SD_EMMC_CMD_RSP always.
>
> In addition we can read the response in the main irq handler already,
> we don't have to do this in the threaded handler.
>
> Signed-off-by: Heiner Kallweit <hkallweit1 at gmail.com>

Acked-by: Kevin Hilman <khilman at baylibre.com>


> ---
>  drivers/mmc/host/meson-gx-mmc.c | 16 ++++++++--------
>  1 file changed, 8 insertions(+), 8 deletions(-)
>
> diff --git a/drivers/mmc/host/meson-gx-mmc.c b/drivers/mmc/host/meson-gx-mmc.c
> index 25b46d36..6721aee2 100644
> --- a/drivers/mmc/host/meson-gx-mmc.c
> +++ b/drivers/mmc/host/meson-gx-mmc.c
> @@ -510,9 +510,6 @@ static void meson_mmc_request(struct mmc_host *mmc, struct mmc_request *mrq)
>  
>  	WARN_ON(host->mrq != NULL);
>  
> -	/* Stop execution */
> -	writel(0, host->regs + SD_EMMC_START);
> -
>  	host->mrq = mrq;
>  	meson_mmc_start_cmd(mmc, mrq->cmd);
>  }
> @@ -521,12 +518,16 @@ static void meson_mmc_read_resp(struct mmc_host *mmc, struct mmc_command *cmd)
>  {
>  	struct meson_host *host = mmc_priv(mmc);
>  
> +	/*
> +	 * reading SD_EMMC_CMD_RSP stops processing, therefore read
> +	 * this register even if command has no response
> +	 */
>  	if (cmd->flags & MMC_RSP_136) {
>  		cmd->resp[0] = readl(host->regs + SD_EMMC_CMD_RSP3);
>  		cmd->resp[1] = readl(host->regs + SD_EMMC_CMD_RSP2);
>  		cmd->resp[2] = readl(host->regs + SD_EMMC_CMD_RSP1);
>  		cmd->resp[3] = readl(host->regs + SD_EMMC_CMD_RSP);
> -	} else if (cmd->flags & MMC_RSP_PRESENT) {
> +	} else {
>  		cmd->resp[0] = readl(host->regs + SD_EMMC_CMD_RSP);
>  	}
>  }
> @@ -564,6 +565,8 @@ static irqreturn_t meson_mmc_irq(int irq, void *dev_id)
>  		goto out;
>  	}
>  
> +	meson_mmc_read_resp(host->mmc, cmd);
> +
>  	cmd->error = 0;
>  	if (status & IRQ_RXD_ERR_MASK) {
>  		dev_dbg(host->dev, "Unhandled IRQ: RXD error\n");
> @@ -610,10 +613,8 @@ static irqreturn_t meson_mmc_irq(int irq, void *dev_id)
>  	/* ack all (enabled) interrupts */
>  	writel(status, host->regs + SD_EMMC_STATUS);
>  
> -	if (ret == IRQ_HANDLED) {
> -		meson_mmc_read_resp(host->mmc, cmd);
> +	if (ret == IRQ_HANDLED)
>  		meson_mmc_request_done(host->mmc, cmd->mrq);
> -	}
>  
>  	spin_unlock(&host->lock);
>  	return ret;
> @@ -643,7 +644,6 @@ static irqreturn_t meson_mmc_irq_thread(int irq, void *dev_id)
>  		data->bytes_xfered = xfer_bytes;
>  	}
>  
> -	meson_mmc_read_resp(host->mmc, cmd);
>  	if (mmc_op_multi(cmd->opcode))
>  		meson_mmc_start_cmd(host->mmc, data->stop);
>  	else



More information about the linux-amlogic mailing list