summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMichael Sevakis <jethead71@rockbox.org>2009-03-09 04:25:25 +0000
committerMichael Sevakis <jethead71@rockbox.org>2009-03-09 04:25:25 +0000
commitd1adf35e626cd9717cab2de17b029d3c8790ce6e (patch)
tree26c8e3781bb5d906b4a737dea0439dae460047ab
parentde910d862c166c9c73ccc01b6a6dc0884c7037ae (diff)
downloadrockbox-d1adf35e626cd9717cab2de17b029d3c8790ce6e.tar.gz
rockbox-d1adf35e626cd9717cab2de17b029d3c8790ce6e.zip
Gigabeat S: Switch SSI1 and 2 around so that playback can use the shared peripheral DMA with SSI2 which doesn't require use of the peripheral DMA unit-- SSI2 is mapped to the SDMA core address space. Fix some break keywords in get_script_pc(). Use the patched script for mcu_2_app (BSP appears to have neglected to update that). Use _SHP instead of _SP for shared peripheral constants (consistency).
git-svn-id: svn://svn.rockbox.org/rockbox/trunk@20254 a1c6a512-1295-4272-9138-f99709370657
-rw-r--r--firmware/target/arm/imx31/gigabeat-s/audio-gigabeat-s.c4
-rw-r--r--firmware/target/arm/imx31/gigabeat-s/pcm-imx31.c116
-rw-r--r--firmware/target/arm/imx31/gigabeat-s/wmcodec-imx31.c8
-rw-r--r--firmware/target/arm/imx31/sdma-imx31.c31
-rw-r--r--firmware/target/arm/imx31/sdma-imx31.h10
5 files changed, 77 insertions, 92 deletions
diff --git a/firmware/target/arm/imx31/gigabeat-s/audio-gigabeat-s.c b/firmware/target/arm/imx31/gigabeat-s/audio-gigabeat-s.c
index 87b59de599..f5e17a4039 100644
--- a/firmware/target/arm/imx31/gigabeat-s/audio-gigabeat-s.c
+++ b/firmware/target/arm/imx31/gigabeat-s/audio-gigabeat-s.c
@@ -30,8 +30,8 @@ void audio_set_output_source(int source)
30 { 30 {
31 default: 31 default:
32 case AUDIO_SRC_PLAYBACK: 32 case AUDIO_SRC_PLAYBACK:
33 /* Receive data from PORT1 (SSI1) */ 33 /* Receive data from PORT2 (SSI2) */
34 AUDMUX_PDCR4 = AUDMUX_PDCR_RXDSEL_PORT1; 34 AUDMUX_PDCR4 = AUDMUX_PDCR_RXDSEL_PORT2;
35 /* wmc_clear(WMC_COMPANDING_CTRL, WMC_LOOPBACK); */ 35 /* wmc_clear(WMC_COMPANDING_CTRL, WMC_LOOPBACK); */
36 break; 36 break;
37 37
diff --git a/firmware/target/arm/imx31/gigabeat-s/pcm-imx31.c b/firmware/target/arm/imx31/gigabeat-s/pcm-imx31.c
index 9d2503f4e6..649186ab2e 100644
--- a/firmware/target/arm/imx31/gigabeat-s/pcm-imx31.c
+++ b/firmware/target/arm/imx31/gigabeat-s/pcm-imx31.c
@@ -88,7 +88,7 @@ static void play_dma_callback(void)
88void pcm_play_lock(void) 88void pcm_play_lock(void)
89{ 89{
90 if (++dma_play_data.locked == 1) 90 if (++dma_play_data.locked == 1)
91 imx31_regclr32(&SSI_SIER1, SSI_SIER_TDMAE); 91 imx31_regclr32(&SSI_SIER2, SSI_SIER_TDMAE);
92} 92}
93 93
94void pcm_play_unlock(void) 94void pcm_play_unlock(void)
@@ -98,7 +98,7 @@ void pcm_play_unlock(void)
98 int oldstatus = disable_irq_save(); 98 int oldstatus = disable_irq_save();
99 int pending = dma_play_data.callback_pending; 99 int pending = dma_play_data.callback_pending;
100 dma_play_data.callback_pending = 0; 100 dma_play_data.callback_pending = 0;
101 SSI_SIER1 |= SSI_SIER_TDMAE; 101 SSI_SIER2 |= SSI_SIER_TDMAE;
102 restore_irq(oldstatus); 102 restore_irq(oldstatus);
103 103
104 /* Should an interrupt be forced instead? The upper pcm layer can 104 /* Should an interrupt be forced instead? The upper pcm layer can
@@ -119,11 +119,11 @@ void pcm_play_dma_init(void)
119 /* Init channel information */ 119 /* Init channel information */
120 dma_play_cd.bd_count = 1; 120 dma_play_cd.bd_count = 1;
121 dma_play_cd.callback = play_dma_callback; 121 dma_play_cd.callback = play_dma_callback;
122 dma_play_cd.shp_addr = SDMA_PER_ADDR_SSI1_TX1; 122 dma_play_cd.shp_addr = SDMA_PER_ADDR_SSI2_TX1;
123 dma_play_cd.wml = SDMA_SSI_TXFIFO_WML*2; 123 dma_play_cd.wml = SDMA_SSI_TXFIFO_WML*2;
124 dma_play_cd.per_type = SDMA_PER_SSI; 124 dma_play_cd.per_type = SDMA_PER_SSI_SHP; /* SSI2 shared with SDMA core */
125 dma_play_cd.tran_type = SDMA_TRAN_EMI_2_PER; 125 dma_play_cd.tran_type = SDMA_TRAN_EMI_2_PER;
126 dma_play_cd.event_id1 = SDMA_REQ_SSI1_TX1; 126 dma_play_cd.event_id1 = SDMA_REQ_SSI2_TX1;
127 127
128 sdma_channel_init(DMA_PLAY_CH_NUM, &dma_play_cd, &dma_play_bd); 128 sdma_channel_init(DMA_PLAY_CH_NUM, &dma_play_cd, &dma_play_bd);
129 129
@@ -131,60 +131,60 @@ void pcm_play_dma_init(void)
131 imx31_clkctl_module_clock_gating(CG_SSI2, CGM_ON_ALL); 131 imx31_clkctl_module_clock_gating(CG_SSI2, CGM_ON_ALL);
132 132
133 /* Reset & disable SSIs */ 133 /* Reset & disable SSIs */
134 SSI_SCR2 &= ~SSI_SCR_SSIEN;
135 SSI_SCR1 &= ~SSI_SCR_SSIEN; 134 SSI_SCR1 &= ~SSI_SCR_SSIEN;
135 SSI_SCR2 &= ~SSI_SCR_SSIEN;
136 136
137 SSI_SIER1 = 0; 137 SSI_SIER1 = 0;
138 SSI_SIER2 = 0; 138 SSI_SIER2 = 0;
139 139
140 /* Set up audio mux */ 140 /* Set up audio mux */
141 141
142 /* Port 1 (internally connected to SSI1) 142 /* Port 2 (internally connected to SSI2)
143 * All clocking is output sourced from port 4 */ 143 * All clocking is output sourced from port 4 */
144 AUDMUX_PTCR1 = AUDMUX_PTCR_TFS_DIR | AUDMUX_PTCR_TFSEL_PORT4 | 144 AUDMUX_PTCR2 = AUDMUX_PTCR_TFS_DIR | AUDMUX_PTCR_TFSEL_PORT4 |
145 AUDMUX_PTCR_TCLKDIR | AUDMUX_PTCR_TCSEL_PORT4 | 145 AUDMUX_PTCR_TCLKDIR | AUDMUX_PTCR_TCSEL_PORT4 |
146 AUDMUX_PTCR_SYN; 146 AUDMUX_PTCR_SYN;
147 147
148 /* Receive data from port 4 */ 148 /* Receive data from port 4 */
149 AUDMUX_PDCR1 = AUDMUX_PDCR_RXDSEL_PORT4; 149 AUDMUX_PDCR2 = AUDMUX_PDCR_RXDSEL_PORT4;
150 /* All clock lines are inputs sourced from the master mode codec and 150 /* All clock lines are inputs sourced from the master mode codec and
151 * sent back to SSI1 through port 1 */ 151 * sent back to SSI2 through port 2 */
152 AUDMUX_PTCR4 = AUDMUX_PTCR_SYN; 152 AUDMUX_PTCR4 = AUDMUX_PTCR_SYN;
153 153
154 /* Receive data from port 1 */ 154 /* Receive data from port 2 */
155 AUDMUX_PDCR4 = AUDMUX_PDCR_RXDSEL_PORT1; 155 AUDMUX_PDCR4 = AUDMUX_PDCR_RXDSEL_PORT2;
156 156
157 /* PORT2 (internally connected to SSI2) routes clocking to PORT5 to 157 /* PORT1 (internally connected to SSI1) routes clocking to PORT5 to
158 * provide MCLK to the codec */ 158 * provide MCLK to the codec */
159 /* TX clocks are inputs taken from SSI2 */ 159 /* TX clocks are inputs taken from SSI2 */
160 /* RX clocks are outputs taken from PORT4 */ 160 /* RX clocks are outputs taken from PORT4 */
161 AUDMUX_PTCR2 = AUDMUX_PTCR_RFS_DIR | AUDMUX_PTCR_RFSSEL_PORT4 | 161 AUDMUX_PTCR1 = AUDMUX_PTCR_RFS_DIR | AUDMUX_PTCR_RFSSEL_PORT4 |
162 AUDMUX_PTCR_RCLKDIR | AUDMUX_PTCR_RCSEL_PORT4; 162 AUDMUX_PTCR_RCLKDIR | AUDMUX_PTCR_RCSEL_PORT4;
163 /* RX data taken from PORT4 */ 163 /* RX data taken from PORT4 */
164 AUDMUX_PDCR2 = AUDMUX_PDCR_RXDSEL_PORT4; 164 AUDMUX_PDCR1 = AUDMUX_PDCR_RXDSEL_PORT4;
165 165
166 /* PORT5 outputs TCLK sourced from PORT2 (SSI2) */ 166 /* PORT5 outputs TCLK sourced from PORT1 (SSI1) */
167 AUDMUX_PTCR5 = AUDMUX_PTCR_TCLKDIR | AUDMUX_PTCR_TCSEL_PORT2; 167 AUDMUX_PTCR5 = AUDMUX_PTCR_TCLKDIR | AUDMUX_PTCR_TCSEL_PORT1;
168 AUDMUX_PDCR5 = 0; 168 AUDMUX_PDCR5 = 0;
169 169
170 /* Setup SSIs */ 170 /* Setup SSIs */
171 171
172 /* SSI1 - SoC software interface for all I2S data out */ 172 /* SSI2 - SoC software interface for all I2S data out */
173 SSI_SCR1 = SSI_SCR_SYN | SSI_SCR_I2S_MODE_SLAVE; 173 SSI_SCR2 = SSI_SCR_SYN | SSI_SCR_I2S_MODE_SLAVE;
174 SSI_STCR1 = SSI_STCR_TXBIT0 | SSI_STCR_TSCKP | SSI_STCR_TFSI | 174 SSI_STCR2 = SSI_STCR_TXBIT0 | SSI_STCR_TSCKP | SSI_STCR_TFSI |
175 SSI_STCR_TEFS | SSI_STCR_TFEN0; 175 SSI_STCR_TEFS | SSI_STCR_TFEN0;
176 176
177 /* 16 bits per word, 2 words per frame */ 177 /* 16 bits per word, 2 words per frame */
178 SSI_STCCR1 = SSI_STRCCR_WL16 | SSI_STRCCR_DCw(2-1) | 178 SSI_STCCR2 = SSI_STRCCR_WL16 | SSI_STRCCR_DCw(2-1) |
179 SSI_STRCCR_PMw(4-1); 179 SSI_STRCCR_PMw(4-1);
180 180
181 /* Transmit low watermark */ 181 /* Transmit low watermark */
182 SSI_SFCSR1 = (SSI_SFCSR1 & ~SSI_SFCSR_TFWM0) | 182 SSI_SFCSR2 = (SSI_SFCSR2 & ~SSI_SFCSR_TFWM0) |
183 SSI_SFCSR_TFWM0w(8-SDMA_SSI_TXFIFO_WML); 183 SSI_SFCSR_TFWM0w(8-SDMA_SSI_TXFIFO_WML);
184 SSI_STMSK1 = 0; 184 SSI_STMSK2 = 0;
185 185
186 /* SSI2 - provides MCLK to codec. Receives data from codec. */ 186 /* SSI1 - provides MCLK to codec. Receives data from codec. */
187 SSI_STCR2 = SSI_STCR_TXDIR; 187 SSI_STCR1 = SSI_STCR_TXDIR;
188 188
189 /* f(INT_BIT_CLK) = 189 /* f(INT_BIT_CLK) =
190 * f(SYS_CLK) / [(DIV2 + 1)*(7*PSR + 1)*(PM + 1)*2] = 190 * f(SYS_CLK) / [(DIV2 + 1)*(7*PSR + 1)*(PM + 1)*2] =
@@ -198,25 +198,25 @@ void pcm_play_dma_init(void)
198 * The hardware seems to force a divide by 4 even if all bits are 198 * The hardware seems to force a divide by 4 even if all bits are
199 * zero but comply by setting DIV2 and the others to zero. 199 * zero but comply by setting DIV2 and the others to zero.
200 */ 200 */
201 SSI_STCCR2 = SSI_STRCCR_DIV2 | SSI_STRCCR_PMw(1-1); 201 SSI_STCCR1 = SSI_STRCCR_DIV2 | SSI_STRCCR_PMw(1-1);
202 202
203 /* SSI2 - receive - asynchronous clocks */ 203 /* SSI1 - receive - asynchronous clocks */
204 SSI_SCR2 = SSI_SCR_I2S_MODE_SLAVE; 204 SSI_SCR1 = SSI_SCR_I2S_MODE_SLAVE;
205 205
206 SSI_SRCR2 = SSI_SRCR_RXBIT0 | SSI_SRCR_RSCKP | SSI_SRCR_RFSI | 206 SSI_SRCR1 = SSI_SRCR_RXBIT0 | SSI_SRCR_RSCKP | SSI_SRCR_RFSI |
207 SSI_SRCR_REFS; 207 SSI_SRCR_REFS;
208 208
209 /* 16 bits per word, 2 words per frame */ 209 /* 16 bits per word, 2 words per frame */
210 SSI_SRCCR2 = SSI_STRCCR_WL16 | SSI_STRCCR_DCw(2-1) | 210 SSI_SRCCR1 = SSI_STRCCR_WL16 | SSI_STRCCR_DCw(2-1) |
211 SSI_STRCCR_PMw(4-1); 211 SSI_STRCCR_PMw(4-1);
212 212
213 /* Receive high watermark */ 213 /* Receive high watermark */
214 SSI_SFCSR2 = (SSI_SFCSR2 & ~SSI_SFCSR_RFWM0) | 214 SSI_SFCSR1 = (SSI_SFCSR1 & ~SSI_SFCSR_RFWM0) |
215 SSI_SFCSR_RFWM0w(SDMA_SSI_RXFIFO_WML); 215 SSI_SFCSR_RFWM0w(SDMA_SSI_RXFIFO_WML);
216 SSI_SRMSK2 = 0; 216 SSI_SRMSK1 = 0;
217 217
218 /* Enable SSI2 (codec clock) */ 218 /* Enable SSI1 (codec clock) */
219 SSI_SCR2 |= SSI_SCR_SSIEN; 219 SSI_SCR1 |= SSI_SCR_SSIEN;
220 220
221 audiohw_init(); 221 audiohw_init();
222} 222}
@@ -229,31 +229,31 @@ void pcm_postinit(void)
229static void play_start_pcm(void) 229static void play_start_pcm(void)
230{ 230{
231 /* Stop transmission (if in progress) */ 231 /* Stop transmission (if in progress) */
232 SSI_SCR1 &= ~SSI_SCR_TE; 232 SSI_SCR2 &= ~SSI_SCR_TE;
233 233
234 SSI_SCR1 |= SSI_SCR_SSIEN; /* Enable SSI */ 234 SSI_SCR2 |= SSI_SCR_SSIEN; /* Enable SSI */
235 SSI_STCR1 |= SSI_STCR_TFEN0; /* Enable TX FIFO */ 235 SSI_STCR2 |= SSI_STCR_TFEN0; /* Enable TX FIFO */
236 236
237 dma_play_data.state = 1; /* Enable DMA requests on unlock */ 237 dma_play_data.state = 1; /* Enable DMA requests on unlock */
238 238
239 /* Do prefill to prevent swapped channels (see TLSbo61214 in MCIMX31CE). 239 /* Do prefill to prevent swapped channels (see TLSbo61214 in MCIMX31CE).
240 * No actual solution was offered but this appears to work. */ 240 * No actual solution was offered but this appears to work. */
241 SSI_STX0_1 = 0; 241 SSI_STX0_2 = 0;
242 SSI_STX0_1 = 0; 242 SSI_STX0_2 = 0;
243 SSI_STX0_1 = 0; 243 SSI_STX0_2 = 0;
244 SSI_STX0_1 = 0; 244 SSI_STX0_2 = 0;
245 245
246 SSI_SCR1 |= SSI_SCR_TE; /* Start transmitting */ 246 SSI_SCR2 |= SSI_SCR_TE; /* Start transmitting */
247} 247}
248 248
249static void play_stop_pcm(void) 249static void play_stop_pcm(void)
250{ 250{
251 /* Wait for FIFO to empty */ 251 /* Wait for FIFO to empty */
252 while (SSI_SFCSR_TFCNT0r(SSI_SFCSR1) > 0); 252 while (SSI_SFCSR_TFCNT0r(SSI_SFCSR2) > 0);
253 253
254 /* Disable transmission */ 254 /* Disable transmission */
255 SSI_STCR1 &= ~SSI_STCR_TFEN0; 255 SSI_STCR2 &= ~SSI_STCR_TFEN0;
256 SSI_SCR1 &= ~(SSI_SCR_TE | SSI_SCR_SSIEN); 256 SSI_SCR2 &= ~(SSI_SCR_TE | SSI_SCR_SSIEN);
257 257
258 /* Set state before pending to prevent race with interrupt */ 258 /* Set state before pending to prevent race with interrupt */
259 /* Do not enable DMA requests on unlock */ 259 /* Do not enable DMA requests on unlock */
@@ -266,8 +266,8 @@ void pcm_play_dma_start(const void *addr, size_t size)
266 sdma_channel_stop(DMA_PLAY_CH_NUM); 266 sdma_channel_stop(DMA_PLAY_CH_NUM);
267 267
268 /* Disable transmission */ 268 /* Disable transmission */
269 SSI_STCR1 &= ~SSI_STCR_TFEN0; 269 SSI_STCR2 &= ~SSI_STCR_TFEN0;
270 SSI_SCR1 &= ~(SSI_SCR_TE | SSI_SCR_SSIEN); 270 SSI_SCR2 &= ~(SSI_SCR_TE | SSI_SCR_SSIEN);
271 271
272 addr = (void *)(((unsigned long)addr + 3) & ~3); 272 addr = (void *)(((unsigned long)addr + 3) & ~3);
273 size &= ~3; 273 size &= ~3;
@@ -408,7 +408,7 @@ static void rec_dma_callback(void)
408void pcm_rec_lock(void) 408void pcm_rec_lock(void)
409{ 409{
410 if (++dma_rec_data.locked == 1) 410 if (++dma_rec_data.locked == 1)
411 imx31_regclr32(&SSI_SIER2, SSI_SIER_RDMAE); 411 imx31_regclr32(&SSI_SIER1, SSI_SIER_RDMAE);
412} 412}
413 413
414void pcm_rec_unlock(void) 414void pcm_rec_unlock(void)
@@ -418,7 +418,7 @@ void pcm_rec_unlock(void)
418 int oldstatus = disable_irq_save(); 418 int oldstatus = disable_irq_save();
419 int pending = dma_rec_data.callback_pending; 419 int pending = dma_rec_data.callback_pending;
420 dma_rec_data.callback_pending = 0; 420 dma_rec_data.callback_pending = 0;
421 SSI_SIER2 |= SSI_SIER_RDMAE; 421 SSI_SIER1 |= SSI_SIER_RDMAE;
422 restore_irq(oldstatus); 422 restore_irq(oldstatus);
423 423
424 /* Should an interrupt be forced instead? The upper pcm layer can 424 /* Should an interrupt be forced instead? The upper pcm layer can
@@ -451,10 +451,10 @@ void pcm_rec_dma_stop(void)
451 /* Stop receiving data */ 451 /* Stop receiving data */
452 sdma_channel_stop(DMA_REC_CH_NUM); 452 sdma_channel_stop(DMA_REC_CH_NUM);
453 453
454 imx31_regclr32(&SSI_SIER2, SSI_SIER_RDMAE); 454 imx31_regclr32(&SSI_SIER1, SSI_SIER_RDMAE);
455 455
456 SSI_SCR2 &= ~SSI_SCR_RE; /* Disable RX */ 456 SSI_SCR1 &= ~SSI_SCR_RE; /* Disable RX */
457 SSI_SRCR2 &= ~SSI_SRCR_RFEN0; /* Disable RX FIFO */ 457 SSI_SRCR1 &= ~SSI_SRCR_RFEN0; /* Disable RX FIFO */
458 458
459 /* Set state before pending to prevent race with interrupt */ 459 /* Set state before pending to prevent race with interrupt */
460 /* Do not enable DMA requests on unlock */ 460 /* Do not enable DMA requests on unlock */
@@ -487,14 +487,14 @@ void pcm_rec_dma_start(void *addr, size_t size)
487 487
488 dma_rec_data.state = 1; 488 dma_rec_data.state = 1;
489 489
490 SSI_SRCR2 |= SSI_SRCR_RFEN0; /* Enable RX FIFO */ 490 SSI_SRCR1 |= SSI_SRCR_RFEN0; /* Enable RX FIFO */
491 491
492 /* Ensure clear FIFO */ 492 /* Ensure clear FIFO */
493 while (SSI_SFCSR2 & SSI_SFCSR_RFCNT0) 493 while (SSI_SFCSR1 & SSI_SFCSR_RFCNT0)
494 SSI_SRX0_2; 494 SSI_SRX0_1;
495 495
496 /* Enable receive */ 496 /* Enable receive */
497 SSI_SCR2 |= SSI_SCR_RE; 497 SSI_SCR1 |= SSI_SCR_RE;
498 sdma_channel_run(DMA_REC_CH_NUM); 498 sdma_channel_run(DMA_REC_CH_NUM);
499} 499}
500 500
@@ -511,11 +511,11 @@ void pcm_rec_dma_init(void)
511 /* Init channel information */ 511 /* Init channel information */
512 dma_rec_cd.bd_count = 1; 512 dma_rec_cd.bd_count = 1;
513 dma_rec_cd.callback = rec_dma_callback; 513 dma_rec_cd.callback = rec_dma_callback;
514 dma_rec_cd.shp_addr = SDMA_PER_ADDR_SSI2_RX1; 514 dma_rec_cd.shp_addr = SDMA_PER_ADDR_SSI1_RX1;
515 dma_rec_cd.wml = SDMA_SSI_RXFIFO_WML*2; 515 dma_rec_cd.wml = SDMA_SSI_RXFIFO_WML*2;
516 dma_rec_cd.per_type = SDMA_PER_SSI; 516 dma_rec_cd.per_type = SDMA_PER_SSI;
517 dma_rec_cd.tran_type = SDMA_TRAN_PER_2_EMI; 517 dma_rec_cd.tran_type = SDMA_TRAN_PER_2_EMI;
518 dma_rec_cd.event_id1 = SDMA_REQ_SSI2_RX1; 518 dma_rec_cd.event_id1 = SDMA_REQ_SSI1_RX1;
519 519
520 sdma_channel_init(DMA_REC_CH_NUM, &dma_rec_cd, &dma_rec_bd); 520 sdma_channel_init(DMA_REC_CH_NUM, &dma_rec_cd, &dma_rec_bd);
521} 521}
diff --git a/firmware/target/arm/imx31/gigabeat-s/wmcodec-imx31.c b/firmware/target/arm/imx31/gigabeat-s/wmcodec-imx31.c
index e307057978..542f6eb633 100644
--- a/firmware/target/arm/imx31/gigabeat-s/wmcodec-imx31.c
+++ b/firmware/target/arm/imx31/gigabeat-s/wmcodec-imx31.c
@@ -44,17 +44,17 @@ void audiohw_init(void)
44 /* How SYSCLK for codec is derived (USBPLL=338.688MHz). 44 /* How SYSCLK for codec is derived (USBPLL=338.688MHz).
45 * 45 *
46 * SSI post dividers (SSI2 PODF=4, SSI2 PRE PODF=0): 46 * SSI post dividers (SSI2 PODF=4, SSI2 PRE PODF=0):
47 * 338688000Hz / 5 = 67737600Hz = ssi2_clk 47 * 338688000Hz / 5 = 67737600Hz = ssi1_clk
48 * 48 *
49 * SSI bit clock dividers (DIV2=1, PSR=0, PM=0): 49 * SSI bit clock dividers (DIV2=1, PSR=0, PM=0):
50 * ssi2_clk / 4 = 16934400Hz = INT_BIT_CLK (MCLK) 50 * ssi1_clk / 4 = 16934400Hz = INT_BIT_CLK (MCLK)
51 * 51 *
52 * WM Codec post divider (MCLKDIV=1.5): 52 * WM Codec post divider (MCLKDIV=1.5):
53 * INT_BIT_CLK (MCLK) / 1.5 = 11289600Hz = 256*fs = SYSCLK 53 * INT_BIT_CLK (MCLK) / 1.5 = 11289600Hz = 256*fs = SYSCLK
54 */ 54 */
55 imx31_regmod32(&CLKCTL_PDR1, 55 imx31_regmod32(&CLKCTL_PDR1,
56 PDR1_SSI1_PODFw(64-1) | PDR1_SSI2_PODFw(5-1) | 56 PDR1_SSI1_PODFw(5-1) | PDR1_SSI2_PODFw(64-1) |
57 PDR1_SSI1_PRE_PODFw(8-1) | PDR1_SSI2_PRE_PODFw(1-1), 57 PDR1_SSI1_PRE_PODFw(1-1) | PDR1_SSI2_PRE_PODFw(8-1),
58 PDR1_SSI1_PODF | PDR1_SSI2_PODF | 58 PDR1_SSI1_PODF | PDR1_SSI2_PODF |
59 PDR1_SSI1_PRE_PODF | PDR1_SSI2_PRE_PODF); 59 PDR1_SSI1_PRE_PODF | PDR1_SSI2_PRE_PODF);
60 60
diff --git a/firmware/target/arm/imx31/sdma-imx31.c b/firmware/target/arm/imx31/sdma-imx31.c
index 100bd51028..d1611d6332 100644
--- a/firmware/target/arm/imx31/sdma-imx31.c
+++ b/firmware/target/arm/imx31/sdma-imx31.c
@@ -116,7 +116,7 @@ static void init_script_info(void)
116 script_info.ap_2_bp_addr = ap_2_bp_ADDR_2; 116 script_info.ap_2_bp_addr = ap_2_bp_ADDR_2;
117 script_info.bp_2_ap_addr = bp_2_ap_ADDR_2; 117 script_info.bp_2_ap_addr = bp_2_ap_ADDR_2;
118 script_info.loopback_on_dsp_side_addr = -1; 118 script_info.loopback_on_dsp_side_addr = -1;
119 script_info.mcu_2_app_addr = mcu_2_app_ADDR_2; 119 script_info.mcu_2_app_addr = mcu_2_app_patched_ADDR_2;
120 script_info.mcu_2_shp_addr = mcu_2_shp_patched_ADDR_2; 120 script_info.mcu_2_shp_addr = mcu_2_shp_patched_ADDR_2;
121 script_info.mcu_interrupt_only_addr = -1; 121 script_info.mcu_interrupt_only_addr = -1;
122 script_info.shp_2_mcu_addr = shp_2_mcu_patched_ADDR_2; 122 script_info.shp_2_mcu_addr = shp_2_mcu_patched_ADDR_2;
@@ -161,8 +161,6 @@ static unsigned long get_script_pc(unsigned int peripheral_type,
161 case SDMA_TRAN_INT_2_EMI: 161 case SDMA_TRAN_INT_2_EMI:
162 res = script_info.ap_2_ap_addr; 162 res = script_info.ap_2_ap_addr;
163 break; 163 break;
164 default:
165 break;
166 } 164 }
167 break; 165 break;
168 166
@@ -182,8 +180,6 @@ static unsigned long get_script_pc(unsigned int peripheral_type,
182 case SDMA_TRAN_EMI_2_DSP_LOOP: 180 case SDMA_TRAN_EMI_2_DSP_LOOP:
183 res = script_info.mcu_interrupt_only_addr; 181 res = script_info.mcu_interrupt_only_addr;
184 break; 182 break;
185 default:
186 break;
187 } 183 }
188 break; 184 break;
189#endif 185#endif
@@ -204,8 +200,6 @@ static unsigned long get_script_pc(unsigned int peripheral_type,
204 case SDMA_TRAN_EMI_2_PER: 200 case SDMA_TRAN_EMI_2_PER:
205 res = script_info.mcu_2_firi_addr; 201 res = script_info.mcu_2_firi_addr;
206 break; 202 break;
207 default:
208 break;
209 } 203 }
210 break; 204 break;
211#endif 205#endif
@@ -226,14 +220,12 @@ static unsigned long get_script_pc(unsigned int peripheral_type,
226 case SDMA_TRAN_EMI_2_PER: 220 case SDMA_TRAN_EMI_2_PER:
227 res = script_info.mcu_2_app_addr; 221 res = script_info.mcu_2_app_addr;
228 break; 222 break;
229 default:
230 break;
231 } 223 }
232 break; 224 break;
233#endif 225#endif
234 226
235#if 0 /* Not using this */ 227#if 0 /* Not using this */
236 case SDMA_PER_UART_SP: 228 case SDMA_PER_UART_SHP:
237 switch (transfer_type) 229 switch (transfer_type)
238 { 230 {
239 case SDMA_TRAN_PER_2_INT: 231 case SDMA_TRAN_PER_2_INT:
@@ -248,8 +240,6 @@ static unsigned long get_script_pc(unsigned int peripheral_type,
248 case SDMA_TRAN_EMI_2_PER: 240 case SDMA_TRAN_EMI_2_PER:
249 res = script_info.mcu_2_shp_addr; 241 res = script_info.mcu_2_shp_addr;
250 break; 242 break;
251 default:
252 break;
253 } 243 }
254 break; 244 break;
255#endif 245#endif
@@ -263,8 +253,6 @@ static unsigned long get_script_pc(unsigned int peripheral_type,
263 case SDMA_TRAN_EMI_2_PER: 253 case SDMA_TRAN_EMI_2_PER:
264 res = script_info.mcu_2_ata_addr; 254 res = script_info.mcu_2_ata_addr;
265 break; 255 break;
266 default:
267 break;
268 } 256 }
269 break; 257 break;
270 258
@@ -285,8 +273,6 @@ static unsigned long get_script_pc(unsigned int peripheral_type,
285 case SDMA_TRAN_EMI_2_PER: 273 case SDMA_TRAN_EMI_2_PER:
286 res = script_info.mcu_2_app_addr; 274 res = script_info.mcu_2_app_addr;
287 break; 275 break;
288 default:
289 break;
290 } 276 }
291 break; 277 break;
292 278
@@ -294,8 +280,8 @@ static unsigned long get_script_pc(unsigned int peripheral_type,
294 case SDMA_PER_MMC: 280 case SDMA_PER_MMC:
295 case SDMA_PER_SDHC: 281 case SDMA_PER_SDHC:
296#endif 282#endif
297 case SDMA_PER_SSI_SP: 283 case SDMA_PER_SSI_SHP:
298 case SDMA_PER_CSPI_SP: 284 case SDMA_PER_CSPI_SHP:
299 switch (transfer_type) 285 switch (transfer_type)
300 { 286 {
301 case SDMA_TRAN_PER_2_INT: 287 case SDMA_TRAN_PER_2_INT:
@@ -310,9 +296,8 @@ static unsigned long get_script_pc(unsigned int peripheral_type,
310 case SDMA_TRAN_EMI_2_PER: 296 case SDMA_TRAN_EMI_2_PER:
311 res = script_info.mcu_2_shp_addr; 297 res = script_info.mcu_2_shp_addr;
312 break; 298 break;
313 default:
314 break;
315 } 299 }
300 break;
316 301
317 case SDMA_PER_MSHC: 302 case SDMA_PER_MSHC:
318 switch (transfer_type) 303 switch (transfer_type)
@@ -323,9 +308,8 @@ static unsigned long get_script_pc(unsigned int peripheral_type,
323 case SDMA_TRAN_EMI_2_PER: 308 case SDMA_TRAN_EMI_2_PER:
324 res = script_info.mcu_2_mshc_addr; 309 res = script_info.mcu_2_mshc_addr;
325 break; 310 break;
326 default:
327 break;
328 } 311 }
312 break;
329 313
330 case SDMA_PER_CCM: 314 case SDMA_PER_CCM:
331 switch (transfer_type) 315 switch (transfer_type)
@@ -333,9 +317,8 @@ static unsigned long get_script_pc(unsigned int peripheral_type,
333 case SDMA_TRAN_PER_2_EMI: 317 case SDMA_TRAN_PER_2_EMI:
334 res = script_info.dptc_dvfs_addr; 318 res = script_info.dptc_dvfs_addr;
335 break; 319 break;
336 default:
337 break;
338 } 320 }
321 break;
339 } 322 }
340 323
341 if (res == (unsigned short)-1) 324 if (res == (unsigned short)-1)
diff --git a/firmware/target/arm/imx31/sdma-imx31.h b/firmware/target/arm/imx31/sdma-imx31.h
index 5daa33d7ba..b7e0ab42a4 100644
--- a/firmware/target/arm/imx31/sdma-imx31.h
+++ b/firmware/target/arm/imx31/sdma-imx31.h
@@ -28,22 +28,24 @@
28 * script to execute. */ 28 * script to execute. */
29enum SDMA_PERIPHERAL_TYPE 29enum SDMA_PERIPHERAL_TYPE
30{ 30{
31 /* SHP = "Shared peripheral" where peripheral is mapped into SDMA
32 * core memory via the SPBA */
31 __SDMA_PER_FIRST = -1, 33 __SDMA_PER_FIRST = -1,
32 SDMA_PER_MEMORY, 34 SDMA_PER_MEMORY,
33 SDMA_PER_DSP, 35 SDMA_PER_DSP,
34 SDMA_PER_FIRI, 36 SDMA_PER_FIRI,
35 SDMA_PER_UART, 37 SDMA_PER_UART,
36 SDMA_PER_UART_SP, /* Shared */ 38 SDMA_PER_UART_SHP,
37 SDMA_PER_ATA, 39 SDMA_PER_ATA,
38 SDMA_PER_CSPI, 40 SDMA_PER_CSPI,
39 SDMA_PER_EXT, 41 SDMA_PER_EXT,
40 SDMA_PER_SSI, 42 SDMA_PER_SSI,
41 SDMA_PER_SSI_SP, /* Shared */ 43 SDMA_PER_SSI_SHP,
42 SDMA_PER_MMC, 44 SDMA_PER_MMC,
43 SDMA_PER_SDHC, 45 SDMA_PER_SDHC,
44 SDMA_PER_CSPI_SP, /* Shared */ 46 SDMA_PER_CSPI_SHP,
45 SDMA_PER_MSHC, 47 SDMA_PER_MSHC,
46 SDMA_PER_MSHC_SP, /* Shared */ 48 SDMA_PER_MSHC_SHP,
47 SDMA_PER_CCM, 49 SDMA_PER_CCM,
48 SDMA_PER_ASRC, 50 SDMA_PER_ASRC,
49 SDMA_PER_ESAI, 51 SDMA_PER_ESAI,