aboutsummaryrefslogtreecommitdiffstats
path: root/sound/soc/tegra/tegra30_ahub.c
diff options
context:
space:
mode:
authorStephen Warren <swarren@nvidia.com>2013-11-15 13:29:45 -0500
committerStephen Warren <swarren@nvidia.com>2013-12-11 18:43:44 -0500
commit768db0b93d6f0ed10f351b5eca34ef44b456369c (patch)
treeecb9ddf873761452d2ff775a4374b2ea208d9a6a /sound/soc/tegra/tegra30_ahub.c
parent5185e0acc831e250257ba04f5204dc5f5c1e5d0a (diff)
ASoC: tegra: call pm_runtime APIs around register accesses
Call pm_runtime_get_sync() before all register accesses; the HW requires clocks to be running when accessing registers. This hasn't been needed to date, since all register IO was performed while playback was active, and hence the ASoC core had already called pm_runtime_get(). However, an imminent future commit will allocate and set up the FIFOs and routing during probe(), when that "protection" won't be in place. Signed-off-by: Stephen Warren <swarren@nvidia.com> Acked-by: Mark Brown <broonie@linaro.org>
Diffstat (limited to 'sound/soc/tegra/tegra30_ahub.c')
-rw-r--r--sound/soc/tegra/tegra30_ahub.c32
1 files changed, 32 insertions, 0 deletions
diff --git a/sound/soc/tegra/tegra30_ahub.c b/sound/soc/tegra/tegra30_ahub.c
index 38c6962b7d66..7d146e6b7038 100644
--- a/sound/soc/tegra/tegra30_ahub.c
+++ b/sound/soc/tegra/tegra30_ahub.c
@@ -114,6 +114,8 @@ int tegra30_ahub_allocate_rx_fifo(enum tegra30_ahub_rxcif *rxcif,
114 (channel * TEGRA30_AHUB_CHANNEL_RXFIFO_STRIDE); 114 (channel * TEGRA30_AHUB_CHANNEL_RXFIFO_STRIDE);
115 *reqsel = ahub->dma_sel + channel; 115 *reqsel = ahub->dma_sel + channel;
116 116
117 pm_runtime_get_sync(ahub->dev);
118
117 reg = TEGRA30_AHUB_CHANNEL_CTRL + 119 reg = TEGRA30_AHUB_CHANNEL_CTRL +
118 (channel * TEGRA30_AHUB_CHANNEL_CTRL_STRIDE); 120 (channel * TEGRA30_AHUB_CHANNEL_CTRL_STRIDE);
119 val = tegra30_apbif_read(reg); 121 val = tegra30_apbif_read(reg);
@@ -140,6 +142,8 @@ int tegra30_ahub_allocate_rx_fifo(enum tegra30_ahub_rxcif *rxcif,
140 (channel * TEGRA30_AHUB_CIF_RX_CTRL_STRIDE); 142 (channel * TEGRA30_AHUB_CIF_RX_CTRL_STRIDE);
141 ahub->soc_data->set_audio_cif(ahub->regmap_apbif, reg, &cif_conf); 143 ahub->soc_data->set_audio_cif(ahub->regmap_apbif, reg, &cif_conf);
142 144
145 pm_runtime_put(ahub->dev);
146
143 return 0; 147 return 0;
144} 148}
145EXPORT_SYMBOL_GPL(tegra30_ahub_allocate_rx_fifo); 149EXPORT_SYMBOL_GPL(tegra30_ahub_allocate_rx_fifo);
@@ -149,12 +153,16 @@ int tegra30_ahub_enable_rx_fifo(enum tegra30_ahub_rxcif rxcif)
149 int channel = rxcif - TEGRA30_AHUB_RXCIF_APBIF_RX0; 153 int channel = rxcif - TEGRA30_AHUB_RXCIF_APBIF_RX0;
150 int reg, val; 154 int reg, val;
151 155
156 pm_runtime_get_sync(ahub->dev);
157
152 reg = TEGRA30_AHUB_CHANNEL_CTRL + 158 reg = TEGRA30_AHUB_CHANNEL_CTRL +
153 (channel * TEGRA30_AHUB_CHANNEL_CTRL_STRIDE); 159 (channel * TEGRA30_AHUB_CHANNEL_CTRL_STRIDE);
154 val = tegra30_apbif_read(reg); 160 val = tegra30_apbif_read(reg);
155 val |= TEGRA30_AHUB_CHANNEL_CTRL_RX_EN; 161 val |= TEGRA30_AHUB_CHANNEL_CTRL_RX_EN;
156 tegra30_apbif_write(reg, val); 162 tegra30_apbif_write(reg, val);
157 163
164 pm_runtime_put(ahub->dev);
165
158 return 0; 166 return 0;
159} 167}
160EXPORT_SYMBOL_GPL(tegra30_ahub_enable_rx_fifo); 168EXPORT_SYMBOL_GPL(tegra30_ahub_enable_rx_fifo);
@@ -164,12 +172,16 @@ int tegra30_ahub_disable_rx_fifo(enum tegra30_ahub_rxcif rxcif)
164 int channel = rxcif - TEGRA30_AHUB_RXCIF_APBIF_RX0; 172 int channel = rxcif - TEGRA30_AHUB_RXCIF_APBIF_RX0;
165 int reg, val; 173 int reg, val;
166 174
175 pm_runtime_get_sync(ahub->dev);
176
167 reg = TEGRA30_AHUB_CHANNEL_CTRL + 177 reg = TEGRA30_AHUB_CHANNEL_CTRL +
168 (channel * TEGRA30_AHUB_CHANNEL_CTRL_STRIDE); 178 (channel * TEGRA30_AHUB_CHANNEL_CTRL_STRIDE);
169 val = tegra30_apbif_read(reg); 179 val = tegra30_apbif_read(reg);
170 val &= ~TEGRA30_AHUB_CHANNEL_CTRL_RX_EN; 180 val &= ~TEGRA30_AHUB_CHANNEL_CTRL_RX_EN;
171 tegra30_apbif_write(reg, val); 181 tegra30_apbif_write(reg, val);
172 182
183 pm_runtime_put(ahub->dev);
184
173 return 0; 185 return 0;
174} 186}
175EXPORT_SYMBOL_GPL(tegra30_ahub_disable_rx_fifo); 187EXPORT_SYMBOL_GPL(tegra30_ahub_disable_rx_fifo);
@@ -204,6 +216,8 @@ int tegra30_ahub_allocate_tx_fifo(enum tegra30_ahub_txcif *txcif,
204 (channel * TEGRA30_AHUB_CHANNEL_TXFIFO_STRIDE); 216 (channel * TEGRA30_AHUB_CHANNEL_TXFIFO_STRIDE);
205 *reqsel = ahub->dma_sel + channel; 217 *reqsel = ahub->dma_sel + channel;
206 218
219 pm_runtime_get_sync(ahub->dev);
220
207 reg = TEGRA30_AHUB_CHANNEL_CTRL + 221 reg = TEGRA30_AHUB_CHANNEL_CTRL +
208 (channel * TEGRA30_AHUB_CHANNEL_CTRL_STRIDE); 222 (channel * TEGRA30_AHUB_CHANNEL_CTRL_STRIDE);
209 val = tegra30_apbif_read(reg); 223 val = tegra30_apbif_read(reg);
@@ -230,6 +244,8 @@ int tegra30_ahub_allocate_tx_fifo(enum tegra30_ahub_txcif *txcif,
230 (channel * TEGRA30_AHUB_CIF_TX_CTRL_STRIDE); 244 (channel * TEGRA30_AHUB_CIF_TX_CTRL_STRIDE);
231 ahub->soc_data->set_audio_cif(ahub->regmap_apbif, reg, &cif_conf); 245 ahub->soc_data->set_audio_cif(ahub->regmap_apbif, reg, &cif_conf);
232 246
247 pm_runtime_put(ahub->dev);
248
233 return 0; 249 return 0;
234} 250}
235EXPORT_SYMBOL_GPL(tegra30_ahub_allocate_tx_fifo); 251EXPORT_SYMBOL_GPL(tegra30_ahub_allocate_tx_fifo);
@@ -239,12 +255,16 @@ int tegra30_ahub_enable_tx_fifo(enum tegra30_ahub_txcif txcif)
239 int channel = txcif - TEGRA30_AHUB_TXCIF_APBIF_TX0; 255 int channel = txcif - TEGRA30_AHUB_TXCIF_APBIF_TX0;
240 int reg, val; 256 int reg, val;
241 257
258 pm_runtime_get_sync(ahub->dev);
259
242 reg = TEGRA30_AHUB_CHANNEL_CTRL + 260 reg = TEGRA30_AHUB_CHANNEL_CTRL +
243 (channel * TEGRA30_AHUB_CHANNEL_CTRL_STRIDE); 261 (channel * TEGRA30_AHUB_CHANNEL_CTRL_STRIDE);
244 val = tegra30_apbif_read(reg); 262 val = tegra30_apbif_read(reg);
245 val |= TEGRA30_AHUB_CHANNEL_CTRL_TX_EN; 263 val |= TEGRA30_AHUB_CHANNEL_CTRL_TX_EN;
246 tegra30_apbif_write(reg, val); 264 tegra30_apbif_write(reg, val);
247 265
266 pm_runtime_put(ahub->dev);
267
248 return 0; 268 return 0;
249} 269}
250EXPORT_SYMBOL_GPL(tegra30_ahub_enable_tx_fifo); 270EXPORT_SYMBOL_GPL(tegra30_ahub_enable_tx_fifo);
@@ -254,12 +274,16 @@ int tegra30_ahub_disable_tx_fifo(enum tegra30_ahub_txcif txcif)
254 int channel = txcif - TEGRA30_AHUB_TXCIF_APBIF_TX0; 274 int channel = txcif - TEGRA30_AHUB_TXCIF_APBIF_TX0;
255 int reg, val; 275 int reg, val;
256 276
277 pm_runtime_get_sync(ahub->dev);
278
257 reg = TEGRA30_AHUB_CHANNEL_CTRL + 279 reg = TEGRA30_AHUB_CHANNEL_CTRL +
258 (channel * TEGRA30_AHUB_CHANNEL_CTRL_STRIDE); 280 (channel * TEGRA30_AHUB_CHANNEL_CTRL_STRIDE);
259 val = tegra30_apbif_read(reg); 281 val = tegra30_apbif_read(reg);
260 val &= ~TEGRA30_AHUB_CHANNEL_CTRL_TX_EN; 282 val &= ~TEGRA30_AHUB_CHANNEL_CTRL_TX_EN;
261 tegra30_apbif_write(reg, val); 283 tegra30_apbif_write(reg, val);
262 284
285 pm_runtime_put(ahub->dev);
286
263 return 0; 287 return 0;
264} 288}
265EXPORT_SYMBOL_GPL(tegra30_ahub_disable_tx_fifo); 289EXPORT_SYMBOL_GPL(tegra30_ahub_disable_tx_fifo);
@@ -280,10 +304,14 @@ int tegra30_ahub_set_rx_cif_source(enum tegra30_ahub_rxcif rxcif,
280 int channel = rxcif - TEGRA30_AHUB_RXCIF_APBIF_RX0; 304 int channel = rxcif - TEGRA30_AHUB_RXCIF_APBIF_RX0;
281 int reg; 305 int reg;
282 306
307 pm_runtime_get_sync(ahub->dev);
308
283 reg = TEGRA30_AHUB_AUDIO_RX + 309 reg = TEGRA30_AHUB_AUDIO_RX +
284 (channel * TEGRA30_AHUB_AUDIO_RX_STRIDE); 310 (channel * TEGRA30_AHUB_AUDIO_RX_STRIDE);
285 tegra30_audio_write(reg, 1 << txcif); 311 tegra30_audio_write(reg, 1 << txcif);
286 312
313 pm_runtime_put(ahub->dev);
314
287 return 0; 315 return 0;
288} 316}
289EXPORT_SYMBOL_GPL(tegra30_ahub_set_rx_cif_source); 317EXPORT_SYMBOL_GPL(tegra30_ahub_set_rx_cif_source);
@@ -293,10 +321,14 @@ int tegra30_ahub_unset_rx_cif_source(enum tegra30_ahub_rxcif rxcif)
293 int channel = rxcif - TEGRA30_AHUB_RXCIF_APBIF_RX0; 321 int channel = rxcif - TEGRA30_AHUB_RXCIF_APBIF_RX0;
294 int reg; 322 int reg;
295 323
324 pm_runtime_get_sync(ahub->dev);
325
296 reg = TEGRA30_AHUB_AUDIO_RX + 326 reg = TEGRA30_AHUB_AUDIO_RX +
297 (channel * TEGRA30_AHUB_AUDIO_RX_STRIDE); 327 (channel * TEGRA30_AHUB_AUDIO_RX_STRIDE);
298 tegra30_audio_write(reg, 0); 328 tegra30_audio_write(reg, 0);
299 329
330 pm_runtime_put(ahub->dev);
331
300 return 0; 332 return 0;
301} 333}
302EXPORT_SYMBOL_GPL(tegra30_ahub_unset_rx_cif_source); 334EXPORT_SYMBOL_GPL(tegra30_ahub_unset_rx_cif_source);