diff mbox

mmc: rtsx: add card power off during probe

Message ID 1411024883.27455.11.camel@debian-rtk5880 (mailing list archive)
State New, archived
Headers show

Commit Message

rogerable@realtek.com Sept. 18, 2014, 7:19 a.m. UTC
On Wed, 2014-09-17 at 21:29 +0200, Ulf Hansson wrote:
> On 17 September 2014 11:11, micky <micky_ching@realsil.com.cn> wrote:

> > On 09/17/2014 02:01 AM, Ulf Hansson wrote:

> >>

> >> On 12 September 2014 03:39,  <micky_ching@realsil.com.cn> wrote:

> >>>

> >>> From: Roger Tseng <rogerable@realtek.com>

> >>>

> >>> Some platform have both UEFI driver and MFD/mmc driver, if entering

> >>> linux while card in the slot, the card power is already on, and rtsx-mmc

> >>> driver have no chance to make card power off. This will lead UHSI card

> >>> failed to enter UHSI mode.

> >>>

> >>> It is hard to control the UEFI driver leaving state, so we power off the

> >>> card power during probe.

> >>>

> >>> Signed-off-by: Roger Tseng <rogerable@realtek.com>

> >>> Signed-off-by: Micky Ching <micky_ching@realsil.com.cn>

> >>> ---

> >>>   drivers/mmc/host/rtsx_pci_sdmmc.c |    7 ++++++-

> >>>   1 file changed, 6 insertions(+), 1 deletion(-)

> >>>

> >>> diff --git a/drivers/mmc/host/rtsx_pci_sdmmc.c

> >>> b/drivers/mmc/host/rtsx_pci_sdmmc.c

> >>> index dfde4a2..57b0796 100644

> >>> --- a/drivers/mmc/host/rtsx_pci_sdmmc.c

> >>> +++ b/drivers/mmc/host/rtsx_pci_sdmmc.c

> >>> @@ -1341,8 +1341,13 @@ static int rtsx_pci_sdmmc_drv_probe(struct

> >>> platform_device *pdev)

> >>>          host->pcr = pcr;

> >>>          host->mmc = mmc;

> >>>          host->pdev = pdev;

> >>> -       host->power_state = SDMMC_POWER_OFF;

> >>>          INIT_WORK(&host->work, sd_request);

> >>> +       sd_power_off(host);

> >>> +       /*

> >>> +        * ref: SD spec 3.01: 6.4.1.2 Power On or Power Cycle

> >>> +        */

> >>> +       usleep_range(1000, 2000);

> >>> +

> >>

> >> This won't work in cases were you power off eMMC cards, unless you can

> >> do a full power cycle - cut both VCC and VCCQ. Can you?

> >

> > Hi Uffe,

> >

> > VCCQ will poweroff at the same time.

> 

> In that case, don't forget to enable MMC_CAP2_FULL_PWR_CYCLE.

> 

> >

> > if MMC_CAP2_NO_PRESCAN_POWERUP enable, will call mmc_power_off() at start,

> > then it will check ios.power_mode, but the state is MMC_POWER_OFF and just

> > return.

> 

> Uhh, that's right! So, I wonder why we invokes mmc_power_off() from

> that path at all.

> 

> Hmm, I think we should change the behavior in mmc_start_host(), like below:

> 1) Add a "MMC_POWER_UNDEFINED" state which is what the power state

> should be assigned to at allocation.

> 2 ) From mmc_start_host(), invoke mmc_power_off() when

> MMC_CAP2_NO_PRESCAN_POWERUP and MMC_CAP2_FULL_PWR_CYCLE is set.

> 

> Would that work?

Yes. I have confirmed this by following changes. The MMC_POWER_UNDEFINED
designation in mmc_start_host() will eventually cause a power-off
operation.

But I wonder if we need to additionally check MMC_CAP2_FULL_PWR_CYCLE
before calling mmc_power_off()?

> Kind regards

> Uffe

> 

> > Best Regards.

> > micky.

> >

> >> There are also another option you might want to use,

> >> MMC_CAP2_NO_PRESCAN_POWERUP. But again, it must only be used for those

> >> hosts that you are able to do a full power cycle for.

> >>

> >> Kind regards

> >> Uffe

> >>

> >>>          platform_set_drvdata(pdev, host);

> >>>          pcr->slots[RTSX_SD_CARD].p_dev = pdev;

> >>>          pcr->slots[RTSX_SD_CARD].card_event = rtsx_pci_sdmmc_card_event;

> >>> --

> >>> 1.7.9.5

> >>>

> >> .

> >>

> >

> 

> ------Please consider the environment before printing this e-mail.


-- 
Best regards,
Roger Tseng

Comments

Ulf Hansson Sept. 18, 2014, 9:14 p.m. UTC | #1
[...]

>>
>> In that case, don't forget to enable MMC_CAP2_FULL_PWR_CYCLE.
>>
>> >
>> > if MMC_CAP2_NO_PRESCAN_POWERUP enable, will call mmc_power_off() at start,
>> > then it will check ios.power_mode, but the state is MMC_POWER_OFF and just
>> > return.
>>
>> Uhh, that's right! So, I wonder why we invokes mmc_power_off() from
>> that path at all.
>>
>> Hmm, I think we should change the behavior in mmc_start_host(), like below:
>> 1) Add a "MMC_POWER_UNDEFINED" state which is what the power state
>> should be assigned to at allocation.
>> 2 ) From mmc_start_host(), invoke mmc_power_off() when
>> MMC_CAP2_NO_PRESCAN_POWERUP and MMC_CAP2_FULL_PWR_CYCLE is set.
>>
>> Would that work?
> Yes. I have confirmed this by following changes. The MMC_POWER_UNDEFINED
> designation in mmc_start_host() will eventually cause a power-off
> operation.
>
> But I wonder if we need to additionally check MMC_CAP2_FULL_PWR_CYCLE
> before calling mmc_power_off()?

The intent from my side was to keep the current behaviour for those
that already used MMC_CAP2_NO_PRESCAN_POWERUP, but it's s not a big
deal.

So, let's try your proposal, thus don't check MMC_CAP2_FULL_PWR_CYCLE.

Can you repost new version of your patches and please split them up on
core and host separately.

Kind regards
Uffe
--
To unsubscribe from this list: send the line "unsubscribe linux-mmc" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
rogerable@realtek.com Sept. 22, 2014, 10:09 a.m. UTC | #2
On Thu, 2014-09-18 at 23:14 +0200, Ulf Hansson wrote:
> [...]

> 

> >>

> >> In that case, don't forget to enable MMC_CAP2_FULL_PWR_CYCLE.

> >>

> >> >

> >> > if MMC_CAP2_NO_PRESCAN_POWERUP enable, will call mmc_power_off() at start,

> >> > then it will check ios.power_mode, but the state is MMC_POWER_OFF and just

> >> > return.

> >>

> >> Uhh, that's right! So, I wonder why we invokes mmc_power_off() from

> >> that path at all.

> >>

> >> Hmm, I think we should change the behavior in mmc_start_host(), like below:

> >> 1) Add a "MMC_POWER_UNDEFINED" state which is what the power state

> >> should be assigned to at allocation.

> >> 2 ) From mmc_start_host(), invoke mmc_power_off() when

> >> MMC_CAP2_NO_PRESCAN_POWERUP and MMC_CAP2_FULL_PWR_CYCLE is set.

> >>

> >> Would that work?

> > Yes. I have confirmed this by following changes. The MMC_POWER_UNDEFINED

> > designation in mmc_start_host() will eventually cause a power-off

> > operation.

> >

> > But I wonder if we need to additionally check MMC_CAP2_FULL_PWR_CYCLE

> > before calling mmc_power_off()?

> 

> The intent from my side was to keep the current behaviour for those

> that already used MMC_CAP2_NO_PRESCAN_POWERUP, but it's s not a big

> deal.

> 


