Re: [PATCH 2/3] mmc: dw_mmc: simplify the SDMMC_CLKEN_LOW_PWR logic

2015-08-17 Thread Alim Akhtar
Hi Michal,

On Mon, Aug 17, 2015 at 8:25 PM, Michal Suchanek  wrote:
>  Hello,
>
> On 17 August 2015 at 16:42, Alim Akhtar  wrote:
>> HI
>>
>> On Mon, Aug 17, 2015 at 4:56 PM, Jaehoon Chung  
>> wrote:
>>> On 08/17/2015 02:52 PM, Michal Suchanek wrote:
 Hello,

 On 17 August 2015 at 03:55, Jaehoon Chung  wrote:
> Hi, Michal.
>
> On 08/12/2015 09:23 PM, Michal Suchanek wrote:
>> The driver has open-coded test for SDIO cards. Use the mmc core provided
>> MMC_QUIRK_BROKEN_CLK_GATING flag instead.
>
> Did you use the clock-gating for SDIO cards?
> Doesn't MMC_CAP_SDIO_IRQ bit set? Which case is broken?
> Could you explain to me more?

 The core flag for disabling power saving is MMC_QUIRK_BROKEN_CLK_GATING.
>>>
>>> I understood your intention. And i read the comment into mmc/core/quirks.c
>>> I will test SDIO card with this patch. Thanks.
>>>
>> When you test, please check if SDIO IRQ still works, we need to put
>> dw_mmc in low_power mode otherwise SDIO IRQ will be not be generated
>> by dw_mmc host controller.
>>
>
> As far as I understand the logic which is removed in this patch and
> the core logic which replaces it is the same -  low power by means of
> clock gating is *not* enabled for SDIO cards in either case.
>
> The original code also checks for SDIO IRQ and disables clock gating
> regardless of card type which is probably redundant. If not it should
> be fixed in mmc core.
>
> My recent kernel builds which I run on a system with mwifiex card
> probably include this patch.
>
I have no objection to this patch as such, it just that some extra
testing on few other boards will be good, which I am sure Jeahoon will
take care.
Thanks!!

> Thanks
>
> Michal



-- 
Regards,
Alim
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/


Re: [PATCH 2/3] mmc: dw_mmc: simplify the SDMMC_CLKEN_LOW_PWR logic

2015-08-17 Thread Michal Suchanek
 Hello,

On 17 August 2015 at 16:42, Alim Akhtar  wrote:
> HI
>
> On Mon, Aug 17, 2015 at 4:56 PM, Jaehoon Chung  wrote:
>> On 08/17/2015 02:52 PM, Michal Suchanek wrote:
>>> Hello,
>>>
>>> On 17 August 2015 at 03:55, Jaehoon Chung  wrote:
 Hi, Michal.

 On 08/12/2015 09:23 PM, Michal Suchanek wrote:
> The driver has open-coded test for SDIO cards. Use the mmc core provided
> MMC_QUIRK_BROKEN_CLK_GATING flag instead.

 Did you use the clock-gating for SDIO cards?
 Doesn't MMC_CAP_SDIO_IRQ bit set? Which case is broken?
 Could you explain to me more?
>>>
>>> The core flag for disabling power saving is MMC_QUIRK_BROKEN_CLK_GATING.
>>
>> I understood your intention. And i read the comment into mmc/core/quirks.c
>> I will test SDIO card with this patch. Thanks.
>>
> When you test, please check if SDIO IRQ still works, we need to put
> dw_mmc in low_power mode otherwise SDIO IRQ will be not be generated
> by dw_mmc host controller.
>

As far as I understand the logic which is removed in this patch and
the core logic which replaces it is the same -  low power by means of
clock gating is *not* enabled for SDIO cards in either case.

The original code also checks for SDIO IRQ and disables clock gating
regardless of card type which is probably redundant. If not it should
be fixed in mmc core.

My recent kernel builds which I run on a system with mwifiex card
probably include this patch.

Thanks

Michal
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/


Re: [PATCH 2/3] mmc: dw_mmc: simplify the SDMMC_CLKEN_LOW_PWR logic

2015-08-17 Thread Alim Akhtar
HI

On Mon, Aug 17, 2015 at 4:56 PM, Jaehoon Chung  wrote:
> On 08/17/2015 02:52 PM, Michal Suchanek wrote:
>> Hello,
>>
>> On 17 August 2015 at 03:55, Jaehoon Chung  wrote:
>>> Hi, Michal.
>>>
>>> On 08/12/2015 09:23 PM, Michal Suchanek wrote:
 The driver has open-coded test for SDIO cards. Use the mmc core provided
 MMC_QUIRK_BROKEN_CLK_GATING flag instead.
>>>
>>> Did you use the clock-gating for SDIO cards?
>>> Doesn't MMC_CAP_SDIO_IRQ bit set? Which case is broken?
>>> Could you explain to me more?
>>
>> The core flag for disabling power saving is MMC_QUIRK_BROKEN_CLK_GATING.
>
> I understood your intention. And i read the comment into mmc/core/quirks.c
> I will test SDIO card with this patch. Thanks.
>
When you test, please check if SDIO IRQ still works, we need to put
dw_mmc in low_power mode otherwise SDIO IRQ will be not be generated
by dw_mmc host controller.

