[U-Boot] [PATCH 3/5] mmc: Tegra2: Factor out mmc_wait_inhibit functionality

Anton Staaf robotboy at chromium.org
Fri Oct 28 19:55:18 CEST 2011


On Thu, Oct 13, 2011 at 2:57 PM, Anton Staaf <robotboy at chromium.org> wrote:
> This is a well encapsulated section of mmc_send_cmd, by moving
> it to it's own function it increases the readability of mmc_send_cmd.
>
> Signed-off-by: Anton Staaf <robotboy at chromium.org>
> Cc: Tom Warren <twarren at nvidia.com>
> Cc: Stephen Warren <swarren at nvidia.com>

Adding Albert to CC.

-Anton

> ---
>  drivers/mmc/tegra2_mmc.c |   41 ++++++++++++++++++++++++++---------------
>  1 files changed, 26 insertions(+), 15 deletions(-)
>
> diff --git a/drivers/mmc/tegra2_mmc.c b/drivers/mmc/tegra2_mmc.c
> index 27564b0..141429e 100644
> --- a/drivers/mmc/tegra2_mmc.c
> +++ b/drivers/mmc/tegra2_mmc.c
> @@ -102,18 +102,12 @@ static void mmc_set_transfer_mode(struct mmc_host *host, struct mmc_data *data)
>        writew(mode, &host->reg->trnmod);
>  }
>
> -static int mmc_send_cmd(struct mmc *mmc, struct mmc_cmd *cmd,
> -                       struct mmc_data *data)
> +static int mmc_wait_inhibit(struct mmc_host *host,
> +                           struct mmc_cmd *cmd,
> +                           struct mmc_data *data,
> +                           unsigned int timeout)
>  {
> -       struct mmc_host *host = (struct mmc_host *)mmc->priv;
> -       int flags, i;
> -       unsigned int timeout;
> -       unsigned int mask;
> -       unsigned int retry = 0x100000;
> -       debug(" mmc_send_cmd called\n");
> -
> -       /* Wait max 10 ms */
> -       timeout = 10;
> +       unsigned int mask = 0;
>
>        /*
>         * PRNSTS
> @@ -121,15 +115,13 @@ static int mmc_send_cmd(struct mmc *mmc, struct mmc_cmd *cmd,
>         * CMDINHCMD[0] : Command Inhibit (CMD)
>         */
>        mask = (1 << 0);
> -       if ((data != NULL) || (cmd->resp_type & MMC_RSP_BUSY))
> -               mask |= (1 << 1);
>
>        /*
>         * We shouldn't wait for data inhibit for stop commands, even
>         * though they might use busy signaling
>         */
> -       if (data)
> -               mask &= ~(1 << 1);
> +       if ((data == NULL) && (cmd->resp_type & MMC_RSP_BUSY))
> +               mask |= (1 << 1);
>
>        while (readl(&host->reg->prnsts) & mask) {
>                if (timeout == 0) {
> @@ -140,6 +132,25 @@ static int mmc_send_cmd(struct mmc *mmc, struct mmc_cmd *cmd,
>                udelay(1000);
>        }
>
> +       return 0;
> +}
> +
> +static int mmc_send_cmd(struct mmc *mmc, struct mmc_cmd *cmd,
> +                       struct mmc_data *data)
> +{
> +       struct mmc_host *host = (struct mmc_host *)mmc->priv;
> +       int flags, i;
> +       int result;
> +       unsigned int timeout;
> +       unsigned int mask;
> +       unsigned int retry = 0x100000;
> +       debug(" mmc_send_cmd called\n");
> +
> +       result = mmc_wait_inhibit(host, cmd, data, 10 /* ms */);
> +
> +       if (result < 0)
> +               return result;
> +
>        if (data)
>                mmc_prepare_data(host, data);
>
> --
> 1.7.3.1
>
>


More information about the U-Boot mailing list