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

mmc: Merge branch fixes into next

Merge the mmc fixes for v6.17-rc[n] into the next branch, to allow them to
get tested together with the new mmc changes that are targeted for v6.18.

Signed-off-by: Ulf Hansson <ulf.hansson@linaro.org>

+87 -20
+1 -1
drivers/mmc/host/mvsdio.c
··· 292 292 host->pio_ptr = NULL; 293 293 host->pio_size = 0; 294 294 } else { 295 - dma_unmap_sg(mmc_dev(host->mmc), data->sg, host->sg_frags, 295 + dma_unmap_sg(mmc_dev(host->mmc), data->sg, data->sg_len, 296 296 mmc_get_dma_dir(data)); 297 297 } 298 298
+67 -1
drivers/mmc/host/sdhci-pci-gli.c
··· 283 283 #define PCIE_GLI_9767_UHS2_CTL2_ZC_VALUE 0xb 284 284 #define PCIE_GLI_9767_UHS2_CTL2_ZC_CTL BIT(6) 285 285 #define PCIE_GLI_9767_UHS2_CTL2_ZC_CTL_VALUE 0x1 286 + #define PCIE_GLI_9767_UHS2_CTL2_FORCE_PHY_RESETN BIT(13) 287 + #define PCIE_GLI_9767_UHS2_CTL2_FORCE_RESETN_VALUE BIT(14) 286 288 287 289 #define GLI_MAX_TUNING_LOOP 40 288 290 ··· 1181 1179 gl9767_vhs_read(pdev); 1182 1180 } 1183 1181 1182 + static void sdhci_gl9767_uhs2_phy_reset(struct sdhci_host *host, bool assert) 1183 + { 1184 + struct sdhci_pci_slot *slot = sdhci_priv(host); 1185 + struct pci_dev *pdev = slot->chip->pdev; 1186 + u32 value, set, clr; 1187 + 1188 + if (assert) { 1189 + /* Assert reset, set RESETN and clean RESETN_VALUE */ 1190 + set = PCIE_GLI_9767_UHS2_CTL2_FORCE_PHY_RESETN; 1191 + clr = PCIE_GLI_9767_UHS2_CTL2_FORCE_RESETN_VALUE; 1192 + } else { 1193 + /* De-assert reset, clean RESETN and set RESETN_VALUE */ 1194 + set = PCIE_GLI_9767_UHS2_CTL2_FORCE_RESETN_VALUE; 1195 + clr = PCIE_GLI_9767_UHS2_CTL2_FORCE_PHY_RESETN; 1196 + } 1197 + 1198 + gl9767_vhs_write(pdev); 1199 + pci_read_config_dword(pdev, PCIE_GLI_9767_UHS2_CTL2, &value); 1200 + value |= set; 1201 + pci_write_config_dword(pdev, PCIE_GLI_9767_UHS2_CTL2, value); 1202 + value &= ~clr; 1203 + pci_write_config_dword(pdev, PCIE_GLI_9767_UHS2_CTL2, value); 1204 + gl9767_vhs_read(pdev); 1205 + } 1206 + 1207 + static void __gl9767_uhs2_set_power(struct sdhci_host *host, unsigned char mode, unsigned short vdd) 1208 + { 1209 + u8 pwr = 0; 1210 + 1211 + if (mode != MMC_POWER_OFF) { 1212 + pwr = sdhci_get_vdd_value(vdd); 1213 + if (!pwr) 1214 + WARN(1, "%s: Invalid vdd %#x\n", 1215 + mmc_hostname(host->mmc), vdd); 1216 + pwr |= SDHCI_VDD2_POWER_180; 1217 + } 1218 + 1219 + if (host->pwr == pwr) 1220 + return; 1221 + 1222 + host->pwr = pwr; 1223 + 1224 + if (pwr == 0) { 1225 + sdhci_writeb(host, 0, SDHCI_POWER_CONTROL); 1226 + } else { 1227 + sdhci_writeb(host, 0, SDHCI_POWER_CONTROL); 1228 + 1229 + pwr |= SDHCI_POWER_ON; 1230 + sdhci_writeb(host, pwr & 0xf, SDHCI_POWER_CONTROL); 1231 + usleep_range(5000, 6250); 1232 + 1233 + /* Assert reset */ 1234 + sdhci_gl9767_uhs2_phy_reset(host, true); 1235 + pwr |= SDHCI_VDD2_POWER_ON; 1236 + sdhci_writeb(host, pwr, SDHCI_POWER_CONTROL); 1237 + usleep_range(5000, 6250); 1238 + } 1239 + } 1240 + 1184 1241 static void sdhci_gl9767_set_clock(struct sdhci_host *host, unsigned int clock) 1185 1242 { 1186 1243 struct sdhci_pci_slot *slot = sdhci_priv(host); ··· 1266 1205 } 1267 1206 1268 1207 sdhci_enable_clk(host, clk); 1208 + 1209 + if (mmc_card_uhs2(host->mmc)) 1210 + /* De-assert reset */ 1211 + sdhci_gl9767_uhs2_phy_reset(host, false); 1212 + 1269 1213 gl9767_set_low_power_negotiation(pdev, true); 1270 1214 } 1271 1215 ··· 1542 1476 gl9767_vhs_read(pdev); 1543 1477 1544 1478 sdhci_gli_overcurrent_event_enable(host, false); 1545 - sdhci_uhs2_set_power(host, mode, vdd); 1479 + __gl9767_uhs2_set_power(host, mode, vdd); 1546 1480 sdhci_gli_overcurrent_event_enable(host, true); 1547 1481 } else { 1548 1482 gl9767_vhs_write(pdev);
+2 -1
drivers/mmc/host/sdhci-uhs2.c
··· 295 295 else 296 296 sdhci_uhs2_set_power(host, ios->power_mode, ios->vdd); 297 297 298 - sdhci_set_clock(host, host->clock); 298 + host->ops->set_clock(host, ios->clock); 299 + host->clock = ios->clock; 299 300 } 300 301 301 302 static int sdhci_uhs2_set_ios(struct mmc_host *mmc, struct mmc_ios *ios)
+17 -17
drivers/mmc/host/sdhci.c
··· 2367 2367 (ios->power_mode == MMC_POWER_UP) && 2368 2368 !(host->quirks2 & SDHCI_QUIRK2_PRESET_VALUE_BROKEN)) 2369 2369 sdhci_enable_preset_value(host, false); 2370 - 2371 - if (!ios->clock || ios->clock != host->clock) { 2372 - host->ops->set_clock(host, ios->clock); 2373 - host->clock = ios->clock; 2374 - 2375 - if (host->quirks & SDHCI_QUIRK_DATA_TIMEOUT_USES_SDCLK && 2376 - host->clock) { 2377 - host->timeout_clk = mmc->actual_clock ? 2378 - mmc->actual_clock / 1000 : 2379 - host->clock / 1000; 2380 - mmc->max_busy_timeout = 2381 - host->ops->get_max_timeout_count ? 2382 - host->ops->get_max_timeout_count(host) : 2383 - 1 << 27; 2384 - mmc->max_busy_timeout /= host->timeout_clk; 2385 - } 2386 - } 2387 2370 } 2388 2371 EXPORT_SYMBOL_GPL(sdhci_set_ios_common); 2389 2372 ··· 2392 2409 turning_on_clk = ios->clock != host->clock && ios->clock && !host->clock; 2393 2410 2394 2411 sdhci_set_ios_common(mmc, ios); 2412 + 2413 + if (!ios->clock || ios->clock != host->clock) { 2414 + host->ops->set_clock(host, ios->clock); 2415 + host->clock = ios->clock; 2416 + 2417 + if (host->quirks & SDHCI_QUIRK_DATA_TIMEOUT_USES_SDCLK && 2418 + host->clock) { 2419 + host->timeout_clk = mmc->actual_clock ? 2420 + mmc->actual_clock / 1000 : 2421 + host->clock / 1000; 2422 + mmc->max_busy_timeout = 2423 + host->ops->get_max_timeout_count ? 2424 + host->ops->get_max_timeout_count(host) : 2425 + 1 << 27; 2426 + mmc->max_busy_timeout /= host->timeout_clk; 2427 + } 2428 + } 2395 2429 2396 2430 if (host->ops->set_power) 2397 2431 host->ops->set_power(host, ios->power_mode, ios->vdd);