> Best Regards,
> Jaehoon Chung
>
>>
>> It may coincide with MMC_CAP_SDIO_IRQ but that's different flag for
>> different purpose.
>>
>> MMC_QUIRK_BROKEN_CLK_GATING is currently set for all SDIO cards except
>> for cards on a whitelist.
>>
>> I don't know any particular SDIO card that has problems when the clock
>> is off and does not use an IRQ.
>>
>> Thanks
>>
>> Michal
>>
>>>
>>> Best Regards,
>>> Jaehoon Chung
>>>

 As a bonus this may enable clock gating on SDIO cards that are known to
 work with it.

 Signed-off-by: Michal Suchanek 
 ---
  drivers/mmc/host/dw_mmc.c | 33 +++--
  1 file changed, 15 insertions(+), 18 deletions(-)

 diff --git a/drivers/mmc/host/dw_mmc.c b/drivers/mmc/host/dw_mmc.c
 index 40e9d8e..3bc9fd7 100644
 --- a/drivers/mmc/host/dw_mmc.c
 +++ b/drivers/mmc/host/dw_mmc.c
 @@ -1335,27 +1335,24 @@ static void dw_mci_init_card(struct mmc_host *mmc, 
 struct mmc_card *card)
* description of the CLKENA register we should disable low power 
 mode
* for SDIO cards if we need SDIO interrupts to work.
*/
 - if (mmc->caps & MMC_CAP_SDIO_IRQ) {
 - const u32 clken_low_pwr = SDMMC_CLKEN_LOW_PWR << slot->id;
 - u32 clk_en_a_old;
 - u32 clk_en_a;
 + const u32 clken_low_pwr = SDMMC_CLKEN_LOW_PWR << slot->id;
 + u32 clk_en_a_old;
 + u32 clk_en_a;

 - clk_en_a_old = mci_readl(host, CLKENA);
 + clk_en_a_old = mci_readl(host, CLKENA);

 - if (card->type == MMC_TYPE_SDIO ||
 - card->type == MMC_TYPE_SD_COMBO) {
 - set_bit(DW_MMC_CARD_NO_LOW_PWR, >flags);
 - clk_en_a = clk_en_a_old & ~clken_low_pwr;
 - } else {
 - clear_bit(DW_MMC_CARD_NO_LOW_PWR, >flags);
 - clk_en_a = clk_en_a_old | clken_low_pwr;
 - }
 + if (card->quirks & MMC_QUIRK_BROKEN_CLK_GATING) {
 + set_bit(DW_MMC_CARD_NO_LOW_PWR, >flags);
 + clk_en_a = clk_en_a_old & ~clken_low_pwr;
 + } else {
 + clear_bit(DW_MMC_CARD_NO_LOW_PWR, >flags);
 + clk_en_a = clk_en_a_old | clken_low_pwr;
 + }

 - if (clk_en_a != clk_en_a_old) {
 - mci_writel(host, CLKENA, clk_en_a);
 - mci_send_cmd(slot, SDMMC_CMD_UPD_CLK |
 -  SDMMC_CMD_PRV_DAT_WAIT, 0);
 - }
 + if (clk_en_a != clk_en_a_old) {
 + mci_writel(host, CLKENA, clk_en_a);
 + mci_send_cmd(slot, SDMMC_CMD_UPD_CLK |
 + SDMMC_CMD_PRV_DAT_WAIT, 0);
   }
  }


>>>
>> --
>> 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-mmc" in
> the body of a message to majord...@vger.kernel.org
> More majordomo info at  http://vger.kernel.org/majordomo-info.html



-- 
Regards,
Alim
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/


Re: [PATCH 2/3] mmc: dw_mmc: simplify the SDMMC_CLKEN_LOW_PWR logic

2015-08-17 Thread Jaehoon Chung
On 08/17/2015 02:52 PM, Michal Suchanek wrote:
> Hello,
> 
> On 17 August 2015 at 03:55, Jaehoon Chung  wrote:
>> Hi, Michal.
>>
>> On 08/12/2015 09:23 PM, Michal Suchanek wrote:
>>> The driver has open-coded test for SDIO cards. Use the mmc core provided
>>> MMC_QUIRK_BROKEN_CLK_GATING flag instead.
>>
>> Did you use the clock-gating for SDIO cards?
>> Doesn't MMC_CAP_SDIO_IRQ bit set? Which case is broken?
>> Could you explain to me more?
> 
> The core flag for disabling power saving is MMC_QUIRK_BROKEN_CLK_GATING.

I understood your intention. And i read the comment into mmc/core/quirks.c
I will test SDIO card with this patch. Thanks.

Best Regards,
Jaehoon Chung

