]> git.proxmox.com Git - mirror_ubuntu-bionic-kernel.git/commitdiff
ASoC: cirrus: i2s: Fix {TX|RX}LinCtrlData setup
authorAlexander Sverdlin <alexander.sverdlin@gmail.com>
Sat, 28 Apr 2018 20:51:39 +0000 (22:51 +0200)
committerKleber Sacilotto de Souza <kleber.souza@canonical.com>
Mon, 14 Jan 2019 09:28:55 +0000 (09:28 +0000)
BugLink: http://bugs.launchpad.net/bugs/1807469
commit 5d302ed3cc80564fb835bed5fdba1e1250ecc9e5 upstream.

According to "EP93xx User’s Guide", I2STXLinCtrlData and I2SRXLinCtrlData
registers actually have different format. The only currently used bit
(Left_Right_Justify) has different position. Fix this and simplify the
whole setup taking into account the fact that both registers have zero
default value.

The practical effect of the above is repaired SND_SOC_DAIFMT_RIGHT_J
support (currently unused).

Signed-off-by: Alexander Sverdlin <alexander.sverdlin@gmail.com>
Signed-off-by: Mark Brown <broonie@kernel.org>
Cc: stable@vger.kernel.org
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Signed-off-by: Kamal Mostafa <kamal@canonical.com>
Signed-off-by: Khalid Elmously <khalid.elmously@canonical.com>
sound/soc/cirrus/ep93xx-i2s.c

index 38c240c9704174dd1c25b6b6f4eefb191fcd9a9c..0dc3852c46219f1aca029a08b7a46681d0b0a389 100644 (file)
@@ -51,7 +51,9 @@
 #define EP93XX_I2S_WRDLEN_24           (1 << 0)
 #define EP93XX_I2S_WRDLEN_32           (2 << 0)
 
-#define EP93XX_I2S_LINCTRLDATA_R_JUST  (1 << 2) /* Right justify */
+#define EP93XX_I2S_RXLINCTRLDATA_R_JUST        BIT(1) /* Right justify */
+
+#define EP93XX_I2S_TXLINCTRLDATA_R_JUST        BIT(2) /* Right justify */
 
 #define EP93XX_I2S_CLKCFG_LRS          (1 << 0) /* lrclk polarity */
 #define EP93XX_I2S_CLKCFG_CKP          (1 << 1) /* Bit clock polarity */
@@ -170,25 +172,25 @@ static int ep93xx_i2s_set_dai_fmt(struct snd_soc_dai *cpu_dai,
                                  unsigned int fmt)
 {
        struct ep93xx_i2s_info *info = snd_soc_dai_get_drvdata(cpu_dai);
-       unsigned int clk_cfg, lin_ctrl;
+       unsigned int clk_cfg;
+       unsigned int txlin_ctrl = 0;
+       unsigned int rxlin_ctrl = 0;
 
        clk_cfg  = ep93xx_i2s_read_reg(info, EP93XX_I2S_RXCLKCFG);
-       lin_ctrl = ep93xx_i2s_read_reg(info, EP93XX_I2S_RXLINCTRLDATA);
 
        switch (fmt & SND_SOC_DAIFMT_FORMAT_MASK) {
        case SND_SOC_DAIFMT_I2S:
                clk_cfg |= EP93XX_I2S_CLKCFG_REL;
-               lin_ctrl &= ~EP93XX_I2S_LINCTRLDATA_R_JUST;
                break;
 
        case SND_SOC_DAIFMT_LEFT_J:
                clk_cfg &= ~EP93XX_I2S_CLKCFG_REL;
-               lin_ctrl &= ~EP93XX_I2S_LINCTRLDATA_R_JUST;
                break;
 
        case SND_SOC_DAIFMT_RIGHT_J:
                clk_cfg &= ~EP93XX_I2S_CLKCFG_REL;
-               lin_ctrl |= EP93XX_I2S_LINCTRLDATA_R_JUST;
+               rxlin_ctrl |= EP93XX_I2S_RXLINCTRLDATA_R_JUST;
+               txlin_ctrl |= EP93XX_I2S_TXLINCTRLDATA_R_JUST;
                break;
 
        default:
@@ -237,8 +239,8 @@ static int ep93xx_i2s_set_dai_fmt(struct snd_soc_dai *cpu_dai,
        /* Write new register values */
        ep93xx_i2s_write_reg(info, EP93XX_I2S_RXCLKCFG, clk_cfg);
        ep93xx_i2s_write_reg(info, EP93XX_I2S_TXCLKCFG, clk_cfg);
-       ep93xx_i2s_write_reg(info, EP93XX_I2S_RXLINCTRLDATA, lin_ctrl);
-       ep93xx_i2s_write_reg(info, EP93XX_I2S_TXLINCTRLDATA, lin_ctrl);
+       ep93xx_i2s_write_reg(info, EP93XX_I2S_RXLINCTRLDATA, rxlin_ctrl);
+       ep93xx_i2s_write_reg(info, EP93XX_I2S_TXLINCTRLDATA, txlin_ctrl);
        return 0;
 }