diff options
author | Kuninori Morimoto <kuninori.morimoto.gx@renesas.com> | 2015-06-15 02:27:13 -0400 |
---|---|---|
committer | Mark Brown <broonie@kernel.org> | 2015-06-16 07:34:04 -0400 |
commit | 88c61cff4dab7c23a101b12041c99da61df305dd (patch) | |
tree | e9c0a5e23ce6f4373102a9e90f139bf67ed2c929 /sound | |
parent | bfc0cfe6b7acb1d0c318f9bc41fcb895a941f83d (diff) |
ASoC: rsnd: don't use rsnd_mod_to_io() on rsnd_src_xxx()
Each Renesas sound mod (= SSI/SRC/DVC) might be called from many paths
if it supports MIXer. In such case, mod <-> io is no longer 1:1
relationship. This patch removes rsnd_mod_to_io() from rsnd_src_xxx()
and related function.
Signed-off-by: Kuninori Morimoto <kuninori.morimoto.gx@renesas.com>
Tested-by: Keita Kobayashi <keita.kobayashi.ym@renesas.com>
Signed-off-by: Mark Brown <broonie@kernel.org>
Diffstat (limited to 'sound')
-rw-r--r-- | sound/soc/sh/rcar/src.c | 57 |
1 files changed, 32 insertions, 25 deletions
diff --git a/sound/soc/sh/rcar/src.c b/sound/soc/sh/rcar/src.c index 62216196af9c..bc122ede3254 100644 --- a/sound/soc/sh/rcar/src.c +++ b/sound/soc/sh/rcar/src.c | |||
@@ -236,10 +236,9 @@ int rsnd_src_ssi_irq_disable(struct rsnd_mod *ssi_mod) | |||
236 | return 0; | 236 | return 0; |
237 | } | 237 | } |
238 | 238 | ||
239 | static u32 rsnd_src_convert_rate(struct rsnd_src *src) | 239 | static u32 rsnd_src_convert_rate(struct rsnd_dai_stream *io, |
240 | struct rsnd_src *src) | ||
240 | { | 241 | { |
241 | struct rsnd_mod *mod = &src->mod; | ||
242 | struct rsnd_dai_stream *io = rsnd_mod_to_io(mod); | ||
243 | struct snd_pcm_runtime *runtime = rsnd_io_to_runtime(io); | 242 | struct snd_pcm_runtime *runtime = rsnd_io_to_runtime(io); |
244 | u32 convert_rate; | 243 | u32 convert_rate; |
245 | 244 | ||
@@ -275,7 +274,7 @@ unsigned int rsnd_src_get_ssi_rate(struct rsnd_priv *priv, | |||
275 | * return convert rate if SRC is used, | 274 | * return convert rate if SRC is used, |
276 | * otherwise, return runtime->rate as usual | 275 | * otherwise, return runtime->rate as usual |
277 | */ | 276 | */ |
278 | rate = rsnd_src_convert_rate(src); | 277 | rate = rsnd_src_convert_rate(io, src); |
279 | } | 278 | } |
280 | 279 | ||
281 | if (!rate) | 280 | if (!rate) |
@@ -289,7 +288,7 @@ static int rsnd_src_set_convert_rate(struct rsnd_mod *mod, | |||
289 | { | 288 | { |
290 | struct snd_pcm_runtime *runtime = rsnd_io_to_runtime(io); | 289 | struct snd_pcm_runtime *runtime = rsnd_io_to_runtime(io); |
291 | struct rsnd_src *src = rsnd_mod_to_src(mod); | 290 | struct rsnd_src *src = rsnd_mod_to_src(mod); |
292 | u32 convert_rate = rsnd_src_convert_rate(src); | 291 | u32 convert_rate = rsnd_src_convert_rate(io, src); |
293 | u32 fsrate = 0; | 292 | u32 fsrate = 0; |
294 | 293 | ||
295 | if (convert_rate) | 294 | if (convert_rate) |
@@ -414,9 +413,9 @@ static int rsnd_src_stop(struct rsnd_mod *mod) | |||
414 | /* | 413 | /* |
415 | * Gen1 functions | 414 | * Gen1 functions |
416 | */ | 415 | */ |
417 | static int rsnd_src_set_route_gen1(struct rsnd_mod *mod) | 416 | static int rsnd_src_set_route_gen1(struct rsnd_dai_stream *io, |
417 | struct rsnd_mod *mod) | ||
418 | { | 418 | { |
419 | struct rsnd_dai_stream *io = rsnd_mod_to_io(mod); | ||
420 | struct src_route_config { | 419 | struct src_route_config { |
421 | u32 mask; | 420 | u32 mask; |
422 | int shift; | 421 | int shift; |
@@ -451,13 +450,13 @@ static int rsnd_src_set_route_gen1(struct rsnd_mod *mod) | |||
451 | return 0; | 450 | return 0; |
452 | } | 451 | } |
453 | 452 | ||
454 | static int rsnd_src_set_convert_timing_gen1(struct rsnd_mod *mod) | 453 | static int rsnd_src_set_convert_timing_gen1(struct rsnd_dai_stream *io, |
454 | struct rsnd_mod *mod) | ||
455 | { | 455 | { |
456 | struct rsnd_dai_stream *io = rsnd_mod_to_io(mod); | ||
457 | struct rsnd_priv *priv = rsnd_mod_to_priv(mod); | 456 | struct rsnd_priv *priv = rsnd_mod_to_priv(mod); |
458 | struct rsnd_src *src = rsnd_mod_to_src(mod); | 457 | struct rsnd_src *src = rsnd_mod_to_src(mod); |
459 | struct snd_pcm_runtime *runtime = rsnd_io_to_runtime(io); | 458 | struct snd_pcm_runtime *runtime = rsnd_io_to_runtime(io); |
460 | u32 convert_rate = rsnd_src_convert_rate(src); | 459 | u32 convert_rate = rsnd_src_convert_rate(io, src); |
461 | u32 mask; | 460 | u32 mask; |
462 | u32 val; | 461 | u32 val; |
463 | int shift; | 462 | int shift; |
@@ -527,7 +526,7 @@ static int rsnd_src_set_convert_rate_gen1(struct rsnd_mod *mod, | |||
527 | rsnd_mod_read(mod, SRC_IFSVR) / 100 * 98); | 526 | rsnd_mod_read(mod, SRC_IFSVR) / 100 * 98); |
528 | 527 | ||
529 | /* Gen1/Gen2 are not compatible */ | 528 | /* Gen1/Gen2 are not compatible */ |
530 | if (rsnd_src_convert_rate(src)) | 529 | if (rsnd_src_convert_rate(io, src)) |
531 | rsnd_mod_write(mod, SRC_ROUTE_MODE0, 1); | 530 | rsnd_mod_write(mod, SRC_ROUTE_MODE0, 1); |
532 | 531 | ||
533 | /* no SRC_BFSSR settings, since SRC_SRCCR::BUFMD is 0 */ | 532 | /* no SRC_BFSSR settings, since SRC_SRCCR::BUFMD is 0 */ |
@@ -545,7 +544,7 @@ static int rsnd_src_init_gen1(struct rsnd_mod *mod, | |||
545 | if (ret < 0) | 544 | if (ret < 0) |
546 | return ret; | 545 | return ret; |
547 | 546 | ||
548 | ret = rsnd_src_set_route_gen1(mod); | 547 | ret = rsnd_src_set_route_gen1(io, mod); |
549 | if (ret < 0) | 548 | if (ret < 0) |
550 | return ret; | 549 | return ret; |
551 | 550 | ||
@@ -553,7 +552,7 @@ static int rsnd_src_init_gen1(struct rsnd_mod *mod, | |||
553 | if (ret < 0) | 552 | if (ret < 0) |
554 | return ret; | 553 | return ret; |
555 | 554 | ||
556 | ret = rsnd_src_set_convert_timing_gen1(mod); | 555 | ret = rsnd_src_set_convert_timing_gen1(io, mod); |
557 | if (ret < 0) | 556 | if (ret < 0) |
558 | return ret; | 557 | return ret; |
559 | 558 | ||
@@ -650,9 +649,9 @@ static bool rsnd_src_error_record_gen2(struct rsnd_mod *mod) | |||
650 | return ret; | 649 | return ret; |
651 | } | 650 | } |
652 | 651 | ||
653 | static int _rsnd_src_start_gen2(struct rsnd_mod *mod) | 652 | static int _rsnd_src_start_gen2(struct rsnd_mod *mod, |
653 | struct rsnd_dai_stream *io) | ||
654 | { | 654 | { |
655 | struct rsnd_dai_stream *io = rsnd_mod_to_io(mod); | ||
656 | u32 val = rsnd_io_to_mod_dvc(io) ? 0x01 : 0x11; | 655 | u32 val = rsnd_io_to_mod_dvc(io) ? 0x01 : 0x11; |
657 | 656 | ||
658 | rsnd_mod_write(mod, SRC_CTRL, val); | 657 | rsnd_mod_write(mod, SRC_CTRL, val); |
@@ -677,9 +676,9 @@ static int _rsnd_src_stop_gen2(struct rsnd_mod *mod) | |||
677 | return rsnd_src_stop(mod); | 676 | return rsnd_src_stop(mod); |
678 | } | 677 | } |
679 | 678 | ||
680 | static irqreturn_t rsnd_src_interrupt_gen2(int irq, void *data) | 679 | static void __rsnd_src_interrupt_gen2(struct rsnd_mod *mod, |
680 | struct rsnd_dai_stream *io) | ||
681 | { | 681 | { |
682 | struct rsnd_mod *mod = data; | ||
683 | struct rsnd_priv *priv = rsnd_mod_to_priv(mod); | 682 | struct rsnd_priv *priv = rsnd_mod_to_priv(mod); |
684 | 683 | ||
685 | spin_lock(&priv->lock); | 684 | spin_lock(&priv->lock); |
@@ -698,12 +697,20 @@ static irqreturn_t rsnd_src_interrupt_gen2(int irq, void *data) | |||
698 | 697 | ||
699 | _rsnd_src_stop_gen2(mod); | 698 | _rsnd_src_stop_gen2(mod); |
700 | if (src->err < 1024) | 699 | if (src->err < 1024) |
701 | _rsnd_src_start_gen2(mod); | 700 | _rsnd_src_start_gen2(mod, io); |
702 | else | 701 | else |
703 | dev_warn(dev, "no more SRC restart\n"); | 702 | dev_warn(dev, "no more SRC restart\n"); |
704 | } | 703 | } |
704 | |||
705 | rsnd_src_interrupt_gen2_out: | 705 | rsnd_src_interrupt_gen2_out: |
706 | spin_unlock(&priv->lock); | 706 | spin_unlock(&priv->lock); |
707 | } | ||
708 | |||
709 | static irqreturn_t rsnd_src_interrupt_gen2(int irq, void *data) | ||
710 | { | ||
711 | struct rsnd_mod *mod = data; | ||
712 | |||
713 | rsnd_mod_interrupt(mod, __rsnd_src_interrupt_gen2); | ||
707 | 714 | ||
708 | return IRQ_HANDLED; | 715 | return IRQ_HANDLED; |
709 | } | 716 | } |
@@ -715,7 +722,7 @@ static int rsnd_src_set_convert_rate_gen2(struct rsnd_mod *mod, | |||
715 | struct device *dev = rsnd_priv_to_dev(priv); | 722 | struct device *dev = rsnd_priv_to_dev(priv); |
716 | struct snd_pcm_runtime *runtime = rsnd_io_to_runtime(io); | 723 | struct snd_pcm_runtime *runtime = rsnd_io_to_runtime(io); |
717 | struct rsnd_src *src = rsnd_mod_to_src(mod); | 724 | struct rsnd_src *src = rsnd_mod_to_src(mod); |
718 | u32 convert_rate = rsnd_src_convert_rate(src); | 725 | u32 convert_rate = rsnd_src_convert_rate(io, src); |
719 | u32 cr, route; | 726 | u32 cr, route; |
720 | uint ratio; | 727 | uint ratio; |
721 | int ret; | 728 | int ret; |
@@ -769,12 +776,12 @@ static int rsnd_src_set_convert_rate_gen2(struct rsnd_mod *mod, | |||
769 | return 0; | 776 | return 0; |
770 | } | 777 | } |
771 | 778 | ||
772 | static int rsnd_src_set_convert_timing_gen2(struct rsnd_mod *mod) | 779 | static int rsnd_src_set_convert_timing_gen2(struct rsnd_dai_stream *io, |
780 | struct rsnd_mod *mod) | ||
773 | { | 781 | { |
774 | struct rsnd_dai_stream *io = rsnd_mod_to_io(mod); | ||
775 | struct snd_pcm_runtime *runtime = rsnd_io_to_runtime(io); | 782 | struct snd_pcm_runtime *runtime = rsnd_io_to_runtime(io); |
776 | struct rsnd_src *src = rsnd_mod_to_src(mod); | 783 | struct rsnd_src *src = rsnd_mod_to_src(mod); |
777 | u32 convert_rate = rsnd_src_convert_rate(src); | 784 | u32 convert_rate = rsnd_src_convert_rate(io, src); |
778 | int ret; | 785 | int ret; |
779 | 786 | ||
780 | if (convert_rate) | 787 | if (convert_rate) |
@@ -840,7 +847,7 @@ static int rsnd_src_init_gen2(struct rsnd_mod *mod, | |||
840 | if (ret < 0) | 847 | if (ret < 0) |
841 | return ret; | 848 | return ret; |
842 | 849 | ||
843 | ret = rsnd_src_set_convert_timing_gen2(mod); | 850 | ret = rsnd_src_set_convert_timing_gen2(io, mod); |
844 | if (ret < 0) | 851 | if (ret < 0) |
845 | return ret; | 852 | return ret; |
846 | 853 | ||
@@ -853,7 +860,7 @@ static int rsnd_src_start_gen2(struct rsnd_mod *mod, | |||
853 | { | 860 | { |
854 | rsnd_dma_start(io, rsnd_mod_to_dma(mod)); | 861 | rsnd_dma_start(io, rsnd_mod_to_dma(mod)); |
855 | 862 | ||
856 | return _rsnd_src_start_gen2(mod); | 863 | return _rsnd_src_start_gen2(mod, io); |
857 | } | 864 | } |
858 | 865 | ||
859 | static int rsnd_src_stop_gen2(struct rsnd_mod *mod, | 866 | static int rsnd_src_stop_gen2(struct rsnd_mod *mod, |
@@ -874,7 +881,7 @@ static void rsnd_src_reconvert_update(struct rsnd_mod *mod) | |||
874 | struct rsnd_dai_stream *io = rsnd_mod_to_io(mod); | 881 | struct rsnd_dai_stream *io = rsnd_mod_to_io(mod); |
875 | struct snd_pcm_runtime *runtime = rsnd_io_to_runtime(io); | 882 | struct snd_pcm_runtime *runtime = rsnd_io_to_runtime(io); |
876 | struct rsnd_src *src = rsnd_mod_to_src(mod); | 883 | struct rsnd_src *src = rsnd_mod_to_src(mod); |
877 | u32 convert_rate = rsnd_src_convert_rate(src); | 884 | u32 convert_rate = rsnd_src_convert_rate(io, src); |
878 | u32 fsrate; | 885 | u32 fsrate; |
879 | 886 | ||
880 | if (!runtime) | 887 | if (!runtime) |