> 
> It may coincide with MMC_CAP_SDIO_IRQ but that's different flag for
> different purpose.
> 
> MMC_QUIRK_BROKEN_CLK_GATING is currently set for all SDIO cards except
> for cards on a whitelist.
> 
> I don't know any particular SDIO card that has problems when the clock
> is off and does not use an IRQ.
> 
> Thanks
> 
> Michal
> 
>>
>> Best Regards,
>> Jaehoon Chung
>>
>>>
>>> As a bonus this may enable clock gating on SDIO cards that are known to
>>> work with it.
>>>
>>> Signed-off-by: Michal Suchanek 
>>> ---
>>>  drivers/mmc/host/dw_mmc.c | 33 +++--
>>>  1 file changed, 15 insertions(+), 18 deletions(-)
>>>
>>> diff --git a/drivers/mmc/host/dw_mmc.c b/drivers/mmc/host/dw_mmc.c
>>> index 40e9d8e..3bc9fd7 100644
>>> --- a/drivers/mmc/host/dw_mmc.c
>>> +++ b/drivers/mmc/host/dw_mmc.c
>>> @@ -1335,27 +1335,24 @@ static void dw_mci_init_card(struct mmc_host *mmc, 
>>> struct mmc_card *card)
>>>* description of the CLKENA register we should disable low power mode
>>>* for SDIO cards if we need SDIO interrupts to work.
>>>*/
>>> - if (mmc->caps & MMC_CAP_SDIO_IRQ) {
>>> - const u32 clken_low_pwr = SDMMC_CLKEN_LOW_PWR << slot->id;
>>> - u32 clk_en_a_old;
>>> - u32 clk_en_a;
>>> + const u32 clken_low_pwr = SDMMC_CLKEN_LOW_PWR << slot->id;
>>> + u32 clk_en_a_old;
>>> + u32 clk_en_a;
>>>
>>> - clk_en_a_old = mci_readl(host, CLKENA);
>>> + clk_en_a_old = mci_readl(host, CLKENA);
>>>
>>> - if (card->type == MMC_TYPE_SDIO ||
>>> - card->type == MMC_TYPE_SD_COMBO) {
>>> - set_bit(DW_MMC_CARD_NO_LOW_PWR, >flags);
>>> - clk_en_a = clk_en_a_old & ~clken_low_pwr;
>>> - } else {
>>> - clear_bit(DW_MMC_CARD_NO_LOW_PWR, >flags);
>>> - clk_en_a = clk_en_a_old | clken_low_pwr;
>>> - }
>>> + if (card->quirks & MMC_QUIRK_BROKEN_CLK_GATING) {
>>> + set_bit(DW_MMC_CARD_NO_LOW_PWR, >flags);
>>> + clk_en_a = clk_en_a_old & ~clken_low_pwr;
>>> + } else {
>>> + clear_bit(DW_MMC_CARD_NO_LOW_PWR, >flags);
>>> + clk_en_a = clk_en_a_old | clken_low_pwr;
>>> + }
>>>
>>> - if (clk_en_a != clk_en_a_old) {
>>> - mci_writel(host, CLKENA, clk_en_a);
>>> - mci_send_cmd(slot, SDMMC_CMD_UPD_CLK |
>>> -  SDMMC_CMD_PRV_DAT_WAIT, 0);
>>> - }
>>> + if (clk_en_a != clk_en_a_old) {
>>> + mci_writel(host, CLKENA, clk_en_a);
>>> + mci_send_cmd(slot, SDMMC_CMD_UPD_CLK |
>>> + SDMMC_CMD_PRV_DAT_WAIT, 0);
>>>   }
>>>  }
>>>
>>>
>>
> --
> 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-kernel" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/


Re: [PATCH 2/3] mmc: dw_mmc: simplify the SDMMC_CLKEN_LOW_PWR logic

2015-08-17 Thread Jaehoon Chung
On 08/17/2015 02:52 PM, Michal Suchanek wrote:
 Hello,
 
 On 17 August 2015 at 03:55, Jaehoon Chung jh80.ch...@samsung.com wrote:
 Hi, Michal.

 On 08/12/2015 09:23 PM, Michal Suchanek wrote:
 The driver has open-coded test for SDIO cards. Use the mmc core provided
 MMC_QUIRK_BROKEN_CLK_GATING flag instead.

 Did you use the clock-gating for SDIO cards?
 Doesn't MMC_CAP_SDIO_IRQ bit set? Which case is broken?
 Could you explain to me more?
 
 The core flag for disabling power saving is MMC_QUIRK_BROKEN_CLK_GATING.

I understood your intention. And i read the comment into mmc/core/quirks.c
I will test SDIO card with this patch. Thanks.

Best Regards,
Jaehoon Chung

 
 It may coincide with MMC_CAP_SDIO_IRQ but that's different flag for
 different purpose.
 
 MMC_QUIRK_BROKEN_CLK_GATING is currently set for all SDIO cards except
 for cards on a whitelist.
 
 I don't know any particular SDIO card that has problems when the clock
 is off and does not use an IRQ.
 
 Thanks
 
 Michal
 

 Best Regards,
 Jaehoon Chung


 As a bonus this may enable clock gating on SDIO cards that are known to
 work with it.

 Signed-off-by: Michal Suchanek hramr...@gmail.com
 ---
  drivers/mmc/host/dw_mmc.c | 33 +++--
  1 file changed, 15 insertions(+), 18 deletions(-)

 diff --git a/drivers/mmc/host/dw_mmc.c b/drivers/mmc/host/dw_mmc.c
 index 40e9d8e..3bc9fd7 100644
 --- a/drivers/mmc/host/dw_mmc.c
 +++ b/drivers/mmc/host/dw_mmc.c
 @@ -1335,27 +1335,24 @@ static void dw_mci_init_card(struct mmc_host *mmc, 
 struct mmc_card *card)
