Messages in this thread Patch in this message | | | Date | Tue, 07 Aug 2007 13:55:59 +0100 | From | David Vrabel <> | Subject | [patch 4/4] sdio: disable CD resistor |
| |
-- David Vrabel, Software Engineer, Drivers group Tel: +44 (0)1223 692562 CSR plc, Churchill House, Cambridge Business Park, Cowley Road, CB4 0WZ
. sdio: disable CD resistor
Disable the card detect resistor to ensure all data lines are equally loaded. Not doing this can have a negative impact on buses with marginal signal quality.
Signed-off-by: David Vrabel <david.vrabel@csr.com --- Index: mmc/drivers/mmc/core/sdio.c =================================================================== --- mmc.orig/drivers/mmc/core/sdio.c 2007-08-07 07:27:31.000000000 +0100 +++ mmc/drivers/mmc/core/sdio.c 2007-08-07 07:30:58.000000000 +0100 @@ -148,10 +148,25 @@ return ret; } +static int sdio_modify_cccr(struct mmc_card *card, unsigned reg, + u8 val, u8 mask) +{ + u8 old; + int ret; + + ret = mmc_io_rw_direct(card, 0, 0, reg, 0, &old); + if (ret) + return ret; + + val = (old & ~mask) | val; + + ret = mmc_io_rw_direct(card, 1, 0, reg, val, NULL); + return ret; +} + static int sdio_enable_wide(struct mmc_card *card) { int ret; - u8 ctrl; if (!(card->host->caps & MMC_CAP_4_BIT_DATA)) return 0; @@ -159,13 +174,8 @@ if (card->cccr.low_speed && !card->cccr.wide_bus) return 0; - ret = mmc_io_rw_direct(card, 0, 0, SDIO_CCCR_IF, 0, &ctrl); - if (ret) - return ret; - - ctrl |= SDIO_BUS_WIDTH_4BIT; - - ret = mmc_io_rw_direct(card, 1, 0, SDIO_CCCR_IF, ctrl, NULL); + ret = sdio_modify_cccr(card, SDIO_CCCR_IF, SDIO_BUS_WIDTH_4BIT, + SDIO_BUS_WIDTH_MASK); if (ret) return ret; @@ -334,6 +344,15 @@ mmc_set_clock(host, card->cis.max_dtr); /* + * Disable Card Detect resistor on DAT3 so all data lines are + * loaded the same. + */ + err = sdio_modify_cccr(card, SDIO_CCCR_IF, SDIO_BUS_CD_DISABLE, + SDIO_BUS_CD_DISABLE); + if (err) + goto remove; + + /* * Switch to wider bus (if supported). */ err = sdio_enable_wide(card); Index: mmc/include/linux/mmc/sdio.h =================================================================== --- mmc.orig/include/linux/mmc/sdio.h 2007-08-07 07:27:30.000000000 +0100 +++ mmc/include/linux/mmc/sdio.h 2007-08-07 07:27:31.000000000 +0100 @@ -94,6 +94,7 @@ #define SDIO_BUS_WIDTH_1BIT 0x00 #define SDIO_BUS_WIDTH_4BIT 0x02 +#define SDIO_BUS_WIDTH_MASK 0x03 #define SDIO_BUS_CD_DISABLE 0x80 /* disable pull-up on DAT3 (pin 1) */ | |