diff options
author | Lucas Stach <dev@lynxeye.de> | 2012-12-19 18:17:33 -0500 |
---|---|---|
committer | Mark Brown <broonie@opensource.wolfsonmicro.com> | 2012-12-24 10:59:10 -0500 |
commit | 919ad49c214adcc80578c7a02efd3fe8460e0797 (patch) | |
tree | 048b7f4d0ffa880bf1adfd288db96ee12c3b0872 /sound/soc/tegra | |
parent | a49f0d1ea3ec94fc7cf33a7c36a16343b74bd565 (diff) |
ASoC: tegra: add function to set ac97 rate
AC97 uses a fixed rate, unrelated to the sample rate. Add a function to
make the setup more trivial.
Signed-off-by: Lucas Stach <dev@lynxeye.de>
Acked-by: Stephen Warren <swarren@nvidia.com>
Signed-off-by: Mark Brown <broonie@opensource.wolfsonmicro.com>
Diffstat (limited to 'sound/soc/tegra')
-rw-r--r-- | sound/soc/tegra/tegra_asoc_utils.c | 53 | ||||
-rw-r--r-- | sound/soc/tegra/tegra_asoc_utils.h | 1 |
2 files changed, 54 insertions, 0 deletions
diff --git a/sound/soc/tegra/tegra_asoc_utils.c b/sound/soc/tegra/tegra_asoc_utils.c index 6872c77a1196..ba419f86384d 100644 --- a/sound/soc/tegra/tegra_asoc_utils.c +++ b/sound/soc/tegra/tegra_asoc_utils.c | |||
@@ -112,6 +112,59 @@ int tegra_asoc_utils_set_rate(struct tegra_asoc_utils_data *data, int srate, | |||
112 | } | 112 | } |
113 | EXPORT_SYMBOL_GPL(tegra_asoc_utils_set_rate); | 113 | EXPORT_SYMBOL_GPL(tegra_asoc_utils_set_rate); |
114 | 114 | ||
115 | int tegra_asoc_utils_set_ac97_rate(struct tegra_asoc_utils_data *data) | ||
116 | { | ||
117 | const int pll_rate = 73728000; | ||
118 | const int ac97_rate = 24576000; | ||
119 | int err; | ||
120 | |||
121 | clk_disable_unprepare(data->clk_cdev1); | ||
122 | clk_disable_unprepare(data->clk_pll_a_out0); | ||
123 | clk_disable_unprepare(data->clk_pll_a); | ||
124 | |||
125 | /* | ||
126 | * AC97 rate is fixed at 24.576MHz and is used for both the host | ||
127 | * controller and the external codec | ||
128 | */ | ||
129 | err = clk_set_rate(data->clk_pll_a, pll_rate); | ||
130 | if (err) { | ||
131 | dev_err(data->dev, "Can't set pll_a rate: %d\n", err); | ||
132 | return err; | ||
133 | } | ||
134 | |||
135 | err = clk_set_rate(data->clk_pll_a_out0, ac97_rate); | ||
136 | if (err) { | ||
137 | dev_err(data->dev, "Can't set pll_a_out0 rate: %d\n", err); | ||
138 | return err; | ||
139 | } | ||
140 | |||
141 | /* Don't set cdev1/extern1 rate; it's locked to pll_a_out0 */ | ||
142 | |||
143 | err = clk_prepare_enable(data->clk_pll_a); | ||
144 | if (err) { | ||
145 | dev_err(data->dev, "Can't enable pll_a: %d\n", err); | ||
146 | return err; | ||
147 | } | ||
148 | |||
149 | err = clk_prepare_enable(data->clk_pll_a_out0); | ||
150 | if (err) { | ||
151 | dev_err(data->dev, "Can't enable pll_a_out0: %d\n", err); | ||
152 | return err; | ||
153 | } | ||
154 | |||
155 | err = clk_prepare_enable(data->clk_cdev1); | ||
156 | if (err) { | ||
157 | dev_err(data->dev, "Can't enable cdev1: %d\n", err); | ||
158 | return err; | ||
159 | } | ||
160 | |||
161 | data->set_baseclock = pll_rate; | ||
162 | data->set_mclk = ac97_rate; | ||
163 | |||
164 | return 0; | ||
165 | } | ||
166 | EXPORT_SYMBOL_GPL(tegra_asoc_utils_set_ac97_rate); | ||
167 | |||
115 | int tegra_asoc_utils_init(struct tegra_asoc_utils_data *data, | 168 | int tegra_asoc_utils_init(struct tegra_asoc_utils_data *data, |
116 | struct device *dev) | 169 | struct device *dev) |
117 | { | 170 | { |
diff --git a/sound/soc/tegra/tegra_asoc_utils.h b/sound/soc/tegra/tegra_asoc_utils.h index 44db1dbb8f21..974c9f8830f9 100644 --- a/sound/soc/tegra/tegra_asoc_utils.h +++ b/sound/soc/tegra/tegra_asoc_utils.h | |||
@@ -43,6 +43,7 @@ struct tegra_asoc_utils_data { | |||
43 | 43 | ||
44 | int tegra_asoc_utils_set_rate(struct tegra_asoc_utils_data *data, int srate, | 44 | int tegra_asoc_utils_set_rate(struct tegra_asoc_utils_data *data, int srate, |
45 | int mclk); | 45 | int mclk); |
46 | int tegra_asoc_utils_set_ac97_rate(struct tegra_asoc_utils_data *data); | ||
46 | int tegra_asoc_utils_init(struct tegra_asoc_utils_data *data, | 47 | int tegra_asoc_utils_init(struct tegra_asoc_utils_data *data, |
47 | struct device *dev); | 48 | struct device *dev); |
48 | void tegra_asoc_utils_fini(struct tegra_asoc_utils_data *data); | 49 | void tegra_asoc_utils_fini(struct tegra_asoc_utils_data *data); |