* description of the CLKENA register we should disable low power mode
* for SDIO cards if we need SDIO interrupts to work.
*/
 - if (mmc-caps  MMC_CAP_SDIO_IRQ) {
 - const u32 clken_low_pwr = SDMMC_CLKEN_LOW_PWR  slot-id;
 - u32 clk_en_a_old;
 - u32 clk_en_a;
 + const u32 clken_low_pwr = SDMMC_CLKEN_LOW_PWR  slot-id;
 + u32 clk_en_a_old;
 + u32 clk_en_a;

 - clk_en_a_old = mci_readl(host, CLKENA);
 + clk_en_a_old = mci_readl(host, CLKENA);

 - if (card-type == MMC_TYPE_SDIO ||
 - card-type == MMC_TYPE_SD_COMBO) {
 - set_bit(DW_MMC_CARD_NO_LOW_PWR, slot-flags);
 - clk_en_a = clk_en_a_old  ~clken_low_pwr;
 - } else {
 - clear_bit(DW_MMC_CARD_NO_LOW_PWR, slot-flags);
 - clk_en_a = clk_en_a_old | clken_low_pwr;
 - }
 + if (card-quirks  MMC_QUIRK_BROKEN_CLK_GATING) {
 + set_bit(DW_MMC_CARD_NO_LOW_PWR, slot-flags);
 + clk_en_a = clk_en_a_old  ~clken_low_pwr;
 + } else {
 + clear_bit(DW_MMC_CARD_NO_LOW_PWR, slot-flags);
 + clk_en_a = clk_en_a_old | clken_low_pwr;
 + }

 - if (clk_en_a != clk_en_a_old) {
 - mci_writel(host, CLKENA, clk_en_a);
 - mci_send_cmd(slot, SDMMC_CMD_UPD_CLK |
 -  SDMMC_CMD_PRV_DAT_WAIT, 0);
 - }
 + if (clk_en_a != clk_en_a_old) {
 + mci_writel(host, CLKENA, clk_en_a);
 + mci_send_cmd(slot, SDMMC_CMD_UPD_CLK |
 + SDMMC_CMD_PRV_DAT_WAIT, 0);
   }
  }



 --
 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-kernel in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/


Re: [PATCH 2/3] mmc: dw_mmc: simplify the SDMMC_CLKEN_LOW_PWR logic

2015-08-17 Thread Alim Akhtar
HI

On Mon, Aug 17, 2015 at 4:56 PM, Jaehoon Chung jh80.ch...@samsung.com wrote:
 On 08/17/2015 02:52 PM, Michal Suchanek wrote:
 Hello,

 On 17 August 2015 at 03:55, Jaehoon Chung jh80.ch...@samsung.com wrote:
 Hi, Michal.

 On 08/12/2015 09:23 PM, Michal Suchanek wrote:
 The driver has open-coded test for SDIO cards. Use the mmc core provided
 MMC_QUIRK_BROKEN_CLK_GATING flag instead.

 Did you use the clock-gating for SDIO cards?
 Doesn't MMC_CAP_SDIO_IRQ bit set? Which case is broken?
 Could you explain to me more?

 The core flag for disabling power saving is MMC_QUIRK_BROKEN_CLK_GATING.

 I understood your intention. And i read the comment into mmc/core/quirks.c
 I will test SDIO card with this patch. Thanks.

When you test, please check if SDIO IRQ still works, we need to put
dw_mmc in low_power mode otherwise SDIO IRQ will be not be generated
by dw_mmc host controller.

 Best Regards,
 Jaehoon Chung


 It may coincide with MMC_CAP_SDIO_IRQ but that's different flag for
 different purpose.

 MMC_QUIRK_BROKEN_CLK_GATING is currently set for all SDIO cards except
 for cards on a whitelist.

 I don't know any particular SDIO card that has problems when the clock
 is off and does not use an IRQ.

 Thanks

 Michal


 Best Regards,
 Jaehoon Chung


 As a bonus this may enable clock gating on SDIO cards that are known to
 work with it.

 Signed-off-by: Michal Suchanek hramr...@gmail.com
 ---
  drivers/mmc/host/dw_mmc.c | 33 +++--
  1 file changed, 15 insertions(+), 18 deletions(-)

 diff --git a/drivers/mmc/host/dw_mmc.c b/drivers/mmc/host/dw_mmc.c
 index 40e9d8e..3bc9fd7 100644
 --- a/drivers/mmc/host/dw_mmc.c
 +++ b/drivers/mmc/host/dw_mmc.c
 @@ -1335,27 +1335,24 @@ static void dw_mci_init_card(struct mmc_host *mmc, 
 struct mmc_card *card)
* description of the CLKENA register we should disable low power 
 mode
