aboutsummaryrefslogtreecommitdiffstats
path: root/sound/soc/sh/fsi.c
diff options
context:
space:
mode:
authorKuninori Morimoto <kuninori.morimoto.gx@renesas.com>2012-02-03 03:57:25 -0500
committerMark Brown <broonie@opensource.wolfsonmicro.com>2012-02-03 06:55:40 -0500
commit180346ede352b12c72c5aeba2fc806fd32880c16 (patch)
treefb6beecbc664be92fba6efbe2e3fd5e1f9bccb5a /sound/soc/sh/fsi.c
parent938e2a8da5b2c1cb21c200e97736259948a3d12c (diff)
ASoC: fsi: add .start_stop handler to fsi_stream_handler
Signed-off-by: Kuninori Morimoto <kuninori.morimoto.gx@renesas.com> Signed-off-by: Mark Brown <broonie@opensource.wolfsonmicro.com>
Diffstat (limited to 'sound/soc/sh/fsi.c')
-rw-r--r--sound/soc/sh/fsi.c51
1 files changed, 29 insertions, 22 deletions
diff --git a/sound/soc/sh/fsi.c b/sound/soc/sh/fsi.c
index 7dec144b8466..8d05e59c8831 100644
--- a/sound/soc/sh/fsi.c
+++ b/sound/soc/sh/fsi.c
@@ -203,6 +203,8 @@ struct fsi_stream_handler {
203 int (*probe)(struct fsi_priv *fsi, struct fsi_stream *io); 203 int (*probe)(struct fsi_priv *fsi, struct fsi_stream *io);
204 int (*transfer)(struct fsi_priv *fsi, struct fsi_stream *io); 204 int (*transfer)(struct fsi_priv *fsi, struct fsi_stream *io);
205 int (*remove)(struct fsi_priv *fsi, struct fsi_stream *io); 205 int (*remove)(struct fsi_priv *fsi, struct fsi_stream *io);
206 void (*start_stop)(struct fsi_priv *fsi, struct fsi_stream *io,
207 int enable);
206}; 208};
207#define fsi_stream_handler_call(io, func, args...) \ 209#define fsi_stream_handler_call(io, func, args...) \
208 (!(io) ? -ENODEV : \ 210 (!(io) ? -ENODEV : \
@@ -513,6 +515,12 @@ static int fsi_stream_transfer(struct fsi_stream *io)
513 return fsi_stream_handler_call(io, transfer, fsi, io); 515 return fsi_stream_handler_call(io, transfer, fsi, io);
514} 516}
515 517
518#define fsi_stream_start(fsi, io)\
519 fsi_stream_handler_call(io, start_stop, fsi, io, 1)
520
521#define fsi_stream_stop(fsi, io)\
522 fsi_stream_handler_call(io, start_stop, fsi, io, 0)
523
516static int fsi_stream_probe(struct fsi_priv *fsi) 524static int fsi_stream_probe(struct fsi_priv *fsi)
517{ 525{
518 struct fsi_stream *io; 526 struct fsi_stream *io;
@@ -691,24 +699,6 @@ static int fsi_set_master_clk(struct device *dev, struct fsi_priv *fsi,
691 return ret; 699 return ret;
692} 700}
693 701
694#define fsi_port_start(f, i) __fsi_port_clk_ctrl(f, i, 1)
695#define fsi_port_stop(f, i) __fsi_port_clk_ctrl(f, i, 0)
696static void __fsi_port_clk_ctrl(struct fsi_priv *fsi, struct fsi_stream *io,
697 int enable)
698{
699 struct fsi_master *master = fsi_get_master(fsi);
700 u32 clk = fsi_is_port_a(fsi) ? CRA : CRB;
701
702 if (enable)
703 fsi_irq_enable(fsi, io);
704 else
705 fsi_irq_disable(fsi, io);
706
707 if (fsi_is_clk_master(fsi))
708 fsi_master_mask_set(master, CLK_RST, clk, (enable) ? clk : 0);
709}
710
711
712/* 702/*
713 * pio data transfer handler 703 * pio data transfer handler
714 */ 704 */
@@ -845,12 +835,29 @@ static int fsi_pio_push(struct fsi_priv *fsi, struct fsi_stream *io)
845 samples); 835 samples);
846} 836}
847 837
838static void fsi_pio_start_stop(struct fsi_priv *fsi, struct fsi_stream *io,
839 int enable)
840{
841 struct fsi_master *master = fsi_get_master(fsi);
842 u32 clk = fsi_is_port_a(fsi) ? CRA : CRB;
843
844 if (enable)
845 fsi_irq_enable(fsi, io);
846 else
847 fsi_irq_disable(fsi, io);
848
849 if (fsi_is_clk_master(fsi))
850 fsi_master_mask_set(master, CLK_RST, clk, (enable) ? clk : 0);
851}
852
848static struct fsi_stream_handler fsi_pio_push_handler = { 853static struct fsi_stream_handler fsi_pio_push_handler = {
849 .transfer = fsi_pio_push, 854 .transfer = fsi_pio_push,
855 .start_stop = fsi_pio_start_stop,
850}; 856};
851 857
852static struct fsi_stream_handler fsi_pio_pop_handler = { 858static struct fsi_stream_handler fsi_pio_pop_handler = {
853 .transfer = fsi_pio_pop, 859 .transfer = fsi_pio_pop,
860 .start_stop = fsi_pio_start_stop,
854}; 861};
855 862
856static irqreturn_t fsi_interrupt(int irq, void *data) 863static irqreturn_t fsi_interrupt(int irq, void *data)
@@ -1033,10 +1040,10 @@ static int fsi_dai_trigger(struct snd_pcm_substream *substream, int cmd,
1033 fsi_stream_init(fsi, io, substream); 1040 fsi_stream_init(fsi, io, substream);
1034 ret = fsi_stream_transfer(io); 1041 ret = fsi_stream_transfer(io);
1035 if (0 == ret) 1042 if (0 == ret)
1036 fsi_port_start(fsi, io); 1043 fsi_stream_start(fsi, io);
1037 break; 1044 break;
1038 case SNDRV_PCM_TRIGGER_STOP: 1045 case SNDRV_PCM_TRIGGER_STOP:
1039 fsi_port_stop(fsi, io); 1046 fsi_stream_stop(fsi, io);
1040 fsi_stream_quit(fsi, io); 1047 fsi_stream_quit(fsi, io);
1041 break; 1048 break;
1042 } 1049 }
@@ -1436,7 +1443,7 @@ static void __fsi_suspend(struct fsi_priv *fsi,
1436 if (!fsi_stream_is_working(fsi, io)) 1443 if (!fsi_stream_is_working(fsi, io))
1437 return; 1444 return;
1438 1445
1439 fsi_port_stop(fsi, io); 1446 fsi_stream_stop(fsi, io);
1440 fsi_hw_shutdown(fsi, dev); 1447 fsi_hw_shutdown(fsi, dev);
1441} 1448}
1442 1449
@@ -1452,7 +1459,7 @@ static void __fsi_resume(struct fsi_priv *fsi,
1452 if (fsi_is_clk_master(fsi) && fsi->rate) 1459 if (fsi_is_clk_master(fsi) && fsi->rate)
1453 fsi_set_master_clk(dev, fsi, fsi->rate, 1); 1460 fsi_set_master_clk(dev, fsi, fsi->rate, 1);
1454 1461
1455 fsi_port_start(fsi, io); 1462 fsi_stream_start(fsi, io);
1456} 1463}
1457 1464
1458static int fsi_suspend(struct device *dev) 1465static int fsi_suspend(struct device *dev)