ASoC: rsnd: SSI + DMA can select BUSIF
[deliverable/linux.git] / sound / soc / sh / rcar / ssi.c
index 2df723df5d19bd95bc9a4d492894c6a9ca5d2a71..34e84009162bc7c49e4d6b00401e7c4be0c6a907 100644 (file)
@@ -90,6 +90,20 @@ struct rsnd_ssi {
 #define rsnd_ssi_mode_flags(p) ((p)->info->flags)
 #define rsnd_ssi_dai_id(ssi) ((ssi)->info->dai_id)
 
+static int rsnd_ssi_use_busif(struct rsnd_mod *mod)
+{
+       struct rsnd_ssi *ssi = rsnd_mod_to_ssi(mod);
+       struct rsnd_dai_stream *io = rsnd_mod_to_io(mod);
+       int use_busif = 0;
+
+       if (!(rsnd_ssi_mode_flags(ssi) & RSND_SSI_NO_BUSIF))
+               use_busif = 1;
+       if (rsnd_io_to_mod_src(io))
+               use_busif = 1;
+
+       return use_busif;
+}
+
 static void rsnd_ssi_status_check(struct rsnd_mod *mod,
                                  u32 bit)
 {
@@ -289,8 +303,6 @@ static int rsnd_ssi_init(struct rsnd_mod *mod,
        ssi->cr_own     = cr;
        ssi->err        = -1; /* ignore 1st error */
 
-       rsnd_src_ssi_mode_init(mod, rdai);
-
        return 0;
 }
 
@@ -389,6 +401,8 @@ static int rsnd_ssi_pio_start(struct rsnd_mod *mod,
        /* enable PIO IRQ */
        ssi->cr_etc = UIEN | OIEN | DIEN;
 
+       rsnd_src_ssiu_start(mod, rdai, 0);
+
        rsnd_src_enable_ssi_irq(mod, rdai);
 
        rsnd_ssi_hw_start(ssi, rdai, io);
@@ -405,6 +419,8 @@ static int rsnd_ssi_pio_stop(struct rsnd_mod *mod,
 
        rsnd_ssi_hw_stop(ssi, rdai);
 
+       rsnd_src_ssiu_stop(mod, rdai, 0);
+
        return 0;
 }
 
@@ -457,6 +473,8 @@ static int rsnd_ssi_dma_start(struct rsnd_mod *mod,
        /* enable DMA transfer */
        ssi->cr_etc = DMEN;
 
+       rsnd_src_ssiu_start(mod, rdai, rsnd_ssi_use_busif(mod));
+
        rsnd_dma_start(dma);
 
        rsnd_ssi_hw_start(ssi, ssi->rdai, io);
@@ -482,11 +500,19 @@ static int rsnd_ssi_dma_stop(struct rsnd_mod *mod,
 
        rsnd_dma_stop(dma);
 
+       rsnd_src_ssiu_stop(mod, rdai, 1);
+
        return 0;
 }
 
+static char *rsnd_ssi_dma_name(struct rsnd_mod *mod)
+{
+       return rsnd_ssi_use_busif(mod) ? "ssiu" : SSI_NAME;
+}
+
 static struct rsnd_mod_ops rsnd_ssi_dma_ops = {
        .name   = SSI_NAME,
+       .dma_name = rsnd_ssi_dma_name,
        .probe  = rsnd_ssi_dma_probe,
        .remove = rsnd_ssi_dma_remove,
        .init   = rsnd_ssi_init,
@@ -595,6 +621,9 @@ static void rsnd_of_parse_ssi(struct platform_device *pdev,
                 */
                ssi_info->dma_id = of_get_property(np, "pio-transfer", NULL) ?
                        0 : 1;
+
+               if (of_get_property(np, "no-busif", NULL))
+                       ssi_info->flags |= RSND_SSI_NO_BUSIF;
        }
 
 rsnd_of_parse_ssi_end:
This page took 0.025157 seconds and 5 git commands to generate.