sdio: add CD disable support
Subsystems (4)
PATCH 1/1 sdio: add CD disable support
From: Ohad Ben-Cohen <[email protected]>
To save power, the pull-up resistor on CD/DAT[3] (pin 1) of the card can be disconnected. This is desired, e.g., with embedded SDIO devices which do not rely on this pin for card detection.
--- drivers/mmc/core/sdio.c | 32 ++++++++++++++++++++++++++++++++ include/linux/mmc/card.h | 3 ++- 2 files changed, 34 insertions(+), 1 deletions(-)
drivers/mmc/core/sdio.c +32 -0
@@ -165,6 +165,31 @@ static int sdio_enable_wide(struct mmc_card *card) }/* +* Disconnect the pull-up resistor on CD/DAT[3] if requested by the card. +* If card detection is not needed, this can save some power. +*/ +static int sdio_disable_cd (struct mmc_card *card) +{ +int ret; +u8 ctrl; + +if (!card->cccr.disable_cd) +return 0 ; + + ret =mmc_io_rw_direct (card,0 ,0 ,SDIO_CCCR_IF ,0 , &ctrl); +if (ret) +return ret; + + ctrl |=SDIO_BUS_CD_DISABLE ; + + ret =mmc_io_rw_direct (card,1 ,0 ,SDIO_CCCR_IF , ctrl,NULL ); +if (ret) +return ret; + +return 0 ; +} + +/* * Test if the card supports high-speed mode and, if so, switch to it. */ static int sdio_enable_hs (struct mmc_card *card)
@@ -392,6 +417,13 @@ int mmc_attach_sdio(struct mmc_host *host, u32 ocr) goto remove;/* +* Disconnect card detection pull-up resistor (if requested by card). +*/ + err =sdio_disable_cd (card); +if (err) + goto remove; + +/* * Initialize (but don't add) all present functions. */ for (i =0 ;i < funcs;i++) {
include/linux/mmc/card.h +2 -1
@@ -62,7 +62,8 @@ struct sdio_cccr { low_speed:1, wide_bus:1, high_power:1, - high_speed:1; + high_speed:1, + disable_cd:1; };struct sdio_cis {
Signature · 1 line
1.5.4.3
Quoted 7 lines · Ohad Ben-Cohen
From: Ohad Ben-Cohen <[email protected]>
To save power, the pull-up resistor on CD/DAT[3] (pin 1) of the card can be disconnected. This is desired, e.g., with embedded SDIO devices which do not rely on this pin for card detection.
Quoted 6 lines
Signed-off-by Ohad Ben-Cohen <[email protected]>--- drivers/mmc/core/sdio.c | 32 ++++++++++++++++++++++++++++++++ include/linux/mmc/card.h | 3 ++- 2 files changed, 34 insertions(+), 1 deletions(-)
Do you have a follow-up patch to make use of this new functionality? I can't see anywhere where disable_cd is set.
Quoted 1 line · Matt Fleming
Do you have a follow-up patch to make use of this new functionality?
Well, sort of:
The patch sets disable_cd for TI wl1271 embedded wlan sdio device on a ZOOM2 platform.
Since the patch is very board/device specific, we first route it via internal maintainers, so it is not posted yet.
It's nothing fancy:
(quoted diff) +0 -0
b/arch/arm/mach-omap2/mmc-twl4030.c
index 5b64bf1..caa8b16 100644
arch/arm/mach-omap2/mmc-twl4030.c +1 -0
@@ -81,6 +81,7 @@ static struct embedded_sdio_data omap_wifi_emb_data = { .wide_bus = 1, .high_power = 0, .high_speed = 0, + .disable_cd = 1, }, .funcs = wifi_func_array, .num_funcs = 2,
Quoted 19 lines · Ohad Ben-Cohen
Quoted 1 line · Matt Fleming
Do you have a follow-up patch to make use of this new functionality?
Well, sort of:
The patch sets
disable_cdfor TI wl1271 embedded wlan sdio device on a ZOOM2 platform.Since the patch is very board/device specific, we first route it via internal maintainers, so it is not posted yet.
It's nothing fancy:
arch/arm/mach-omap2/mmc-twl4030.c +0
-0
arch/arm/mach-omap2/mmc-twl4030.c static struct embedded_sdio_data omap_wifi_emb_data = { · line 87
Quoted 7 lines
arch/arm/mach-omap2/mmc-twl4030.c +1
-0@@ -81,6 +81,7 @@ static struct embedded_sdio_data omap_wifi_emb_data = { .wide_bus = 1, .high_power = 0, .high_speed = 0, + .disable_cd = 1, }, .funcs = wifi_func_array, .num_funcs = 2,
Ah, that's fair enough then. I just wanted to make sure that a patch that used this functionality was in the pipeline :-)
As David has already said, both comments need fixing up. It is the host controller driver that decides whether to disable the DAT[3] pull-up, not the card. If you make those changes then you can add my Acked-by.
Hi Matt,
Quoted 3 lines · Matt Fleming
As David has already said, both comments need fixing up. It is the host controller driver that decides whether to disable the DAT[3] pull-up, not the card. If you make those changes then you can add my Acked-by.
I'm posting a follow-up patch with the fixes and your Ack,
will appreciate your second review.
Thanks,
Ohad.
Quoted 6 lines · Ohad Ben-Cohen
From: Ohad Ben-Cohen <[email protected]>
To save power, the pull-up resistor on CD/DAT[3] (pin 1) of the card can be disconnected. This is desired, e.g., with embedded SDIO devices which do not rely on this pin for card detection.
Platforms may rely on the card's pull-up and not fit/configure an external one. There may need to be a way for host controller drivers to
say this and prevent the disabling of the card's DAT3 pull-up.
Quoted 11 lines
Signed-off-by Ohad Ben-Cohen <[email protected]>--- drivers/mmc/core/sdio.c | 32 ++++++++++++++++++++++++++++++++ include/linux/mmc/card.h | 3 ++- 2 files changed, 34 insertions(+), 1 deletions(-)drivers/mmc/core/sdio.c +0
-0
drivers/mmc/core/sdio.c static int sdio_enable_wide(struct mmc_card *card) · line 170
Quoted 6 lines
drivers/mmc/core/sdio.c +3
-0@@ -165,6 +165,31 @@ static int sdio_enable_wide(struct mmc_card *card) }/* +* Disconnect the pull-up resistor on CD/DAT[3] if requested by the card. +* If card detection is not needed, this can save some power. +*/
The first sentence of this comment doesn't make sense. The decision to disable the pull-up is for the controller driver to make, not that card.
David
Signature · 6 lines
David Vrabel, Senior Software Engineer, Drivers CSR, Churchill House, Cambridge Business Park, Tel: +44 (0)1223 692562 Cowley Road, Cambridge, CB4 0WZ http://www.csr.com/ 'member of the CSR plc group of companies. CSR plc registered in England and Wales, registered number 4187346, registered office Churchill House, Cambridge Business Park, Cowley Road, Cambridge, CB4 0WZ, United Kingdom'
Hi David,
Thank you for your comments.
Quoted 3 lines · David Vrabel
Platforms may rely on the card's pull-up and not fit/configure an external one. There may need to be a way for host controller drivers to say this and prevent the disabling of the card's DAT3 pull-up.
Currently the only way to really disable the CD using this patch is by setting the disable_cd bit on for a specific controller. We are doing so for a specific controller to which an embedded sdio device is wired, on certain boards. This is done using the embedded_sdio's .cccr field, which is used instead of reading the card's cccr.
So as you correctly noted, card has no say here.
Quoted 1 line
The first sentence of this comment doesn't make sense.
Fixed;
I'll follow-up with a correction of the patch and will appreciate your review.
Thanks,
Ohad.