diff options
author | Kuninori Morimoto <kuninori.morimoto.gx@renesas.com> | 2014-03-03 23:50:49 -0500 |
---|---|---|
committer | Mark Brown <broonie@linaro.org> | 2014-03-05 01:07:53 -0500 |
commit | ff8f30e688477beead6d1e648fb11f321220a4d7 (patch) | |
tree | 00657d0771172a7182cb1851baf499e5e8aeb416 | |
parent | 76c6fb5c49790da44d553f655182b426ade2c599 (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.c | 116 |
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 | ||
361 | static 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 | |||
361 | static int rsnd_ssi_pio_start(struct rsnd_mod *mod, | 381 | static 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 | ||
390 | static struct rsnd_mod_ops rsnd_ssi_pio_ops = { | 410 | static 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 | ||
419 | static 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 | |||
447 | static 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 | |||
398 | static int rsnd_ssi_dma_start(struct rsnd_mod *mod, | 456 | static 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 | ||
437 | static struct rsnd_mod_ops rsnd_ssi_dma_ops = { | 495 | static 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, | |||
620 | void rsnd_ssi_remove(struct platform_device *pdev, | 642 | void 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 | } |