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

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

 




> -----Original Message-----
> From: linux-mmc-owner@xxxxxxxxxxxxxxx [mailto:linux-mmc-
> owner@xxxxxxxxxxxxxxx] On Behalf Of Saugata Das
> Sent: Tuesday, April 03, 2012 9:48 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 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.

Yes, this makes sense. With current implementation, mmc_select_powerclass()
should never really fail which means failure should be treated as fatal and
we should really skip the card initialization.
This patch is already pushed to mmc-next. So I will post another patch (by
next week as I will be on vacation in this week) to skip the card
initialization if mmc_select_powerclass fails.

Is this ok?

Regards,
Subhash

> 
> 
> > 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

--
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