diff options
author | Andrew Bresticker <abrestic@chromium.org> | 2013-09-25 17:12:48 -0400 |
---|---|---|
committer | Tomasz Figa <t.figa@samsung.com> | 2014-01-08 12:02:41 -0500 |
commit | 547f33509ccc6e016df02600d377778b75e26a7b (patch) | |
tree | 2b534dc529d2b747c4fe50e48019aa0a4cd7a0f3 /drivers | |
parent | b37a4224104568198b93fb9831224cfe7d83fff8 (diff) |
clk: exynos-audss: allow input clocks to be specified in device tree
This allows the input clocks to the Exynos AudioSS block to be
specified via device-tree bindings. Default names will be used
when an input clock is not given.
Signed-off-by: Andrew Bresticker <abrestic@chromium.org>
Acked-by: Mike Turquette <mturquette@linaro.org>
Acked-by: Kukjin Kim <kgene.kim@samsung.com>
Signed-off-by: Tomasz Figa <t.figa@samsung.com>
Diffstat (limited to 'drivers')
-rw-r--r-- | drivers/clk/samsung/clk-exynos-audss.c | 25 |
1 files changed, 20 insertions, 5 deletions
diff --git a/drivers/clk/samsung/clk-exynos-audss.c b/drivers/clk/samsung/clk-exynos-audss.c index 1d8f6770ccfe..19a0d874931e 100644 --- a/drivers/clk/samsung/clk-exynos-audss.c +++ b/drivers/clk/samsung/clk-exynos-audss.c | |||
@@ -28,10 +28,6 @@ static struct clk_onecell_data clk_data; | |||
28 | #define ASS_CLK_DIV 0x4 | 28 | #define ASS_CLK_DIV 0x4 |
29 | #define ASS_CLK_GATE 0x8 | 29 | #define ASS_CLK_GATE 0x8 |
30 | 30 | ||
31 | /* list of all parent clock list */ | ||
32 | static const char *mout_audss_p[] = { "fin_pll", "fout_epll" }; | ||
33 | static const char *mout_i2s_p[] = { "mout_audss", "cdclk0", "sclk_audio0" }; | ||
34 | |||
35 | #ifdef CONFIG_PM_SLEEP | 31 | #ifdef CONFIG_PM_SLEEP |
36 | static unsigned long reg_save[][2] = { | 32 | static unsigned long reg_save[][2] = { |
37 | {ASS_CLK_SRC, 0}, | 33 | {ASS_CLK_SRC, 0}, |
@@ -68,6 +64,10 @@ static int exynos_audss_clk_probe(struct platform_device *pdev) | |||
68 | { | 64 | { |
69 | int i, ret = 0; | 65 | int i, ret = 0; |
70 | struct resource *res; | 66 | struct resource *res; |
67 | const char *mout_audss_p[] = {"fin_pll", "fout_epll"}; | ||
68 | const char *mout_i2s_p[] = {"mout_audss", "cdclk0", "sclk_audio0"}; | ||
69 | const char *sclk_pcm_p = "sclk_pcm0"; | ||
70 | struct clk *pll_ref, *pll_in, *cdclk, *sclk_audio, *sclk_pcm_in; | ||
71 | 71 | ||
72 | res = platform_get_resource(pdev, IORESOURCE_MEM, 0); | 72 | res = platform_get_resource(pdev, IORESOURCE_MEM, 0); |
73 | reg_base = devm_ioremap_resource(&pdev->dev, res); | 73 | reg_base = devm_ioremap_resource(&pdev->dev, res); |
@@ -85,11 +85,23 @@ static int exynos_audss_clk_probe(struct platform_device *pdev) | |||
85 | clk_data.clks = clk_table; | 85 | clk_data.clks = clk_table; |
86 | clk_data.clk_num = EXYNOS_AUDSS_MAX_CLKS; | 86 | clk_data.clk_num = EXYNOS_AUDSS_MAX_CLKS; |
87 | 87 | ||
88 | pll_ref = devm_clk_get(&pdev->dev, "pll_ref"); | ||
89 | pll_in = devm_clk_get(&pdev->dev, "pll_in"); | ||
90 | if (!IS_ERR(pll_ref)) | ||
91 | mout_audss_p[0] = __clk_get_name(pll_ref); | ||
92 | if (!IS_ERR(pll_in)) | ||
93 | mout_audss_p[1] = __clk_get_name(pll_in); | ||
88 | clk_table[EXYNOS_MOUT_AUDSS] = clk_register_mux(NULL, "mout_audss", | 94 | clk_table[EXYNOS_MOUT_AUDSS] = clk_register_mux(NULL, "mout_audss", |
89 | mout_audss_p, ARRAY_SIZE(mout_audss_p), | 95 | mout_audss_p, ARRAY_SIZE(mout_audss_p), |
90 | CLK_SET_RATE_NO_REPARENT, | 96 | CLK_SET_RATE_NO_REPARENT, |
91 | reg_base + ASS_CLK_SRC, 0, 1, 0, &lock); | 97 | reg_base + ASS_CLK_SRC, 0, 1, 0, &lock); |
92 | 98 | ||
99 | cdclk = devm_clk_get(&pdev->dev, "cdclk"); | ||
100 | sclk_audio = devm_clk_get(&pdev->dev, "sclk_audio"); | ||
101 | if (!IS_ERR(cdclk)) | ||
102 | mout_i2s_p[1] = __clk_get_name(cdclk); | ||
103 | if (!IS_ERR(sclk_audio)) | ||
104 | mout_i2s_p[2] = __clk_get_name(sclk_audio); | ||
93 | clk_table[EXYNOS_MOUT_I2S] = clk_register_mux(NULL, "mout_i2s", | 105 | clk_table[EXYNOS_MOUT_I2S] = clk_register_mux(NULL, "mout_i2s", |
94 | mout_i2s_p, ARRAY_SIZE(mout_i2s_p), | 106 | mout_i2s_p, ARRAY_SIZE(mout_i2s_p), |
95 | CLK_SET_RATE_NO_REPARENT, | 107 | CLK_SET_RATE_NO_REPARENT, |
@@ -123,8 +135,11 @@ static int exynos_audss_clk_probe(struct platform_device *pdev) | |||
123 | "sclk_pcm", CLK_SET_RATE_PARENT, | 135 | "sclk_pcm", CLK_SET_RATE_PARENT, |
124 | reg_base + ASS_CLK_GATE, 4, 0, &lock); | 136 | reg_base + ASS_CLK_GATE, 4, 0, &lock); |
125 | 137 | ||
138 | sclk_pcm_in = devm_clk_get(&pdev->dev, "sclk_pcm_in"); | ||
139 | if (!IS_ERR(sclk_pcm_in)) | ||
140 | sclk_pcm_p = __clk_get_name(sclk_pcm_in); | ||
126 | clk_table[EXYNOS_SCLK_PCM] = clk_register_gate(NULL, "sclk_pcm", | 141 | clk_table[EXYNOS_SCLK_PCM] = clk_register_gate(NULL, "sclk_pcm", |
127 | "div_pcm0", CLK_SET_RATE_PARENT, | 142 | sclk_pcm_p, CLK_SET_RATE_PARENT, |
128 | reg_base + ASS_CLK_GATE, 5, 0, &lock); | 143 | reg_base + ASS_CLK_GATE, 5, 0, &lock); |
129 | 144 | ||
130 | for (i = 0; i < clk_data.clk_num; i++) { | 145 | for (i = 0; i < clk_data.clk_num; i++) { |