summaryrefslogtreecommitdiffstats
path: root/sound
diff options
context:
space:
mode:
authorKuninori Morimoto <kuninori.morimoto.gx@renesas.com>2015-06-15 02:26:56 -0400
committerMark Brown <broonie@kernel.org>2015-06-16 07:34:04 -0400
commitbfc0cfe6b7acb1d0c318f9bc41fcb895a941f83d (patch)
tree6eec377af1e5487fd732484bf7e5123e09e740a1 /sound
parent9b99e9a7c5057684104178bb6c3815fcb2f13be4 (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.c2
-rw-r--r--sound/soc/sh/rcar/rsnd.h2
-rw-r--r--sound/soc/sh/rcar/ssi.c32
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,
559struct rsnd_mod *rsnd_ssi_mod_get(struct rsnd_priv *priv, int id); 559struct rsnd_mod *rsnd_ssi_mod_get(struct rsnd_priv *priv, int id);
560int rsnd_ssi_is_pin_sharing(struct rsnd_mod *mod); 560int rsnd_ssi_is_pin_sharing(struct rsnd_mod *mod);
561int rsnd_ssi_is_dma_mode(struct rsnd_mod *mod); 561int rsnd_ssi_is_dma_mode(struct rsnd_mod *mod);
562int rsnd_ssi_use_busif(struct rsnd_mod *mod); 562int 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
90int rsnd_ssi_use_busif(struct rsnd_mod *mod) 90int 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
229static void rsnd_ssi_hw_stop(struct rsnd_ssi *ssi) 228static 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
425static irqreturn_t rsnd_ssi_interrupt(int irq, void *data) 423static 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
485static 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";