select SND_SOC_MAX98925 if I2C
select SND_SOC_MAX98926 if I2C
select SND_SOC_MAX98927 if I2C
+++++ select SND_SOC_MAX98373 if I2C
select SND_SOC_MAX9850 if I2C
select SND_SOC_MAX9860 if I2C
select SND_SOC_MAX9768 if I2C
select SND_SOC_PCM1681 if I2C
select SND_SOC_PCM179X_I2C if I2C
select SND_SOC_PCM179X_SPI if SPI_MASTER
+++++ select SND_SOC_PCM186X_I2C if I2C
+++++ select SND_SOC_PCM186X_SPI if SPI_MASTER
select SND_SOC_PCM3008
select SND_SOC_PCM3168A_I2C if I2C
select SND_SOC_PCM3168A_SPI if SPI_MASTER
select SND_SOC_TAS5086 if I2C
select SND_SOC_TAS571X if I2C
select SND_SOC_TAS5720 if I2C
+++++ select SND_SOC_TAS6424 if I2C
select SND_SOC_TFA9879 if I2C
select SND_SOC_TLV320AIC23_I2C if I2C
select SND_SOC_TLV320AIC23_SPI if SPI_MASTER
tristate "Maxim Integrated MAX98927 Speaker Amplifier"
depends on I2C
+++++config SND_SOC_MAX98373
+++++ tristate "Maxim Integrated MAX98373 Speaker Amplifier"
+++++ depends on I2C
+++++
config SND_SOC_MAX9850
tristate
Enable support for Texas Instruments PCM179x CODEC.
Select this if your PCM179x is connected via an SPI bus.
+++++config SND_SOC_PCM186X
+++++ tristate
+++++
+++++config SND_SOC_PCM186X_I2C
+++++ tristate "Texas Instruments PCM186x CODECs - I2C"
+++++ depends on I2C
+++++ select SND_SOC_PCM186X
+++++ select REGMAP_I2C
+++++
+++++config SND_SOC_PCM186X_SPI
+++++ tristate "Texas Instruments PCM186x CODECs - SPI"
+++++ depends on SPI_MASTER
+++++ select SND_SOC_PCM186X
+++++ select REGMAP_SPI
+++++
config SND_SOC_PCM3008
tristate
Enable support for Texas Instruments TAS5720L/M high-efficiency mono
Class-D audio power amplifiers.
+++++ config SND_SOC_TAS6424
+++++ tristate "Texas Instruments TAS6424 Quad-Channel Audio amplifier"
+++++ depends on I2C
+++++ help
+++++ Enable support for Texas Instruments TAS6424 high-efficiency
+++++ digital input quad-channel Class-D audio power amplifiers.
+++++
config SND_SOC_TFA9879
tristate "NXP Semiconductors TFA9879 amplifier"
depends on I2C
snd-soc-max98925-objs := max98925.o
snd-soc-max98926-objs := max98926.o
snd-soc-max98927-objs := max98927.o
+++++snd-soc-max98373-objs := max98373.o
snd-soc-max9850-objs := max9850.o
snd-soc-max9860-objs := max9860.o
snd-soc-mc13783-objs := mc13783.o
snd-soc-pcm179x-codec-objs := pcm179x.o
snd-soc-pcm179x-i2c-objs := pcm179x-i2c.o
snd-soc-pcm179x-spi-objs := pcm179x-spi.o
+++++snd-soc-pcm186x-objs := pcm186x.o
+++++snd-soc-pcm186x-i2c-objs := pcm186x-i2c.o
+++++snd-soc-pcm186x-spi-objs := pcm186x-spi.o
snd-soc-pcm3008-objs := pcm3008.o
snd-soc-pcm3168a-objs := pcm3168a.o
snd-soc-pcm3168a-i2c-objs := pcm3168a-i2c.o
snd-soc-tas5086-objs := tas5086.o
snd-soc-tas571x-objs := tas571x.o
snd-soc-tas5720-objs := tas5720.o
+++++ snd-soc-tas6424-objs := tas6424.o
snd-soc-tfa9879-objs := tfa9879.o
snd-soc-tlv320aic23-objs := tlv320aic23.o
snd-soc-tlv320aic23-i2c-objs := tlv320aic23-i2c.o
obj-$(CONFIG_SND_SOC_MAX98925) += snd-soc-max98925.o
obj-$(CONFIG_SND_SOC_MAX98926) += snd-soc-max98926.o
obj-$(CONFIG_SND_SOC_MAX98927) += snd-soc-max98927.o
+++++obj-$(CONFIG_SND_SOC_MAX98373) += snd-soc-max98373.o
obj-$(CONFIG_SND_SOC_MAX9850) += snd-soc-max9850.o
obj-$(CONFIG_SND_SOC_MAX9860) += snd-soc-max9860.o
obj-$(CONFIG_SND_SOC_MC13783) += snd-soc-mc13783.o
obj-$(CONFIG_SND_SOC_PCM179X) += snd-soc-pcm179x-codec.o
obj-$(CONFIG_SND_SOC_PCM179X_I2C) += snd-soc-pcm179x-i2c.o
obj-$(CONFIG_SND_SOC_PCM179X_SPI) += snd-soc-pcm179x-spi.o
+++++obj-$(CONFIG_SND_SOC_PCM186X) += snd-soc-pcm186x.o
+++++obj-$(CONFIG_SND_SOC_PCM186X_I2C) += snd-soc-pcm186x-i2c.o
+++++obj-$(CONFIG_SND_SOC_PCM186X_SPI) += snd-soc-pcm186x-spi.o
obj-$(CONFIG_SND_SOC_PCM3008) += snd-soc-pcm3008.o
obj-$(CONFIG_SND_SOC_PCM3168A) += snd-soc-pcm3168a.o
obj-$(CONFIG_SND_SOC_PCM3168A_I2C) += snd-soc-pcm3168a-i2c.o
obj-$(CONFIG_SND_SOC_TAS5086) += snd-soc-tas5086.o
obj-$(CONFIG_SND_SOC_TAS571X) += snd-soc-tas571x.o
obj-$(CONFIG_SND_SOC_TAS5720) += snd-soc-tas5720.o
+++++ obj-$(CONFIG_SND_SOC_TAS6424) += snd-soc-tas6424.o
obj-$(CONFIG_SND_SOC_TFA9879) += snd-soc-tfa9879.o
obj-$(CONFIG_SND_SOC_TLV320AIC23) += snd-soc-tlv320aic23.o
obj-$(CONFIG_SND_SOC_TLV320AIC23_I2C) += snd-soc-tlv320aic23-i2c.o
return false;
}
- ----static int sun4i_i2s_set_clk_rate(struct sun4i_i2s *i2s,
+ ++++static int sun4i_i2s_set_clk_rate(struct snd_soc_dai *dai,
unsigned int rate,
unsigned int word_size)
{
+ ++++ struct sun4i_i2s *i2s = snd_soc_dai_get_drvdata(dai);
unsigned int oversample_rate, clk_rate;
int bclk_div, mclk_div;
int ret;
break;
default:
+ ++++ dev_err(dai->dev, "Unsupported sample rate: %u\n", rate);
return -EINVAL;
}
return ret;
oversample_rate = i2s->mclk_freq / rate;
- ---- if (!sun4i_i2s_oversample_is_valid(oversample_rate))
+ ++++ if (!sun4i_i2s_oversample_is_valid(oversample_rate)) {
+ ++++ dev_err(dai->dev, "Unsupported oversample rate: %d\n",
+ ++++ oversample_rate);
return -EINVAL;
+ ++++ }
bclk_div = sun4i_i2s_get_bclk_div(i2s, oversample_rate,
word_size);
- ---- if (bclk_div < 0)
+ ++++ if (bclk_div < 0) {
+ ++++ dev_err(dai->dev, "Unsupported BCLK divider: %d\n", bclk_div);
return -EINVAL;
+ ++++ }
mclk_div = sun4i_i2s_get_mclk_div(i2s, oversample_rate,
clk_rate, rate);
- ---- if (mclk_div < 0)
+ ++++ if (mclk_div < 0) {
+ ++++ dev_err(dai->dev, "Unsupported MCLK divider: %d\n", mclk_div);
return -EINVAL;
+ ++++ }
/* Adjust the clock division values if needed */
bclk_div += i2s->variant->bclk_offset;
u32 width;
channels = params_channels(params);
- ---- if (channels != 2)
+ ++++ if (channels != 2) {
+ ++++ dev_err(dai->dev, "Unsupported number of channels: %d\n",
+ ++++ channels);
return -EINVAL;
+ ++++ }
if (i2s->variant->has_chcfg) {
regmap_update_bits(i2s->regmap, SUN8I_I2S_CHAN_CFG_REG,
width = DMA_SLAVE_BUSWIDTH_2_BYTES;
break;
default:
+ ++++ dev_err(dai->dev, "Unsupported physical sample width: %d\n",
+ ++++ params_physical_width(params));
return -EINVAL;
}
i2s->playback_dma_data.addr_width = width;
break;
default:
+ ++++ dev_err(dai->dev, "Unsupported sample width: %d\n",
+ ++++ params_width(params));
return -EINVAL;
}
regmap_field_write(i2s->field_fmt_sr,
sr + i2s->variant->fmt_offset);
- ---- return sun4i_i2s_set_clk_rate(i2s, params_rate(params),
+ ++++ return sun4i_i2s_set_clk_rate(dai, params_rate(params),
params_width(params));
}
val = SUN4I_I2S_FMT0_FMT_RIGHT_J;
break;
default:
+ ++++ dev_err(dai->dev, "Unsupported format: %d\n",
+ ++++ fmt & SND_SOC_DAIFMT_FORMAT_MASK);
return -EINVAL;
}
case SND_SOC_DAIFMT_NB_NF:
break;
default:
+ ++++ dev_err(dai->dev, "Unsupported clock polarity: %d\n",
+ ++++ fmt & SND_SOC_DAIFMT_INV_MASK);
return -EINVAL;
}
val = SUN4I_I2S_CTRL_MODE_SLAVE;
break;
default:
+ ++++ dev_err(dai->dev, "Unsupported slave setting: %d\n",
+ ++++ fmt & SND_SOC_DAIFMT_MASTER_MASK);
return -EINVAL;
}
regmap_update_bits(i2s->regmap, SUN4I_I2S_CTRL_REG,
val = 0;
break;
default:
+ ++++ dev_err(dai->dev, "Unsupported slave setting: %d\n",
+ ++++ fmt & SND_SOC_DAIFMT_MASTER_MASK);
return -EINVAL;
}
regmap_update_bits(i2s->regmap, SUN4I_I2S_CTRL_REG,
.field_rxchansel = REG_FIELD(SUN4I_I2S_RX_CHAN_SEL_REG, 0, 2),
};
++ +++static const struct sun4i_i2s_quirks sun8i_a83t_i2s_quirks = {
++ +++ .has_reset = true,
++ +++ .reg_offset_txdata = SUN8I_I2S_FIFO_TX_REG,
++ +++ .sun4i_i2s_regmap = &sun4i_i2s_regmap_config,
++ +++ .field_clkdiv_mclk_en = REG_FIELD(SUN4I_I2S_CLK_DIV_REG, 7, 7),
++ +++ .field_fmt_wss = REG_FIELD(SUN4I_I2S_FMT0_REG, 2, 3),
++ +++ .field_fmt_sr = REG_FIELD(SUN4I_I2S_FMT0_REG, 4, 5),
++ +++ .field_fmt_bclk = REG_FIELD(SUN4I_I2S_FMT0_REG, 6, 6),
++ +++ .field_fmt_lrclk = REG_FIELD(SUN4I_I2S_FMT0_REG, 7, 7),
++ +++ .has_slave_select_bit = true,
++ +++ .field_fmt_mode = REG_FIELD(SUN4I_I2S_FMT0_REG, 0, 1),
++ +++ .field_txchanmap = REG_FIELD(SUN4I_I2S_TX_CHAN_MAP_REG, 0, 31),
++ +++ .field_rxchanmap = REG_FIELD(SUN4I_I2S_RX_CHAN_MAP_REG, 0, 31),
++ +++ .field_txchansel = REG_FIELD(SUN4I_I2S_TX_CHAN_SEL_REG, 0, 2),
++ +++ .field_rxchansel = REG_FIELD(SUN4I_I2S_RX_CHAN_SEL_REG, 0, 2),
++ +++};
++ +++
static const struct sun4i_i2s_quirks sun8i_h3_i2s_quirks = {
.has_reset = true,
.reg_offset_txdata = SUN8I_I2S_FIFO_TX_REG,
.compatible = "allwinner,sun6i-a31-i2s",
.data = &sun6i_a31_i2s_quirks,
},
++ +++ {
++ +++ .compatible = "allwinner,sun8i-a83t-i2s",
++ +++ .data = &sun8i_a83t_i2s_quirks,
++ +++ },
{
.compatible = "allwinner,sun8i-h3-i2s",
.data = &sun8i_h3_i2s_quirks,