Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

Merge tag 'mmc-v6.4-rc1-2' of git://git.kernel.org/pub/scm/linux/kernel/git/ulfh/mmc

Pull MMC fixes from Ulf Hansson:
"MMC core:
- Fix pwrseq for WILC1000/WILC3000 SDIO card

MMC host:
- vub300: Fix invalid response handling"

* tag 'mmc-v6.4-rc1-2' of git://git.kernel.org/pub/scm/linux/kernel/git/ulfh/mmc:
mmc: pwrseq: sd8787: Fix WILC CHIP_EN and RESETN toggling order
mmc: vub300: fix invalid response handling

+29 -8
+26 -8
drivers/mmc/core/pwrseq_sd8787.c
··· 28 28 struct mmc_pwrseq pwrseq; 29 29 struct gpio_desc *reset_gpio; 30 30 struct gpio_desc *pwrdn_gpio; 31 - u32 reset_pwrdwn_delay_ms; 32 31 }; 33 32 34 33 #define to_pwrseq_sd8787(p) container_of(p, struct mmc_pwrseq_sd8787, pwrseq) ··· 38 39 39 40 gpiod_set_value_cansleep(pwrseq->reset_gpio, 1); 40 41 41 - msleep(pwrseq->reset_pwrdwn_delay_ms); 42 + msleep(300); 42 43 gpiod_set_value_cansleep(pwrseq->pwrdn_gpio, 1); 43 44 } 44 45 ··· 50 51 gpiod_set_value_cansleep(pwrseq->reset_gpio, 0); 51 52 } 52 53 54 + static void mmc_pwrseq_wilc1000_pre_power_on(struct mmc_host *host) 55 + { 56 + struct mmc_pwrseq_sd8787 *pwrseq = to_pwrseq_sd8787(host->pwrseq); 57 + 58 + /* The pwrdn_gpio is really CHIP_EN, reset_gpio is RESETN */ 59 + gpiod_set_value_cansleep(pwrseq->pwrdn_gpio, 1); 60 + msleep(5); 61 + gpiod_set_value_cansleep(pwrseq->reset_gpio, 1); 62 + } 63 + 64 + static void mmc_pwrseq_wilc1000_power_off(struct mmc_host *host) 65 + { 66 + struct mmc_pwrseq_sd8787 *pwrseq = to_pwrseq_sd8787(host->pwrseq); 67 + 68 + gpiod_set_value_cansleep(pwrseq->reset_gpio, 0); 69 + gpiod_set_value_cansleep(pwrseq->pwrdn_gpio, 0); 70 + } 71 + 53 72 static const struct mmc_pwrseq_ops mmc_pwrseq_sd8787_ops = { 54 73 .pre_power_on = mmc_pwrseq_sd8787_pre_power_on, 55 74 .power_off = mmc_pwrseq_sd8787_power_off, 56 75 }; 57 76 58 - static const u32 sd8787_delay_ms = 300; 59 - static const u32 wilc1000_delay_ms = 5; 77 + static const struct mmc_pwrseq_ops mmc_pwrseq_wilc1000_ops = { 78 + .pre_power_on = mmc_pwrseq_wilc1000_pre_power_on, 79 + .power_off = mmc_pwrseq_wilc1000_power_off, 80 + }; 60 81 61 82 static const struct of_device_id mmc_pwrseq_sd8787_of_match[] = { 62 - { .compatible = "mmc-pwrseq-sd8787", .data = &sd8787_delay_ms }, 63 - { .compatible = "mmc-pwrseq-wilc1000", .data = &wilc1000_delay_ms }, 83 + { .compatible = "mmc-pwrseq-sd8787", .data = &mmc_pwrseq_sd8787_ops }, 84 + { .compatible = "mmc-pwrseq-wilc1000", .data = &mmc_pwrseq_wilc1000_ops }, 64 85 {/* sentinel */}, 65 86 }; 66 87 MODULE_DEVICE_TABLE(of, mmc_pwrseq_sd8787_of_match); ··· 96 77 return -ENOMEM; 97 78 98 79 match = of_match_node(mmc_pwrseq_sd8787_of_match, pdev->dev.of_node); 99 - pwrseq->reset_pwrdwn_delay_ms = *(u32 *)match->data; 100 80 101 81 pwrseq->pwrdn_gpio = devm_gpiod_get(dev, "powerdown", GPIOD_OUT_LOW); 102 82 if (IS_ERR(pwrseq->pwrdn_gpio)) ··· 106 88 return PTR_ERR(pwrseq->reset_gpio); 107 89 108 90 pwrseq->pwrseq.dev = dev; 109 - pwrseq->pwrseq.ops = &mmc_pwrseq_sd8787_ops; 91 + pwrseq->pwrseq.ops = match->data; 110 92 pwrseq->pwrseq.owner = THIS_MODULE; 111 93 platform_set_drvdata(pdev, pwrseq); 112 94
+3
drivers/mmc/host/vub300.c
··· 1713 1713 int bytes = 3 & less_cmd; 1714 1714 int words = less_cmd >> 2; 1715 1715 u8 *r = vub300->resp.response.command_response; 1716 + 1717 + if (!resp_len) 1718 + return; 1716 1719 if (bytes == 3) { 1717 1720 cmd->resp[words] = (r[1 + (words << 2)] << 24) 1718 1721 | (r[2 + (words << 2)] << 16)