Commit 381e3554 authored by Linus Torvalds's avatar Linus Torvalds

Merge tag 'mmc-v3.18-2' of git://git.linaro.org/people/ulf.hansson/mmc

Pull MMC fix from Ulf Hansson:
 "Fix card detection regression in the MMC core.

  The MMC_CAP2_CD_ACTIVE_HIGH and MMC_CAP2_RO_ACTIVE_HIGH could under
  some circumstances be set incorrectly, causing the card detection to
  fail"

* tag 'mmc-v3.18-2' of git://git.linaro.org/people/ulf.hansson/mmc:
  mmc: core: fix card detection regression
parents 087b0198 a31b0c6c
...@@ -311,7 +311,8 @@ int mmc_of_parse(struct mmc_host *host) ...@@ -311,7 +311,8 @@ int mmc_of_parse(struct mmc_host *host)
struct device_node *np; struct device_node *np;
u32 bus_width; u32 bus_width;
int len, ret; int len, ret;
bool cap_invert, gpio_invert; bool cd_cap_invert, cd_gpio_invert = false;
bool ro_cap_invert, ro_gpio_invert = false;
if (!host->parent || !host->parent->of_node) if (!host->parent || !host->parent->of_node)
return 0; return 0;
...@@ -359,16 +360,13 @@ int mmc_of_parse(struct mmc_host *host) ...@@ -359,16 +360,13 @@ int mmc_of_parse(struct mmc_host *host)
if (of_find_property(np, "non-removable", &len)) { if (of_find_property(np, "non-removable", &len)) {
host->caps |= MMC_CAP_NONREMOVABLE; host->caps |= MMC_CAP_NONREMOVABLE;
} else { } else {
if (of_property_read_bool(np, "cd-inverted")) cd_cap_invert = of_property_read_bool(np, "cd-inverted");
cap_invert = true;
else
cap_invert = false;
if (of_find_property(np, "broken-cd", &len)) if (of_find_property(np, "broken-cd", &len))
host->caps |= MMC_CAP_NEEDS_POLL; host->caps |= MMC_CAP_NEEDS_POLL;
ret = mmc_gpiod_request_cd(host, "cd", 0, true, ret = mmc_gpiod_request_cd(host, "cd", 0, true,
0, &gpio_invert); 0, &cd_gpio_invert);
if (ret) { if (ret) {
if (ret == -EPROBE_DEFER) if (ret == -EPROBE_DEFER)
return ret; return ret;
...@@ -391,17 +389,14 @@ int mmc_of_parse(struct mmc_host *host) ...@@ -391,17 +389,14 @@ int mmc_of_parse(struct mmc_host *host)
* both inverted, the end result is that the CD line is * both inverted, the end result is that the CD line is
* not inverted. * not inverted.
*/ */
if (cap_invert ^ gpio_invert) if (cd_cap_invert ^ cd_gpio_invert)
host->caps2 |= MMC_CAP2_CD_ACTIVE_HIGH; host->caps2 |= MMC_CAP2_CD_ACTIVE_HIGH;
} }
/* Parse Write Protection */ /* Parse Write Protection */
if (of_property_read_bool(np, "wp-inverted")) ro_cap_invert = of_property_read_bool(np, "wp-inverted");
cap_invert = true;
else
cap_invert = false;
ret = mmc_gpiod_request_ro(host, "wp", 0, false, 0, &gpio_invert); ret = mmc_gpiod_request_ro(host, "wp", 0, false, 0, &ro_gpio_invert);
if (ret) { if (ret) {
if (ret == -EPROBE_DEFER) if (ret == -EPROBE_DEFER)
goto out; goto out;
...@@ -414,7 +409,7 @@ int mmc_of_parse(struct mmc_host *host) ...@@ -414,7 +409,7 @@ int mmc_of_parse(struct mmc_host *host)
dev_info(host->parent, "Got WP GPIO\n"); dev_info(host->parent, "Got WP GPIO\n");
/* See the comment on CD inversion above */ /* See the comment on CD inversion above */
if (cap_invert ^ gpio_invert) if (ro_cap_invert ^ ro_gpio_invert)
host->caps2 |= MMC_CAP2_RO_ACTIVE_HIGH; host->caps2 |= MMC_CAP2_RO_ACTIVE_HIGH;
if (of_find_property(np, "cap-sd-highspeed", &len)) if (of_find_property(np, "cap-sd-highspeed", &len))
......
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