diff options
Diffstat (limited to 'sound/soc/sh/rcar/src.c')
-rw-r--r-- | sound/soc/sh/rcar/src.c | 190 |
1 files changed, 65 insertions, 125 deletions
diff --git a/sound/soc/sh/rcar/src.c b/sound/soc/sh/rcar/src.c index 4d0720ed5a90..e3b078e7c3aa 100644 --- a/sound/soc/sh/rcar/src.c +++ b/sound/soc/sh/rcar/src.c | |||
@@ -18,21 +18,9 @@ struct rsnd_src { | |||
18 | 18 | ||
19 | #define RSND_SRC_NAME_SIZE 16 | 19 | #define RSND_SRC_NAME_SIZE 16 |
20 | 20 | ||
21 | /* | ||
22 | * ADINR | ||
23 | */ | ||
24 | #define OTBL_24 (0 << 16) | ||
25 | #define OTBL_22 (2 << 16) | ||
26 | #define OTBL_20 (4 << 16) | ||
27 | #define OTBL_18 (6 << 16) | ||
28 | #define OTBL_16 (8 << 16) | ||
29 | |||
30 | #define rsnd_src_mode_flags(p) ((p)->info->flags) | ||
31 | #define rsnd_src_convert_rate(p) ((p)->info->convert_rate) | 21 | #define rsnd_src_convert_rate(p) ((p)->info->convert_rate) |
32 | #define rsnd_mod_to_src(_mod) \ | 22 | #define rsnd_mod_to_src(_mod) \ |
33 | container_of((_mod), struct rsnd_src, mod) | 23 | container_of((_mod), struct rsnd_src, mod) |
34 | #define rsnd_src_hpbif_is_enable(src) \ | ||
35 | (rsnd_src_mode_flags(src) & RSND_SCU_USE_HPBIF) | ||
36 | #define rsnd_src_dma_available(src) \ | 24 | #define rsnd_src_dma_available(src) \ |
37 | rsnd_dma_available(rsnd_mod_to_dma(&(src)->mod)) | 25 | rsnd_dma_available(rsnd_mod_to_dma(&(src)->mod)) |
38 | 26 | ||
@@ -80,34 +68,35 @@ struct rsnd_src { | |||
80 | * | 68 | * |
81 | * This driver request | 69 | * This driver request |
82 | * struct rsnd_src_platform_info { | 70 | * struct rsnd_src_platform_info { |
83 | * u32 flags; | ||
84 | * u32 convert_rate; | 71 | * u32 convert_rate; |
72 | * int dma_id; | ||
85 | * } | 73 | * } |
86 | * | 74 | * |
87 | * rsnd_src_hpbif_is_enable() will be true | ||
88 | * if flags had RSND_SRC_USE_HPBIF, | ||
89 | * and it controls whether SSIU is used or not. | ||
90 | * | ||
91 | * rsnd_src_convert_rate() indicates | 75 | * rsnd_src_convert_rate() indicates |
92 | * above convert_rate, and it controls | 76 | * above convert_rate, and it controls |
93 | * whether SRC is used or not. | 77 | * whether SRC is used or not. |
94 | * | 78 | * |
95 | * ex) doesn't use SRC | 79 | * ex) doesn't use SRC |
96 | * struct rsnd_src_platform_info info = { | 80 | * static struct rsnd_dai_platform_info rsnd_dai = { |
97 | * .flags = 0, | 81 | * .playback = { .ssi = &rsnd_ssi[0], }, |
98 | * .convert_rate = 0, | ||
99 | * }; | 82 | * }; |
100 | * | 83 | * |
101 | * ex) uses SRC | 84 | * ex) uses SRC |
102 | * struct rsnd_src_platform_info info = { | 85 | * static struct rsnd_src_platform_info rsnd_src[] = { |
103 | * .flags = RSND_SRC_USE_HPBIF, | 86 | * RSND_SCU(48000, 0), |
104 | * .convert_rate = 48000, | 87 | * ... |
88 | * }; | ||
89 | * static struct rsnd_dai_platform_info rsnd_dai = { | ||
90 | * .playback = { .ssi = &rsnd_ssi[0], .src = &rsnd_src[0] }, | ||
105 | * }; | 91 | * }; |
106 | * | 92 | * |
107 | * ex) uses SRC bypass mode | 93 | * ex) uses SRC bypass mode |
108 | * struct rsnd_src_platform_info info = { | 94 | * static struct rsnd_src_platform_info rsnd_src[] = { |
109 | * .flags = RSND_SRC_USE_HPBIF, | 95 | * RSND_SCU(0, 0), |
110 | * .convert_rate = 0, | 96 | * ... |
97 | * }; | ||
98 | * static struct rsnd_dai_platform_info rsnd_dai = { | ||
99 | * .playback = { .ssi = &rsnd_ssi[0], .src = &rsnd_src[0] }, | ||
111 | * }; | 100 | * }; |
112 | * | 101 | * |
113 | */ | 102 | */ |
@@ -116,27 +105,17 @@ struct rsnd_src { | |||
116 | * Gen1/Gen2 common functions | 105 | * Gen1/Gen2 common functions |
117 | */ | 106 | */ |
118 | int rsnd_src_ssi_mode_init(struct rsnd_mod *ssi_mod, | 107 | int rsnd_src_ssi_mode_init(struct rsnd_mod *ssi_mod, |
119 | struct rsnd_dai *rdai, | 108 | struct rsnd_dai *rdai) |
120 | struct rsnd_dai_stream *io) | ||
121 | { | 109 | { |
122 | struct rsnd_priv *priv = rsnd_mod_to_priv(ssi_mod); | 110 | struct rsnd_dai_stream *io = rsnd_mod_to_io(ssi_mod); |
123 | struct rsnd_mod *src_mod = rsnd_io_to_mod_src(io); | 111 | struct rsnd_mod *src_mod = rsnd_io_to_mod_src(io); |
124 | struct rcar_snd_info *info = rsnd_priv_to_info(priv); | ||
125 | int ssi_id = rsnd_mod_id(ssi_mod); | 112 | int ssi_id = rsnd_mod_id(ssi_mod); |
126 | int has_src = 0; | ||
127 | 113 | ||
128 | /* | 114 | /* |
129 | * SSI_MODE0 | 115 | * SSI_MODE0 |
130 | */ | 116 | */ |
131 | if (info->dai_info) { | ||
132 | has_src = !!src_mod; | ||
133 | } else { | ||
134 | struct rsnd_src *src = rsnd_mod_to_src(src_mod); | ||
135 | has_src = rsnd_src_hpbif_is_enable(src); | ||
136 | } | ||
137 | |||
138 | rsnd_mod_bset(ssi_mod, SSI_MODE0, (1 << ssi_id), | 117 | rsnd_mod_bset(ssi_mod, SSI_MODE0, (1 << ssi_id), |
139 | has_src ? 0 : (1 << ssi_id)); | 118 | src_mod ? 0 : (1 << ssi_id)); |
140 | 119 | ||
141 | /* | 120 | /* |
142 | * SSI_MODE1 | 121 | * SSI_MODE1 |
@@ -166,8 +145,7 @@ int rsnd_src_ssi_mode_init(struct rsnd_mod *ssi_mod, | |||
166 | } | 145 | } |
167 | 146 | ||
168 | int rsnd_src_enable_ssi_irq(struct rsnd_mod *ssi_mod, | 147 | int rsnd_src_enable_ssi_irq(struct rsnd_mod *ssi_mod, |
169 | struct rsnd_dai *rdai, | 148 | struct rsnd_dai *rdai) |
170 | struct rsnd_dai_stream *io) | ||
171 | { | 149 | { |
172 | struct rsnd_priv *priv = rsnd_mod_to_priv(ssi_mod); | 150 | struct rsnd_priv *priv = rsnd_mod_to_priv(ssi_mod); |
173 | 151 | ||
@@ -203,13 +181,12 @@ unsigned int rsnd_src_get_ssi_rate(struct rsnd_priv *priv, | |||
203 | } | 181 | } |
204 | 182 | ||
205 | static int rsnd_src_set_convert_rate(struct rsnd_mod *mod, | 183 | static int rsnd_src_set_convert_rate(struct rsnd_mod *mod, |
206 | struct rsnd_dai *rdai, | 184 | struct rsnd_dai *rdai) |
207 | struct rsnd_dai_stream *io) | ||
208 | { | 185 | { |
186 | struct rsnd_dai_stream *io = rsnd_mod_to_io(mod); | ||
209 | struct snd_pcm_runtime *runtime = rsnd_io_to_runtime(io); | 187 | struct snd_pcm_runtime *runtime = rsnd_io_to_runtime(io); |
210 | struct rsnd_src *src = rsnd_mod_to_src(mod); | 188 | struct rsnd_src *src = rsnd_mod_to_src(mod); |
211 | u32 convert_rate = rsnd_src_convert_rate(src); | 189 | u32 convert_rate = rsnd_src_convert_rate(src); |
212 | u32 adinr = runtime->channels; | ||
213 | u32 fsrate = 0; | 190 | u32 fsrate = 0; |
214 | 191 | ||
215 | if (convert_rate) | 192 | if (convert_rate) |
@@ -226,17 +203,7 @@ static int rsnd_src_set_convert_rate(struct rsnd_mod *mod, | |||
226 | rsnd_mod_write(mod, SRC_SRCIR, 1); | 203 | rsnd_mod_write(mod, SRC_SRCIR, 1); |
227 | 204 | ||
228 | /* Set channel number and output bit length */ | 205 | /* Set channel number and output bit length */ |
229 | switch (runtime->sample_bits) { | 206 | rsnd_mod_write(mod, SRC_ADINR, rsnd_get_adinr(mod)); |
230 | case 16: | ||
231 | adinr |= OTBL_16; | ||
232 | break; | ||
233 | case 32: | ||
234 | adinr |= OTBL_24; | ||
235 | break; | ||
236 | default: | ||
237 | return -EIO; | ||
238 | } | ||
239 | rsnd_mod_write(mod, SRC_ADINR, adinr); | ||
240 | 207 | ||
241 | /* Enable the initial value of IFS */ | 208 | /* Enable the initial value of IFS */ |
242 | if (fsrate) { | 209 | if (fsrate) { |
@@ -253,8 +220,7 @@ static int rsnd_src_set_convert_rate(struct rsnd_mod *mod, | |||
253 | } | 220 | } |
254 | 221 | ||
255 | static int rsnd_src_init(struct rsnd_mod *mod, | 222 | static int rsnd_src_init(struct rsnd_mod *mod, |
256 | struct rsnd_dai *rdai, | 223 | struct rsnd_dai *rdai) |
257 | struct rsnd_dai_stream *io) | ||
258 | { | 224 | { |
259 | struct rsnd_src *src = rsnd_mod_to_src(mod); | 225 | struct rsnd_src *src = rsnd_mod_to_src(mod); |
260 | 226 | ||
@@ -264,8 +230,7 @@ static int rsnd_src_init(struct rsnd_mod *mod, | |||
264 | } | 230 | } |
265 | 231 | ||
266 | static int rsnd_src_quit(struct rsnd_mod *mod, | 232 | static int rsnd_src_quit(struct rsnd_mod *mod, |
267 | struct rsnd_dai *rdai, | 233 | struct rsnd_dai *rdai) |
268 | struct rsnd_dai_stream *io) | ||
269 | { | 234 | { |
270 | struct rsnd_src *src = rsnd_mod_to_src(mod); | 235 | struct rsnd_src *src = rsnd_mod_to_src(mod); |
271 | 236 | ||
@@ -275,8 +240,7 @@ static int rsnd_src_quit(struct rsnd_mod *mod, | |||
275 | } | 240 | } |
276 | 241 | ||
277 | static int rsnd_src_start(struct rsnd_mod *mod, | 242 | static int rsnd_src_start(struct rsnd_mod *mod, |
278 | struct rsnd_dai *rdai, | 243 | struct rsnd_dai *rdai) |
279 | struct rsnd_dai_stream *io) | ||
280 | { | 244 | { |
281 | struct rsnd_src *src = rsnd_mod_to_src(mod); | 245 | struct rsnd_src *src = rsnd_mod_to_src(mod); |
282 | 246 | ||
@@ -294,8 +258,7 @@ static int rsnd_src_start(struct rsnd_mod *mod, | |||
294 | 258 | ||
295 | 259 | ||
296 | static int rsnd_src_stop(struct rsnd_mod *mod, | 260 | static int rsnd_src_stop(struct rsnd_mod *mod, |
297 | struct rsnd_dai *rdai, | 261 | struct rsnd_dai *rdai) |
298 | struct rsnd_dai_stream *io) | ||
299 | { | 262 | { |
300 | struct rsnd_src *src = rsnd_mod_to_src(mod); | 263 | struct rsnd_src *src = rsnd_mod_to_src(mod); |
301 | 264 | ||
@@ -313,9 +276,9 @@ static struct rsnd_mod_ops rsnd_src_non_ops = { | |||
313 | * Gen1 functions | 276 | * Gen1 functions |
314 | */ | 277 | */ |
315 | static int rsnd_src_set_route_gen1(struct rsnd_mod *mod, | 278 | static int rsnd_src_set_route_gen1(struct rsnd_mod *mod, |
316 | struct rsnd_dai *rdai, | 279 | struct rsnd_dai *rdai) |
317 | struct rsnd_dai_stream *io) | ||
318 | { | 280 | { |
281 | struct rsnd_dai_stream *io = rsnd_mod_to_io(mod); | ||
319 | struct src_route_config { | 282 | struct src_route_config { |
320 | u32 mask; | 283 | u32 mask; |
321 | int shift; | 284 | int shift; |
@@ -351,9 +314,9 @@ static int rsnd_src_set_route_gen1(struct rsnd_mod *mod, | |||
351 | } | 314 | } |
352 | 315 | ||
353 | static int rsnd_src_set_convert_timing_gen1(struct rsnd_mod *mod, | 316 | static int rsnd_src_set_convert_timing_gen1(struct rsnd_mod *mod, |
354 | struct rsnd_dai *rdai, | 317 | struct rsnd_dai *rdai) |
355 | struct rsnd_dai_stream *io) | ||
356 | { | 318 | { |
319 | struct rsnd_dai_stream *io = rsnd_mod_to_io(mod); | ||
357 | struct rsnd_priv *priv = rsnd_mod_to_priv(mod); | 320 | struct rsnd_priv *priv = rsnd_mod_to_priv(mod); |
358 | struct rsnd_src *src = rsnd_mod_to_src(mod); | 321 | struct rsnd_src *src = rsnd_mod_to_src(mod); |
359 | struct snd_pcm_runtime *runtime = rsnd_io_to_runtime(io); | 322 | struct snd_pcm_runtime *runtime = rsnd_io_to_runtime(io); |
@@ -410,12 +373,11 @@ static int rsnd_src_set_convert_timing_gen1(struct rsnd_mod *mod, | |||
410 | } | 373 | } |
411 | 374 | ||
412 | static int rsnd_src_set_convert_rate_gen1(struct rsnd_mod *mod, | 375 | static int rsnd_src_set_convert_rate_gen1(struct rsnd_mod *mod, |
413 | struct rsnd_dai *rdai, | 376 | struct rsnd_dai *rdai) |
414 | struct rsnd_dai_stream *io) | ||
415 | { | 377 | { |
416 | int ret; | 378 | int ret; |
417 | 379 | ||
418 | ret = rsnd_src_set_convert_rate(mod, rdai, io); | 380 | ret = rsnd_src_set_convert_rate(mod, rdai); |
419 | if (ret < 0) | 381 | if (ret < 0) |
420 | return ret; | 382 | return ret; |
421 | 383 | ||
@@ -432,24 +394,23 @@ static int rsnd_src_set_convert_rate_gen1(struct rsnd_mod *mod, | |||
432 | } | 394 | } |
433 | 395 | ||
434 | static int rsnd_src_init_gen1(struct rsnd_mod *mod, | 396 | static int rsnd_src_init_gen1(struct rsnd_mod *mod, |
435 | struct rsnd_dai *rdai, | 397 | struct rsnd_dai *rdai) |
436 | struct rsnd_dai_stream *io) | ||
437 | { | 398 | { |
438 | int ret; | 399 | int ret; |
439 | 400 | ||
440 | ret = rsnd_src_init(mod, rdai, io); | 401 | ret = rsnd_src_init(mod, rdai); |
441 | if (ret < 0) | 402 | if (ret < 0) |
442 | return ret; | 403 | return ret; |
443 | 404 | ||
444 | ret = rsnd_src_set_route_gen1(mod, rdai, io); | 405 | ret = rsnd_src_set_route_gen1(mod, rdai); |
445 | if (ret < 0) | 406 | if (ret < 0) |
446 | return ret; | 407 | return ret; |
447 | 408 | ||
448 | ret = rsnd_src_set_convert_rate_gen1(mod, rdai, io); | 409 | ret = rsnd_src_set_convert_rate_gen1(mod, rdai); |
449 | if (ret < 0) | 410 | if (ret < 0) |
450 | return ret; | 411 | return ret; |
451 | 412 | ||
452 | ret = rsnd_src_set_convert_timing_gen1(mod, rdai, io); | 413 | ret = rsnd_src_set_convert_timing_gen1(mod, rdai); |
453 | if (ret < 0) | 414 | if (ret < 0) |
454 | return ret; | 415 | return ret; |
455 | 416 | ||
@@ -457,25 +418,23 @@ static int rsnd_src_init_gen1(struct rsnd_mod *mod, | |||
457 | } | 418 | } |
458 | 419 | ||
459 | static int rsnd_src_start_gen1(struct rsnd_mod *mod, | 420 | static int rsnd_src_start_gen1(struct rsnd_mod *mod, |
460 | struct rsnd_dai *rdai, | 421 | struct rsnd_dai *rdai) |
461 | struct rsnd_dai_stream *io) | ||
462 | { | 422 | { |
463 | int id = rsnd_mod_id(mod); | 423 | int id = rsnd_mod_id(mod); |
464 | 424 | ||
465 | rsnd_mod_bset(mod, SRC_ROUTE_CTRL, (1 << id), (1 << id)); | 425 | rsnd_mod_bset(mod, SRC_ROUTE_CTRL, (1 << id), (1 << id)); |
466 | 426 | ||
467 | return rsnd_src_start(mod, rdai, io); | 427 | return rsnd_src_start(mod, rdai); |
468 | } | 428 | } |
469 | 429 | ||
470 | static int rsnd_src_stop_gen1(struct rsnd_mod *mod, | 430 | static int rsnd_src_stop_gen1(struct rsnd_mod *mod, |
471 | struct rsnd_dai *rdai, | 431 | struct rsnd_dai *rdai) |
472 | struct rsnd_dai_stream *io) | ||
473 | { | 432 | { |
474 | int id = rsnd_mod_id(mod); | 433 | int id = rsnd_mod_id(mod); |
475 | 434 | ||
476 | rsnd_mod_bset(mod, SRC_ROUTE_CTRL, (1 << id), 0); | 435 | rsnd_mod_bset(mod, SRC_ROUTE_CTRL, (1 << id), 0); |
477 | 436 | ||
478 | return rsnd_src_stop(mod, rdai, io); | 437 | return rsnd_src_stop(mod, rdai); |
479 | } | 438 | } |
480 | 439 | ||
481 | static struct rsnd_mod_ops rsnd_src_gen1_ops = { | 440 | static struct rsnd_mod_ops rsnd_src_gen1_ops = { |
@@ -490,17 +449,16 @@ static struct rsnd_mod_ops rsnd_src_gen1_ops = { | |||
490 | * Gen2 functions | 449 | * Gen2 functions |
491 | */ | 450 | */ |
492 | static int rsnd_src_set_convert_rate_gen2(struct rsnd_mod *mod, | 451 | static int rsnd_src_set_convert_rate_gen2(struct rsnd_mod *mod, |
493 | struct rsnd_dai *rdai, | 452 | struct rsnd_dai *rdai) |
494 | struct rsnd_dai_stream *io) | ||
495 | { | 453 | { |
496 | int ret; | 454 | int ret; |
497 | 455 | ||
498 | ret = rsnd_src_set_convert_rate(mod, rdai, io); | 456 | ret = rsnd_src_set_convert_rate(mod, rdai); |
499 | if (ret < 0) | 457 | if (ret < 0) |
500 | return ret; | 458 | return ret; |
501 | 459 | ||
502 | rsnd_mod_write(mod, SSI_BUSIF_ADINR, rsnd_mod_read(mod, SRC_ADINR)); | 460 | rsnd_mod_write(mod, SSI_BUSIF_ADINR, rsnd_get_adinr(mod)); |
503 | rsnd_mod_write(mod, SSI_BUSIF_MODE, rsnd_mod_read(mod, SRC_BUSIF_MODE)); | 461 | rsnd_mod_write(mod, SSI_BUSIF_MODE, 1); |
504 | 462 | ||
505 | rsnd_mod_write(mod, SRC_SRCCR, 0x00011110); | 463 | rsnd_mod_write(mod, SRC_SRCCR, 0x00011110); |
506 | 464 | ||
@@ -511,9 +469,9 @@ static int rsnd_src_set_convert_rate_gen2(struct rsnd_mod *mod, | |||
511 | } | 469 | } |
512 | 470 | ||
513 | static int rsnd_src_set_convert_timing_gen2(struct rsnd_mod *mod, | 471 | static int rsnd_src_set_convert_timing_gen2(struct rsnd_mod *mod, |
514 | struct rsnd_dai *rdai, | 472 | struct rsnd_dai *rdai) |
515 | struct rsnd_dai_stream *io) | ||
516 | { | 473 | { |
474 | struct rsnd_dai_stream *io = rsnd_mod_to_io(mod); | ||
517 | struct snd_pcm_runtime *runtime = rsnd_io_to_runtime(io); | 475 | struct snd_pcm_runtime *runtime = rsnd_io_to_runtime(io); |
518 | struct rsnd_src *src = rsnd_mod_to_src(mod); | 476 | struct rsnd_src *src = rsnd_mod_to_src(mod); |
519 | u32 convert_rate = rsnd_src_convert_rate(src); | 477 | u32 convert_rate = rsnd_src_convert_rate(src); |
@@ -530,25 +488,16 @@ static int rsnd_src_set_convert_timing_gen2(struct rsnd_mod *mod, | |||
530 | } | 488 | } |
531 | 489 | ||
532 | static int rsnd_src_probe_gen2(struct rsnd_mod *mod, | 490 | static int rsnd_src_probe_gen2(struct rsnd_mod *mod, |
533 | struct rsnd_dai *rdai, | 491 | struct rsnd_dai *rdai) |
534 | struct rsnd_dai_stream *io) | ||
535 | { | 492 | { |
536 | struct rsnd_priv *priv = rsnd_mod_to_priv(mod); | 493 | struct rsnd_priv *priv = rsnd_mod_to_priv(mod); |
537 | struct rcar_snd_info *info = rsnd_priv_to_info(priv); | ||
538 | struct rsnd_src *src = rsnd_mod_to_src(mod); | 494 | struct rsnd_src *src = rsnd_mod_to_src(mod); |
539 | struct rsnd_mod *ssi = rsnd_ssi_mod_get(priv, rsnd_mod_id(mod)); | ||
540 | struct device *dev = rsnd_priv_to_dev(priv); | 495 | struct device *dev = rsnd_priv_to_dev(priv); |
541 | int ret; | 496 | int ret; |
542 | int is_play; | ||
543 | |||
544 | if (info->dai_info) | ||
545 | is_play = rsnd_info_is_playback(priv, src); | ||
546 | else | ||
547 | is_play = rsnd_ssi_is_play(ssi); | ||
548 | 497 | ||
549 | ret = rsnd_dma_init(priv, | 498 | ret = rsnd_dma_init(priv, |
550 | rsnd_mod_to_dma(mod), | 499 | rsnd_mod_to_dma(mod), |
551 | is_play, | 500 | rsnd_info_is_playback(priv, src), |
552 | src->info->dma_id); | 501 | src->info->dma_id); |
553 | if (ret < 0) | 502 | if (ret < 0) |
554 | dev_err(dev, "SRC DMA failed\n"); | 503 | dev_err(dev, "SRC DMA failed\n"); |
@@ -557,8 +506,7 @@ static int rsnd_src_probe_gen2(struct rsnd_mod *mod, | |||
557 | } | 506 | } |
558 | 507 | ||
559 | static int rsnd_src_remove_gen2(struct rsnd_mod *mod, | 508 | static int rsnd_src_remove_gen2(struct rsnd_mod *mod, |
560 | struct rsnd_dai *rdai, | 509 | struct rsnd_dai *rdai) |
561 | struct rsnd_dai_stream *io) | ||
562 | { | 510 | { |
563 | rsnd_dma_quit(rsnd_mod_to_priv(mod), rsnd_mod_to_dma(mod)); | 511 | rsnd_dma_quit(rsnd_mod_to_priv(mod), rsnd_mod_to_dma(mod)); |
564 | 512 | ||
@@ -566,20 +514,19 @@ static int rsnd_src_remove_gen2(struct rsnd_mod *mod, | |||
566 | } | 514 | } |
567 | 515 | ||
568 | static int rsnd_src_init_gen2(struct rsnd_mod *mod, | 516 | static int rsnd_src_init_gen2(struct rsnd_mod *mod, |
569 | struct rsnd_dai *rdai, | 517 | struct rsnd_dai *rdai) |
570 | struct rsnd_dai_stream *io) | ||
571 | { | 518 | { |
572 | int ret; | 519 | int ret; |
573 | 520 | ||
574 | ret = rsnd_src_init(mod, rdai, io); | 521 | ret = rsnd_src_init(mod, rdai); |
575 | if (ret < 0) | 522 | if (ret < 0) |
576 | return ret; | 523 | return ret; |
577 | 524 | ||
578 | ret = rsnd_src_set_convert_rate_gen2(mod, rdai, io); | 525 | ret = rsnd_src_set_convert_rate_gen2(mod, rdai); |
579 | if (ret < 0) | 526 | if (ret < 0) |
580 | return ret; | 527 | return ret; |
581 | 528 | ||
582 | ret = rsnd_src_set_convert_timing_gen2(mod, rdai, io); | 529 | ret = rsnd_src_set_convert_timing_gen2(mod, rdai); |
583 | if (ret < 0) | 530 | if (ret < 0) |
584 | return ret; | 531 | return ret; |
585 | 532 | ||
@@ -587,22 +534,22 @@ static int rsnd_src_init_gen2(struct rsnd_mod *mod, | |||
587 | } | 534 | } |
588 | 535 | ||
589 | static int rsnd_src_start_gen2(struct rsnd_mod *mod, | 536 | static int rsnd_src_start_gen2(struct rsnd_mod *mod, |
590 | struct rsnd_dai *rdai, | 537 | struct rsnd_dai *rdai) |
591 | struct rsnd_dai_stream *io) | ||
592 | { | 538 | { |
539 | struct rsnd_dai_stream *io = rsnd_mod_to_io(mod); | ||
593 | struct rsnd_src *src = rsnd_mod_to_src(mod); | 540 | struct rsnd_src *src = rsnd_mod_to_src(mod); |
541 | u32 val = rsnd_io_to_mod_dvc(io) ? 0x01 : 0x11; | ||
594 | 542 | ||
595 | rsnd_dma_start(rsnd_mod_to_dma(&src->mod)); | 543 | rsnd_dma_start(rsnd_mod_to_dma(&src->mod)); |
596 | 544 | ||
597 | rsnd_mod_write(mod, SSI_CTRL, 0x1); | 545 | rsnd_mod_write(mod, SSI_CTRL, 0x1); |
598 | rsnd_mod_write(mod, SRC_CTRL, 0x11); | 546 | rsnd_mod_write(mod, SRC_CTRL, val); |
599 | 547 | ||
600 | return rsnd_src_start(mod, rdai, io); | 548 | return rsnd_src_start(mod, rdai); |
601 | } | 549 | } |
602 | 550 | ||
603 | static int rsnd_src_stop_gen2(struct rsnd_mod *mod, | 551 | static int rsnd_src_stop_gen2(struct rsnd_mod *mod, |
604 | struct rsnd_dai *rdai, | 552 | struct rsnd_dai *rdai) |
605 | struct rsnd_dai_stream *io) | ||
606 | { | 553 | { |
607 | struct rsnd_src *src = rsnd_mod_to_src(mod); | 554 | struct rsnd_src *src = rsnd_mod_to_src(mod); |
608 | 555 | ||
@@ -611,7 +558,7 @@ static int rsnd_src_stop_gen2(struct rsnd_mod *mod, | |||
611 | 558 | ||
612 | rsnd_dma_stop(rsnd_mod_to_dma(&src->mod)); | 559 | rsnd_dma_stop(rsnd_mod_to_dma(&src->mod)); |
613 | 560 | ||
614 | return rsnd_src_stop(mod, rdai, io); | 561 | return rsnd_src_stop(mod, rdai); |
615 | } | 562 | } |
616 | 563 | ||
617 | static struct rsnd_mod_ops rsnd_src_gen2_ops = { | 564 | static struct rsnd_mod_ops rsnd_src_gen2_ops = { |
@@ -699,11 +646,6 @@ int rsnd_src_probe(struct platform_device *pdev, | |||
699 | snprintf(name, RSND_SRC_NAME_SIZE, "src.%d", i); | 646 | snprintf(name, RSND_SRC_NAME_SIZE, "src.%d", i); |
700 | 647 | ||
701 | clk = devm_clk_get(dev, name); | 648 | clk = devm_clk_get(dev, name); |
702 | if (IS_ERR(clk)) { | ||
703 | snprintf(name, RSND_SRC_NAME_SIZE, "scu.%d", i); | ||
704 | clk = devm_clk_get(dev, name); | ||
705 | } | ||
706 | |||
707 | if (IS_ERR(clk)) | 649 | if (IS_ERR(clk)) |
708 | return PTR_ERR(clk); | 650 | return PTR_ERR(clk); |
709 | 651 | ||
@@ -711,12 +653,10 @@ int rsnd_src_probe(struct platform_device *pdev, | |||
711 | src->clk = clk; | 653 | src->clk = clk; |
712 | 654 | ||
713 | ops = &rsnd_src_non_ops; | 655 | ops = &rsnd_src_non_ops; |
714 | if (rsnd_src_hpbif_is_enable(src)) { | 656 | if (rsnd_is_gen1(priv)) |
715 | if (rsnd_is_gen1(priv)) | 657 | ops = &rsnd_src_gen1_ops; |
716 | ops = &rsnd_src_gen1_ops; | 658 | if (rsnd_is_gen2(priv)) |
717 | if (rsnd_is_gen2(priv)) | 659 | ops = &rsnd_src_gen2_ops; |
718 | ops = &rsnd_src_gen2_ops; | ||
719 | } | ||
720 | 660 | ||
721 | rsnd_mod_init(priv, &src->mod, ops, RSND_MOD_SRC, i); | 661 | rsnd_mod_init(priv, &src->mod, ops, RSND_MOD_SRC, i); |
722 | 662 | ||