aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorPeter Ujfalusi <peter.ujfalusi@ti.com>2013-11-14 04:35:31 -0500
committerMark Brown <broonie@linaro.org>2013-12-10 06:22:16 -0500
commit487dce8823cdcb70e645e5312a0d4f7081e1ad13 (patch)
tree0ad7ab39c4066e48c2eee00d000afc5366c22fc2
parent8f113b77b511c9e26706d4eb077af0ba30893ee4 (diff)
ASoC: davinci-mcasp: Simplify FIFO configuration code
The FIFO registers base address is different in dm646x compared to newer SoCs with McASP IP. Instead of using two paths (switch/case) to handle the difference we can simply pick the correct base address beforehand and use offsets to address the register we need to configure. With this change the indentation depth can be reduced as well. Signed-off-by: Peter Ujfalusi <peter.ujfalusi@ti.com> Signed-off-by: Mark Brown <broonie@linaro.org>
-rw-r--r--sound/soc/davinci/davinci-mcasp.c101
-rw-r--r--sound/soc/davinci/davinci-mcasp.h16
2 files changed, 38 insertions, 79 deletions
diff --git a/sound/soc/davinci/davinci-mcasp.c b/sound/soc/davinci/davinci-mcasp.c
index 1341f327df83..72ea45893abf 100644
--- a/sound/soc/davinci/davinci-mcasp.c
+++ b/sound/soc/davinci/davinci-mcasp.c
@@ -38,6 +38,7 @@
38struct davinci_mcasp { 38struct davinci_mcasp {
39 struct davinci_pcm_dma_params dma_params[2]; 39 struct davinci_pcm_dma_params dma_params[2];
40 void __iomem *base; 40 void __iomem *base;
41 u32 fifo_base;
41 struct device *dev; 42 struct device *dev;
42 43
43 /* McASP specific data */ 44 /* McASP specific data */
@@ -153,38 +154,20 @@ static void mcasp_start_tx(struct davinci_mcasp *mcasp)
153 154
154static void davinci_mcasp_start(struct davinci_mcasp *mcasp, int stream) 155static void davinci_mcasp_start(struct davinci_mcasp *mcasp, int stream)
155{ 156{
157 u32 reg;
158
156 if (stream == SNDRV_PCM_STREAM_PLAYBACK) { 159 if (stream == SNDRV_PCM_STREAM_PLAYBACK) {
157 if (mcasp->txnumevt) { /* enable FIFO */ 160 if (mcasp->txnumevt) { /* enable FIFO */
158 switch (mcasp->version) { 161 reg = mcasp->fifo_base + MCASP_WFIFOCTL_OFFSET;
159 case MCASP_VERSION_3: 162 mcasp_clr_bits(mcasp->base + reg, FIFO_ENABLE);
160 mcasp_clr_bits(mcasp->base + MCASP_VER3_WFIFOCTL, 163 mcasp_set_bits(mcasp->base + reg, FIFO_ENABLE);
161 FIFO_ENABLE);
162 mcasp_set_bits(mcasp->base + MCASP_VER3_WFIFOCTL,
163 FIFO_ENABLE);
164 break;
165 default:
166 mcasp_clr_bits(mcasp->base +
167 DAVINCI_MCASP_WFIFOCTL, FIFO_ENABLE);
168 mcasp_set_bits(mcasp->base +
169 DAVINCI_MCASP_WFIFOCTL, FIFO_ENABLE);
170 }
171 } 164 }
172 mcasp_start_tx(mcasp); 165 mcasp_start_tx(mcasp);
173 } else { 166 } else {
174 if (mcasp->rxnumevt) { /* enable FIFO */ 167 if (mcasp->rxnumevt) { /* enable FIFO */
175 switch (mcasp->version) { 168 reg = mcasp->fifo_base + MCASP_RFIFOCTL_OFFSET;
176 case MCASP_VERSION_3: 169 mcasp_clr_bits(mcasp->base + reg, FIFO_ENABLE);
177 mcasp_clr_bits(mcasp->base + MCASP_VER3_RFIFOCTL, 170 mcasp_set_bits(mcasp->base + reg, FIFO_ENABLE);
178 FIFO_ENABLE);
179 mcasp_set_bits(mcasp->base + MCASP_VER3_RFIFOCTL,
180 FIFO_ENABLE);
181 break;
182 default:
183 mcasp_clr_bits(mcasp->base +
184 DAVINCI_MCASP_RFIFOCTL, FIFO_ENABLE);
185 mcasp_set_bits(mcasp->base +
186 DAVINCI_MCASP_RFIFOCTL, FIFO_ENABLE);
187 }
188 } 171 }
189 mcasp_start_rx(mcasp); 172 mcasp_start_rx(mcasp);
190 } 173 }
@@ -204,31 +187,18 @@ static void mcasp_stop_tx(struct davinci_mcasp *mcasp)
204 187
205static void davinci_mcasp_stop(struct davinci_mcasp *mcasp, int stream) 188static void davinci_mcasp_stop(struct davinci_mcasp *mcasp, int stream)
206{ 189{
190 u32 reg;
191
207 if (stream == SNDRV_PCM_STREAM_PLAYBACK) { 192 if (stream == SNDRV_PCM_STREAM_PLAYBACK) {
208 if (mcasp->txnumevt) { /* disable FIFO */ 193 if (mcasp->txnumevt) { /* disable FIFO */
209 switch (mcasp->version) { 194 reg = mcasp->fifo_base + MCASP_WFIFOCTL_OFFSET;
210 case MCASP_VERSION_3: 195 mcasp_clr_bits(mcasp->base + reg, FIFO_ENABLE);
211 mcasp_clr_bits(mcasp->base + MCASP_VER3_WFIFOCTL,
212 FIFO_ENABLE);
213 break;
214 default:
215 mcasp_clr_bits(mcasp->base +
216 DAVINCI_MCASP_WFIFOCTL, FIFO_ENABLE);
217 }
218 } 196 }
219 mcasp_stop_tx(mcasp); 197 mcasp_stop_tx(mcasp);
220 } else { 198 } else {
221 if (mcasp->rxnumevt) { /* disable FIFO */ 199 if (mcasp->rxnumevt) { /* disable FIFO */
222 switch (mcasp->version) { 200 reg = mcasp->fifo_base + MCASP_RFIFOCTL_OFFSET;
223 case MCASP_VERSION_3: 201 mcasp_clr_bits(mcasp->base + reg, FIFO_ENABLE);
224 mcasp_clr_bits(mcasp->base + MCASP_VER3_RFIFOCTL,
225 FIFO_ENABLE);
226 break;
227
228 default:
229 mcasp_clr_bits(mcasp->base +
230 DAVINCI_MCASP_RFIFOCTL, FIFO_ENABLE);
231 }
232 } 202 }
233 mcasp_stop_rx(mcasp); 203 mcasp_stop_rx(mcasp);
234 } 204 }
@@ -438,6 +408,7 @@ static int davinci_hw_common_param(struct davinci_mcasp *mcasp, int stream,
438 u8 ser; 408 u8 ser;
439 u8 slots = mcasp->tdm_slots; 409 u8 slots = mcasp->tdm_slots;
440 u8 max_active_serializers = (channels + slots - 1) / slots; 410 u8 max_active_serializers = (channels + slots - 1) / slots;
411 u32 reg;
441 /* Default configuration */ 412 /* Default configuration */
442 mcasp_set_bits(mcasp->base + DAVINCI_MCASP_PWREMUMGT_REG, MCASP_SOFT); 413 mcasp_set_bits(mcasp->base + DAVINCI_MCASP_PWREMUMGT_REG, MCASP_SOFT);
443 414
@@ -488,37 +459,20 @@ static int davinci_hw_common_param(struct davinci_mcasp *mcasp, int stream,
488 if (mcasp->txnumevt * tx_ser > 64) 459 if (mcasp->txnumevt * tx_ser > 64)
489 mcasp->txnumevt = 1; 460 mcasp->txnumevt = 1;
490 461
491 switch (mcasp->version) { 462 reg = mcasp->fifo_base + MCASP_WFIFOCTL_OFFSET;
492 case MCASP_VERSION_3: 463 mcasp_mod_bits(mcasp->base + reg, tx_ser, NUMDMA_MASK);
493 mcasp_mod_bits(mcasp->base + MCASP_VER3_WFIFOCTL, tx_ser, 464 mcasp_mod_bits(mcasp->base + reg,
494 NUMDMA_MASK); 465 ((mcasp->txnumevt * tx_ser) << 8), NUMEVT_MASK);
495 mcasp_mod_bits(mcasp->base + MCASP_VER3_WFIFOCTL,
496 ((mcasp->txnumevt * tx_ser) << 8), NUMEVT_MASK);
497 break;
498 default:
499 mcasp_mod_bits(mcasp->base + DAVINCI_MCASP_WFIFOCTL,
500 tx_ser, NUMDMA_MASK);
501 mcasp_mod_bits(mcasp->base + DAVINCI_MCASP_WFIFOCTL,
502 ((mcasp->txnumevt * tx_ser) << 8), NUMEVT_MASK);
503 }
504 } 466 }
505 467
506 if (mcasp->rxnumevt && stream == SNDRV_PCM_STREAM_CAPTURE) { 468 if (mcasp->rxnumevt && stream == SNDRV_PCM_STREAM_CAPTURE) {
507 if (mcasp->rxnumevt * rx_ser > 64) 469 if (mcasp->rxnumevt * rx_ser > 64)
508 mcasp->rxnumevt = 1; 470 mcasp->rxnumevt = 1;
509 switch (mcasp->version) { 471
510 case MCASP_VERSION_3: 472 reg = mcasp->fifo_base + MCASP_RFIFOCTL_OFFSET;
511 mcasp_mod_bits(mcasp->base + MCASP_VER3_RFIFOCTL, rx_ser, 473 mcasp_mod_bits(mcasp->base + reg, rx_ser, NUMDMA_MASK);
512 NUMDMA_MASK); 474 mcasp_mod_bits(mcasp->base + reg,
513 mcasp_mod_bits(mcasp->base + MCASP_VER3_RFIFOCTL, 475 ((mcasp->rxnumevt * rx_ser) << 8), NUMEVT_MASK);
514 ((mcasp->rxnumevt * rx_ser) << 8), NUMEVT_MASK);
515 break;
516 default:
517 mcasp_mod_bits(mcasp->base + DAVINCI_MCASP_RFIFOCTL,
518 rx_ser, NUMDMA_MASK);
519 mcasp_mod_bits(mcasp->base + DAVINCI_MCASP_RFIFOCTL,
520 ((mcasp->rxnumevt * rx_ser) << 8), NUMEVT_MASK);
521 }
522 } 476 }
523 477
524 return 0; 478 return 0;
@@ -974,6 +928,11 @@ static int davinci_mcasp_probe(struct platform_device *pdev)
974 mcasp->version = pdata->version; 928 mcasp->version = pdata->version;
975 mcasp->txnumevt = pdata->txnumevt; 929 mcasp->txnumevt = pdata->txnumevt;
976 mcasp->rxnumevt = pdata->rxnumevt; 930 mcasp->rxnumevt = pdata->rxnumevt;
931 if (mcasp->version < MCASP_VERSION_3)
932 mcasp->fifo_base = DAVINCI_MCASP_V2_AFIFO_BASE;
933 else
934 mcasp->fifo_base = DAVINCI_MCASP_V3_AFIFO_BASE;
935
977 mcasp->dev = &pdev->dev; 936 mcasp->dev = &pdev->dev;
978 937
979 dat = platform_get_resource_byname(pdev, IORESOURCE_MEM, "dat"); 938 dat = platform_get_resource_byname(pdev, IORESOURCE_MEM, "dat");
diff --git a/sound/soc/davinci/davinci-mcasp.h b/sound/soc/davinci/davinci-mcasp.h
index 80e5a1846687..8fed757d6087 100644
--- a/sound/soc/davinci/davinci-mcasp.h
+++ b/sound/soc/davinci/davinci-mcasp.h
@@ -90,14 +90,14 @@
90#define DAVINCI_MCASP_RXBUF_REG 0x280 90#define DAVINCI_MCASP_RXBUF_REG 0x280
91 91
92/* McASP FIFO Registers */ 92/* McASP FIFO Registers */
93#define DAVINCI_MCASP_WFIFOCTL (0x1010) 93#define DAVINCI_MCASP_V2_AFIFO_BASE (0x1010)
94#define DAVINCI_MCASP_WFIFOSTS (0x1014) 94#define DAVINCI_MCASP_V3_AFIFO_BASE (0x1000)
95#define DAVINCI_MCASP_RFIFOCTL (0x1018) 95
96#define DAVINCI_MCASP_RFIFOSTS (0x101C) 96/* FIFO register offsets from AFIFO base */
97#define MCASP_VER3_WFIFOCTL (0x1000) 97#define MCASP_WFIFOCTL_OFFSET (0x0)
98#define MCASP_VER3_WFIFOSTS (0x1004) 98#define MCASP_WFIFOSTS_OFFSET (0x4)
99#define MCASP_VER3_RFIFOCTL (0x1008) 99#define MCASP_RFIFOCTL_OFFSET (0x8)
100#define MCASP_VER3_RFIFOSTS (0x100C) 100#define MCASP_RFIFOSTS_OFFSET (0xc)
101 101
102/* 102/*
103 * DAVINCI_MCASP_PWREMUMGT_REG - Power Down and Emulation Management 103 * DAVINCI_MCASP_PWREMUMGT_REG - Power Down and Emulation Management