* for SDIO cards if we need SDIO interrupts to work.
*/
 - if (mmc-caps  MMC_CAP_SDIO_IRQ) {
 - const u32 clken_low_pwr = SDMMC_CLKEN_LOW_PWR  slot-id;
 - u32 clk_en_a_old;
 - u32 clk_en_a;
 + const u32 clken_low_pwr = SDMMC_CLKEN_LOW_PWR  slot-id;
 + u32 clk_en_a_old;
 + u32 clk_en_a;

 - clk_en_a_old = mci_readl(host, CLKENA);
 + clk_en_a_old = mci_readl(host, CLKENA);

 - if (card-type == MMC_TYPE_SDIO ||
 - card-type == MMC_TYPE_SD_COMBO) {
 - set_bit(DW_MMC_CARD_NO_LOW_PWR, slot-flags);
 - clk_en_a = clk_en_a_old  ~clken_low_pwr;
 - } else {
 - clear_bit(DW_MMC_CARD_NO_LOW_PWR, slot-flags);
 - clk_en_a = clk_en_a_old | clken_low_pwr;
 - }
 + if (card-quirks  MMC_QUIRK_BROKEN_CLK_GATING) {
 + set_bit(DW_MMC_CARD_NO_LOW_PWR, slot-flags);
 + clk_en_a = clk_en_a_old  ~clken_low_pwr;
 + } else {
 + clear_bit(DW_MMC_CARD_NO_LOW_PWR, slot-flags);
 + clk_en_a = clk_en_a_old | clken_low_pwr;
 + }

 - if (clk_en_a != clk_en_a_old) {
 - mci_writel(host, CLKENA, clk_en_a);
 - mci_send_cmd(slot, SDMMC_CMD_UPD_CLK |
 -  SDMMC_CMD_PRV_DAT_WAIT, 0);
 - }
 + if (clk_en_a != clk_en_a_old) {
 + mci_writel(host, CLKENA, clk_en_a);
 + mci_send_cmd(slot, SDMMC_CMD_UPD_CLK |
 + SDMMC_CMD_PRV_DAT_WAIT, 0);
   }
  }



 --
 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-mmc in
 the body of a message to majord...@vger.kernel.org
 More majordomo info at  http://vger.kernel.org/majordomo-info.html



-- 
Regards,
Alim
--
To unsubscribe from this list: send the line unsubscribe linux-kernel in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/


Re: [PATCH 2/3] mmc: dw_mmc: simplify the SDMMC_CLKEN_LOW_PWR logic

2015-08-17 Thread Alim Akhtar
Hi Michal,

On Mon, Aug 17, 2015 at 8:25 PM, Michal Suchanek hramr...@gmail.com wrote:
  Hello,

 On 17 August 2015 at 16:42, Alim Akhtar alim.akh...@gmail.com wrote:
 HI

 On Mon, Aug 17, 2015 at 4:56 PM, Jaehoon Chung jh80.ch...@samsung.com 
 wrote:
 On 08/17/2015 02:52 PM, Michal Suchanek wrote:
 Hello,

 On 17 August 2015 at 03:55, Jaehoon Chung jh80.ch...@samsung.com wrote:
 Hi, Michal.

 On 08/12/2015 09:23 PM, Michal Suchanek wrote:
 The driver has open-coded test for SDIO cards. Use the mmc core provided
 MMC_QUIRK_BROKEN_CLK_GATING flag instead.

 Did you use the clock-gating for SDIO cards?
 Doesn't MMC_CAP_SDIO_IRQ bit set? Which case is broken?
 Could you explain to me more?

 The core flag for disabling power saving is MMC_QUIRK_BROKEN_CLK_GATING.

 I understood your intention. And i read the comment into mmc/core/quirks.c
 I will test SDIO card with this patch. Thanks.

 When you test, please check if SDIO IRQ still works, we need to put
 dw_mmc in low_power mode otherwise SDIO IRQ will be not be generated
 by dw_mmc host controller.


 As far as I understand the logic which is removed in this patch and
 the core logic which replaces it is the same -  low power by means of
 clock gating is *not* enabled for SDIO cards in either case.

 The original code also checks for SDIO IRQ and disables clock gating
 regardless of card type which is probably redundant. If not it should
 be fixed in mmc core.

 My recent kernel builds which I run on a system with mwifiex card
 probably include this patch.

I have no objection to this patch as such, it just that some extra
testing on few other boards will be good, which I am sure Jeahoon will
take care.
Thanks!!

 Thanks

 Michal



-- 
Regards,
Alim
--
To unsubscribe from this list: send the line unsubscribe linux-kernel in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/


Re: [PATCH 2/3] mmc: dw_mmc: simplify the SDMMC_CLKEN_LOW_PWR logic

2015-08-17 Thread Michal Suchanek
 Hello,

On 17 August 2015 at 16:42, Alim Akhtar alim.akh...@gmail.com wrote:
 HI

 On Mon, Aug 17, 2015 at 4:56 PM, Jaehoon Chung jh80.ch...@samsung.com wrote:
 On 08/17/2015 02:52 PM, Michal Suchanek wrote:
 Hello,

 On 17 August 2015 at 03:55, Jaehoon Chung jh80.ch...@samsung.com wrote:
 Hi, Michal.

 On 08/12/2015 09:23 PM, Michal Suchanek wrote:
 The driver has open-coded test for SDIO cards. Use the mmc core provided
 MMC_QUIRK_BROKEN_CLK_GATING flag instead.

 Did you use the clock-gating for SDIO cards?
 Doesn't MMC_CAP_SDIO_IRQ bit set? Which case is broken?
 Could you explain to me more?

 The core flag for disabling power saving is MMC_QUIRK_BROKEN_CLK_GATING.

 I understood your intention. And i read the comment into mmc/core/quirks.c
 I will test SDIO card with this patch. Thanks.

 When you test, please check if SDIO IRQ still works, we need to put
 dw_mmc in low_power mode otherwise SDIO IRQ will be not be generated
 by dw_mmc host controller.


