ASoC: ti: davinci-mcasp: Set unused serializers as INACTIVE
authorPeter Ujfalusi <peter.ujfalusi@ti.com>
Thu, 20 Jun 2019 09:20:01 +0000 (12:20 +0300)
committerMark Brown <broonie@kernel.org>
Thu, 20 Jun 2019 11:59:17 +0000 (12:59 +0100)
Unused serializers needs to be configured as INACTIVE, otherwise they will
underflow/overflow when multiple serializers are connected, but some are
not needed for the given stream.

Signed-off-by: Peter Ujfalusi <peter.ujfalusi@ti.com>
Signed-off-by: Mark Brown <broonie@kernel.org>
sound/soc/ti/davinci-mcasp.c

index a8378d223a9e9df3daa80a0010e37edb9a2653fc..8bec0dc4f75489018bc51877c311c5f5b31862c6 100644 (file)
@@ -848,14 +848,15 @@ static int mcasp_common_hw_param(struct davinci_mcasp *mcasp, int stream,
                                        rx_ser < max_active_serializers) {
                        clear_bit(PIN_BIT_AXR(i), &mcasp->pdir);
                        rx_ser++;
-               } else if (mcasp->serial_dir[i] == INACTIVE_MODE) {
+               } else {
+                       /* Inactive or unused pin, set it to inactive */
                        mcasp_mod_bits(mcasp, DAVINCI_MCASP_XRSRCTL_REG(i),
                                       SRMOD_INACTIVE, SRMOD_MASK);
-                       clear_bit(PIN_BIT_AXR(i), &mcasp->pdir);
-               } else if (mcasp->serial_dir[i] == TX_MODE) {
-                       /* Unused TX pins, clear PDIR  */
-                       mcasp_mod_bits(mcasp, DAVINCI_MCASP_XRSRCTL_REG(i),
-                                      mcasp->dismod, DISMOD_MASK);
+                       /* If unused, set DISMOD for the pin */
+                       if (mcasp->serial_dir[i] != INACTIVE_MODE)
+                               mcasp_mod_bits(mcasp,
+                                              DAVINCI_MCASP_XRSRCTL_REG(i),
+                                              mcasp->dismod, DISMOD_MASK);
                        clear_bit(PIN_BIT_AXR(i), &mcasp->pdir);
                }
        }
@@ -965,6 +966,7 @@ static int mcasp_i2s_hw_param(struct davinci_mcasp *mcasp, int stream,
                for (i = 0; i < active_slots; i++)
                        mask |= (1 << i);
        }
+
        mcasp_clr_bits(mcasp, DAVINCI_MCASP_ACLKXCTL_REG, TX_ASYNC);
 
        if (!mcasp->dat_port)