diff options
| -rw-r--r-- | sound/soc/amd/raven/acp3x-i2s.c | 6 | ||||
| -rw-r--r-- | sound/soc/amd/raven/acp3x-pcm-dma.c | 6 | ||||
| -rw-r--r-- | sound/soc/codecs/adau17x1.c | 13 | ||||
| -rw-r--r-- | sound/soc/codecs/rt1011.c | 16 | ||||
| -rw-r--r-- | sound/soc/codecs/rt1011.h | 1 | ||||
| -rw-r--r-- | sound/soc/codecs/rt286.c | 5 | ||||
| -rw-r--r-- | sound/soc/codecs/tas2552.c | 4 | ||||
| -rw-r--r-- | sound/soc/codecs/tlv320aic32x4.c | 12 | ||||
| -rw-r--r-- | sound/soc/intel/boards/kbl_da7219_max98927.c | 38 | ||||
| -rw-r--r-- | sound/soc/intel/keembay/kmb_platform.c | 5 | ||||
| -rw-r--r-- | sound/soc/meson/axg-frddr.c | 27 | 
11 files changed, 84 insertions, 49 deletions
diff --git a/sound/soc/amd/raven/acp3x-i2s.c b/sound/soc/amd/raven/acp3x-i2s.c index 5bc028692fcf..2cd93887410c 100644 --- a/sound/soc/amd/raven/acp3x-i2s.c +++ b/sound/soc/amd/raven/acp3x-i2s.c @@ -264,8 +264,7 @@ static struct snd_soc_dai_driver acp3x_i2s_dai = {  	.playback = {  		.rates = SNDRV_PCM_RATE_8000_96000,  		.formats = SNDRV_PCM_FMTBIT_S16_LE | SNDRV_PCM_FMTBIT_S8 | -			SNDRV_PCM_FMTBIT_U8 | SNDRV_PCM_FMTBIT_S24_LE | -			SNDRV_PCM_FMTBIT_S32_LE, +			SNDRV_PCM_FMTBIT_U8 | SNDRV_PCM_FMTBIT_S32_LE,  		.channels_min = 2,  		.channels_max = 8,  		.rate_min = 8000, @@ -274,8 +273,7 @@ static struct snd_soc_dai_driver acp3x_i2s_dai = {  	.capture = {  		.rates = SNDRV_PCM_RATE_8000_48000,  		.formats = SNDRV_PCM_FMTBIT_S16_LE | SNDRV_PCM_FMTBIT_S8 | -			SNDRV_PCM_FMTBIT_U8 | SNDRV_PCM_FMTBIT_S24_LE | -			SNDRV_PCM_FMTBIT_S32_LE, +			SNDRV_PCM_FMTBIT_U8 | SNDRV_PCM_FMTBIT_S32_LE,  		.channels_min = 2,  		.channels_max = 2,  		.rate_min = 8000, diff --git a/sound/soc/amd/raven/acp3x-pcm-dma.c b/sound/soc/amd/raven/acp3x-pcm-dma.c index 417cda24030c..f22bb2bdf527 100644 --- a/sound/soc/amd/raven/acp3x-pcm-dma.c +++ b/sound/soc/amd/raven/acp3x-pcm-dma.c @@ -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_PAUSE | SNDRV_PCM_INFO_RESUME,  	.formats = SNDRV_PCM_FMTBIT_S16_LE |  SNDRV_PCM_FMTBIT_S8 | -		   SNDRV_PCM_FMTBIT_U8 | SNDRV_PCM_FMTBIT_S24_LE | -		   SNDRV_PCM_FMTBIT_S32_LE, +		   SNDRV_PCM_FMTBIT_U8 | SNDRV_PCM_FMTBIT_S32_LE,  	.channels_min = 2,  	.channels_max = 8,  	.rates = SNDRV_PCM_RATE_8000_96000, @@ -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_PAUSE | SNDRV_PCM_INFO_RESUME,  	.formats = SNDRV_PCM_FMTBIT_S16_LE | SNDRV_PCM_FMTBIT_S8 | -		   SNDRV_PCM_FMTBIT_U8 | SNDRV_PCM_FMTBIT_S24_LE | -		   SNDRV_PCM_FMTBIT_S32_LE, +		   SNDRV_PCM_FMTBIT_U8 | SNDRV_PCM_FMTBIT_S32_LE,  	.channels_min = 2,  	.channels_max = 2,  	.rates = SNDRV_PCM_RATE_8000_48000, diff --git a/sound/soc/codecs/adau17x1.c b/sound/soc/codecs/adau17x1.c index 546ee8178038..8aae7ab74091 100644 --- a/sound/soc/codecs/adau17x1.c +++ b/sound/soc/codecs/adau17x1.c @@ -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);  	unsigned int ctrl0, ctrl1; +	unsigned int ctrl0_mask;  	int lrclk_pol;  	switch (fmt & SND_SOC_DAIFMT_MASTER_MASK) { @@ -612,8 +613,16 @@ static int adau17x1_set_dai_fmt(struct snd_soc_dai *dai,  	if (lrclk_pol)  		ctrl0 |= ADAU17X1_SERIAL_PORT0_LRCLK_POL; -	regmap_write(adau->regmap, ADAU17X1_SERIAL_PORT0, ctrl0); -	regmap_write(adau->regmap, ADAU17X1_SERIAL_PORT1, ctrl1); +	/* Set the mask to update all relevant bits in ADAU17X1_SERIAL_PORT0 */ +	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; diff --git a/sound/soc/codecs/rt1011.c b/sound/soc/codecs/rt1011.c index 098ecf13814d..bfe045367db3 100644 --- a/sound/soc/codecs/rt1011.c +++ b/sound/soc/codecs/rt1011.c @@ -2239,18 +2239,9 @@ static int rt1011_calibrate(struct rt1011_priv *rt1011, unsigned char cali_flag)  	dc_offset |= (value & 0xffff);  	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 (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 */  		regmap_write(rt1011->regmap, RT1011_CLASS_D_POS, 0x010e);  		regmap_write(rt1011->regmap, @@ -2376,10 +2367,7 @@ static void rt1011_calibration_work(struct work_struct *work)  		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);  }  static int rt1011_parse_dp(struct rt1011_priv *rt1011, struct device *dev) diff --git a/sound/soc/codecs/rt1011.h b/sound/soc/codecs/rt1011.h index f3a9a96640f1..68fadc15fa8c 100644 --- a/sound/soc/codecs/rt1011.h +++ b/sound/soc/codecs/rt1011.h @@ -692,7 +692,6 @@ struct rt1011_priv {  	unsigned int r0_reg, cali_done;  	unsigned int r0_calib, temperature_calib;  	int recv_spk_mode; -	unsigned int pack_id; /* 0: WLCSP; 1: QFN */  };  #endif		/* end of _RT1011_H_ */ diff --git a/sound/soc/codecs/rt286.c b/sound/soc/codecs/rt286.c index 8abe232ca4a4..e16e7237156f 100644 --- a/sound/soc/codecs/rt286.c +++ b/sound/soc/codecs/rt286.c @@ -171,6 +171,9 @@ static bool rt286_readable_register(struct device *dev, unsigned int reg)  	case RT286_PROC_COEF:  	case RT286_SET_AMP_GAIN_ADC_IN1:  	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_OUT2):  	case RT286_SET_POWER(RT286_ADC_IN1): @@ -1204,7 +1207,7 @@ static int rt286_i2c_probe(struct i2c_client *i2c,  	mdelay(10);  	if (!rt286->pdata.gpio2_en) -		regmap_write(rt286->regmap, RT286_SET_DMIC2_DEFAULT, 0x4000); +		regmap_write(rt286->regmap, RT286_SET_DMIC2_DEFAULT, 0x40);  	else  		regmap_write(rt286->regmap, RT286_SET_DMIC2_DEFAULT, 0); diff --git a/sound/soc/codecs/tas2552.c b/sound/soc/codecs/tas2552.c index bd00c35116cd..700baa6314aa 100644 --- a/sound/soc/codecs/tas2552.c +++ b/sound/soc/codecs/tas2552.c @@ -730,8 +730,10 @@ static int tas2552_probe(struct i2c_client *client,  	ret = devm_snd_soc_register_component(&client->dev,  				      &soc_component_dev_tas2552,  				      tas2552_dai, ARRAY_SIZE(tas2552_dai)); -	if (ret < 0) +	if (ret < 0) {  		dev_err(&client->dev, "Failed to register component: %d\n", ret); +		pm_runtime_get_noresume(&client->dev); +	}  	return ret;  } diff --git a/sound/soc/codecs/tlv320aic32x4.c b/sound/soc/codecs/tlv320aic32x4.c index f04f88c8d425..b689f26fc4be 100644 --- a/sound/soc/codecs/tlv320aic32x4.c +++ b/sound/soc/codecs/tlv320aic32x4.c @@ -577,12 +577,12 @@ static const struct regmap_range_cfg aic32x4_regmap_pages[] = {  		.window_start = 0,  		.window_len = 128,  		.range_min = 0, -		.range_max = AIC32X4_RMICPGAVOL, +		.range_max = AIC32X4_REFPOWERUP,  	},  };  const struct regmap_config aic32x4_regmap_config = { -	.max_register = AIC32X4_RMICPGAVOL, +	.max_register = AIC32X4_REFPOWERUP,  	.ranges = aic32x4_regmap_pages,  	.num_ranges = ARRAY_SIZE(aic32x4_regmap_pages),  }; @@ -1243,6 +1243,10 @@ int aic32x4_probe(struct device *dev, struct regmap *regmap)  	if (ret)  		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,  			&soc_component_dev_aic32x4, &aic32x4_dai, 1);  	if (ret) { @@ -1250,10 +1254,6 @@ int aic32x4_probe(struct device *dev, struct regmap *regmap)  		goto err_disable_regulators;  	} -	ret = aic32x4_register_clocks(dev, aic32x4->mclk_name); -	if (ret) -		goto err_disable_regulators; -  	return 0;  err_disable_regulators: diff --git a/sound/soc/intel/boards/kbl_da7219_max98927.c b/sound/soc/intel/boards/kbl_da7219_max98927.c index cc9a2509ace2..e0149cf6127d 100644 --- a/sound/soc/intel/boards/kbl_da7219_max98927.c +++ b/sound/soc/intel/boards/kbl_da7219_max98927.c @@ -282,12 +282,34 @@ static int kabylake_ssp_fixup(struct snd_soc_pcm_runtime *rtd,  	struct snd_interval *chan = hw_param_interval(params,  			SNDRV_PCM_HW_PARAM_CHANNELS);  	struct snd_mask *fmt = hw_param_mask(params, SNDRV_PCM_HW_PARAM_FORMAT); -	struct snd_soc_dpcm *dpcm = container_of( -			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; +	struct snd_soc_dpcm *dpcm, *rtd_dpcm = NULL;  	/* +	 * 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,  	 * where as kblda7219m98927 & kblmax98927 supports S16_LE by default.  	 * Skipping the port wise FE and BE configuration for kblda7219m98373 & @@ -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  	 */ -	if (!strcmp(fe_dai_link->name, "Kbl Audio Port") || -	    !strcmp(fe_dai_link->name, "Kbl Audio Headset Playback") || -	    !strcmp(fe_dai_link->name, "Kbl Audio Capture Port")) { +	if (!strcmp(rtd_dpcm->fe->dai_link->name, "Kbl Audio Port") || +	    !strcmp(rtd_dpcm->fe->dai_link->name, "Kbl Audio Headset Playback") || +	    !strcmp(rtd_dpcm->fe->dai_link->name, "Kbl Audio Capture Port")) {  		rate->min = rate->max = 48000;  		chan->min = chan->max = 2;  		snd_mask_none(fmt); @@ -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.  	 * 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);  	return 0; diff --git a/sound/soc/intel/keembay/kmb_platform.c b/sound/soc/intel/keembay/kmb_platform.c index 0fd1e8f62c89..96741c7c0fba 100644 --- a/sound/soc/intel/keembay/kmb_platform.c +++ b/sound/soc/intel/keembay/kmb_platform.c @@ -105,14 +105,15 @@ static unsigned int kmb_pcm_tx_fn(struct kmb_i2s_info *kmb_i2s,  	void *buf = runtime->dma_area;  	int i; +	if (kmb_i2s->iec958_fmt) +		hdmi_reformat_iec958(runtime, kmb_i2s, tx_ptr); +  	/* KMB i2s uses two separate L/R FIFO */  	for (i = 0; i < kmb_i2s->fifo_th; i++) {  		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][1], i2s_base + RRBR_RTHR(0));  		} 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][1], i2s_base + RRBR_RTHR(0));  		} diff --git a/sound/soc/meson/axg-frddr.c b/sound/soc/meson/axg-frddr.c index c3ae8ac30745..37f4bb3469b5 100644 --- a/sound/soc/meson/axg-frddr.c +++ b/sound/soc/meson/axg-frddr.c @@ -11,6 +11,7 @@  #include <linux/regmap.h>  #include <linux/module.h>  #include <linux/of_platform.h> +#include <sound/pcm_params.h>  #include <sound/soc.h>  #include <sound/soc-dai.h> @@ -46,11 +47,28 @@ static int g12a_frddr_dai_prepare(struct snd_pcm_substream *substream,  	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,  				 struct snd_soc_dai *dai)  {  	struct axg_fifo *fifo = snd_soc_dai_get_drvdata(dai); -	unsigned int val;  	int ret;  	/* 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,  	/* Apply single buffer mode to the interface */  	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;  } @@ -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 = { +	.hw_params	= axg_frddr_dai_hw_params,  	.startup	= axg_frddr_dai_startup,  	.shutdown	= axg_frddr_dai_shutdown,  }; @@ -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 = {  	.prepare	= g12a_frddr_dai_prepare, +	.hw_params	= axg_frddr_dai_hw_params,  	.startup	= axg_frddr_dai_startup,  	.shutdown	= axg_frddr_dai_shutdown,  };  | 
