diff options
| -rw-r--r-- | drivers/mmc/host/sdhci-st.c | 15 |
1 files changed, 14 insertions, 1 deletions
diff --git a/drivers/mmc/host/sdhci-st.c b/drivers/mmc/host/sdhci-st.c index c95ba83366a0..ed92ce729dde 100644 --- a/drivers/mmc/host/sdhci-st.c +++ b/drivers/mmc/host/sdhci-st.c | |||
| @@ -28,6 +28,7 @@ | |||
| 28 | 28 | ||
| 29 | struct st_mmc_platform_data { | 29 | struct st_mmc_platform_data { |
| 30 | struct reset_control *rstc; | 30 | struct reset_control *rstc; |
| 31 | struct clk *icnclk; | ||
| 31 | void __iomem *top_ioaddr; | 32 | void __iomem *top_ioaddr; |
| 32 | }; | 33 | }; |
| 33 | 34 | ||
| @@ -353,7 +354,7 @@ static int sdhci_st_probe(struct platform_device *pdev) | |||
| 353 | struct sdhci_host *host; | 354 | struct sdhci_host *host; |
| 354 | struct st_mmc_platform_data *pdata; | 355 | struct st_mmc_platform_data *pdata; |
| 355 | struct sdhci_pltfm_host *pltfm_host; | 356 | struct sdhci_pltfm_host *pltfm_host; |
| 356 | struct clk *clk; | 357 | struct clk *clk, *icnclk; |
| 357 | int ret = 0; | 358 | int ret = 0; |
| 358 | u16 host_version; | 359 | u16 host_version; |
| 359 | struct resource *res; | 360 | struct resource *res; |
| @@ -365,6 +366,11 @@ static int sdhci_st_probe(struct platform_device *pdev) | |||
| 365 | return PTR_ERR(clk); | 366 | return PTR_ERR(clk); |
| 366 | } | 367 | } |
| 367 | 368 | ||
| 369 | /* ICN clock isn't compulsory, but use it if it's provided. */ | ||
| 370 | icnclk = devm_clk_get(&pdev->dev, "icn"); | ||
| 371 | if (IS_ERR(icnclk)) | ||
| 372 | icnclk = NULL; | ||
| 373 | |||
| 368 | rstc = devm_reset_control_get(&pdev->dev, NULL); | 374 | rstc = devm_reset_control_get(&pdev->dev, NULL); |
| 369 | if (IS_ERR(rstc)) | 375 | if (IS_ERR(rstc)) |
| 370 | rstc = NULL; | 376 | rstc = NULL; |
| @@ -389,6 +395,7 @@ static int sdhci_st_probe(struct platform_device *pdev) | |||
| 389 | } | 395 | } |
| 390 | 396 | ||
| 391 | clk_prepare_enable(clk); | 397 | clk_prepare_enable(clk); |
| 398 | clk_prepare_enable(icnclk); | ||
| 392 | 399 | ||
| 393 | /* Configure the FlashSS Top registers for setting eMMC TX/RX delay */ | 400 | /* Configure the FlashSS Top registers for setting eMMC TX/RX delay */ |
| 394 | res = platform_get_resource_byname(pdev, IORESOURCE_MEM, | 401 | res = platform_get_resource_byname(pdev, IORESOURCE_MEM, |
| @@ -400,6 +407,7 @@ static int sdhci_st_probe(struct platform_device *pdev) | |||
| 400 | } | 407 | } |
| 401 | 408 | ||
| 402 | pltfm_host->clk = clk; | 409 | pltfm_host->clk = clk; |
| 410 | pdata->icnclk = icnclk; | ||
| 403 | 411 | ||
| 404 | /* Configure the Arasan HC inside the flashSS */ | 412 | /* Configure the Arasan HC inside the flashSS */ |
| 405 | st_mmcss_cconfig(np, host); | 413 | st_mmcss_cconfig(np, host); |
| @@ -422,6 +430,7 @@ static int sdhci_st_probe(struct platform_device *pdev) | |||
| 422 | return 0; | 430 | return 0; |
| 423 | 431 | ||
| 424 | err_out: | 432 | err_out: |
| 433 | clk_disable_unprepare(icnclk); | ||
| 425 | clk_disable_unprepare(clk); | 434 | clk_disable_unprepare(clk); |
| 426 | err_of: | 435 | err_of: |
| 427 | sdhci_pltfm_free(pdev); | 436 | sdhci_pltfm_free(pdev); |
| @@ -442,6 +451,8 @@ static int sdhci_st_remove(struct platform_device *pdev) | |||
| 442 | 451 | ||
| 443 | ret = sdhci_pltfm_unregister(pdev); | 452 | ret = sdhci_pltfm_unregister(pdev); |
| 444 | 453 | ||
| 454 | clk_disable_unprepare(pdata->icnclk); | ||
| 455 | |||
| 445 | if (rstc) | 456 | if (rstc) |
| 446 | reset_control_assert(rstc); | 457 | reset_control_assert(rstc); |
| 447 | 458 | ||
| @@ -462,6 +473,7 @@ static int sdhci_st_suspend(struct device *dev) | |||
| 462 | if (pdata->rstc) | 473 | if (pdata->rstc) |
| 463 | reset_control_assert(pdata->rstc); | 474 | reset_control_assert(pdata->rstc); |
| 464 | 475 | ||
| 476 | clk_disable_unprepare(pdata->icnclk); | ||
| 465 | clk_disable_unprepare(pltfm_host->clk); | 477 | clk_disable_unprepare(pltfm_host->clk); |
| 466 | out: | 478 | out: |
| 467 | return ret; | 479 | return ret; |
| @@ -475,6 +487,7 @@ static int sdhci_st_resume(struct device *dev) | |||
| 475 | struct device_node *np = dev->of_node; | 487 | struct device_node *np = dev->of_node; |
| 476 | 488 | ||
| 477 | clk_prepare_enable(pltfm_host->clk); | 489 | clk_prepare_enable(pltfm_host->clk); |
| 490 | clk_prepare_enable(pdata->icnclk); | ||
| 478 | 491 | ||
| 479 | if (pdata->rstc) | 492 | if (pdata->rstc) |
| 480 | reset_control_deassert(pdata->rstc); | 493 | reset_control_deassert(pdata->rstc); |