As far as I understand the logic which is removed in this patch and
the core logic which replaces it is the same -  low power by means of
clock gating is *not* enabled for SDIO cards in either case.

The original code also checks for SDIO IRQ and disables clock gating
regardless of card type which is probably redundant. If not it should
be fixed in mmc core.

My recent kernel builds which I run on a system with mwifiex card
probably include this patch.

Thanks

Michal
--
To unsubscribe from this list: send the line unsubscribe linux-kernel in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/


Re: [PATCH 2/3] mmc: dw_mmc: simplify the SDMMC_CLKEN_LOW_PWR logic

2015-08-16 Thread Michal Suchanek
Hello,

On 17 August 2015 at 03:55, Jaehoon Chung  wrote:
> Hi, Michal.
>
> On 08/12/2015 09:23 PM, Michal Suchanek wrote:
>> The driver has open-coded test for SDIO cards. Use the mmc core provided
>> MMC_QUIRK_BROKEN_CLK_GATING flag instead.
>
> Did you use the clock-gating for SDIO cards?
> Doesn't MMC_CAP_SDIO_IRQ bit set? Which case is broken?
> Could you explain to me more?

The core flag for disabling power saving is MMC_QUIRK_BROKEN_CLK_GATING.

It may coincide with MMC_CAP_SDIO_IRQ but that's different flag for
different purpose.

MMC_QUIRK_BROKEN_CLK_GATING is currently set for all SDIO cards except
for cards on a whitelist.

I don't know any particular SDIO card that has problems when the clock
is off and does not use an IRQ.

Thanks

Michal

>
> Best Regards,
> Jaehoon Chung
>
>>
>> As a bonus this may enable clock gating on SDIO cards that are known to
>> work with it.
>>
>> Signed-off-by: Michal Suchanek 
>> ---
>>  drivers/mmc/host/dw_mmc.c | 33 +++--
>>  1 file changed, 15 insertions(+), 18 deletions(-)
>>
>> diff --git a/drivers/mmc/host/dw_mmc.c b/drivers/mmc/host/dw_mmc.c
>> index 40e9d8e..3bc9fd7 100644
>> --- a/drivers/mmc/host/dw_mmc.c
>> +++ b/drivers/mmc/host/dw_mmc.c
>> @@ -1335,27 +1335,24 @@ static void dw_mci_init_card(struct mmc_host *mmc, 
>> struct mmc_card *card)
>>* description of the CLKENA register we should disable low power mode
>>* for SDIO cards if we need SDIO interrupts to work.
>>*/
>> - if (mmc->caps & MMC_CAP_SDIO_IRQ) {
>> - const u32 clken_low_pwr = SDMMC_CLKEN_LOW_PWR << slot->id;
>> - u32 clk_en_a_old;
>> - u32 clk_en_a;
>> + const u32 clken_low_pwr = SDMMC_CLKEN_LOW_PWR << slot->id;
>> + u32 clk_en_a_old;
>> + u32 clk_en_a;
>>
>> - clk_en_a_old = mci_readl(host, CLKENA);
>> + clk_en_a_old = mci_readl(host, CLKENA);
>>
>> - if (card->type == MMC_TYPE_SDIO ||
>> - card->type == MMC_TYPE_SD_COMBO) {
>> - set_bit(DW_MMC_CARD_NO_LOW_PWR, >flags);
>> - clk_en_a = clk_en_a_old & ~clken_low_pwr;
>> - } else {
>> - clear_bit(DW_MMC_CARD_NO_LOW_PWR, >flags);
>> - clk_en_a = clk_en_a_old | clken_low_pwr;
>> - }
>> + if (card->quirks & MMC_QUIRK_BROKEN_CLK_GATING) {
>> + set_bit(DW_MMC_CARD_NO_LOW_PWR, >flags);
>> + clk_en_a = clk_en_a_old & ~clken_low_pwr;
>> + } else {
>> + clear_bit(DW_MMC_CARD_NO_LOW_PWR, >flags);
>> + clk_en_a = clk_en_a_old | clken_low_pwr;
>> + }
>>
>> - if (clk_en_a != clk_en_a_old) {
>> - mci_writel(host, CLKENA, clk_en_a);
>> - mci_send_cmd(slot, SDMMC_CMD_UPD_CLK |
>> -  SDMMC_CMD_PRV_DAT_WAIT, 0);
>> - }
>> + if (clk_en_a != clk_en_a_old) {
>> + mci_writel(host, CLKENA, clk_en_a);
>> + mci_send_cmd(slot, SDMMC_CMD_UPD_CLK |
>> + SDMMC_CMD_PRV_DAT_WAIT, 0);
>>   }
>>  }
>>
>>
>
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/


Re: [PATCH 2/3] mmc: dw_mmc: simplify the SDMMC_CLKEN_LOW_PWR logic

2015-08-16 Thread Jaehoon Chung
Hi, Michal.

On 08/12/2015 09:23 PM, Michal Suchanek wrote:
> The driver has open-coded test for SDIO cards. Use the mmc core provided
> MMC_QUIRK_BROKEN_CLK_GATING flag instead.

Did you use the clock-gating for SDIO cards?
Doesn't MMC_CAP_SDIO_IRQ bit set? Which case is broken?
Could you explain to me more?

Best Regards,
Jaehoon Chung

