Re: [PATCH v1 1/1] mmc: core: fix power class selection

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On 3 April 2012 12:25, Subhash Jadavani <subhashj@xxxxxxxxxxxxxx> wrote:
> mmc_select_powerclass() function returns error if eMMC
> VDD level supported by host is between 2.7v to 3.2v.
>
> According to eMMC specification, valid voltage for high
> voltage cards is 2.7v to 3.6v. This patch ensures that
> 2.7v to 3.6v VDD range is treated as valid range.
>
> Also, failure to set the power class shouldn't be treated
> as fatal error because even if setting the power class
> fails, card can still work in default power class.
> If mmc_select_powerclass() returns error, just print
> the warning message and go ahead with rest of the card
> initialization.
>

Have you checked why mmc_select_powerclass returned error ? Today, in
the mmc_select_powerclass, it is just setting the value of power
class, which the eMMC expects. So, it should not fail.

Another point is that, today mmc_select_powerclass is assuming that
host can support the maximum possible power classes and it does not
check host controllers capability in driving higher current (mA). But
I think in future we need to add this check for host controller
ability and return error from mmc_select_powerclass so that
mmc_init_card can choose the next speed mode. From that perspective,
the approach to ignore the error return from mmc_select_powerclass
looks wrong.


> Signed-off-by: Subhash Jadavani <subhashj@xxxxxxxxxxxxxx>
> ---
>  drivers/mmc/core/mmc.c |   30 +++++++++++++++++-------------
>  1 files changed, 17 insertions(+), 13 deletions(-)
>
> diff --git a/drivers/mmc/core/mmc.c b/drivers/mmc/core/mmc.c
> index 02914d6..54df5ad 100644
> --- a/drivers/mmc/core/mmc.c
> +++ b/drivers/mmc/core/mmc.c
> @@ -695,6 +695,11 @@ static int mmc_select_powerclass(struct mmc_card *card,
>                else if (host->ios.clock <= 200000000)
>                        index = EXT_CSD_PWR_CL_200_195;
>                break;
> +       case MMC_VDD_27_28:
> +       case MMC_VDD_28_29:
> +       case MMC_VDD_29_30:
> +       case MMC_VDD_30_31:
> +       case MMC_VDD_31_32:
>        case MMC_VDD_32_33:
>        case MMC_VDD_33_34:
>        case MMC_VDD_34_35:
> @@ -1111,11 +1116,10 @@ static int mmc_init_card(struct mmc_host *host, u32 ocr,
>                ext_csd_bits = (bus_width == MMC_BUS_WIDTH_8) ?
>                                EXT_CSD_BUS_WIDTH_8 : EXT_CSD_BUS_WIDTH_4;
>                err = mmc_select_powerclass(card, ext_csd_bits, ext_csd);
> -               if (err) {
> -                       pr_err("%s: power class selection to bus width %d failed\n",
> -                               mmc_hostname(card->host), 1 << bus_width);
> -                       goto err;
> -               }
> +               if (err)
> +                       pr_warning("%s: power class selection to bus width %d"
> +                                  " failed\n", mmc_hostname(card->host),
> +                                  1 << bus_width);
>        }
>
>        /*
> @@ -1147,10 +1151,10 @@ static int mmc_init_card(struct mmc_host *host, u32 ocr,
>                        err = mmc_select_powerclass(card, ext_csd_bits[idx][0],
>                                                    ext_csd);
>                        if (err)
> -                               pr_err("%s: power class selection to "
> -                                      "bus width %d failed\n",
> -                                      mmc_hostname(card->host),
> -                                      1 << bus_width);
> +                               pr_warning("%s: power class selection to "
> +                                          "bus width %d failed\n",
> +                                          mmc_hostname(card->host),
> +                                          1 << bus_width);
>
>                        err = mmc_switch(card, EXT_CSD_CMD_SET_NORMAL,
>                                         EXT_CSD_BUS_WIDTH,
> @@ -1178,10 +1182,10 @@ static int mmc_init_card(struct mmc_host *host, u32 ocr,
>                        err = mmc_select_powerclass(card, ext_csd_bits[idx][1],
>                                                    ext_csd);
>                        if (err)
> -                               pr_err("%s: power class selection to "
> -                                      "bus width %d ddr %d failed\n",
> -                                      mmc_hostname(card->host),
> -                                      1 << bus_width, ddr);
> +                               pr_warning("%s: power class selection to "
> +                                          "bus width %d ddr %d failed\n",
> +                                          mmc_hostname(card->host),
> +                                          1 << bus_width, ddr);
>
>                        err = mmc_switch(card, EXT_CSD_CMD_SET_NORMAL,
>                                         EXT_CSD_BUS_WIDTH,
> --
> 1.7.1.1
>
> --
> Sent by a consultant of the Qualcomm Innovation Center, Inc.
> The Qualcomm Innovation Center, Inc. is a member of the Code Aurora Forum.
> --
> To unsubscribe from this list: send the line "unsubscribe linux-mmc" in
> the body of a message to majordomo@xxxxxxxxxxxxxxx
> More majordomo info at  http://vger.kernel.org/majordomo-info.html
--
To unsubscribe from this list: send the line "unsubscribe linux-mmc" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html


[Index of Archives]     [Linux USB Devel]     [Linux Media]     [Video for Linux]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]

  Powered by Linux