On my platform (ARM Versatile Express Cortex A15 emulator) host->ocr_avail_mmc is 0. mmc_attach_mmc knows that it could be 0, in fact at the beginning of the function it checks if host->ocr_avail_mmc is not 0 before setting host->ocr_avail. However later on, is going to call mmc_select_voltage regardeless of its value. If host->ocr_avail_mmc is 0, host->ocr ends up being 0 too, and we error out. I admit that I am not terribly familiar with this code, but it seems to me that we should only call mmc_select_voltage and check the return value if host->ocr_avail_mmc. If that is not the right fix please advise. --- mmc_attach_mmc: only call mmc_select_voltage if host->ocr_avail_mmc host->ocr_avail_mmc can be 0, in fact mmc_attach_mmc checks if host->ocr_avail_mmc is not 0 before setting host->ocr_avail. However later on, is going to call mmc_select_voltage regardeless of its value. If host->ocr_avail_mmc is 0, host->ocr ends up being 0 too, and mmc_select_voltage errors out. This patch fixes that by only calling mmc_select_voltage iff host->ocr_avail_mmc != 0. Signed-off-by: Stefano Stabellini <stefano.stabellini@xxxxxxxxxxxxx> diff --git a/drivers/mmc/core/mmc.c b/drivers/mmc/core/mmc.c index e6e3911..0edd33b 100644 --- a/drivers/mmc/core/mmc.c +++ b/drivers/mmc/core/mmc.c @@ -1529,14 +1529,15 @@ int mmc_attach_mmc(struct mmc_host *host) ocr &= ~0x7F; } - host->ocr = mmc_select_voltage(host, ocr); - - /* - * Can we support the voltage of the card? - */ - if (!host->ocr) { - err = -EINVAL; - goto err; + if (host->ocr_avail_mmc) { + host->ocr = mmc_select_voltage(host, ocr); + /* + * Can we support the voltage of the card? + */ + if (!host->ocr) { + err = -EINVAL; + goto err; + } } /* -- To unsubscribe from this list: send the line "unsubscribe linux-mmc" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html