@@ -145,51 +145,69 @@ static inline void i2s_clear_irqs(struct dw_i2s_dev *dev, u32 stream)
145
145
}
146
146
}
147
147
148
- static void i2s_start (struct dw_i2s_dev * dev ,
149
- struct snd_pcm_substream * substream )
148
+ static inline void i2s_disable_irqs (struct dw_i2s_dev * dev , u32 stream ,
149
+ int chan_nr )
150
150
{
151
- struct i2s_clk_config_data * config = & dev -> config ;
152
151
u32 i , irq ;
153
- i2s_write_reg (dev -> i2s_base , IER , 1 );
154
152
155
- if (substream -> stream == SNDRV_PCM_STREAM_PLAYBACK ) {
156
- for (i = 0 ; i < (config -> chan_nr / 2 ); i ++ ) {
153
+ if (stream == SNDRV_PCM_STREAM_PLAYBACK ) {
154
+ for (i = 0 ; i < (chan_nr / 2 ); i ++ ) {
155
+ irq = i2s_read_reg (dev -> i2s_base , IMR (i ));
156
+ i2s_write_reg (dev -> i2s_base , IMR (i ), irq | 0x30 );
157
+ }
158
+ } else {
159
+ for (i = 0 ; i < (chan_nr / 2 ); i ++ ) {
160
+ irq = i2s_read_reg (dev -> i2s_base , IMR (i ));
161
+ i2s_write_reg (dev -> i2s_base , IMR (i ), irq | 0x03 );
162
+ }
163
+ }
164
+ }
165
+
166
+ static inline void i2s_enable_irqs (struct dw_i2s_dev * dev , u32 stream ,
167
+ int chan_nr )
168
+ {
169
+ u32 i , irq ;
170
+
171
+ if (stream == SNDRV_PCM_STREAM_PLAYBACK ) {
172
+ for (i = 0 ; i < (chan_nr / 2 ); i ++ ) {
157
173
irq = i2s_read_reg (dev -> i2s_base , IMR (i ));
158
174
i2s_write_reg (dev -> i2s_base , IMR (i ), irq & ~0x30 );
159
175
}
160
- i2s_write_reg (dev -> i2s_base , ITER , 1 );
161
176
} else {
162
- for (i = 0 ; i < (config -> chan_nr / 2 ); i ++ ) {
177
+ for (i = 0 ; i < (chan_nr / 2 ); i ++ ) {
163
178
irq = i2s_read_reg (dev -> i2s_base , IMR (i ));
164
179
i2s_write_reg (dev -> i2s_base , IMR (i ), irq & ~0x03 );
165
180
}
166
- i2s_write_reg (dev -> i2s_base , IRER , 1 );
167
181
}
182
+ }
183
+
184
+ static void i2s_start (struct dw_i2s_dev * dev ,
185
+ struct snd_pcm_substream * substream )
186
+ {
187
+ struct i2s_clk_config_data * config = & dev -> config ;
188
+
189
+ i2s_write_reg (dev -> i2s_base , IER , 1 );
190
+ i2s_enable_irqs (dev , substream -> stream , config -> chan_nr );
191
+
192
+ if (substream -> stream == SNDRV_PCM_STREAM_PLAYBACK )
193
+ i2s_write_reg (dev -> i2s_base , ITER , 1 );
194
+ else
195
+ i2s_write_reg (dev -> i2s_base , IRER , 1 );
168
196
169
197
i2s_write_reg (dev -> i2s_base , CER , 1 );
170
198
}
171
199
172
200
static void i2s_stop (struct dw_i2s_dev * dev ,
173
201
struct snd_pcm_substream * substream )
174
202
{
175
- u32 i = 0 , irq ;
176
203
177
204
i2s_clear_irqs (dev , substream -> stream );
178
- if (substream -> stream == SNDRV_PCM_STREAM_PLAYBACK ) {
205
+ if (substream -> stream == SNDRV_PCM_STREAM_PLAYBACK )
179
206
i2s_write_reg (dev -> i2s_base , ITER , 0 );
180
-
181
- for (i = 0 ; i < 4 ; i ++ ) {
182
- irq = i2s_read_reg (dev -> i2s_base , IMR (i ));
183
- i2s_write_reg (dev -> i2s_base , IMR (i ), irq | 0x30 );
184
- }
185
- } else {
207
+ else
186
208
i2s_write_reg (dev -> i2s_base , IRER , 0 );
187
209
188
- for (i = 0 ; i < 4 ; i ++ ) {
189
- irq = i2s_read_reg (dev -> i2s_base , IMR (i ));
190
- i2s_write_reg (dev -> i2s_base , IMR (i ), irq | 0x03 );
191
- }
192
- }
210
+ i2s_disable_irqs (dev , substream -> stream , 8 );
193
211
194
212
if (!dev -> active ) {
195
213
i2s_write_reg (dev -> i2s_base , CER , 0 );
@@ -223,7 +241,7 @@ static int dw_i2s_startup(struct snd_pcm_substream *substream,
223
241
224
242
static void dw_i2s_config (struct dw_i2s_dev * dev , int stream )
225
243
{
226
- u32 ch_reg , irq ;
244
+ u32 ch_reg ;
227
245
struct i2s_clk_config_data * config = & dev -> config ;
228
246
229
247
@@ -235,16 +253,12 @@ static void dw_i2s_config(struct dw_i2s_dev *dev, int stream)
235
253
dev -> xfer_resolution );
236
254
i2s_write_reg (dev -> i2s_base , TFCR (ch_reg ),
237
255
dev -> fifo_th - 1 );
238
- irq = i2s_read_reg (dev -> i2s_base , IMR (ch_reg ));
239
- i2s_write_reg (dev -> i2s_base , IMR (ch_reg ), irq & ~0x30 );
240
256
i2s_write_reg (dev -> i2s_base , TER (ch_reg ), 1 );
241
257
} else {
242
258
i2s_write_reg (dev -> i2s_base , RCR (ch_reg ),
243
259
dev -> xfer_resolution );
244
260
i2s_write_reg (dev -> i2s_base , RFCR (ch_reg ),
245
261
dev -> fifo_th - 1 );
246
- irq = i2s_read_reg (dev -> i2s_base , IMR (ch_reg ));
247
- i2s_write_reg (dev -> i2s_base , IMR (ch_reg ), irq & ~0x03 );
248
262
i2s_write_reg (dev -> i2s_base , RER (ch_reg ), 1 );
249
263
}
250
264
0 commit comments