Commit d143a69f authored by Mark Brown's avatar Mark Brown

Merge remote-tracking branch 'asoc/for-5.12' into asoc-linus

parents bf05bf16 a89f3a93
...@@ -264,8 +264,7 @@ static struct snd_soc_dai_driver acp3x_i2s_dai = { ...@@ -264,8 +264,7 @@ static struct snd_soc_dai_driver acp3x_i2s_dai = {
.playback = { .playback = {
.rates = SNDRV_PCM_RATE_8000_96000, .rates = SNDRV_PCM_RATE_8000_96000,
.formats = SNDRV_PCM_FMTBIT_S16_LE | SNDRV_PCM_FMTBIT_S8 | .formats = SNDRV_PCM_FMTBIT_S16_LE | SNDRV_PCM_FMTBIT_S8 |
SNDRV_PCM_FMTBIT_U8 | SNDRV_PCM_FMTBIT_S24_LE | SNDRV_PCM_FMTBIT_U8 | SNDRV_PCM_FMTBIT_S32_LE,
SNDRV_PCM_FMTBIT_S32_LE,
.channels_min = 2, .channels_min = 2,
.channels_max = 8, .channels_max = 8,
.rate_min = 8000, .rate_min = 8000,
...@@ -274,8 +273,7 @@ static struct snd_soc_dai_driver acp3x_i2s_dai = { ...@@ -274,8 +273,7 @@ static struct snd_soc_dai_driver acp3x_i2s_dai = {
.capture = { .capture = {
.rates = SNDRV_PCM_RATE_8000_48000, .rates = SNDRV_PCM_RATE_8000_48000,
.formats = SNDRV_PCM_FMTBIT_S16_LE | SNDRV_PCM_FMTBIT_S8 | .formats = SNDRV_PCM_FMTBIT_S16_LE | SNDRV_PCM_FMTBIT_S8 |
SNDRV_PCM_FMTBIT_U8 | SNDRV_PCM_FMTBIT_S24_LE | SNDRV_PCM_FMTBIT_U8 | SNDRV_PCM_FMTBIT_S32_LE,
SNDRV_PCM_FMTBIT_S32_LE,
.channels_min = 2, .channels_min = 2,
.channels_max = 2, .channels_max = 2,
.rate_min = 8000, .rate_min = 8000,
......
...@@ -24,8 +24,7 @@ static const struct snd_pcm_hardware acp3x_pcm_hardware_playback = { ...@@ -24,8 +24,7 @@ static const struct snd_pcm_hardware acp3x_pcm_hardware_playback = {
SNDRV_PCM_INFO_MMAP | SNDRV_PCM_INFO_MMAP_VALID | SNDRV_PCM_INFO_MMAP | SNDRV_PCM_INFO_MMAP_VALID |
SNDRV_PCM_INFO_PAUSE | SNDRV_PCM_INFO_RESUME, SNDRV_PCM_INFO_PAUSE | SNDRV_PCM_INFO_RESUME,
.formats = SNDRV_PCM_FMTBIT_S16_LE | SNDRV_PCM_FMTBIT_S8 | .formats = SNDRV_PCM_FMTBIT_S16_LE | SNDRV_PCM_FMTBIT_S8 |
SNDRV_PCM_FMTBIT_U8 | SNDRV_PCM_FMTBIT_S24_LE | SNDRV_PCM_FMTBIT_U8 | SNDRV_PCM_FMTBIT_S32_LE,
SNDRV_PCM_FMTBIT_S32_LE,
.channels_min = 2, .channels_min = 2,
.channels_max = 8, .channels_max = 8,
.rates = SNDRV_PCM_RATE_8000_96000, .rates = SNDRV_PCM_RATE_8000_96000,
...@@ -45,8 +44,7 @@ static const struct snd_pcm_hardware acp3x_pcm_hardware_capture = { ...@@ -45,8 +44,7 @@ static const struct snd_pcm_hardware acp3x_pcm_hardware_capture = {
SNDRV_PCM_INFO_MMAP | SNDRV_PCM_INFO_MMAP_VALID | SNDRV_PCM_INFO_MMAP | SNDRV_PCM_INFO_MMAP_VALID |
SNDRV_PCM_INFO_PAUSE | SNDRV_PCM_INFO_RESUME, SNDRV_PCM_INFO_PAUSE | SNDRV_PCM_INFO_RESUME,
.formats = SNDRV_PCM_FMTBIT_S16_LE | SNDRV_PCM_FMTBIT_S8 | .formats = SNDRV_PCM_FMTBIT_S16_LE | SNDRV_PCM_FMTBIT_S8 |
SNDRV_PCM_FMTBIT_U8 | SNDRV_PCM_FMTBIT_S24_LE | SNDRV_PCM_FMTBIT_U8 | SNDRV_PCM_FMTBIT_S32_LE,
SNDRV_PCM_FMTBIT_S32_LE,
.channels_min = 2, .channels_min = 2,
.channels_max = 2, .channels_max = 2,
.rates = SNDRV_PCM_RATE_8000_48000, .rates = SNDRV_PCM_RATE_8000_48000,
......
...@@ -553,6 +553,7 @@ static int adau17x1_set_dai_fmt(struct snd_soc_dai *dai, ...@@ -553,6 +553,7 @@ static int adau17x1_set_dai_fmt(struct snd_soc_dai *dai,
{ {
struct adau *adau = snd_soc_component_get_drvdata(dai->component); struct adau *adau = snd_soc_component_get_drvdata(dai->component);
unsigned int ctrl0, ctrl1; unsigned int ctrl0, ctrl1;
unsigned int ctrl0_mask;
int lrclk_pol; int lrclk_pol;
switch (fmt & SND_SOC_DAIFMT_MASTER_MASK) { switch (fmt & SND_SOC_DAIFMT_MASTER_MASK) {
...@@ -612,8 +613,16 @@ static int adau17x1_set_dai_fmt(struct snd_soc_dai *dai, ...@@ -612,8 +613,16 @@ static int adau17x1_set_dai_fmt(struct snd_soc_dai *dai,
if (lrclk_pol) if (lrclk_pol)
ctrl0 |= ADAU17X1_SERIAL_PORT0_LRCLK_POL; ctrl0 |= ADAU17X1_SERIAL_PORT0_LRCLK_POL;
regmap_write(adau->regmap, ADAU17X1_SERIAL_PORT0, ctrl0); /* Set the mask to update all relevant bits in ADAU17X1_SERIAL_PORT0 */
regmap_write(adau->regmap, ADAU17X1_SERIAL_PORT1, ctrl1); ctrl0_mask = ADAU17X1_SERIAL_PORT0_MASTER |
ADAU17X1_SERIAL_PORT0_LRCLK_POL |
ADAU17X1_SERIAL_PORT0_BCLK_POL |
ADAU17X1_SERIAL_PORT0_PULSE_MODE;
regmap_update_bits(adau->regmap, ADAU17X1_SERIAL_PORT0, ctrl0_mask,
ctrl0);
regmap_update_bits(adau->regmap, ADAU17X1_SERIAL_PORT1,
ADAU17X1_SERIAL_PORT1_DELAY_MASK, ctrl1);
adau->dai_fmt = fmt & SND_SOC_DAIFMT_FORMAT_MASK; adau->dai_fmt = fmt & SND_SOC_DAIFMT_FORMAT_MASK;
......
...@@ -2239,18 +2239,9 @@ static int rt1011_calibrate(struct rt1011_priv *rt1011, unsigned char cali_flag) ...@@ -2239,18 +2239,9 @@ static int rt1011_calibrate(struct rt1011_priv *rt1011, unsigned char cali_flag)
dc_offset |= (value & 0xffff); dc_offset |= (value & 0xffff);
dev_info(dev, "Gain1 offset=0x%x\n", dc_offset); dev_info(dev, "Gain1 offset=0x%x\n", dc_offset);
/* check the package info. */
regmap_read(rt1011->regmap, RT1011_EFUSE_MATCH_DONE, &value);
if (value & 0x4)
rt1011->pack_id = 1;
if (cali_flag) { if (cali_flag) {
if (rt1011->pack_id)
regmap_write(rt1011->regmap, RT1011_ADC_SET_1, 0x292c);
else
regmap_write(rt1011->regmap, RT1011_ADC_SET_1, 0x2925); regmap_write(rt1011->regmap, RT1011_ADC_SET_1, 0x2925);
/* Class D on */ /* Class D on */
regmap_write(rt1011->regmap, RT1011_CLASS_D_POS, 0x010e); regmap_write(rt1011->regmap, RT1011_CLASS_D_POS, 0x010e);
regmap_write(rt1011->regmap, regmap_write(rt1011->regmap,
...@@ -2376,9 +2367,6 @@ static void rt1011_calibration_work(struct work_struct *work) ...@@ -2376,9 +2367,6 @@ static void rt1011_calibration_work(struct work_struct *work)
rt1011_r0_load(rt1011); rt1011_r0_load(rt1011);
} }
if (rt1011->pack_id)
snd_soc_component_write(component, RT1011_ADC_SET_1, 0x292c);
else
snd_soc_component_write(component, RT1011_ADC_SET_1, 0x2925); snd_soc_component_write(component, RT1011_ADC_SET_1, 0x2925);
} }
......
...@@ -692,7 +692,6 @@ struct rt1011_priv { ...@@ -692,7 +692,6 @@ struct rt1011_priv {
unsigned int r0_reg, cali_done; unsigned int r0_reg, cali_done;
unsigned int r0_calib, temperature_calib; unsigned int r0_calib, temperature_calib;
int recv_spk_mode; int recv_spk_mode;
unsigned int pack_id; /* 0: WLCSP; 1: QFN */
}; };
#endif /* end of _RT1011_H_ */ #endif /* end of _RT1011_H_ */
...@@ -171,6 +171,9 @@ static bool rt286_readable_register(struct device *dev, unsigned int reg) ...@@ -171,6 +171,9 @@ static bool rt286_readable_register(struct device *dev, unsigned int reg)
case RT286_PROC_COEF: case RT286_PROC_COEF:
case RT286_SET_AMP_GAIN_ADC_IN1: case RT286_SET_AMP_GAIN_ADC_IN1:
case RT286_SET_AMP_GAIN_ADC_IN2: case RT286_SET_AMP_GAIN_ADC_IN2:
case RT286_SET_GPIO_MASK:
case RT286_SET_GPIO_DIRECTION:
case RT286_SET_GPIO_DATA:
case RT286_SET_POWER(RT286_DAC_OUT1): case RT286_SET_POWER(RT286_DAC_OUT1):
case RT286_SET_POWER(RT286_DAC_OUT2): case RT286_SET_POWER(RT286_DAC_OUT2):
case RT286_SET_POWER(RT286_ADC_IN1): case RT286_SET_POWER(RT286_ADC_IN1):
...@@ -1204,7 +1207,7 @@ static int rt286_i2c_probe(struct i2c_client *i2c, ...@@ -1204,7 +1207,7 @@ static int rt286_i2c_probe(struct i2c_client *i2c,
mdelay(10); mdelay(10);
if (!rt286->pdata.gpio2_en) if (!rt286->pdata.gpio2_en)
regmap_write(rt286->regmap, RT286_SET_DMIC2_DEFAULT, 0x4000); regmap_write(rt286->regmap, RT286_SET_DMIC2_DEFAULT, 0x40);
else else
regmap_write(rt286->regmap, RT286_SET_DMIC2_DEFAULT, 0); regmap_write(rt286->regmap, RT286_SET_DMIC2_DEFAULT, 0);
......
...@@ -730,8 +730,10 @@ static int tas2552_probe(struct i2c_client *client, ...@@ -730,8 +730,10 @@ static int tas2552_probe(struct i2c_client *client,
ret = devm_snd_soc_register_component(&client->dev, ret = devm_snd_soc_register_component(&client->dev,
&soc_component_dev_tas2552, &soc_component_dev_tas2552,
tas2552_dai, ARRAY_SIZE(tas2552_dai)); tas2552_dai, ARRAY_SIZE(tas2552_dai));
if (ret < 0) if (ret < 0) {
dev_err(&client->dev, "Failed to register component: %d\n", ret); dev_err(&client->dev, "Failed to register component: %d\n", ret);
pm_runtime_get_noresume(&client->dev);
}
return ret; return ret;
} }
......
...@@ -577,12 +577,12 @@ static const struct regmap_range_cfg aic32x4_regmap_pages[] = { ...@@ -577,12 +577,12 @@ static const struct regmap_range_cfg aic32x4_regmap_pages[] = {
.window_start = 0, .window_start = 0,
.window_len = 128, .window_len = 128,
.range_min = 0, .range_min = 0,
.range_max = AIC32X4_RMICPGAVOL, .range_max = AIC32X4_REFPOWERUP,
}, },
}; };
const struct regmap_config aic32x4_regmap_config = { const struct regmap_config aic32x4_regmap_config = {
.max_register = AIC32X4_RMICPGAVOL, .max_register = AIC32X4_REFPOWERUP,
.ranges = aic32x4_regmap_pages, .ranges = aic32x4_regmap_pages,
.num_ranges = ARRAY_SIZE(aic32x4_regmap_pages), .num_ranges = ARRAY_SIZE(aic32x4_regmap_pages),
}; };
...@@ -1243,6 +1243,10 @@ int aic32x4_probe(struct device *dev, struct regmap *regmap) ...@@ -1243,6 +1243,10 @@ int aic32x4_probe(struct device *dev, struct regmap *regmap)
if (ret) if (ret)
goto err_disable_regulators; goto err_disable_regulators;
ret = aic32x4_register_clocks(dev, aic32x4->mclk_name);
if (ret)
goto err_disable_regulators;
ret = devm_snd_soc_register_component(dev, ret = devm_snd_soc_register_component(dev,
&soc_component_dev_aic32x4, &aic32x4_dai, 1); &soc_component_dev_aic32x4, &aic32x4_dai, 1);
if (ret) { if (ret) {
...@@ -1250,10 +1254,6 @@ int aic32x4_probe(struct device *dev, struct regmap *regmap) ...@@ -1250,10 +1254,6 @@ int aic32x4_probe(struct device *dev, struct regmap *regmap)
goto err_disable_regulators; goto err_disable_regulators;
} }
ret = aic32x4_register_clocks(dev, aic32x4->mclk_name);
if (ret)
goto err_disable_regulators;
return 0; return 0;
err_disable_regulators: err_disable_regulators:
......
...@@ -282,11 +282,33 @@ static int kabylake_ssp_fixup(struct snd_soc_pcm_runtime *rtd, ...@@ -282,11 +282,33 @@ static int kabylake_ssp_fixup(struct snd_soc_pcm_runtime *rtd,
struct snd_interval *chan = hw_param_interval(params, struct snd_interval *chan = hw_param_interval(params,
SNDRV_PCM_HW_PARAM_CHANNELS); SNDRV_PCM_HW_PARAM_CHANNELS);
struct snd_mask *fmt = hw_param_mask(params, SNDRV_PCM_HW_PARAM_FORMAT); struct snd_mask *fmt = hw_param_mask(params, SNDRV_PCM_HW_PARAM_FORMAT);
struct snd_soc_dpcm *dpcm = container_of( struct snd_soc_dpcm *dpcm, *rtd_dpcm = NULL;
params, struct snd_soc_dpcm, hw_params);
struct snd_soc_dai_link *fe_dai_link = dpcm->fe->dai_link;
struct snd_soc_dai_link *be_dai_link = dpcm->be->dai_link;
/*
* The following loop will be called only for playback stream
* In this platform, there is only one playback device on every SSP
*/
for_each_dpcm_fe(rtd, SNDRV_PCM_STREAM_PLAYBACK, dpcm) {
rtd_dpcm = dpcm;
break;
}
/*
* This following loop will be called only for capture stream
* In this platform, there is only one capture device on every SSP
*/
for_each_dpcm_fe(rtd, SNDRV_PCM_STREAM_CAPTURE, dpcm) {
rtd_dpcm = dpcm;
break;
}
if (!rtd_dpcm)
return -EINVAL;
/*
* The above 2 loops are mutually exclusive based on the stream direction,
* thus rtd_dpcm variable will never be overwritten
*/
/* /*
* Topology for kblda7219m98373 & kblmax98373 supports only S24_LE, * Topology for kblda7219m98373 & kblmax98373 supports only S24_LE,
* where as kblda7219m98927 & kblmax98927 supports S16_LE by default. * where as kblda7219m98927 & kblmax98927 supports S16_LE by default.
...@@ -309,9 +331,9 @@ static int kabylake_ssp_fixup(struct snd_soc_pcm_runtime *rtd, ...@@ -309,9 +331,9 @@ static int kabylake_ssp_fixup(struct snd_soc_pcm_runtime *rtd,
/* /*
* The ADSP will convert the FE rate to 48k, stereo, 24 bit * The ADSP will convert the FE rate to 48k, stereo, 24 bit
*/ */
if (!strcmp(fe_dai_link->name, "Kbl Audio Port") || if (!strcmp(rtd_dpcm->fe->dai_link->name, "Kbl Audio Port") ||
!strcmp(fe_dai_link->name, "Kbl Audio Headset Playback") || !strcmp(rtd_dpcm->fe->dai_link->name, "Kbl Audio Headset Playback") ||
!strcmp(fe_dai_link->name, "Kbl Audio Capture Port")) { !strcmp(rtd_dpcm->fe->dai_link->name, "Kbl Audio Capture Port")) {
rate->min = rate->max = 48000; rate->min = rate->max = 48000;
chan->min = chan->max = 2; chan->min = chan->max = 2;
snd_mask_none(fmt); snd_mask_none(fmt);
...@@ -322,7 +344,7 @@ static int kabylake_ssp_fixup(struct snd_soc_pcm_runtime *rtd, ...@@ -322,7 +344,7 @@ static int kabylake_ssp_fixup(struct snd_soc_pcm_runtime *rtd,
* The speaker on the SSP0 supports S16_LE and not S24_LE. * The speaker on the SSP0 supports S16_LE and not S24_LE.
* thus changing the mask here * thus changing the mask here
*/ */
if (!strcmp(be_dai_link->name, "SSP0-Codec")) if (!strcmp(rtd_dpcm->be->dai_link->name, "SSP0-Codec"))
snd_mask_set_format(fmt, SNDRV_PCM_FORMAT_S16_LE); snd_mask_set_format(fmt, SNDRV_PCM_FORMAT_S16_LE);
return 0; return 0;
......
...@@ -105,14 +105,15 @@ static unsigned int kmb_pcm_tx_fn(struct kmb_i2s_info *kmb_i2s, ...@@ -105,14 +105,15 @@ static unsigned int kmb_pcm_tx_fn(struct kmb_i2s_info *kmb_i2s,
void *buf = runtime->dma_area; void *buf = runtime->dma_area;
int i; int i;
if (kmb_i2s->iec958_fmt)
hdmi_reformat_iec958(runtime, kmb_i2s, tx_ptr);
/* KMB i2s uses two separate L/R FIFO */ /* KMB i2s uses two separate L/R FIFO */
for (i = 0; i < kmb_i2s->fifo_th; i++) { for (i = 0; i < kmb_i2s->fifo_th; i++) {
if (kmb_i2s->config.data_width == 16) { if (kmb_i2s->config.data_width == 16) {
writel(((u16(*)[2])buf)[tx_ptr][0], i2s_base + LRBR_LTHR(0)); writel(((u16(*)[2])buf)[tx_ptr][0], i2s_base + LRBR_LTHR(0));
writel(((u16(*)[2])buf)[tx_ptr][1], i2s_base + RRBR_RTHR(0)); writel(((u16(*)[2])buf)[tx_ptr][1], i2s_base + RRBR_RTHR(0));
} else { } else {
if (kmb_i2s->iec958_fmt)
hdmi_reformat_iec958(runtime, kmb_i2s, tx_ptr);
writel(((u32(*)[2])buf)[tx_ptr][0], i2s_base + LRBR_LTHR(0)); writel(((u32(*)[2])buf)[tx_ptr][0], i2s_base + LRBR_LTHR(0));
writel(((u32(*)[2])buf)[tx_ptr][1], i2s_base + RRBR_RTHR(0)); writel(((u32(*)[2])buf)[tx_ptr][1], i2s_base + RRBR_RTHR(0));
} }
......
...@@ -11,6 +11,7 @@ ...@@ -11,6 +11,7 @@
#include <linux/regmap.h> #include <linux/regmap.h>
#include <linux/module.h> #include <linux/module.h>
#include <linux/of_platform.h> #include <linux/of_platform.h>
#include <sound/pcm_params.h>
#include <sound/soc.h> #include <sound/soc.h>
#include <sound/soc-dai.h> #include <sound/soc-dai.h>
...@@ -46,11 +47,28 @@ static int g12a_frddr_dai_prepare(struct snd_pcm_substream *substream, ...@@ -46,11 +47,28 @@ static int g12a_frddr_dai_prepare(struct snd_pcm_substream *substream,
return 0; return 0;
} }
static int axg_frddr_dai_hw_params(struct snd_pcm_substream *substream,
struct snd_pcm_hw_params *params,
struct snd_soc_dai *dai)
{
struct axg_fifo *fifo = snd_soc_dai_get_drvdata(dai);
unsigned int period, depth, val;
period = params_period_bytes(params);
/* Trim the FIFO depth if the period is small to improve latency */
depth = min(period, fifo->depth);
val = (depth / AXG_FIFO_BURST) - 1;
regmap_update_bits(fifo->map, FIFO_CTRL1, CTRL1_FRDDR_DEPTH_MASK,
CTRL1_FRDDR_DEPTH(val));
return 0;
}
static int axg_frddr_dai_startup(struct snd_pcm_substream *substream, static int axg_frddr_dai_startup(struct snd_pcm_substream *substream,
struct snd_soc_dai *dai) struct snd_soc_dai *dai)
{ {
struct axg_fifo *fifo = snd_soc_dai_get_drvdata(dai); struct axg_fifo *fifo = snd_soc_dai_get_drvdata(dai);
unsigned int val;
int ret; int ret;
/* Enable pclk to access registers and clock the fifo ip */ /* Enable pclk to access registers and clock the fifo ip */
...@@ -61,11 +79,6 @@ static int axg_frddr_dai_startup(struct snd_pcm_substream *substream, ...@@ -61,11 +79,6 @@ static int axg_frddr_dai_startup(struct snd_pcm_substream *substream,
/* Apply single buffer mode to the interface */ /* Apply single buffer mode to the interface */
regmap_update_bits(fifo->map, FIFO_CTRL0, CTRL0_FRDDR_PP_MODE, 0); regmap_update_bits(fifo->map, FIFO_CTRL0, CTRL0_FRDDR_PP_MODE, 0);
/* Use all fifo depth */
val = (fifo->depth / AXG_FIFO_BURST) - 1;
regmap_update_bits(fifo->map, FIFO_CTRL1, CTRL1_FRDDR_DEPTH_MASK,
CTRL1_FRDDR_DEPTH(val));
return 0; return 0;
} }
...@@ -84,6 +97,7 @@ static int axg_frddr_pcm_new(struct snd_soc_pcm_runtime *rtd, ...@@ -84,6 +97,7 @@ static int axg_frddr_pcm_new(struct snd_soc_pcm_runtime *rtd,
} }
static const struct snd_soc_dai_ops axg_frddr_ops = { static const struct snd_soc_dai_ops axg_frddr_ops = {
.hw_params = axg_frddr_dai_hw_params,
.startup = axg_frddr_dai_startup, .startup = axg_frddr_dai_startup,
.shutdown = axg_frddr_dai_shutdown, .shutdown = axg_frddr_dai_shutdown,
}; };
...@@ -157,6 +171,7 @@ static const struct axg_fifo_match_data axg_frddr_match_data = { ...@@ -157,6 +171,7 @@ static const struct axg_fifo_match_data axg_frddr_match_data = {
static const struct snd_soc_dai_ops g12a_frddr_ops = { static const struct snd_soc_dai_ops g12a_frddr_ops = {
.prepare = g12a_frddr_dai_prepare, .prepare = g12a_frddr_dai_prepare,
.hw_params = axg_frddr_dai_hw_params,
.startup = axg_frddr_dai_startup, .startup = axg_frddr_dai_startup,
.shutdown = axg_frddr_dai_shutdown, .shutdown = axg_frddr_dai_shutdown,
}; };
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment