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

2012-04-03 Thread Saugata Das
On 2 April 2012 16:24, Subhash Jadavani subha...@codeaurora.org wrote:


 -Original Message-
 From: Saugata Das [mailto:saugata@linaro.org]
 Sent: Monday, April 02, 2012 1:20 PM
 To: Subhash Jadavani
 Cc: Girish K S; linux-...@vger.kernel.org; patc...@linaro.org; linux-
 samsung-...@vger.kernel.org; Chris Ball
 Subject: Re: [PATCH V2] mmc: core: Add host capability check for power
 class

 On 28 March 2012 16:39, Subhash Jadavani subha...@codeaurora.org
 wrote:
 
 
  -Original Message-
  From: linux-mmc-ow...@vger.kernel.org [mailto:linux-mmc-
  ow...@vger.kernel.org] On Behalf Of Saugata Das
  Sent: Thursday, December 15, 2011 6:35 PM
  To: Girish K S
  Cc: linux-...@vger.kernel.org; patc...@linaro.org; linux-samsung-
  s...@vger.kernel.org; subha...@codeaurora.org; Chris Ball
  Subject: Re: [PATCH V2] mmc: core: Add host capability check for
  power
  class
 
  On 15 December 2011 16:22, Girish K S
  girish.shivananja...@linaro.org
  wrote:
   On 15 December 2011 15:34, Saugata Das saugata@linaro.org
 wrote:
   On 15 December 2011 09:28, Girish K S
   girish.shivananja...@linaro.org
  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 c...@laptop.org
   Signed-off-by: Girish K S girish.shivananja...@linaro.org
   ---
   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?
  
 
  It is not enough to just check the voltage level and frequency.
  Consider this example, host has capability to support
  MMC_CAP_MAX_CURRENT_400, the PWR_CL_DDR_52_360 has the value
 9
  (400mA) and PWR_CL_200_360 has the value 14 (800mA). Then even
 though
  the host might be capable to run 200MHz clock and 3.6V, it can only
  enable DDR at 52MHz and set 9 in POWER_CLASS.
 
  I think, in mmc_select_powerclass, we need to loop through the power
  classes of all supported modes of transfer (HS200, DDR52, ... ) and
  choose
  the
  mode which gives maximum bandwidth but falls within host capability
  of current consumption. Then set this to POWER_CLASS byte and also
  use the same information when setting HS_TIMING in mmc_init_card.
 
  Hi Saugata,
 
  Does the spec mandates you to set the power class to what is needed by
  frequency/voltage combination? I can't see that mentioned anywhere
  explicitly in eMMC4.5 spec (if it is mentioned in spec, please

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

2012-04-02 Thread Saugata Das
On 28 March 2012 16:39, Subhash Jadavani subha...@codeaurora.org wrote:


 -Original Message-
 From: linux-mmc-ow...@vger.kernel.org [mailto:linux-mmc-
 ow...@vger.kernel.org] On Behalf Of Saugata Das
 Sent: Thursday, December 15, 2011 6:35 PM
 To: Girish K S
 Cc: linux-...@vger.kernel.org; patc...@linaro.org; linux-samsung-
 s...@vger.kernel.org; subha...@codeaurora.org; Chris Ball
 Subject: Re: [PATCH V2] mmc: core: Add host capability check for power
 class

 On 15 December 2011 16:22, Girish K S girish.shivananja...@linaro.org
 wrote:
  On 15 December 2011 15:34, Saugata Das saugata@linaro.org wrote:
  On 15 December 2011 09:28, Girish K S girish.shivananja...@linaro.org
 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 c...@laptop.org
  Signed-off-by: Girish K S girish.shivananja...@linaro.org
  ---
  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?
 

 It is not enough to just check the voltage level and frequency.
 Consider this example, host has capability to support
 MMC_CAP_MAX_CURRENT_400, the PWR_CL_DDR_52_360 has the value 9
 (400mA) and PWR_CL_200_360 has the value 14 (800mA). Then even though
 the host might be capable to run 200MHz clock and 3.6V, it can only enable
 DDR at 52MHz and set 9 in POWER_CLASS.

 I think, in mmc_select_powerclass, we need to loop through the power
 classes of all supported modes of transfer (HS200, DDR52, ... ) and choose
 the
 mode which gives maximum bandwidth but falls within host capability of
 current consumption. Then set this to POWER_CLASS byte and also use the
 same information when setting HS_TIMING in mmc_init_card.

 Hi Saugata,

 Does the spec mandates you to set the power class to what is needed by
 frequency/voltage combination? I can't see that mentioned anywhere
 explicitly in eMMC4.5 spec (if it is mentioned in spec, please let me know
 section and line number). It may be still possible to set the power class
 lower than what is needed by frequency/voltage combination. Say for example,
 8-bit HS200 (200MHz) with high voltage cards may specify power class
 (PWR_CL_200_3_6) value of 14 (800 mA) but that doesn't mean if you want the
 card to work in 8-bit HS200 mode, its POWER_CLASS value must be 14 (800mA).
 If host's VDD regulator is only capable of say 600mA then it may still set
 the POWER_CLASS to 12 (600 mA) which should be the indication

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

2012-04-02 Thread Subhash Jadavani


 -Original Message-
 From: Saugata Das [mailto:saugata@linaro.org]
 Sent: Monday, April 02, 2012 1:20 PM
 To: Subhash Jadavani
 Cc: Girish K S; linux-...@vger.kernel.org; patc...@linaro.org; linux-
 samsung-...@vger.kernel.org; Chris Ball
 Subject: Re: [PATCH V2] mmc: core: Add host capability check for power
class
 
 On 28 March 2012 16:39, Subhash Jadavani subha...@codeaurora.org
 wrote:
 
 
  -Original Message-
  From: linux-mmc-ow...@vger.kernel.org [mailto:linux-mmc-
  ow...@vger.kernel.org] On Behalf Of Saugata Das
  Sent: Thursday, December 15, 2011 6:35 PM
  To: Girish K S
  Cc: linux-...@vger.kernel.org; patc...@linaro.org; linux-samsung-
  s...@vger.kernel.org; subha...@codeaurora.org; Chris Ball
  Subject: Re: [PATCH V2] mmc: core: Add host capability check for
  power
  class
 
  On 15 December 2011 16:22, Girish K S
  girish.shivananja...@linaro.org
  wrote:
   On 15 December 2011 15:34, Saugata Das saugata@linaro.org
 wrote:
   On 15 December 2011 09:28, Girish K S
   girish.shivananja...@linaro.org
  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 c...@laptop.org
   Signed-off-by: Girish K S girish.shivananja...@linaro.org
   ---
   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?
  
 
  It is not enough to just check the voltage level and frequency.
  Consider this example, host has capability to support
  MMC_CAP_MAX_CURRENT_400, the PWR_CL_DDR_52_360 has the value
 9
  (400mA) and PWR_CL_200_360 has the value 14 (800mA). Then even
 though
  the host might be capable to run 200MHz clock and 3.6V, it can only
  enable DDR at 52MHz and set 9 in POWER_CLASS.
 
  I think, in mmc_select_powerclass, we need to loop through the power
  classes of all supported modes of transfer (HS200, DDR52, ... ) and
  choose
  the
  mode which gives maximum bandwidth but falls within host capability
  of current consumption. Then set this to POWER_CLASS byte and also
  use the same information when setting HS_TIMING in mmc_init_card.
 
  Hi Saugata,
 
  Does the spec mandates you to set the power class to what is needed by
  frequency/voltage combination? I can't see that mentioned anywhere
  explicitly in eMMC4.5 spec (if it is mentioned in spec, please let me
  know section and line number). It may be still possible

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

2012-03-29 Thread Girish K S
On 29 March 2012 11:17, Girish K S girish.shivananja...@linaro.org wrote:
 On 28 March 2012 16:39, Subhash Jadavani subha...@codeaurora.org wrote:


 -Original Message-
 From: linux-mmc-ow...@vger.kernel.org [mailto:linux-mmc-
 ow...@vger.kernel.org] On Behalf Of Saugata Das
 Sent: Thursday, December 15, 2011 6:35 PM
 To: Girish K S
 Cc: linux-...@vger.kernel.org; patc...@linaro.org; linux-samsung-
 s...@vger.kernel.org; subha...@codeaurora.org; Chris Ball
 Subject: Re: [PATCH V2] mmc: core: Add host capability check for power
 class

 On 15 December 2011 16:22, Girish K S girish.shivananja...@linaro.org
 wrote:
  On 15 December 2011 15:34, Saugata Das saugata@linaro.org wrote:
  On 15 December 2011 09:28, Girish K S girish.shivananja...@linaro.org
 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 c...@laptop.org
  Signed-off-by: Girish K S girish.shivananja...@linaro.org
  ---
  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?
 

 It is not enough to just check the voltage level and frequency.
 Consider this example, host has capability to support
 MMC_CAP_MAX_CURRENT_400, the PWR_CL_DDR_52_360 has the value 9
 (400mA) and PWR_CL_200_360 has the value 14 (800mA). Then even though
 the host might be capable to run 200MHz clock and 3.6V, it can only enable
 DDR at 52MHz and set 9 in POWER_CLASS.

 I think, in mmc_select_powerclass, we need to loop through the power
 classes of all supported modes of transfer (HS200, DDR52, ... ) and choose
 the
 mode which gives maximum bandwidth but falls within host capability of
 current consumption. Then set this to POWER_CLASS byte and also use the
 same information when setting HS_TIMING in mmc_init_card.

 Hi Saugata,

 Does the spec mandates you to set the power class to what is needed by
 frequency/voltage combination? I can't see that mentioned anywhere
 explicitly in eMMC4.5 spec (if it is mentioned in spec, please let me know
 section and line number). It may be still possible to set the power class
 lower than what is needed by frequency/voltage combination. Say for example,
 8-bit HS200 (200MHz) with high voltage cards may specify power class
 (PWR_CL_200_3_6) value of 14 (800 mA) but that doesn't mean if you want the
 card to work in 8-bit HS200 mode, its POWER_CLASS value must be 14 (800mA).
 If host's VDD regulator is only capable of say 600mA

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

2012-03-29 Thread Subhash Jadavani

 -Original Message-
 From: linux-mmc-ow...@vger.kernel.org [mailto:linux-mmc-
 ow...@vger.kernel.org] On Behalf Of Girish K S
 Sent: Friday, March 30, 2012 10:29 AM
 To: Subhash Jadavani
 Cc: Saugata Das; linux-...@vger.kernel.org; patc...@linaro.org; linux-
 samsung-...@vger.kernel.org; Chris Ball
 Subject: Re: [PATCH V2] mmc: core: Add host capability check for power
class
 
 On 29 March 2012 11:17, Girish K S girish.shivananja...@linaro.org
wrote:
  On 28 March 2012 16:39, Subhash Jadavani subha...@codeaurora.org
 wrote:
 
 
  -Original Message-
  From: linux-mmc-ow...@vger.kernel.org [mailto:linux-mmc-
  ow...@vger.kernel.org] On Behalf Of Saugata Das
  Sent: Thursday, December 15, 2011 6:35 PM
  To: Girish K S
  Cc: linux-...@vger.kernel.org; patc...@linaro.org; linux-samsung-
  s...@vger.kernel.org; subha...@codeaurora.org; Chris Ball
  Subject: Re: [PATCH V2] mmc: core: Add host capability check for
  power
  class
 
  On 15 December 2011 16:22, Girish K S
  girish.shivananja...@linaro.org
  wrote:
   On 15 December 2011 15:34, Saugata Das saugata@linaro.org
 wrote:
   On 15 December 2011 09:28, Girish K S
   girish.shivananja...@linaro.org
  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 c...@laptop.org
   Signed-off-by: Girish K S girish.shivananja...@linaro.org
   ---
   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?
  
 
  It is not enough to just check the voltage level and frequency.
  Consider this example, host has capability to support
  MMC_CAP_MAX_CURRENT_400, the PWR_CL_DDR_52_360 has the
 value 9
  (400mA) and PWR_CL_200_360 has the value 14 (800mA). Then even
  though the host might be capable to run 200MHz clock and 3.6V, it
  can only enable DDR at 52MHz and set 9 in POWER_CLASS.
 
  I think, in mmc_select_powerclass, we need to loop through the power
  classes of all supported modes of transfer (HS200, DDR52, ... ) and
  choose
  the
  mode which gives maximum bandwidth but falls within host capability
  of current consumption. Then set this to POWER_CLASS byte and also
  use the same information when setting HS_TIMING in mmc_init_card.
 
  Hi Saugata,
 
  Does the spec mandates you to set the power class to what is needed
  by frequency/voltage combination? I can't see that mentioned

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

2012-03-28 Thread Girish K S
On 28 March 2012 16:39, Subhash Jadavani subha...@codeaurora.org wrote:


 -Original Message-
 From: linux-mmc-ow...@vger.kernel.org [mailto:linux-mmc-
 ow...@vger.kernel.org] On Behalf Of Saugata Das
 Sent: Thursday, December 15, 2011 6:35 PM
 To: Girish K S
 Cc: linux-...@vger.kernel.org; patc...@linaro.org; linux-samsung-
 s...@vger.kernel.org; subha...@codeaurora.org; Chris Ball
 Subject: Re: [PATCH V2] mmc: core: Add host capability check for power
 class

 On 15 December 2011 16:22, Girish K S girish.shivananja...@linaro.org
 wrote:
  On 15 December 2011 15:34, Saugata Das saugata@linaro.org wrote:
  On 15 December 2011 09:28, Girish K S girish.shivananja...@linaro.org
 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 c...@laptop.org
  Signed-off-by: Girish K S girish.shivananja...@linaro.org
  ---
  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?
 

 It is not enough to just check the voltage level and frequency.
 Consider this example, host has capability to support
 MMC_CAP_MAX_CURRENT_400, the PWR_CL_DDR_52_360 has the value 9
 (400mA) and PWR_CL_200_360 has the value 14 (800mA). Then even though
 the host might be capable to run 200MHz clock and 3.6V, it can only enable
 DDR at 52MHz and set 9 in POWER_CLASS.

 I think, in mmc_select_powerclass, we need to loop through the power
 classes of all supported modes of transfer (HS200, DDR52, ... ) and choose
 the
 mode which gives maximum bandwidth but falls within host capability of
 current consumption. Then set this to POWER_CLASS byte and also use the
 same information when setting HS_TIMING in mmc_init_card.

 Hi Saugata,

 Does the spec mandates you to set the power class to what is needed by
 frequency/voltage combination? I can't see that mentioned anywhere
 explicitly in eMMC4.5 spec (if it is mentioned in spec, please let me know
 section and line number). It may be still possible to set the power class
 lower than what is needed by frequency/voltage combination. Say for example,
 8-bit HS200 (200MHz) with high voltage cards may specify power class
 (PWR_CL_200_3_6) value of 14 (800 mA) but that doesn't mean if you want the
 card to work in 8-bit HS200 mode, its POWER_CLASS value must be 14 (800mA).
 If host's VDD regulator is only capable of say 600mA then it may still set
 the POWER_CLASS to 12 (600 mA) which should be the indication

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

2011-12-15 Thread Saugata Das
On 15 December 2011 16:22, Girish K S girish.shivananja...@linaro.org wrote:
 On 15 December 2011 15:34, Saugata Das saugata@linaro.org wrote:
 On 15 December 2011 09:28, Girish K S girish.shivananja...@linaro.org 
 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 c...@laptop.org
 Signed-off-by: Girish K S girish.shivananja...@linaro.org
 ---
 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?


It is not enough to just check the voltage level and frequency.
Consider this example, host has capability to support
MMC_CAP_MAX_CURRENT_400, the PWR_CL_DDR_52_360 has the value 9 (400mA)
and PWR_CL_200_360 has the value 14 (800mA). Then even though the host
might be capable to run 200MHz clock and 3.6V, it can only enable DDR
at 52MHz and set 9 in POWER_CLASS.

I think, in mmc_select_powerclass, we need to loop through the power
classes of all supported modes of transfer (HS200, DDR52, ... ) and
choose the mode which gives maximum bandwidth but falls within host
capability of current consumption. Then set this to POWER_CLASS byte
and also use the same information when setting HS_TIMING in
mmc_init_card.



 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   (12)
  };

 +#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 majord...@vger.kernel.org
 More majordomo info at  http://vger.kernel.org/majordomo-info.html
--
To unsubscribe from this list: send the line unsubscribe linux-samsung-soc in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


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

2011-12-14 Thread Girish K S
On 15 December 2011 11:33, amit kachhap amit.kach...@linaro.org wrote:
 On Thu, Dec 15, 2011 at 9:28 AM, Girish K S
 girish.shivananja...@linaro.org 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 c...@laptop.org
 Signed-off-by: Girish K S girish.shivananja...@linaro.org
 ---
 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)
 Hi girish,

 These checks can be made like ,
 if (pwrclass_val  MMC_MAX_CURRENT_800)
        pwrclass_val = MMC_MAX_CURRENT_800;
 Applicable in all below conditional checks.

I feel that should be OK. Since there will be no significant
improvement or side effects with the current implementation.


 Thanks,
 Amit D

 +               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,
 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   (12)
  };

 +#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-samsung-soc 
 in
 the body of a message to majord...@vger.kernel.org
 More majordomo info at  http://vger.kernel.org/majordomo-info.html
--
To unsubscribe from this list: send the line unsubscribe linux-samsung-soc in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html