Pull MMC fixes from Ulf Hansson: "MMC core: - Fix potential resource leaks in SDIO card detection error path MMC host: - jz4740: Decrease maximum clock rate to workaround bug on JZ4760(B) - meson-gx: Fix SDIO support to get some WiFi modules to work again - mmc_spi: Fix error handling in ->probe()" * tag 'mmc-v6.2-rc5' of git://git.kernel.org/pub/scm/linux/kernel/git/ulfh/mmc: mmc: jz4740: Work around bug on JZ4760(B) mmc: mmc_spi: fix error handling in mmc_spi_probe() mmc: sdio: fix possible resource leaks in some error paths mmc: meson-gx: fix SDIO mode if cap_sdio_irq isn't set
Unified · Split
| @@ -294,6 +294,12 @@ static void sdio_release_func(struct device *dev) · 293 unmodified lines | ||
| 294 | 294 | if (!(func->card->quirks & MMC_QUIRK_NONSTD_SDIO)) |
| 295 | 295 | sdio_free_func_cis(func); |
| 296 | 296 | |
| 297 | + /* | |
| 298 | + * We have now removed the link to the tuples in the | |
| 299 | + * card structure, so remove the reference. | |
| 300 | + */ | |
| 301 | + put_device(&func->card->dev); | |
| 302 | + | |
| 297 | 303 | kfree(func->info); |
| 298 | 304 | kfree(func->tmpbuf); |
| 299 | 305 | kfree(func); |
| @@ -324,6 +330,12 @@ struct sdio_func *sdio_alloc_func(struct mmc_card *card) · 24 unmodified lines | ||
| 324 | 330 | |
| 325 | 331 | device_initialize(&func->dev); |
| 326 | 332 | |
| 333 | + /* | |
| 334 | + * We may link to tuples in the card structure, | |
| 335 | + * we need make sure we have a reference to it. | |
| 336 | + */ | |
| 337 | + get_device(&func->card->dev); | |
| 338 | + | |
| 327 | 339 | func->dev.parent = &card->dev; |
| 328 | 340 | func->dev.bus = &sdio_bus_type; |
| 329 | 341 | func->dev.release = sdio_release_func; |
| @@ -377,10 +389,9 @@ int sdio_add_func(struct sdio_func *func) · 47 unmodified lines | ||
| 377 | 389 | */ |
| 378 | 390 | void sdio_remove_func(struct sdio_func *func) |
| 379 | 391 | { |
| 380 | − if (!sdio_func_present(func)) | |
| 381 | − return; | |
| 392 | + if (sdio_func_present(func)) | |
| 393 | + device_del(&func->dev); | |
| 382 | 394 | |
| 383 | − device_del(&func->dev); | |
| 384 | 395 | of_node_put(func->dev.of_node); |
| 385 | 396 | put_device(&func->dev); |
| 386 | 397 | } |
| @@ -403,12 +403,6 @@ int sdio_read_func_cis(struct sdio_func *func) · 402 unmodified lines | ||
| 403 | 403 | if (ret) |
| 404 | 404 | return ret; |
| 405 | 405 | |
| 406 | − /* | |
| 407 | − * Since we've linked to tuples in the card structure, | |
| 408 | − * we must make sure we have a reference to it. | |
| 409 | − */ | |
| 410 | − get_device(&func->card->dev); | |
| 411 | − | |
| 412 | 406 | /* |
| 413 | 407 | * Vendor/device id is optional for function CIS, so |
| 414 | 408 | * copy it from the card structure as needed. |
| @@ -434,11 +428,5 @@ void sdio_free_func_cis(struct sdio_func *func) · 19 unmodified lines | ||
| 434 | 428 | } |
| 435 | 429 | |
| 436 | 430 | func->tuples = NULL; |
| 437 | − | |
| 438 | − /* | |
| 439 | − * We have now removed the link to the tuples in the | |
| 440 | − * card structure, so remove the reference. | |
| 441 | − */ | |
| 442 | − put_device(&func->card->dev); | |
| 443 | 431 | } |
| 444 | 432 | |
| @@ -1053,6 +1053,16 @@ static int jz4740_mmc_probe(struct platform_device* pdev) · 1052 unmodified lines | ||
| 1053 | 1053 | mmc->ops = &jz4740_mmc_ops; |
| 1054 | 1054 | if (!mmc->f_max) |
| 1055 | 1055 | mmc->f_max = JZ_MMC_CLK_RATE; |
| 1056 | + | |
| 1057 | + /* | |
| 1058 | + * There seems to be a problem with this driver on the JZ4760 and | |
| 1059 | + * JZ4760B SoCs. There, when using the maximum rate supported (50 MHz), | |
| 1060 | + * the communication fails with many SD cards. | |
| 1061 | + * Until this bug is sorted out, limit the maximum rate to 24 MHz. | |
| 1062 | + */ | |
| 1063 | + if (host->version == JZ_MMC_JZ4760 && mmc->f_max > JZ_MMC_CLK_RATE) | |
| 1064 | + mmc->f_max = JZ_MMC_CLK_RATE; | |
| 1065 | + | |
| 1056 | 1066 | mmc->f_min = mmc->f_max / 128; |
| 1057 | 1067 | mmc->ocr_avail = MMC_VDD_32_33 | MMC_VDD_33_34; |
| 1058 | 1068 | |
| @@ -435,7 +435,8 @@ static int meson_mmc_clk_init(struct meson_host *host) · 434 unmodified lines | ||
| 435 | 435 | clk_reg |= FIELD_PREP(CLK_CORE_PHASE_MASK, CLK_PHASE_180); |
| 436 | 436 | clk_reg |= FIELD_PREP(CLK_TX_PHASE_MASK, CLK_PHASE_0); |
| 437 | 437 | clk_reg |= FIELD_PREP(CLK_RX_PHASE_MASK, CLK_PHASE_0); |
| 438 | − clk_reg |= CLK_IRQ_SDIO_SLEEP(host); | |
| 438 | + if (host->mmc->caps & MMC_CAP_SDIO_IRQ) | |
| 439 | + clk_reg |= CLK_IRQ_SDIO_SLEEP(host); | |
| 439 | 440 | writel(clk_reg, host->regs + SD_EMMC_CLOCK); |
| 440 | 441 | |
| 441 | 442 | /* get the mux parents */ |
| @@ -948,16 +949,18 @@ static irqreturn_t meson_mmc_irq(int irq, void *dev_id) · 506 unmodified lines | ||
| 948 | 949 | { |
| 949 | 950 | struct meson_host *host = dev_id; |
| 950 | 951 | struct mmc_command *cmd; |
| 951 | − u32 status, raw_status; | |
| 952 | + u32 status, raw_status, irq_mask = IRQ_EN_MASK; | |
| 952 | 953 | irqreturn_t ret = IRQ_NONE; |
| 953 | 954 | |
| 955 | + if (host->mmc->caps & MMC_CAP_SDIO_IRQ) | |
| 956 | + irq_mask |= IRQ_SDIO; | |
| 954 | 957 | raw_status = readl(host->regs + SD_EMMC_STATUS); |
| 955 | − status = raw_status & (IRQ_EN_MASK | IRQ_SDIO); | |
| 958 | + status = raw_status & irq_mask; | |
| 956 | 959 | |
| 957 | 960 | if (!status) { |
| 958 | 961 | dev_dbg(host->dev, |
| 959 | − "Unexpected IRQ! irq_en 0x%08lx - status 0x%08x\n", | |
| 960 | − IRQ_EN_MASK | IRQ_SDIO, raw_status); | |
| 962 | + "Unexpected IRQ! irq_en 0x%08x - status 0x%08x\n", | |
| 963 | + irq_mask, raw_status); | |
| 961 | 964 | return IRQ_NONE; |
| 962 | 965 | } |
| 963 | 966 | |
| @@ -1204,6 +1207,11 @@ static int meson_mmc_probe(struct platform_device *pdev) · 240 unmodified lines | ||
| 1204 | 1207 | goto free_host; |
| 1205 | 1208 | } |
| 1206 | 1209 | |
| 1210 | + mmc->caps |= MMC_CAP_CMD23; | |
| 1211 | + | |
| 1212 | + if (mmc->caps & MMC_CAP_SDIO_IRQ) | |
| 1213 | + mmc->caps2 |= MMC_CAP2_SDIO_IRQ_NOTHREAD; | |
| 1214 | + | |
| 1207 | 1215 | host->data = (struct meson_mmc_data *) |
| 1208 | 1216 | of_device_get_match_data(&pdev->dev); |
| 1209 | 1217 | if (!host->data) { |
| @@ -1277,11 +1285,6 @@ static int meson_mmc_probe(struct platform_device *pdev) · 67 unmodified lines | ||
| 1277 | 1285 | |
| 1278 | 1286 | spin_lock_init(&host->lock); |
| 1279 | 1287 | |
| 1280 | − mmc->caps |= MMC_CAP_CMD23; | |
| 1281 | − | |
| 1282 | − if (mmc->caps & MMC_CAP_SDIO_IRQ) | |
| 1283 | − mmc->caps2 |= MMC_CAP2_SDIO_IRQ_NOTHREAD; | |
| 1284 | − | |
| 1285 | 1288 | if (host->dram_access_quirk) { |
| 1286 | 1289 | /* Limit segments to 1 due to low available sram memory */ |
| 1287 | 1290 | mmc->max_segs = 1; |
| @@ -1437,7 +1437,7 @@ static int mmc_spi_probe(struct spi_device *spi) · 1436 unmodified lines | ||
| 1437 | 1437 | |
| 1438 | 1438 | status = mmc_add_host(mmc); |
| 1439 | 1439 | if (status != 0) |
| 1440 | − goto fail_add_host; | |
| 1440 | + goto fail_glue_init; | |
| 1441 | 1441 | |
| 1442 | 1442 | /* |
| 1443 | 1443 | * Index 0 is card detect |
| @@ -1445,7 +1445,7 @@ static int mmc_spi_probe(struct spi_device *spi) · 1 unmodified line | ||
| 1445 | 1445 | */ |
| 1446 | 1446 | status = mmc_gpiod_request_cd(mmc, NULL, 0, false, 1000); |
| 1447 | 1447 | if (status == -EPROBE_DEFER) |
| 1448 | − goto fail_add_host; | |
| 1448 | + goto fail_gpiod_request; | |
| 1449 | 1449 | if (!status) { |
| 1450 | 1450 | /* |
| 1451 | 1451 | * The platform has a CD GPIO signal that may support |
| @@ -1460,7 +1460,7 @@ static int mmc_spi_probe(struct spi_device *spi) · 8 unmodified lines | ||
| 1460 | 1460 | /* Index 1 is write protect/read only */ |
| 1461 | 1461 | status = mmc_gpiod_request_ro(mmc, NULL, 1, 0); |
| 1462 | 1462 | if (status == -EPROBE_DEFER) |
| 1463 | − goto fail_add_host; | |
| 1463 | + goto fail_gpiod_request; | |
| 1464 | 1464 | if (!status) |
| 1465 | 1465 | has_ro = true; |
| 1466 | 1466 | |
| @@ -1474,7 +1474,7 @@ static int mmc_spi_probe(struct spi_device *spi) · 7 unmodified lines | ||
| 1474 | 1474 | ? ", cd polling" : ""); |
| 1475 | 1475 | return 0; |
| 1476 | 1476 | |
| 1477 | −fail_add_host: | |
| 1477 | +fail_gpiod_request: | |
| 1478 | 1478 | mmc_remove_host(mmc); |
| 1479 | 1479 | fail_glue_init: |
| 1480 | 1480 | mmc_spi_dma_free(host); |