> 
> As a bonus this may enable clock gating on SDIO cards that are known to
> work with it.
> 
> Signed-off-by: Michal Suchanek 
> ---
>  drivers/mmc/host/dw_mmc.c | 33 +++--
>  1 file changed, 15 insertions(+), 18 deletions(-)
> 
> diff --git a/drivers/mmc/host/dw_mmc.c b/drivers/mmc/host/dw_mmc.c
> index 40e9d8e..3bc9fd7 100644
> --- a/drivers/mmc/host/dw_mmc.c
> +++ b/drivers/mmc/host/dw_mmc.c
> @@ -1335,27 +1335,24 @@ static void dw_mci_init_card(struct mmc_host *mmc, 
> struct mmc_card *card)
>* description of the CLKENA register we should disable low power mode
>* for SDIO cards if we need SDIO interrupts to work.
>*/
> - if (mmc->caps & MMC_CAP_SDIO_IRQ) {
> - const u32 clken_low_pwr = SDMMC_CLKEN_LOW_PWR << slot->id;
> - u32 clk_en_a_old;
> - u32 clk_en_a;
> + const u32 clken_low_pwr = SDMMC_CLKEN_LOW_PWR << slot->id;
> + u32 clk_en_a_old;
> + u32 clk_en_a;
>  
> - clk_en_a_old = mci_readl(host, CLKENA);
> + clk_en_a_old = mci_readl(host, CLKENA);
>  
> - if (card->type == MMC_TYPE_SDIO ||
> - card->type == MMC_TYPE_SD_COMBO) {
> - set_bit(DW_MMC_CARD_NO_LOW_PWR, >flags);
> - clk_en_a = clk_en_a_old & ~clken_low_pwr;
> - } else {
> - clear_bit(DW_MMC_CARD_NO_LOW_PWR, >flags);
> - clk_en_a = clk_en_a_old | clken_low_pwr;
> - }
> + if (card->quirks & MMC_QUIRK_BROKEN_CLK_GATING) {
> + set_bit(DW_MMC_CARD_NO_LOW_PWR, >flags);
> + clk_en_a = clk_en_a_old & ~clken_low_pwr;
> + } else {
> + clear_bit(DW_MMC_CARD_NO_LOW_PWR, >flags);
> + clk_en_a = clk_en_a_old | clken_low_pwr;
> + }
>  
> - if (clk_en_a != clk_en_a_old) {
> - mci_writel(host, CLKENA, clk_en_a);
> - mci_send_cmd(slot, SDMMC_CMD_UPD_CLK |
> -  SDMMC_CMD_PRV_DAT_WAIT, 0);
> - }
> + if (clk_en_a != clk_en_a_old) {
> + mci_writel(host, CLKENA, clk_en_a);
> + mci_send_cmd(slot, SDMMC_CMD_UPD_CLK |
> + SDMMC_CMD_PRV_DAT_WAIT, 0);
>   }
>  }
>  
> 

--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/


Re: [PATCH 2/3] mmc: dw_mmc: simplify the SDMMC_CLKEN_LOW_PWR logic

2015-08-16 Thread Jaehoon Chung
Hi, Michal.

On 08/12/2015 09:23 PM, Michal Suchanek wrote:
 The driver has open-coded test for SDIO cards. Use the mmc core provided
 MMC_QUIRK_BROKEN_CLK_GATING flag instead.

Did you use the clock-gating for SDIO cards?
Doesn't MMC_CAP_SDIO_IRQ bit set? Which case is broken?
Could you explain to me more?

Best Regards,
Jaehoon Chung

 
 As a bonus this may enable clock gating on SDIO cards that are known to
 work with it.
 
 Signed-off-by: Michal Suchanek hramr...@gmail.com
 ---
  drivers/mmc/host/dw_mmc.c | 33 +++--
  1 file changed, 15 insertions(+), 18 deletions(-)
 
 diff --git a/drivers/mmc/host/dw_mmc.c b/drivers/mmc/host/dw_mmc.c
 index 40e9d8e..3bc9fd7 100644
 --- a/drivers/mmc/host/dw_mmc.c
 +++ b/drivers/mmc/host/dw_mmc.c
 @@ -1335,27 +1335,24 @@ static void dw_mci_init_card(struct mmc_host *mmc, 
 struct mmc_card *card)
