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 21:20, Subhash Jadavani <subhashj@xxxxxxxxxxxxxx> wrote:
>
>
>> -----Original Message-----
>> From: Saugata Das [mailto:saugata.das@xxxxxxxxxx]
>> Sent: Tuesday, April 03, 2012 8:55 PM
>> To: Subhash Jadavani
>> Cc: linux-mmc@xxxxxxxxxxxxxxx; linux-arm-msm@xxxxxxxxxxxxxxx;
>> girish.shivananjappa@xxxxxxxxxx
>> Subject: Re: [PATCH v1 1/1] mmc: core: fix power class selection
>>
>> 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
>
> Agreed with this point.
>
>> mode. From that perspective, the approach to ignore the error return from
>> mmc_select_powerclass looks wrong.
>
> My patch was just intended to fix the issue existing power class
> implementation. As commit text says:
>        - don't consider 2.7v to 3.2v as invalid range
>        - We are already ignoring the error returned by
> mmc_set_power_class() function for DS/HS/DDR cards. So this patch has
> extended that to HS200 cards.
>
> So as far as this patch is concerned, I don't see anything wrong here.
>
> As you have mentioned, currently we are not taking the host controller
> capability into account (as it doesn't exist as of now) so we should not see
> mmc_select_powerclass() fail any time.

This is actually the main concern. The fail of mmc_select_powerclass
is something to be checked and not ignored since it should not fail
under the current implementation.


> But yes, next thing should be to take into account the host current sourcing
> capability before deciding which bus speed mode to choose. But that may be a
> big change and should be as separate patch. Girish had already posted one
> patch for this which needs to be extended to achieve this.
>
> Regards,
> Subhash
>
>>
>>
>> > 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