diff options
author | Dmitry Osipenko <digetx@gmail.com> | 2018-05-03 18:55:34 -0400 |
---|---|---|
committer | Linus Walleij <linus.walleij@linaro.org> | 2018-05-16 08:21:32 -0400 |
commit | c594870756599f23809ab6ba95bee41161601a4a (patch) | |
tree | 6b281c69164a56f40d3eec120862ae943f739487 | |
parent | ba5554dc184ee03bdadfdef8a4b8a97eddbf55dc (diff) |
pinctrl: tegra20: Provide CDEV1/2 clock muxes
Muxing of pins MCLK1/2 determine the muxing of the corresponding clocks.
Make pinctrl driver to provide clock muxes for the CDEV1/2 pingroups, so
that main clk-controller driver could get an actual parent clock for the
CDEV1/2 clocks.
Signed-off-by: Dmitry Osipenko <digetx@gmail.com>
Reviewed-by: Marcel Ziswiler <marcel@ziswiler.com>
Tested-by: Marcel Ziswiler <marcel@ziswiler.com>
Tested-by: Marc Dietrich <marvin24@gmx.de>
Acked-by: Peter De Schrijver <pdeschrijver@nvidia.com>
Signed-off-by: Linus Walleij <linus.walleij@linaro.org>
-rw-r--r-- | drivers/pinctrl/tegra/pinctrl-tegra.c | 11 | ||||
-rw-r--r-- | drivers/pinctrl/tegra/pinctrl-tegra.h | 11 | ||||
-rw-r--r-- | drivers/pinctrl/tegra/pinctrl-tegra20.c | 30 |
3 files changed, 40 insertions, 12 deletions
diff --git a/drivers/pinctrl/tegra/pinctrl-tegra.c b/drivers/pinctrl/tegra/pinctrl-tegra.c index 72c718e66ebb..49c7c1499bc3 100644 --- a/drivers/pinctrl/tegra/pinctrl-tegra.c +++ b/drivers/pinctrl/tegra/pinctrl-tegra.c | |||
@@ -33,17 +33,6 @@ | |||
33 | #include "../pinctrl-utils.h" | 33 | #include "../pinctrl-utils.h" |
34 | #include "pinctrl-tegra.h" | 34 | #include "pinctrl-tegra.h" |
35 | 35 | ||
36 | struct tegra_pmx { | ||
37 | struct device *dev; | ||
38 | struct pinctrl_dev *pctl; | ||
39 | |||
40 | const struct tegra_pinctrl_soc_data *soc; | ||
41 | const char **group_pins; | ||
42 | |||
43 | int nbanks; | ||
44 | void __iomem **regs; | ||
45 | }; | ||
46 | |||
47 | static inline u32 pmx_readl(struct tegra_pmx *pmx, u32 bank, u32 reg) | 36 | static inline u32 pmx_readl(struct tegra_pmx *pmx, u32 bank, u32 reg) |
48 | { | 37 | { |
49 | return readl(pmx->regs[bank] + reg); | 38 | return readl(pmx->regs[bank] + reg); |
diff --git a/drivers/pinctrl/tegra/pinctrl-tegra.h b/drivers/pinctrl/tegra/pinctrl-tegra.h index 33b17cb1471e..aa33c20766c4 100644 --- a/drivers/pinctrl/tegra/pinctrl-tegra.h +++ b/drivers/pinctrl/tegra/pinctrl-tegra.h | |||
@@ -16,6 +16,17 @@ | |||
16 | #ifndef __PINMUX_TEGRA_H__ | 16 | #ifndef __PINMUX_TEGRA_H__ |
17 | #define __PINMUX_TEGRA_H__ | 17 | #define __PINMUX_TEGRA_H__ |
18 | 18 | ||
19 | struct tegra_pmx { | ||
20 | struct device *dev; | ||
21 | struct pinctrl_dev *pctl; | ||
22 | |||
23 | const struct tegra_pinctrl_soc_data *soc; | ||
24 | const char **group_pins; | ||
25 | |||
26 | int nbanks; | ||
27 | void __iomem **regs; | ||
28 | }; | ||
29 | |||
19 | enum tegra_pinconf_param { | 30 | enum tegra_pinconf_param { |
20 | /* argument: tegra_pinconf_pull */ | 31 | /* argument: tegra_pinconf_pull */ |
21 | TEGRA_PINCONF_PARAM_PULL, | 32 | TEGRA_PINCONF_PARAM_PULL, |
diff --git a/drivers/pinctrl/tegra/pinctrl-tegra20.c b/drivers/pinctrl/tegra/pinctrl-tegra20.c index 7e38ee9bae78..b6dd939d32cc 100644 --- a/drivers/pinctrl/tegra/pinctrl-tegra20.c +++ b/drivers/pinctrl/tegra/pinctrl-tegra20.c | |||
@@ -19,6 +19,7 @@ | |||
19 | * more details. | 19 | * more details. |
20 | */ | 20 | */ |
21 | 21 | ||
22 | #include <linux/clk-provider.h> | ||
22 | #include <linux/init.h> | 23 | #include <linux/init.h> |
23 | #include <linux/of.h> | 24 | #include <linux/of.h> |
24 | #include <linux/platform_device.h> | 25 | #include <linux/platform_device.h> |
@@ -2231,9 +2232,36 @@ static const struct tegra_pinctrl_soc_data tegra20_pinctrl = { | |||
2231 | .drvtype_in_mux = false, | 2232 | .drvtype_in_mux = false, |
2232 | }; | 2233 | }; |
2233 | 2234 | ||
2235 | static const char *cdev1_parents[] = { | ||
2236 | "dev1_osc_div", "pll_a_out0", "pll_m_out1", "audio", | ||
2237 | }; | ||
2238 | |||
2239 | static const char *cdev2_parents[] = { | ||
2240 | "dev2_osc_div", "hclk", "pclk", "pll_p_out4", | ||
2241 | }; | ||
2242 | |||
2243 | static void tegra20_pinctrl_register_clock_muxes(struct platform_device *pdev) | ||
2244 | { | ||
2245 | struct tegra_pmx *pmx = platform_get_drvdata(pdev); | ||
2246 | |||
2247 | clk_register_mux(NULL, "cdev1_mux", cdev1_parents, 4, 0, | ||
2248 | pmx->regs[1] + 0x8, 2, 2, CLK_MUX_READ_ONLY, NULL); | ||
2249 | |||
2250 | clk_register_mux(NULL, "cdev2_mux", cdev2_parents, 4, 0, | ||
2251 | pmx->regs[1] + 0x8, 4, 2, CLK_MUX_READ_ONLY, NULL); | ||
2252 | } | ||
2253 | |||
2234 | static int tegra20_pinctrl_probe(struct platform_device *pdev) | 2254 | static int tegra20_pinctrl_probe(struct platform_device *pdev) |
2235 | { | 2255 | { |
2236 | return tegra_pinctrl_probe(pdev, &tegra20_pinctrl); | 2256 | int err; |
2257 | |||
2258 | err = tegra_pinctrl_probe(pdev, &tegra20_pinctrl); | ||
2259 | if (err) | ||
2260 | return err; | ||
2261 | |||
2262 | tegra20_pinctrl_register_clock_muxes(pdev); | ||
2263 | |||
2264 | return 0; | ||
2237 | } | 2265 | } |
2238 | 2266 | ||
2239 | static const struct of_device_id tegra20_pinctrl_of_match[] = { | 2267 | static const struct of_device_id tegra20_pinctrl_of_match[] = { |