ASoC: sun4i-i2s: Support more channels
authorMaxime Ripard <maxime.ripard@bootlin.com>
Mon, 19 Aug 2019 19:25:26 +0000 (21:25 +0200)
committerMark Brown <broonie@kernel.org>
Tue, 20 Aug 2019 17:34:29 +0000 (18:34 +0100)
We've been limited to 2 channels in the driver while the controller
supports from 1 to 8 channels, in both capture and playback. let's remove
the hardcoded checks and numbers, and extend the range of channel numbers
we can use.

Signed-off-by: Maxime Ripard <maxime.ripard@bootlin.com>
Link: https://lore.kernel.org/r/27d9de5cd56f3a544851b8cd8af08bf836d19637.1566242458.git-series.maxime.ripard@bootlin.com
Signed-off-by: Mark Brown <broonie@kernel.org>
sound/soc/sunxi/sun4i-i2s.c

index 6b172dfbc25d085c68475f4662bfa2687e397a3a..9e691baee1e81b9a44c6539ed1b7c42bc5815272 100644 (file)
@@ -400,9 +400,6 @@ static int sun4i_i2s_set_chan_cfg(const struct sun4i_i2s *i2s,
 {
        unsigned int channels = params_channels(params);
 
-       if (channels != 2)
-               return -EINVAL;
-
        /* Map the channels for playback and capture */
        regmap_write(i2s->regmap, SUN4I_I2S_TX_CHAN_MAP_REG, 0x76543210);
        regmap_write(i2s->regmap, SUN4I_I2S_RX_CHAN_MAP_REG, 0x00003210);
@@ -423,9 +420,6 @@ static int sun8i_i2s_set_chan_cfg(const struct sun4i_i2s *i2s,
 {
        unsigned int channels = params_channels(params);
 
-       if (channels != 2)
-               return -EINVAL;
-
        /* Map the channels for playback and capture */
        regmap_write(i2s->regmap, SUN8I_I2S_TX_CHAN_MAP_REG, 0x76543210);
        regmap_write(i2s->regmap, SUN8I_I2S_RX_CHAN_MAP_REG, 0x76543210);
@@ -458,6 +452,7 @@ static int sun4i_i2s_hw_params(struct snd_pcm_substream *substream,
                               struct snd_soc_dai *dai)
 {
        struct sun4i_i2s *i2s = snd_soc_dai_get_drvdata(dai);
+       unsigned int channels = params_channels(params);
        int ret, sr, wss;
        u32 width;
 
@@ -490,7 +485,7 @@ static int sun4i_i2s_hw_params(struct snd_pcm_substream *substream,
        regmap_field_write(i2s->field_fmt_sr, sr);
 
        return sun4i_i2s_set_clk_rate(dai, params_rate(params),
-                                     2, params_width(params));
+                                     channels, params_width(params));
 }
 
 static int sun4i_i2s_set_soc_fmt(const struct sun4i_i2s *i2s,
@@ -814,15 +809,15 @@ static struct snd_soc_dai_driver sun4i_i2s_dai = {
        .probe = sun4i_i2s_dai_probe,
        .capture = {
                .stream_name = "Capture",
-               .channels_min = 2,
-               .channels_max = 2,
+               .channels_min = 1,
+               .channels_max = 8,
                .rates = SNDRV_PCM_RATE_8000_192000,
                .formats = SNDRV_PCM_FMTBIT_S16_LE,
        },
        .playback = {
                .stream_name = "Playback",
-               .channels_min = 2,
-               .channels_max = 2,
+               .channels_min = 1,
+               .channels_max = 8,
                .rates = SNDRV_PCM_RATE_8000_192000,
                .formats = SNDRV_PCM_FMTBIT_S16_LE,
        },