I checked the log and found the commit that invokes mmc_power_off():
a08b17be8b984a7c51cd5a480cd977363df353f9
0d3e3350d5871c53464be4c92d57198744247005
(https://www.mail-archive.com/linux-mmc@vger.kernel.org/msg19638.html )

The proposed change might bring back some delay since invoking
mmc_power_off() in mmc_start_host() is more than NOP now and triggers
real power-off and re-init in sdhci.

Will this be OK?

> So, let's try your proposal, thus don't check MMC_CAP2_FULL_PWR_CYCLE.

> 

> Can you repost new version of your patches and please split them up on

> core and host separately.

> 

> Kind regards

> Uffe

> 

> ------Please consider the environment before printing this e-mail.


-- 
Best regards,
Roger Tseng
Ulf Hansson Sept. 23, 2014, 9:20 a.m. UTC | #3
On 22 September 2014 12:09, Roger Tseng <rogerable@realtek.com> wrote:
> On Thu, 2014-09-18 at 23:14 +0200, Ulf Hansson wrote:
>> [...]
>>
>> >>
>> >> In that case, don't forget to enable MMC_CAP2_FULL_PWR_CYCLE.
>> >>
>> >> >
>> >> > if MMC_CAP2_NO_PRESCAN_POWERUP enable, will call mmc_power_off() at start,
>> >> > then it will check ios.power_mode, but the state is MMC_POWER_OFF and just
>> >> > return.
>> >>
>> >> Uhh, that's right! So, I wonder why we invokes mmc_power_off() from
>> >> that path at all.
>> >>
>> >> Hmm, I think we should change the behavior in mmc_start_host(), like below:
>> >> 1) Add a "MMC_POWER_UNDEFINED" state which is what the power state
>> >> should be assigned to at allocation.
>> >> 2 ) From mmc_start_host(), invoke mmc_power_off() when
>> >> MMC_CAP2_NO_PRESCAN_POWERUP and MMC_CAP2_FULL_PWR_CYCLE is set.
>> >>
>> >> Would that work?
>> > Yes. I have confirmed this by following changes. The MMC_POWER_UNDEFINED
>> > designation in mmc_start_host() will eventually cause a power-off
>> > operation.
>> >
>> > But I wonder if we need to additionally check MMC_CAP2_FULL_PWR_CYCLE
>> > before calling mmc_power_off()?
>>
>> The intent from my side was to keep the current behaviour for those
>> that already used MMC_CAP2_NO_PRESCAN_POWERUP, but it's s not a big
>> deal.
>>
>
> I checked the log and found the commit that invokes mmc_power_off():
> a08b17be8b984a7c51cd5a480cd977363df353f9
> 0d3e3350d5871c53464be4c92d57198744247005
> (https://www.mail-archive.com/linux-mmc@vger.kernel.org/msg19638.html )
>
> The proposed change might bring back some delay since invoking
> mmc_power_off() in mmc_start_host() is more than NOP now and triggers
> real power-off and re-init in sdhci.

Actually the above commits was added due to the below commit:

fa5501890d8974301042e0202d342a6cbe8609f4

But the commits you refer to, didn't bring back the old behaviour,
which I think was the intent. Instead we added a NOP call to
mmc_power_off() from mmc_start_host().

We have few options on how to go forward, but let's loop in Adrian
Hunter first, since he might be able to comment on this as well.

Kind regards
Uffe
--
To unsubscribe from this list: send the line "unsubscribe linux-mmc" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Adrian Hunter Sept. 23, 2014, 7:51 p.m. UTC | #4
On 23/09/2014 12:20 p.m., Ulf Hansson wrote:
> On 22 September 2014 12:09, Roger Tseng <rogerable@realtek.com> wrote:
>> On Thu, 2014-09-18 at 23:14 +0200, Ulf Hansson wrote:
>>> [...]
>>>
>>>>>
>>>>> In that case, don't forget to enable MMC_CAP2_FULL_PWR_CYCLE.
>>>>>
>>>>>>
>>>>>> if MMC_CAP2_NO_PRESCAN_POWERUP enable, will call mmc_power_off() at start,
>>>>>> then it will check ios.power_mode, but the state is MMC_POWER_OFF and just
>>>>>> return.
>>>>>
>>>>> Uhh, that's right! So, I wonder why we invokes mmc_power_off() from
>>>>> that path at all.
>>>>>
>>>>> Hmm, I think we should change the behavior in mmc_start_host(), like below:
>>>>> 1) Add a "MMC_POWER_UNDEFINED" state which is what the power state
>>>>> should be assigned to at allocation.
>>>>> 2 ) From mmc_start_host(), invoke mmc_power_off() when
>>>>> MMC_CAP2_NO_PRESCAN_POWERUP and MMC_CAP2_FULL_PWR_CYCLE is set.
>>>>>
>>>>> Would that work?
>>>> Yes. I have confirmed this by following changes. The MMC_POWER_UNDEFINED
>>>> designation in mmc_start_host() will eventually cause a power-off
>>>> operation.
>>>>
>>>> But I wonder if we need to additionally check MMC_CAP2_FULL_PWR_CYCLE
>>>> before calling mmc_power_off()?
>>>
>>> The intent from my side was to keep the current behaviour for those
>>> that already used MMC_CAP2_NO_PRESCAN_POWERUP, but it's s not a big
>>> deal.
>>>
>>
>> I checked the log and found the commit that invokes mmc_power_off():
>> a08b17be8b984a7c51cd5a480cd977363df353f9
>> 0d3e3350d5871c53464be4c92d57198744247005
>> (https://www.mail-archive.com/linux-mmc@vger.kernel.org/msg19638.html )
>>
>> The proposed change might bring back some delay since invoking
>> mmc_power_off() in mmc_start_host() is more than NOP now and triggers
>> real power-off and re-init in sdhci.
>
> Actually the above commits was added due to the below commit:
>
> fa5501890d8974301042e0202d342a6cbe8609f4
>
> But the commits you refer to, didn't bring back the old behaviour,
> which I think was the intent. Instead we added a NOP call to
> mmc_power_off() from mmc_start_host().
>
> We have few options on how to go forward, but let's loop in Adrian
> Hunter first, since he might be able to comment on this as well.

Having mmc_power_off() in mmc_start_host()
actually power off should be OK.
--
To unsubscribe from this list: send the line "unsubscribe linux-mmc" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
diff mbox

Patch

diff --git a/drivers/mmc/core/core.c b/drivers/mmc/core/core.c
index d03a080fb9cd..3457b0f74b71 100644
--- a/drivers/mmc/core/core.c
+++ b/drivers/mmc/core/core.c
@@ -2489,7 +2489,9 @@  void mmc_start_host(struct mmc_host *host)
 {
        host->f_init = max(freqs[0], host->f_min);
        host->rescan_disable = 0;
-       if (host->caps2 & MMC_CAP2_NO_PRESCAN_POWERUP)
+       host->ios.power_mode = MMC_POWER_UNDEFINED;
+       if (host->caps2 & (MMC_CAP2_NO_PRESCAN_POWERUP |
+           MMC_CAP2_FULL_PWR_CYCLE))
                mmc_power_off(host);
        else
                mmc_power_up(host, host->ocr_avail);
diff --git a/drivers/mmc/host/rtsx_pci_sdmmc.c
b/drivers/mmc/host/rtsx_pci_sdmmc.c
index dfde4a210238..d49460b5ff07 100644
--- a/drivers/mmc/host/rtsx_pci_sdmmc.c
+++ b/drivers/mmc/host/rtsx_pci_sdmmc.c
@@ -1292,6 +1292,7 @@  static void realtek_init_host(struct
realtek_pci_sdmmc *host)
        mmc->caps = MMC_CAP_4_BIT_DATA | MMC_CAP_SD_HIGHSPEED |
                MMC_CAP_MMC_HIGHSPEED | MMC_CAP_BUS_WIDTH_TEST |
                MMC_CAP_UHS_SDR12 | MMC_CAP_UHS_SDR25;
+       mmc->caps2 = MMC_CAP2_NO_PRESCAN_POWERUP |
MMC_CAP2_FULL_PWR_CYCLE;
        mmc->max_current_330 = 400;
        mmc->max_current_180 = 800;
        mmc->ops = &realtek_pci_sdmmc_ops;
diff --git a/include/linux/mmc/host.h b/include/linux/mmc/host.h
index 7960424d0bc0..b3bfa609816a 100644
--- a/include/linux/mmc/host.h
+++ b/include/linux/mmc/host.h
@@ -42,6 +42,7 @@  struct mmc_ios {
 #define MMC_POWER_OFF          0
 #define MMC_POWER_UP           1
 #define MMC_POWER_ON           2
+#define MMC_POWER_UNDEFINED    3
 
        unsigned char   bus_width;              /* data bus width */