| From bcabe95c59f6813f5d0db93a0e27ec0c9121feb3 Mon Sep 17 00:00:00 2001 |
| From: Chris Brandt <chris.brandt@renesas.com> |
| Date: Wed, 25 Jan 2017 15:28:08 -0500 |
| Subject: [PATCH 158/255] mmc: sh_mobile_sdhi: add support for 2 clocks |
| |
| Some controllers have 2 clock sources instead of 1. The 2nd clock |
| is for the internal card detect logic and must be enabled/disabled |
| along with the main core clock for proper operation. |
| |
| Signed-off-by: Chris Brandt <chris.brandt@renesas.com> |
| Signed-off-by: Ulf Hansson <ulf.hansson@linaro.org> |
| Reviewed-by: Wolfram Sang <wsa+renesas@sang-engineering.com> |
| (cherry picked from commit 34a1654706c6cc20e7a9077063b307afe28ec66c) |
| Signed-off-by: Simon Horman <horms+renesas@verge.net.au> |
| --- |
| drivers/mmc/host/sh_mobile_sdhi.c | 23 +++++++++++++++++++++++ |
| 1 file changed, 23 insertions(+) |
| |
| --- a/drivers/mmc/host/sh_mobile_sdhi.c |
| +++ b/drivers/mmc/host/sh_mobile_sdhi.c |
| @@ -143,6 +143,7 @@ MODULE_DEVICE_TABLE(of, sh_mobile_sdhi_o |
| |
| struct sh_mobile_sdhi { |
| struct clk *clk; |
| + struct clk *clk_cd; |
| struct tmio_mmc_data mmc_data; |
| struct tmio_mmc_dma dma_priv; |
| struct pinctrl *pinctrl; |
| @@ -190,6 +191,12 @@ static int sh_mobile_sdhi_clk_enable(str |
| if (ret < 0) |
| return ret; |
| |
| + ret = clk_prepare_enable(priv->clk_cd); |
| + if (ret < 0) { |
| + clk_disable_unprepare(priv->clk); |
| + return ret; |
| + } |
| + |
| /* |
| * The clock driver may not know what maximum frequency |
| * actually works, so it should be set with the max-frequency |
| @@ -255,6 +262,7 @@ static void sh_mobile_sdhi_clk_disable(s |
| struct sh_mobile_sdhi *priv = host_to_priv(host); |
| |
| clk_disable_unprepare(priv->clk); |
| + clk_disable_unprepare(priv->clk_cd); |
| } |
| |
| static int sh_mobile_sdhi_card_busy(struct mmc_host *mmc) |
| @@ -572,6 +580,21 @@ static int sh_mobile_sdhi_probe(struct p |
| goto eprobe; |
| } |
| |
| + /* |
| + * Some controllers provide a 2nd clock just to run the internal card |
| + * detection logic. Unfortunately, the existing driver architecture does |
| + * not support a separation of clocks for runtime PM usage. When |
| + * native hotplug is used, the tmio driver assumes that the core |
| + * must continue to run for card detect to stay active, so we cannot |
| + * disable it. |
| + * Additionally, it is prohibited to supply a clock to the core but not |
| + * to the card detect circuit. That leaves us with if separate clocks |
| + * are presented, we must treat them both as virtually 1 clock. |
| + */ |
| + priv->clk_cd = devm_clk_get(&pdev->dev, "cd"); |
| + if (IS_ERR(priv->clk_cd)) |
| + priv->clk_cd = NULL; |
| + |
| priv->pinctrl = devm_pinctrl_get(&pdev->dev); |
| if (!IS_ERR(priv->pinctrl)) { |
| priv->pins_default = pinctrl_lookup_state(priv->pinctrl, |