ASoC: rsnd: adds struct rsnd_dai_stream as on each fuction as parameter
[deliverable/linux.git] / sound / soc / sh / rcar / src.c
index 3beb32eb412a103db4135a20e96948f4a1c88c80..e28d9f6ddda6801d9e02581b1bba5d99d067dec2 100644 (file)
@@ -316,6 +316,7 @@ static int rsnd_src_set_convert_rate(struct rsnd_mod *mod)
 }
 
 static int rsnd_src_hw_params(struct rsnd_mod *mod,
+                             struct rsnd_dai_stream *io,
                              struct snd_pcm_substream *substream,
                              struct snd_pcm_hw_params *fe_params)
 {
@@ -372,6 +373,7 @@ static int rsnd_src_init(struct rsnd_mod *mod,
 }
 
 static int rsnd_src_quit(struct rsnd_mod *mod,
+                        struct rsnd_dai_stream *io,
                         struct rsnd_priv *priv)
 {
        struct rsnd_src *src = rsnd_mod_to_src(mod);
@@ -532,6 +534,7 @@ static int rsnd_src_set_convert_rate_gen1(struct rsnd_mod *mod)
 }
 
 static int rsnd_src_init_gen1(struct rsnd_mod *mod,
+                             struct rsnd_dai_stream *io,
                              struct rsnd_priv *priv)
 {
        int ret;
@@ -556,6 +559,7 @@ static int rsnd_src_init_gen1(struct rsnd_mod *mod,
 }
 
 static int rsnd_src_start_gen1(struct rsnd_mod *mod,
+                              struct rsnd_dai_stream *io,
                               struct rsnd_priv *priv)
 {
        int id = rsnd_mod_id(mod);
@@ -566,6 +570,7 @@ static int rsnd_src_start_gen1(struct rsnd_mod *mod,
 }
 
 static int rsnd_src_stop_gen1(struct rsnd_mod *mod,
+                             struct rsnd_dai_stream *io,
                              struct rsnd_priv *priv)
 {
        int id = rsnd_mod_id(mod);
@@ -673,10 +678,13 @@ static int _rsnd_src_stop_gen2(struct rsnd_mod *mod)
 static irqreturn_t rsnd_src_interrupt_gen2(int irq, void *data)
 {
        struct rsnd_mod *mod = data;
-       struct rsnd_dai_stream *io = rsnd_mod_to_io(mod);
+       struct rsnd_priv *priv = rsnd_mod_to_priv(mod);
 
-       if (!io)
-               return IRQ_NONE;
+       spin_lock(&priv->lock);
+
+       /* ignore all cases if not working */
+       if (!rsnd_mod_is_working(mod))
+               goto rsnd_src_interrupt_gen2_out;
 
        if (rsnd_src_error_record_gen2(mod)) {
                struct rsnd_priv *priv = rsnd_mod_to_priv(mod);
@@ -692,6 +700,8 @@ static irqreturn_t rsnd_src_interrupt_gen2(int irq, void *data)
                else
                        dev_warn(dev, "no more SRC restart\n");
        }
+rsnd_src_interrupt_gen2_out:
+       spin_unlock(&priv->lock);
 
        return IRQ_HANDLED;
 }
@@ -776,6 +786,7 @@ static int rsnd_src_set_convert_timing_gen2(struct rsnd_mod *mod)
 }
 
 static int rsnd_src_probe_gen2(struct rsnd_mod *mod,
+                              struct rsnd_dai_stream *io,
                               struct rsnd_priv *priv)
 {
        struct rsnd_src *src = rsnd_mod_to_src(mod);
@@ -805,6 +816,7 @@ static int rsnd_src_probe_gen2(struct rsnd_mod *mod,
 }
 
 static int rsnd_src_remove_gen2(struct rsnd_mod *mod,
+                               struct rsnd_dai_stream *io,
                                struct rsnd_priv *priv)
 {
        rsnd_dma_quit(rsnd_mod_to_dma(mod));
@@ -813,6 +825,7 @@ static int rsnd_src_remove_gen2(struct rsnd_mod *mod,
 }
 
 static int rsnd_src_init_gen2(struct rsnd_mod *mod,
+                             struct rsnd_dai_stream *io,
                              struct rsnd_priv *priv)
 {
        int ret;
@@ -833,6 +846,7 @@ static int rsnd_src_init_gen2(struct rsnd_mod *mod,
 }
 
 static int rsnd_src_start_gen2(struct rsnd_mod *mod,
+                              struct rsnd_dai_stream *io,
                               struct rsnd_priv *priv)
 {
        rsnd_dma_start(rsnd_mod_to_dma(mod));
@@ -841,6 +855,7 @@ static int rsnd_src_start_gen2(struct rsnd_mod *mod,
 }
 
 static int rsnd_src_stop_gen2(struct rsnd_mod *mod,
+                             struct rsnd_dai_stream *io,
                              struct rsnd_priv *priv)
 {
        int ret;
@@ -873,10 +888,10 @@ static void rsnd_src_reconvert_update(struct rsnd_mod *mod)
 }
 
 static int rsnd_src_pcm_new(struct rsnd_mod *mod,
+                           struct rsnd_dai_stream *io,
                            struct snd_soc_pcm_runtime *rtd)
 {
        struct rsnd_priv *priv = rsnd_mod_to_priv(mod);
-       struct rsnd_dai_stream *io = rsnd_mod_to_io(mod);
        struct rsnd_dai *rdai = rsnd_io_to_rdai(io);
        struct rsnd_src *src = rsnd_mod_to_src(mod);
        int ret;
@@ -1041,7 +1056,7 @@ int rsnd_src_probe(struct platform_device *pdev,
 
                src->info = &info->src_info[i];
 
-               ret = rsnd_mod_init(&src->mod, ops, clk, RSND_MOD_SRC, i);
+               ret = rsnd_mod_init(priv, &src->mod, ops, clk, RSND_MOD_SRC, i);
                if (ret)
                        return ret;
        }
This page took 0.025879 seconds and 5 git commands to generate.