aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorKuninori Morimoto <kuninori.morimoto.gx@renesas.com>2014-03-03 23:50:49 -0500
committerMark Brown <broonie@linaro.org>2014-03-05 01:07:53 -0500
commitff8f30e688477beead6d1e648fb11f321220a4d7 (patch)
tree00657d0771172a7182cb1851baf499e5e8aeb416
parent76c6fb5c49790da44d553f655182b426ade2c599 (diff)
ASoC: rsnd: use mod probe method on SSI
Now, it can use .probe Signed-off-by: Kuninori Morimoto <kuninori.morimoto.gx@renesas.com> Signed-off-by: Mark Brown <broonie@linaro.org>
-rw-r--r--sound/soc/sh/rcar/ssi.c116
1 files changed, 65 insertions, 51 deletions
diff --git a/sound/soc/sh/rcar/ssi.c b/sound/soc/sh/rcar/ssi.c
index a7df216a46da..0f3eeac56155 100644
--- a/sound/soc/sh/rcar/ssi.c
+++ b/sound/soc/sh/rcar/ssi.c
@@ -358,6 +358,26 @@ static irqreturn_t rsnd_ssi_pio_interrupt(int irq, void *data)
358 return ret; 358 return ret;
359} 359}
360 360
361static int rsnd_ssi_pio_probe(struct rsnd_mod *mod,
362 struct rsnd_dai *rdai,
363 struct rsnd_dai_stream *io)
364{
365 struct rsnd_priv *priv = rsnd_mod_to_priv(mod);
366 struct device *dev = rsnd_priv_to_dev(priv);
367 struct rsnd_ssi *ssi = rsnd_mod_to_ssi(mod);
368 int irq = ssi->info->pio_irq;
369 int ret;
370
371 ret = devm_request_irq(dev, irq,
372 rsnd_ssi_pio_interrupt,
373 IRQF_SHARED,
374 dev_name(dev), ssi);
375 if (ret)
376 dev_err(dev, "SSI request interrupt failed\n");
377
378 return ret;
379}
380
361static int rsnd_ssi_pio_start(struct rsnd_mod *mod, 381static int rsnd_ssi_pio_start(struct rsnd_mod *mod,
362 struct rsnd_dai *rdai, 382 struct rsnd_dai *rdai,
363 struct rsnd_dai_stream *io) 383 struct rsnd_dai_stream *io)
@@ -389,12 +409,50 @@ static int rsnd_ssi_pio_stop(struct rsnd_mod *mod,
389 409
390static struct rsnd_mod_ops rsnd_ssi_pio_ops = { 410static struct rsnd_mod_ops rsnd_ssi_pio_ops = {
391 .name = "ssi (pio)", 411 .name = "ssi (pio)",
412 .probe = rsnd_ssi_pio_probe,
392 .init = rsnd_ssi_init, 413 .init = rsnd_ssi_init,
393 .quit = rsnd_ssi_quit, 414 .quit = rsnd_ssi_quit,
394 .start = rsnd_ssi_pio_start, 415 .start = rsnd_ssi_pio_start,
395 .stop = rsnd_ssi_pio_stop, 416 .stop = rsnd_ssi_pio_stop,
396}; 417};
397 418
419static int rsnd_ssi_dma_probe(struct rsnd_mod *mod,
420 struct rsnd_dai *rdai,
421 struct rsnd_dai_stream *io)
422{
423 struct rsnd_priv *priv = rsnd_mod_to_priv(mod);
424 struct rsnd_ssi *ssi = rsnd_mod_to_ssi(mod);
425 struct rcar_snd_info *info = rsnd_priv_to_info(priv);
426 struct device *dev = rsnd_priv_to_dev(priv);
427 int dma_id = ssi->info->dma_id;
428 int is_play;
429 int ret;
430
431 if (info->dai_info)
432 is_play = rsnd_info_is_playback(priv, ssi);
433 else
434 is_play = rsnd_ssi_is_play(&ssi->mod);
435
436 ret = rsnd_dma_init(
437 priv, rsnd_mod_to_dma(mod),
438 is_play,
439 dma_id);
440
441 if (ret < 0)
442 dev_err(dev, "SSI DMA failed\n");
443
444 return ret;
445}
446
447static int rsnd_ssi_dma_remove(struct rsnd_mod *mod,
448 struct rsnd_dai *rdai,
449 struct rsnd_dai_stream *io)
450{
451 rsnd_dma_quit(rsnd_mod_to_priv(mod), rsnd_mod_to_dma(mod));
452
453 return 0;
454}
455
398static int rsnd_ssi_dma_start(struct rsnd_mod *mod, 456static int rsnd_ssi_dma_start(struct rsnd_mod *mod,
399 struct rsnd_dai *rdai, 457 struct rsnd_dai *rdai,
400 struct rsnd_dai_stream *io) 458 struct rsnd_dai_stream *io)
@@ -436,6 +494,8 @@ static int rsnd_ssi_dma_stop(struct rsnd_mod *mod,
436 494
437static struct rsnd_mod_ops rsnd_ssi_dma_ops = { 495static struct rsnd_mod_ops rsnd_ssi_dma_ops = {
438 .name = "ssi (dma)", 496 .name = "ssi (dma)",
497 .probe = rsnd_ssi_dma_probe,
498 .remove = rsnd_ssi_dma_remove,
439 .init = rsnd_ssi_init, 499 .init = rsnd_ssi_init,
440 .quit = rsnd_ssi_quit, 500 .quit = rsnd_ssi_quit,
441 .start = rsnd_ssi_dma_start, 501 .start = rsnd_ssi_dma_start,
@@ -538,7 +598,7 @@ int rsnd_ssi_probe(struct platform_device *pdev,
538 struct clk *clk; 598 struct clk *clk;
539 struct rsnd_ssi *ssi; 599 struct rsnd_ssi *ssi;
540 char name[RSND_SSI_NAME_SIZE]; 600 char name[RSND_SSI_NAME_SIZE];
541 int i, nr, ret; 601 int i, nr;
542 602
543 /* 603 /*
544 * init SSI 604 * init SSI
@@ -566,48 +626,10 @@ int rsnd_ssi_probe(struct platform_device *pdev,
566 ssi->clk = clk; 626 ssi->clk = clk;
567 627
568 ops = &rsnd_ssi_non_ops; 628 ops = &rsnd_ssi_non_ops;
569 629 if (pinfo->dma_id > 0)
570 /* 630 ops = &rsnd_ssi_dma_ops;
571 * SSI DMA case 631 else if (rsnd_ssi_pio_available(ssi))
572 */ 632 ops = &rsnd_ssi_pio_ops;
573 if (pinfo->dma_id > 0) {
574 int is_play;
575
576 if (info->dai_info)
577 is_play = rsnd_info_is_playback(priv, ssi);
578 else
579 is_play = rsnd_ssi_is_play(&ssi->mod);
580
581 ret = rsnd_dma_init(
582 priv, rsnd_mod_to_dma(&ssi->mod),
583 is_play,
584 pinfo->dma_id);
585 if (ret < 0)
586 dev_info(dev, "SSI DMA failed. try PIO transter\n");
587 else
588 ops = &rsnd_ssi_dma_ops;
589
590 dev_dbg(dev, "SSI%d use DMA transfer\n", i);
591 }
592
593 /*
594 * SSI PIO case
595 */
596 if (!rsnd_ssi_dma_available(ssi) &&
597 rsnd_ssi_pio_available(ssi)) {
598 ret = devm_request_irq(dev, pinfo->pio_irq,
599 &rsnd_ssi_pio_interrupt,
600 IRQF_SHARED,
601 dev_name(dev), ssi);
602 if (ret) {
603 dev_err(dev, "SSI request interrupt failed\n");
604 return ret;
605 }
606
607 ops = &rsnd_ssi_pio_ops;
608
609 dev_dbg(dev, "SSI%d use PIO transfer\n", i);
610 }
611 633
612 rsnd_mod_init(priv, &ssi->mod, ops, RSND_MOD_SSI, i); 634 rsnd_mod_init(priv, &ssi->mod, ops, RSND_MOD_SSI, i);
613 635
@@ -620,12 +642,4 @@ int rsnd_ssi_probe(struct platform_device *pdev,
620void rsnd_ssi_remove(struct platform_device *pdev, 642void rsnd_ssi_remove(struct platform_device *pdev,
621 struct rsnd_priv *priv) 643 struct rsnd_priv *priv)
622{ 644{
623 struct rsnd_ssi *ssi;
624 int i;
625
626 for_each_rsnd_ssi(ssi, priv, i) {
627 if (rsnd_ssi_dma_available(ssi))
628 rsnd_dma_quit(priv, rsnd_mod_to_dma(&ssi->mod));
629 }
630
631} 645}