* description of the CLKENA register we should disable low power mode
* for SDIO cards if we need SDIO interrupts to work.
*/
 - if (mmc-caps  MMC_CAP_SDIO_IRQ) {
 - const u32 clken_low_pwr = SDMMC_CLKEN_LOW_PWR  slot-id;
 - u32 clk_en_a_old;
 - u32 clk_en_a;
 + const u32 clken_low_pwr = SDMMC_CLKEN_LOW_PWR  slot-id;
 + u32 clk_en_a_old;
 + u32 clk_en_a;
  
 - clk_en_a_old = mci_readl(host, CLKENA);
 + clk_en_a_old = mci_readl(host, CLKENA);
  
 - if (card-type == MMC_TYPE_SDIO ||
 - card-type == MMC_TYPE_SD_COMBO) {
 - set_bit(DW_MMC_CARD_NO_LOW_PWR, slot-flags);
 - clk_en_a = clk_en_a_old  ~clken_low_pwr;
 - } else {
 - clear_bit(DW_MMC_CARD_NO_LOW_PWR, slot-flags);
 - clk_en_a = clk_en_a_old | clken_low_pwr;
 - }
 + if (card-quirks  MMC_QUIRK_BROKEN_CLK_GATING) {
 + set_bit(DW_MMC_CARD_NO_LOW_PWR, slot-flags);
 + clk_en_a = clk_en_a_old  ~clken_low_pwr;
 + } else {
 + clear_bit(DW_MMC_CARD_NO_LOW_PWR, slot-flags);
 + clk_en_a = clk_en_a_old | clken_low_pwr;
 + }
  
 - if (clk_en_a != clk_en_a_old) {
 - mci_writel(host, CLKENA, clk_en_a);
 - mci_send_cmd(slot, SDMMC_CMD_UPD_CLK |
 -  SDMMC_CMD_PRV_DAT_WAIT, 0);
 - }
 + if (clk_en_a != clk_en_a_old) {
 + mci_writel(host, CLKENA, clk_en_a);
 + mci_send_cmd(slot, SDMMC_CMD_UPD_CLK |
 + SDMMC_CMD_PRV_DAT_WAIT, 0);
   }
  }
  
 

--
To unsubscribe from this list: send the line unsubscribe linux-kernel in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/


Re: [PATCH 2/3] mmc: dw_mmc: simplify the SDMMC_CLKEN_LOW_PWR logic

2015-08-16 Thread Michal Suchanek
Hello,

On 17 August 2015 at 03:55, Jaehoon Chung jh80.ch...@samsung.com wrote:
 Hi, Michal.

 On 08/12/2015 09:23 PM, Michal Suchanek wrote:
 The driver has open-coded test for SDIO cards. Use the mmc core provided
 MMC_QUIRK_BROKEN_CLK_GATING flag instead.

 Did you use the clock-gating for SDIO cards?
 Doesn't MMC_CAP_SDIO_IRQ bit set? Which case is broken?
 Could you explain to me more?

The core flag for disabling power saving is MMC_QUIRK_BROKEN_CLK_GATING.

It may coincide with MMC_CAP_SDIO_IRQ but that's different flag for
different purpose.

MMC_QUIRK_BROKEN_CLK_GATING is currently set for all SDIO cards except
for cards on a whitelist.

I don't know any particular SDIO card that has problems when the clock
is off and does not use an IRQ.

Thanks

Michal


 Best Regards,
 Jaehoon Chung


 As a bonus this may enable clock gating on SDIO cards that are known to
 work with it.

 Signed-off-by: Michal Suchanek hramr...@gmail.com
 ---
  drivers/mmc/host/dw_mmc.c | 33 +++--
  1 file changed, 15 insertions(+), 18 deletions(-)

 diff --git a/drivers/mmc/host/dw_mmc.c b/drivers/mmc/host/dw_mmc.c
 index 40e9d8e..3bc9fd7 100644
 --- a/drivers/mmc/host/dw_mmc.c
 +++ b/drivers/mmc/host/dw_mmc.c
 @@ -1335,27 +1335,24 @@ static void dw_mci_init_card(struct mmc_host *mmc, 
 struct mmc_card *card)
* description of the CLKENA register we should disable low power mode
* for SDIO cards if we need SDIO interrupts to work.
*/
 - if (mmc-caps  MMC_CAP_SDIO_IRQ) {
 - const u32 clken_low_pwr = SDMMC_CLKEN_LOW_PWR  slot-id;
 - u32 clk_en_a_old;
 - u32 clk_en_a;
 + const u32 clken_low_pwr = SDMMC_CLKEN_LOW_PWR  slot-id;
 + u32 clk_en_a_old;
 + u32 clk_en_a;

 - clk_en_a_old = mci_readl(host, CLKENA);
 + clk_en_a_old = mci_readl(host, CLKENA);

 - if (card-type == MMC_TYPE_SDIO ||
 - card-type == MMC_TYPE_SD_COMBO) {
 - set_bit(DW_MMC_CARD_NO_LOW_PWR, slot-flags);
 - clk_en_a = clk_en_a_old  ~clken_low_pwr;
 - } else {
 - clear_bit(DW_MMC_CARD_NO_LOW_PWR, slot-flags);
 - clk_en_a = clk_en_a_old | clken_low_pwr;
 - }
 + if (card-quirks  MMC_QUIRK_BROKEN_CLK_GATING) {
 + set_bit(DW_MMC_CARD_NO_LOW_PWR, slot-flags);
 + clk_en_a = clk_en_a_old  ~clken_low_pwr;
 + } else {
 + clear_bit(DW_MMC_CARD_NO_LOW_PWR, slot-flags);
 + clk_en_a = clk_en_a_old | clken_low_pwr;
 + }

 - if (clk_en_a != clk_en_a_old) {
 - mci_writel(host, CLKENA, clk_en_a);
 - mci_send_cmd(slot, SDMMC_CMD_UPD_CLK |
 -  SDMMC_CMD_PRV_DAT_WAIT, 0);
 - }
 + if (clk_en_a != clk_en_a_old) {
 + mci_writel(host, CLKENA, clk_en_a);
 + mci_send_cmd(slot, SDMMC_CMD_UPD_CLK |
 + SDMMC_CMD_PRV_DAT_WAIT, 0);
   }
  }



--
To unsubscribe from this list: send the line unsubscribe linux-kernel in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/