Commit 006ebd5d authored by Ohad Ben-Cohen's avatar Ohad Ben-Cohen Committed by Linus Torvalds

sdio: add CD disable support

Add support to disconnect the pull-up resistor on CD/DAT[3] (pin 1)
of the card. This may be desired on certain setups of boards,
controllers and embedded sdio devices which do not need the card's
pull-up. As a result, card detection is disabled and power is saved.

[akpm@linux-foundation.org: simplify sdio_disable_cd() a bit]
Signed-off-by: default avatarOhad Ben-Cohen <ohad@wizery.com>
Acked-by: default avatarMatt Fleming <matt@console-pimps.org>
Cc: Ian Molton <ian@mnementh.co.uk>
Cc: "Roberto A. Foglietta" <roberto.foglietta@gmail.com>
Cc: Philip Langdale <philipl@overt.org>
Cc: Pierre Ossman <pierre@ossman.eu>
Cc: David Vrabel <david.vrabel@csr.com>
Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
parent 653f41b5
...@@ -164,6 +164,29 @@ static int sdio_enable_wide(struct mmc_card *card) ...@@ -164,6 +164,29 @@ static int sdio_enable_wide(struct mmc_card *card)
return 0; return 0;
} }
/*
* If desired, disconnect the pull-up resistor on CD/DAT[3] (pin 1)
* of the card. This may be required on certain setups of boards,
* controllers and embedded sdio device which do not need the card's
* pull-up. As a result, card detection is disabled and power is saved.
*/
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;
return mmc_io_rw_direct(card, 1, 0, SDIO_CCCR_IF, ctrl, NULL);
}
/* /*
* Test if the card supports high-speed mode and, if so, switch to it. * Test if the card supports high-speed mode and, if so, switch to it.
*/ */
...@@ -384,6 +407,13 @@ int mmc_attach_sdio(struct mmc_host *host, u32 ocr) ...@@ -384,6 +407,13 @@ int mmc_attach_sdio(struct mmc_host *host, u32 ocr)
if (err) if (err)
goto remove; goto remove;
/*
* If needed, disconnect card detection pull-up resistor.
*/
err = sdio_disable_cd(card);
if (err)
goto remove;
/* /*
* Initialize (but don't add) all present functions. * Initialize (but don't add) all present functions.
*/ */
......
...@@ -64,7 +64,8 @@ struct sdio_cccr { ...@@ -64,7 +64,8 @@ struct sdio_cccr {
low_speed:1, low_speed:1,
wide_bus:1, wide_bus:1,
high_power:1, high_power:1,
high_speed:1; high_speed:1,
disable_cd:1;
}; };
struct sdio_cis { struct sdio_cis {
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment