Skip to content

Commit 1e4e0bf

Browse files
Sowjanya Komatinenithierryreding
authored andcommitted
ASoC: tegra: Add audio mclk parent configuration
Tegra PMC clock clk_out_1 is dedicated for audio mclk from Tegra30 through Tegra210 and currently Tegra clock driver does the initial parent configuration for audio mclk and keeps it enabled by default. With the move of PMC clocks from clock driver into PMC driver, audio clocks parent configuration can be specified through the device tree using assigned-clock-parents property and audio mclk control should be taken care of by the audio driver. This patch has implementation for parent configuration when default parent configuration through assigned-clock-parents property is not specified in the device tree. Tested-by: Dmitry Osipenko <[email protected]> Reviewed-by: Dmitry Osipenko <[email protected]> Reviewed-by: Sameer Pujar <[email protected]> Signed-off-by: Sowjanya Komatineni <[email protected]> Signed-off-by: Thierry Reding <[email protected]>
1 parent facb0f4 commit 1e4e0bf

File tree

1 file changed

+40
-28
lines changed

1 file changed

+40
-28
lines changed

sound/soc/tegra/tegra_asoc_utils.c

Lines changed: 40 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -60,8 +60,6 @@ int tegra_asoc_utils_set_rate(struct tegra_asoc_utils_data *data, int srate,
6060
data->set_mclk = 0;
6161

6262
clk_disable_unprepare(data->clk_cdev1);
63-
clk_disable_unprepare(data->clk_pll_a_out0);
64-
clk_disable_unprepare(data->clk_pll_a);
6563

6664
err = clk_set_rate(data->clk_pll_a, new_baseclock);
6765
if (err) {
@@ -77,18 +75,6 @@ int tegra_asoc_utils_set_rate(struct tegra_asoc_utils_data *data, int srate,
7775

7876
/* Don't set cdev1/extern1 rate; it's locked to pll_a_out0 */
7977

80-
err = clk_prepare_enable(data->clk_pll_a);
81-
if (err) {
82-
dev_err(data->dev, "Can't enable pll_a: %d\n", err);
83-
return err;
84-
}
85-
86-
err = clk_prepare_enable(data->clk_pll_a_out0);
87-
if (err) {
88-
dev_err(data->dev, "Can't enable pll_a_out0: %d\n", err);
89-
return err;
90-
}
91-
9278
err = clk_prepare_enable(data->clk_cdev1);
9379
if (err) {
9480
dev_err(data->dev, "Can't enable cdev1: %d\n", err);
@@ -109,8 +95,6 @@ int tegra_asoc_utils_set_ac97_rate(struct tegra_asoc_utils_data *data)
10995
int err;
11096

11197
clk_disable_unprepare(data->clk_cdev1);
112-
clk_disable_unprepare(data->clk_pll_a_out0);
113-
clk_disable_unprepare(data->clk_pll_a);
11498

11599
/*
116100
* AC97 rate is fixed at 24.576MHz and is used for both the host
@@ -130,18 +114,6 @@ int tegra_asoc_utils_set_ac97_rate(struct tegra_asoc_utils_data *data)
130114

131115
/* Don't set cdev1/extern1 rate; it's locked to pll_a_out0 */
132116

133-
err = clk_prepare_enable(data->clk_pll_a);
134-
if (err) {
135-
dev_err(data->dev, "Can't enable pll_a: %d\n", err);
136-
return err;
137-
}
138-
139-
err = clk_prepare_enable(data->clk_pll_a_out0);
140-
if (err) {
141-
dev_err(data->dev, "Can't enable pll_a_out0: %d\n", err);
142-
return err;
143-
}
144-
145117
err = clk_prepare_enable(data->clk_cdev1);
146118
if (err) {
147119
dev_err(data->dev, "Can't enable cdev1: %d\n", err);
@@ -158,6 +130,7 @@ EXPORT_SYMBOL_GPL(tegra_asoc_utils_set_ac97_rate);
158130
int tegra_asoc_utils_init(struct tegra_asoc_utils_data *data,
159131
struct device *dev)
160132
{
133+
struct clk *clk_out_1, *clk_extern1;
161134
int ret;
162135

163136
data->dev = dev;
@@ -193,6 +166,45 @@ int tegra_asoc_utils_init(struct tegra_asoc_utils_data *data,
193166
return PTR_ERR(data->clk_cdev1);
194167
}
195168

169+
/*
170+
* If clock parents are not set in DT, configure here to use clk_out_1
171+
* as mclk and extern1 as parent for Tegra30 and higher.
172+
*/
173+
if (!of_find_property(dev->of_node, "assigned-clock-parents", NULL) &&
174+
data->soc > TEGRA_ASOC_UTILS_SOC_TEGRA20) {
175+
dev_warn(data->dev,
176+
"Configuring clocks for a legacy device-tree\n");
177+
dev_warn(data->dev,
178+
"Please update DT to use assigned-clock-parents\n");
179+
clk_extern1 = devm_clk_get(dev, "extern1");
180+
if (IS_ERR(clk_extern1)) {
181+
dev_err(data->dev, "Can't retrieve clk extern1\n");
182+
return PTR_ERR(clk_extern1);
183+
}
184+
185+
ret = clk_set_parent(clk_extern1, data->clk_pll_a_out0);
186+
if (ret < 0) {
187+
dev_err(data->dev,
188+
"Set parent failed for clk extern1\n");
189+
return ret;
190+
}
191+
192+
clk_out_1 = devm_clk_get(dev, "pmc_clk_out_1");
193+
if (IS_ERR(clk_out_1)) {
194+
dev_err(data->dev, "Can't retrieve pmc_clk_out_1\n");
195+
return PTR_ERR(clk_out_1);
196+
}
197+
198+
ret = clk_set_parent(clk_out_1, clk_extern1);
199+
if (ret < 0) {
200+
dev_err(data->dev,
201+
"Set parent failed for pmc_clk_out_1\n");
202+
return ret;
203+
}
204+
205+
data->clk_cdev1 = clk_out_1;
206+
}
207+
196208
ret = tegra_asoc_utils_set_rate(data, 44100, 256 * 44100);
197209
if (ret)
198210
return ret;

0 commit comments

Comments
 (0)