diff options
Diffstat (limited to 'patches.tizen/0439-mmc-dw_mmc-Add-the-ability-to-set-the-ciu-clock-freq.patch')
-rw-r--r-- | patches.tizen/0439-mmc-dw_mmc-Add-the-ability-to-set-the-ciu-clock-freq.patch | 113 |
1 files changed, 113 insertions, 0 deletions
diff --git a/patches.tizen/0439-mmc-dw_mmc-Add-the-ability-to-set-the-ciu-clock-freq.patch b/patches.tizen/0439-mmc-dw_mmc-Add-the-ability-to-set-the-ciu-clock-freq.patch new file mode 100644 index 00000000000..42a5fc08c90 --- /dev/null +++ b/patches.tizen/0439-mmc-dw_mmc-Add-the-ability-to-set-the-ciu-clock-freq.patch @@ -0,0 +1,113 @@ +From 9fe621e95bea01096a5b99468a47ea039344c5c4 Mon Sep 17 00:00:00 2001 +From: Doug Anderson <dianders@chromium.org> +Date: Fri, 7 Jun 2013 10:28:30 -0700 +Subject: [PATCH 0439/1302] mmc: dw_mmc: Add the ability to set the ciu clock + frequency + +As of now we rely on code outside of the driver to set the ciu clock +frequency. There's no reason to do that. Add support for setting up +the clock in the driver during probe. + +Signed-off-by: Doug Anderson <dianders@chromium.org> +Acked-by: Jaehoon Chung <jh80.chung@samsung.com> +Signed-off-by: Chris Ball <cjb@laptop.org> +Signed-off-by: MyungJoo Ham <myungjoo.ham@samsung.com> +--- + .../devicetree/bindings/mmc/synopsis-dw-mshc.txt | 16 ++++++++++++++++ + drivers/mmc/host/dw_mmc.c | 17 +++++++++++++---- + 2 files changed, 29 insertions(+), 4 deletions(-) + +diff --git a/Documentation/devicetree/bindings/mmc/synopsis-dw-mshc.txt b/Documentation/devicetree/bindings/mmc/synopsis-dw-mshc.txt +index d5cc94e..dd31b00 100644 +--- a/Documentation/devicetree/bindings/mmc/synopsis-dw-mshc.txt ++++ b/Documentation/devicetree/bindings/mmc/synopsis-dw-mshc.txt +@@ -39,6 +39,19 @@ Required Properties: + + Optional properties: + ++* clocks: from common clock binding: handle to biu and ciu clocks for the ++ bus interface unit clock and the card interface unit clock. ++ ++* clock-names: from common clock binding: Shall be "biu" and "ciu". ++ If the biu clock is missing we'll simply skip enabling it. If the ++ ciu clock is missing we'll just assume that the clock is running at ++ clock-frequency. It is an error to omit both the ciu clock and the ++ clock-frequency. ++ ++* clock-frequency: should be the frequency (in Hz) of the ciu clock. If this ++ is specified and the ciu clock is specified then we'll try to set the ciu ++ clock to this at probe time. ++ + * num-slots: specifies the number of slots supported by the controller. + The number of physical slots actually used could be equal or less than the + value specified by num-slots. If this property is not specified, the value +@@ -70,6 +83,8 @@ board specific portions as listed below. + + dwmmc0@12200000 { + compatible = "snps,dw-mshc"; ++ clocks = <&clock 351>, <&clock 132>; ++ clock-names = "biu", "ciu"; + reg = <0x12200000 0x1000>; + interrupts = <0 75 0>; + #address-cells = <1>; +@@ -77,6 +92,7 @@ board specific portions as listed below. + }; + + dwmmc0@12200000 { ++ clock-frequency = <400000000>; + num-slots = <1>; + supports-highspeed; + broken-cd; +diff --git a/drivers/mmc/host/dw_mmc.c b/drivers/mmc/host/dw_mmc.c +index 957f5d7..ee5f167 100644 +--- a/drivers/mmc/host/dw_mmc.c ++++ b/drivers/mmc/host/dw_mmc.c +@@ -2117,6 +2117,7 @@ static struct dw_mci_board *dw_mci_parse_dt(struct dw_mci *host) + struct device_node *np = dev->of_node; + const struct dw_mci_drv_data *drv_data = host->drv_data; + int idx, ret; ++ u32 clock_frequency; + + pdata = devm_kzalloc(dev, sizeof(*pdata), GFP_KERNEL); + if (!pdata) { +@@ -2143,6 +2144,9 @@ static struct dw_mci_board *dw_mci_parse_dt(struct dw_mci *host) + + of_property_read_u32(np, "card-detect-delay", &pdata->detect_delay_ms); + ++ if (!of_property_read_u32(np, "clock-frequency", &clock_frequency)) ++ pdata->bus_hz = clock_frequency; ++ + if (drv_data && drv_data->parse_dt) { + ret = drv_data->parse_dt(host); + if (ret) +@@ -2200,18 +2204,23 @@ int dw_mci_probe(struct dw_mci *host) + host->ciu_clk = devm_clk_get(host->dev, "ciu"); + if (IS_ERR(host->ciu_clk)) { + dev_dbg(host->dev, "ciu clock not available\n"); ++ host->bus_hz = host->pdata->bus_hz; + } else { + ret = clk_prepare_enable(host->ciu_clk); + if (ret) { + dev_err(host->dev, "failed to enable ciu clock\n"); + goto err_clk_biu; + } +- } + +- if (IS_ERR(host->ciu_clk)) +- host->bus_hz = host->pdata->bus_hz; +- else ++ if (host->pdata->bus_hz) { ++ ret = clk_set_rate(host->ciu_clk, host->pdata->bus_hz); ++ if (ret) ++ dev_warn(host->dev, ++ "Unable to set bus rate to %ul\n", ++ host->pdata->bus_hz); ++ } + host->bus_hz = clk_get_rate(host->ciu_clk); ++ } + + if (drv_data && drv_data->setup_clock) { + ret = drv_data->setup_clock(host); +-- +1.8.3.2 + |