diff options
author | Kuninori Morimoto <kuninori.morimoto.gx@renesas.com> | 2015-06-15 02:26:56 -0400 |
---|---|---|
committer | Mark Brown <broonie@kernel.org> | 2015-06-16 07:34:04 -0400 |
commit | bfc0cfe6b7acb1d0c318f9bc41fcb895a941f83d (patch) | |
tree | 6eec377af1e5487fd732484bf7e5123e09e740a1 /sound | |
parent | 9b99e9a7c5057684104178bb6c3815fcb2f13be4 (diff) |
ASoC: rsnd: don't use rsnd_mod_to_io() on rsnd_ssi_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_ssi_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/dma.c | 2 | ||||
-rw-r--r-- | sound/soc/sh/rcar/rsnd.h | 2 | ||||
-rw-r--r-- | sound/soc/sh/rcar/ssi.c | 32 |
3 files changed, 20 insertions, 16 deletions
diff --git a/sound/soc/sh/rcar/dma.c b/sound/soc/sh/rcar/dma.c index bdd99f582bb1..6ee34fcc0d68 100644 --- a/sound/soc/sh/rcar/dma.c +++ b/sound/soc/sh/rcar/dma.c | |||
@@ -455,7 +455,7 @@ rsnd_gen2_dma_addr(struct rsnd_dai_stream *io, | |||
455 | dev_err(dev, "DVC is selected without SRC\n"); | 455 | dev_err(dev, "DVC is selected without SRC\n"); |
456 | 456 | ||
457 | /* use SSIU or SSI ? */ | 457 | /* use SSIU or SSI ? */ |
458 | if (is_ssi && rsnd_ssi_use_busif(mod)) | 458 | if (is_ssi && rsnd_ssi_use_busif(io, mod)) |
459 | is_ssi++; | 459 | is_ssi++; |
460 | 460 | ||
461 | return (is_from) ? | 461 | return (is_from) ? |
diff --git a/sound/soc/sh/rcar/rsnd.h b/sound/soc/sh/rcar/rsnd.h index 19d0d8b2b9af..ac03d2008ee8 100644 --- a/sound/soc/sh/rcar/rsnd.h +++ b/sound/soc/sh/rcar/rsnd.h | |||
@@ -559,7 +559,7 @@ void rsnd_ssi_remove(struct platform_device *pdev, | |||
559 | struct rsnd_mod *rsnd_ssi_mod_get(struct rsnd_priv *priv, int id); | 559 | struct rsnd_mod *rsnd_ssi_mod_get(struct rsnd_priv *priv, int id); |
560 | int rsnd_ssi_is_pin_sharing(struct rsnd_mod *mod); | 560 | int rsnd_ssi_is_pin_sharing(struct rsnd_mod *mod); |
561 | int rsnd_ssi_is_dma_mode(struct rsnd_mod *mod); | 561 | int rsnd_ssi_is_dma_mode(struct rsnd_mod *mod); |
562 | int rsnd_ssi_use_busif(struct rsnd_mod *mod); | 562 | int rsnd_ssi_use_busif(struct rsnd_dai_stream *io, struct rsnd_mod *mod); |
563 | 563 | ||
564 | /* | 564 | /* |
565 | * R-Car DVC | 565 | * R-Car DVC |
diff --git a/sound/soc/sh/rcar/ssi.c b/sound/soc/sh/rcar/ssi.c index 0a32544d6f75..fa1f2e5b9070 100644 --- a/sound/soc/sh/rcar/ssi.c +++ b/sound/soc/sh/rcar/ssi.c | |||
@@ -87,10 +87,9 @@ struct rsnd_ssi { | |||
87 | #define rsnd_ssi_of_node(priv) \ | 87 | #define rsnd_ssi_of_node(priv) \ |
88 | of_get_child_by_name(rsnd_priv_to_dev(priv)->of_node, "rcar_sound,ssi") | 88 | of_get_child_by_name(rsnd_priv_to_dev(priv)->of_node, "rcar_sound,ssi") |
89 | 89 | ||
90 | int rsnd_ssi_use_busif(struct rsnd_mod *mod) | 90 | int rsnd_ssi_use_busif(struct rsnd_dai_stream *io, struct rsnd_mod *mod) |
91 | { | 91 | { |
92 | struct rsnd_ssi *ssi = rsnd_mod_to_ssi(mod); | 92 | struct rsnd_ssi *ssi = rsnd_mod_to_ssi(mod); |
93 | struct rsnd_dai_stream *io = rsnd_mod_to_io(mod); | ||
94 | int use_busif = 0; | 93 | int use_busif = 0; |
95 | 94 | ||
96 | if (!rsnd_ssi_is_dma_mode(mod)) | 95 | if (!rsnd_ssi_is_dma_mode(mod)) |
@@ -226,10 +225,9 @@ static void rsnd_ssi_hw_start(struct rsnd_ssi *ssi, | |||
226 | rsnd_mod_name(&ssi->mod), rsnd_mod_id(&ssi->mod)); | 225 | rsnd_mod_name(&ssi->mod), rsnd_mod_id(&ssi->mod)); |
227 | } | 226 | } |
228 | 227 | ||
229 | static void rsnd_ssi_hw_stop(struct rsnd_ssi *ssi) | 228 | static void rsnd_ssi_hw_stop(struct rsnd_dai_stream *io, struct rsnd_ssi *ssi) |
230 | { | 229 | { |
231 | struct rsnd_priv *priv = rsnd_mod_to_priv(&ssi->mod); | 230 | struct rsnd_priv *priv = rsnd_mod_to_priv(&ssi->mod); |
232 | struct rsnd_dai_stream *io = rsnd_mod_to_io(&ssi->mod); | ||
233 | struct rsnd_dai *rdai = rsnd_io_to_rdai(io); | 231 | struct rsnd_dai *rdai = rsnd_io_to_rdai(io); |
234 | struct device *dev = rsnd_priv_to_dev(priv); | 232 | struct device *dev = rsnd_priv_to_dev(priv); |
235 | u32 cr; | 233 | u32 cr; |
@@ -263,7 +261,7 @@ static void rsnd_ssi_hw_stop(struct rsnd_ssi *ssi) | |||
263 | struct rsnd_ssi *ssi_parent = rsnd_ssi_parent(ssi); | 261 | struct rsnd_ssi *ssi_parent = rsnd_ssi_parent(ssi); |
264 | 262 | ||
265 | if (ssi_parent) | 263 | if (ssi_parent) |
266 | rsnd_ssi_hw_stop(ssi_parent); | 264 | rsnd_ssi_hw_stop(io, ssi_parent); |
267 | else | 265 | else |
268 | rsnd_ssi_master_clk_stop(ssi); | 266 | rsnd_ssi_master_clk_stop(ssi); |
269 | } | 267 | } |
@@ -396,7 +394,7 @@ static int rsnd_ssi_start(struct rsnd_mod *mod, | |||
396 | { | 394 | { |
397 | struct rsnd_ssi *ssi = rsnd_mod_to_ssi(mod); | 395 | struct rsnd_ssi *ssi = rsnd_mod_to_ssi(mod); |
398 | 396 | ||
399 | rsnd_src_ssiu_start(mod, io, rsnd_ssi_use_busif(mod)); | 397 | rsnd_src_ssiu_start(mod, io, rsnd_ssi_use_busif(io, mod)); |
400 | 398 | ||
401 | rsnd_ssi_hw_start(ssi, io); | 399 | rsnd_ssi_hw_start(ssi, io); |
402 | 400 | ||
@@ -415,19 +413,18 @@ static int rsnd_ssi_stop(struct rsnd_mod *mod, | |||
415 | 413 | ||
416 | rsnd_ssi_record_error(ssi, rsnd_mod_read(mod, SSISR)); | 414 | rsnd_ssi_record_error(ssi, rsnd_mod_read(mod, SSISR)); |
417 | 415 | ||
418 | rsnd_ssi_hw_stop(ssi); | 416 | rsnd_ssi_hw_stop(io, ssi); |
419 | 417 | ||
420 | rsnd_src_ssiu_stop(mod, io); | 418 | rsnd_src_ssiu_stop(mod, io); |
421 | 419 | ||
422 | return 0; | 420 | return 0; |
423 | } | 421 | } |
424 | 422 | ||
425 | static irqreturn_t rsnd_ssi_interrupt(int irq, void *data) | 423 | static void __rsnd_ssi_interrupt(struct rsnd_mod *mod, |
424 | struct rsnd_dai_stream *io) | ||
426 | { | 425 | { |
427 | struct rsnd_ssi *ssi = data; | 426 | struct rsnd_ssi *ssi = rsnd_mod_to_ssi(mod); |
428 | struct rsnd_mod *mod = &ssi->mod; | ||
429 | struct rsnd_priv *priv = rsnd_mod_to_priv(mod); | 427 | struct rsnd_priv *priv = rsnd_mod_to_priv(mod); |
430 | struct rsnd_dai_stream *io = rsnd_mod_to_io(mod); | ||
431 | int is_dma = rsnd_ssi_is_dma_mode(mod); | 428 | int is_dma = rsnd_ssi_is_dma_mode(mod); |
432 | u32 status; | 429 | u32 status; |
433 | bool elapsed = false; | 430 | bool elapsed = false; |
@@ -483,6 +480,13 @@ rsnd_ssi_interrupt_out: | |||
483 | 480 | ||
484 | if (elapsed) | 481 | if (elapsed) |
485 | rsnd_dai_period_elapsed(io); | 482 | rsnd_dai_period_elapsed(io); |
483 | } | ||
484 | |||
485 | static irqreturn_t rsnd_ssi_interrupt(int irq, void *data) | ||
486 | { | ||
487 | struct rsnd_mod *mod = data; | ||
488 | |||
489 | rsnd_mod_interrupt(mod, __rsnd_ssi_interrupt); | ||
486 | 490 | ||
487 | return IRQ_HANDLED; | 491 | return IRQ_HANDLED; |
488 | } | 492 | } |
@@ -501,7 +505,7 @@ static int rsnd_ssi_pio_probe(struct rsnd_mod *mod, | |||
501 | ret = devm_request_irq(dev, ssi->info->irq, | 505 | ret = devm_request_irq(dev, ssi->info->irq, |
502 | rsnd_ssi_interrupt, | 506 | rsnd_ssi_interrupt, |
503 | IRQF_SHARED, | 507 | IRQF_SHARED, |
504 | dev_name(dev), ssi); | 508 | dev_name(dev), mod); |
505 | 509 | ||
506 | return ret; | 510 | return ret; |
507 | } | 511 | } |
@@ -528,7 +532,7 @@ static int rsnd_ssi_dma_probe(struct rsnd_mod *mod, | |||
528 | ret = devm_request_irq(dev, ssi->info->irq, | 532 | ret = devm_request_irq(dev, ssi->info->irq, |
529 | rsnd_ssi_interrupt, | 533 | rsnd_ssi_interrupt, |
530 | IRQF_SHARED, | 534 | IRQF_SHARED, |
531 | dev_name(dev), ssi); | 535 | dev_name(dev), mod); |
532 | if (ret) | 536 | if (ret) |
533 | return ret; | 537 | return ret; |
534 | 538 | ||
@@ -609,7 +613,7 @@ static struct dma_chan *rsnd_ssi_dma_req(struct rsnd_dai_stream *io, | |||
609 | int is_play = rsnd_io_is_play(io); | 613 | int is_play = rsnd_io_is_play(io); |
610 | char *name; | 614 | char *name; |
611 | 615 | ||
612 | if (rsnd_ssi_use_busif(mod)) | 616 | if (rsnd_ssi_use_busif(io, mod)) |
613 | name = is_play ? "rxu" : "txu"; | 617 | name = is_play ? "rxu" : "txu"; |
614 | else | 618 | else |
615 | name = is_play ? "rx" : "tx"; | 619 | name = is_play ? "rx" : "tx"; |