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 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) */