Re: [PATCH V2] mmc: core: Add host capability check for power class

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

 



On 15 December 2011 15:34, Saugata Das <saugata.das@xxxxxxxxxx> wrote:
> On 15 December 2011 09:28, Girish K S <girish.shivananjappa@xxxxxxxxxx> wrote:
>> This patch adds a check whether the host supports maximum current value
>> obtained from the device's extended csd register for a selected interface
>> voltage and frequency.
>>
>> cc: Chris Ball <cjb@xxxxxxxxxx>
>> Signed-off-by: Girish K S <girish.shivananjappa@xxxxxxxxxx>
>> ---
>> Changes in v2:
>>        deleted a unnecessary if else condition identified by subhash J
>> Changes in v1:
>>       reduced the number of comparisons as per Hein's suggestion
>>
>>  drivers/mmc/core/mmc.c   |   19 +++++++++++++++++++
>>  include/linux/mmc/card.h |    4 ++++
>>  2 files changed, 23 insertions(+), 0 deletions(-)
>>
>> diff --git a/drivers/mmc/core/mmc.c b/drivers/mmc/core/mmc.c
>> index 006e932..b9ef777 100644
>> --- a/drivers/mmc/core/mmc.c
>> +++ b/drivers/mmc/core/mmc.c
>> @@ -688,6 +688,25 @@ static int mmc_select_powerclass(struct mmc_card *card,
>>                pwrclass_val = (pwrclass_val & EXT_CSD_PWR_CL_4BIT_MASK) >>
>>                                EXT_CSD_PWR_CL_4BIT_SHIFT;
>>
>> +       if (pwrclass_val >= MMC_MAX_CURRENT_800)
>> +               pwrclass_val = MMC_MAX_CURRENT_800;
>> +       else if (pwrclass_val >= MMC_MAX_CURRENT_600)
>> +               pwrclass_val = MMC_MAX_CURRENT_600;
>> +       else if (pwrclass_val >= MMC_MAX_CURRENT_400)
>> +               pwrclass_val = MMC_MAX_CURRENT_400;
>> +       else
>> +               pwrclass_val = MMC_MAX_CURRENT_200;
>> +
>> +       if ((pwrclass_val == MMC_MAX_CURRENT_800) &&
>> +           !(card->host->caps & MMC_CAP_MAX_CURRENT_800))
>> +               pwrclass_val = MMC_MAX_CURRENT_600;
>> +       if ((pwrclass_val == MMC_MAX_CURRENT_600) &&
>> +           !(card->host->caps & MMC_CAP_MAX_CURRENT_600))
>> +               pwrclass_val = MMC_MAX_CURRENT_400;
>> +       if ((pwrclass_val == MMC_MAX_CURRENT_400) &&
>> +           !(card->host->caps & MMC_CAP_MAX_CURRENT_400))
>> +               pwrclass_val = MMC_MAX_CURRENT_200;
>> +
>>        /* If the power class is different from the default value */
>>        if (pwrclass_val > 0) {
>>                err = mmc_switch(card, EXT_CSD_CMD_SET_NORMAL,
>
> It is not allowed to set the POWER_CLASS with any value other than
> what is mentioned in the PWR_CL_ff_vvv or PWR_CL_DDR_ff_vvv  for the
> corresponding frequency, voltage. That is, if PWR_CL_200_195 is 14 and
> we want to operate at HS200 then the only value allowed for
> POWER_CLASS is 14. So, we need to check the PWR_CL numbers and choose
> the operating mode (HS200/DDR50/..) based on the platform capability
> to support the current consumption and set the corresponding
> POWER_CLASS value.
>
> Please refer to section 6.6.5 of the 4.5 spec.

The upstreamed code reads the extended csd value based on the already
set voltage level and frequency of host. So it will get the required
power class value which can be set directly. Is my understanding
correct?

>
>
>> diff --git a/include/linux/mmc/card.h b/include/linux/mmc/card.h
>> index 9478a6b..c5e031a 100644
>> --- a/include/linux/mmc/card.h
>> +++ b/include/linux/mmc/card.h
>> @@ -195,6 +195,10 @@ struct mmc_part {
>>  #define MMC_BLK_DATA_AREA_GP   (1<<2)
>>  };
>>
>> +#define MMC_MAX_CURRENT_200    (0)
>> +#define MMC_MAX_CURRENT_400    (7)
>> +#define MMC_MAX_CURRENT_600    (11)
>> +#define MMC_MAX_CURRENT_800    (13)
>>  /*
>>  * MMC device
>>  */
>> --
>> 1.7.1
>>
>> --
>> 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