ASoC: uniphier: fix broken sound if use SRC in replay
authorKatsuhiro Suzuki <suzuki.katsuhiro@socionext.com>
Fri, 23 Feb 2018 12:17:01 +0000 (21:17 +0900)
committerMark Brown <broonie@kernel.org>
Mon, 26 Feb 2018 10:19:02 +0000 (10:19 +0000)
This patch fixes settings for ports with SRC. These ports need to
set the fixed audio rate and clock. If not, the SRC outputs broken
sound.

Signed-off-by: Katsuhiro Suzuki <suzuki.katsuhiro@socionext.com>
Signed-off-by: Mark Brown <broonie@kernel.org>
sound/soc/uniphier/aio-core.c

index 1e5f053d9f6bff6b081b92b3ae7c214856c49c78..1711361fc0c267f95bd3b1637713d7827d8b1d82 100644 (file)
@@ -501,7 +501,7 @@ int aio_port_set_clk(struct uniphier_aio_sub *sub)
                                OPORTMXCTR2_MSSEL_MASTER |
                                OPORTMXCTR2_EXTLSIFSSEL_36 |
                                OPORTMXCTR2_DACCKSEL_1_2;
-               } else {
+               } else if (sub->swm->type == PORT_TYPE_SPDIF) {
                        if (sub->aio->pll_out >= ARRAY_SIZE(v_pll)) {
                                dev_err(dev, "PLL(%d) is invalid\n",
                                        sub->aio->pll_out);
@@ -521,6 +521,11 @@ int aio_port_set_clk(struct uniphier_aio_sub *sub)
                                v |= OPORTMXCTR2_EXTLSIFSSEL_24;
                                break;
                        }
+               } else {
+                       v = OPORTMXCTR2_ACLKSEL_A1 |
+                               OPORTMXCTR2_MSSEL_MASTER |
+                               OPORTMXCTR2_EXTLSIFSSEL_36 |
+                               OPORTMXCTR2_DACCKSEL_1_2;
                }
                regmap_write(r, OPORTMXCTR2(sub->swm->oport.map), v);
        } else {
@@ -550,11 +555,19 @@ int aio_port_set_param(struct uniphier_aio_sub *sub, int pass_through,
                       const struct snd_pcm_hw_params *params)
 {
        struct regmap *r = sub->aio->chip->regmap;
+       unsigned int rate;
        u32 v;
        int ret;
 
        if (!pass_through) {
-               ret = aio_port_set_rate(sub, params_rate(params));
+               if (sub->swm->type == PORT_TYPE_EVE ||
+                   sub->swm->type == PORT_TYPE_CONV) {
+                       rate = 48000;
+               } else {
+                       rate = params_rate(params);
+               }
+
+               ret = aio_port_set_rate(sub, rate);
                if (ret)
                        return ret;