ASoC: fsi: add SND_SOC_DAIFMT_INV_xxx support
authorKuninori Morimoto <kuninori.morimoto.gx@renesas.com>
Fri, 16 Nov 2012 09:17:43 +0000 (01:17 -0800)
committerMark Brown <broonie@opensource.wolfsonmicro.com>
Tue, 20 Nov 2012 06:11:21 +0000 (15:11 +0900)
Current FSI driver is using platform information pointer,
but it is not good design for DT support.
This patch adds SND_SOC_DAIFMT_INV_xxx support,
and it is possible to independent from platform information pointer.

Old type SH_FSI_xxx_INV is still supported,
but it will be removed soon.

Signed-off-by: Kuninori Morimoto <kuninori.morimoto.gx@renesas.com>
Signed-off-by: Mark Brown <broonie@opensource.wolfsonmicro.com>
sound/soc/sh/fsi.c

index 22037f1..e74c4eb 100644 (file)
@@ -267,6 +267,8 @@ struct fsi_priv {
        int clk_cpg:1;
        int spdif:1;
        int enable_stream:1;
+       int bit_clk_inv:1;
+       int lr_clk_inv:1;
 
        long rate;
 };
@@ -1645,6 +1647,16 @@ static int fsi_hw_startup(struct fsi_priv *fsi,
 
        /* clock inversion (CKG2) */
        data = 0;
+       if (fsi->bit_clk_inv)
+               data |= (1 << 0);
+       if (fsi->lr_clk_inv)
+               data |= (1 << 4);
+       if (fsi_is_clk_master(fsi))
+               data <<= 8;
+       /* FIXME
+        *
+        * SH_FSI_xxx_INV style will be removed
+        */
        if (SH_FSI_LRM_INV & flags)
                data |= 1 << 12;
        if (SH_FSI_BRM_INV & flags)
@@ -1796,6 +1808,27 @@ static int fsi_dai_set_fmt(struct snd_soc_dai *dai, unsigned int fmt)
                return -EINVAL;
        }
 
+       /* set clock inversion */
+       switch (fmt & SND_SOC_DAIFMT_INV_MASK) {
+       case SND_SOC_DAIFMT_NB_IF:
+               fsi->bit_clk_inv = 0;
+               fsi->lr_clk_inv = 1;
+               break;
+       case SND_SOC_DAIFMT_IB_NF:
+               fsi->bit_clk_inv = 1;
+               fsi->lr_clk_inv = 0;
+               break;
+       case SND_SOC_DAIFMT_IB_IF:
+               fsi->bit_clk_inv = 1;
+               fsi->lr_clk_inv = 1;
+               break;
+       case SND_SOC_DAIFMT_NB_NF:
+       default:
+               fsi->bit_clk_inv = 0;
+               fsi->lr_clk_inv = 0;
+               break;
+       }
+
        if (fsi_is_clk_master(fsi)) {
                /*
                 * CAUTION