Skip to contentSkip to conversation

sdio: add CD disable support

PATCH Superseded Ohad Ben-Cohen 3 participants 7 messages Jul 30, 2009 – Jul 31, 2009

Subsystems (4)

v1 of 2 Superseded Latest is v2 →

lore
Share & tools
lore
#0 lore raw

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
index fb99ccf..4c4c9a9 100644
@@ -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
index 403aa50..82a8488 100644
@@ -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
#1 lore raw
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
---
 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.

#2 lore raw
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,
#3 lore raw
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_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:

arch/arm/mach-omap2/mmc-twl4030.c +0 -0
index 5b64bf1..caa8b16 100644

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.

#4 lore raw

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.

#5 lore raw
In reply to Ohad Ben-Cohen
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
---
 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
index fb99ccf..4c4c9a9 100644

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'
#6 lore raw

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.