Commit 09354ebe authored by Takashi Iwai's avatar Takashi Iwai
Browse files

Merge tag 'asoc-fix-v5.17-rc7' of...

Merge tag 'asoc-fix-v5.17-rc7' of https://git.kernel.org/pub/scm/linux/kernel/git/broonie/sound into for-linus

ASoC: Potential fixes for v5.17

Rather more fixes here than I'm comfortable with, we've had several
vendors noticing issues late in the release cycle all of which are valid
and reasonable fixes but it adds up to a much larger change set than I'd
like.  Several of the AMD fixes look like cleanups from the subject
lines but are actually fixing user visible problems as well.

If you were to merge this for 5.18 rather than 5.17 it wouldn't be the
end of the world, stable will probably backport everything anyway.
parents 9cb72750 5e02fb59
Loading
Loading
Loading
Loading
+7 −19
Original line number Diff line number Diff line
@@ -88,10 +88,9 @@ static int acp5x_i2s_hwparams(struct snd_pcm_substream *substream,
	struct snd_soc_card *card;
	struct acp5x_platform_info *pinfo;
	struct i2s_dev_data *adata;
	union acp_i2stdm_mstrclkgen mclkgen;

	u32 val;
	u32 reg_val, frmt_reg, master_reg;
	u32 reg_val, frmt_reg;
	u32 lrclk_div_val, bclk_div_val;

	lrclk_div_val = 0;
@@ -160,20 +159,6 @@ static int acp5x_i2s_hwparams(struct snd_pcm_substream *substream,
	acp_writel(val, rtd->acp5x_base + reg_val);

	if (adata->master_mode) {
		switch (rtd->i2s_instance) {
		case I2S_HS_INSTANCE:
			master_reg = ACP_I2STDM2_MSTRCLKGEN;
			break;
		case I2S_SP_INSTANCE:
		default:
			master_reg = ACP_I2STDM0_MSTRCLKGEN;
			break;
		}
		mclkgen.bits.i2stdm_master_mode = 0x1;
		if (adata->tdm_mode)
			mclkgen.bits.i2stdm_format_mode = 0x01;
		else
			mclkgen.bits.i2stdm_format_mode = 0x0;
		switch (params_format(params)) {
		case SNDRV_PCM_FORMAT_S16_LE:
			switch (params_rate(params)) {
@@ -238,9 +223,8 @@ static int acp5x_i2s_hwparams(struct snd_pcm_substream *substream,
		default:
			return -EINVAL;
		}
		mclkgen.bits.i2stdm_bclk_div_val = bclk_div_val;
		mclkgen.bits.i2stdm_lrclk_div_val = lrclk_div_val;
		acp_writel(mclkgen.u32_all, rtd->acp5x_base + master_reg);
		rtd->lrclk_div = lrclk_div_val;
		rtd->bclk_div = bclk_div_val;
	}
	return 0;
}
@@ -249,9 +233,11 @@ static int acp5x_i2s_trigger(struct snd_pcm_substream *substream,
			     int cmd, struct snd_soc_dai *dai)
{
	struct i2s_stream_instance *rtd;
	struct i2s_dev_data *adata;
	u32 ret, val, period_bytes, reg_val, ier_val, water_val;
	u32 buf_size, buf_reg;

	adata = snd_soc_dai_get_drvdata(dai);
	rtd = substream->runtime->private_data;
	period_bytes = frames_to_bytes(substream->runtime,
				       substream->runtime->period_size);
@@ -300,6 +286,8 @@ static int acp5x_i2s_trigger(struct snd_pcm_substream *substream,
		}
		acp_writel(period_bytes, rtd->acp5x_base + water_val);
		acp_writel(buf_size, rtd->acp5x_base + buf_reg);
		if (adata->master_mode)
			acp5x_set_i2s_clk(adata, rtd);
		val = acp_readl(rtd->acp5x_base + reg_val);
		val = val | BIT(0);
		acp_writel(val, rtd->acp5x_base + reg_val);
+22 −1
Original line number Diff line number Diff line
@@ -33,6 +33,8 @@
#define DUAL_CHANNEL		2
#define ACP5X_NUVOTON_CODEC_DAI	"nau8821-hifi"
#define VG_JUPITER 1
#define ACP5X_NUVOTON_BCLK 3072000
#define ACP5X_NAU8821_FREQ_OUT 12288000

static unsigned long acp5x_machine_id;
static struct snd_soc_jack vg_headset;
@@ -98,6 +100,13 @@ static const struct snd_pcm_hw_constraint_list constraints_channels = {
	.mask = 0,
};

static const unsigned int acp5x_nau8821_format[] = {32};

static struct snd_pcm_hw_constraint_list constraints_sample_bits = {
	.list = acp5x_nau8821_format,
	.count = ARRAY_SIZE(acp5x_nau8821_format),
};

static int acp5x_8821_startup(struct snd_pcm_substream *substream)
{
	struct snd_pcm_runtime *runtime = substream->runtime;
@@ -113,6 +122,9 @@ static int acp5x_8821_startup(struct snd_pcm_substream *substream)
				   &constraints_channels);
	snd_pcm_hw_constraint_list(runtime, 0, SNDRV_PCM_HW_PARAM_RATE,
				   &constraints_rates);
	snd_pcm_hw_constraint_list(substream->runtime, 0,
				   SNDRV_PCM_HW_PARAM_SAMPLE_BITS,
				   &constraints_sample_bits);
	return 0;
}

@@ -274,6 +286,15 @@ static int platform_clock_control(struct snd_soc_dapm_widget *w,
			dev_err(card->dev, "set sysclk err = %d\n", ret);
			return -EIO;
		}
	} else {
		ret = snd_soc_dai_set_sysclk(codec_dai, NAU8821_CLK_FLL_BLK, 0,
					     SND_SOC_CLOCK_IN);
		if (ret < 0)
			dev_err(codec_dai->dev, "can't set BLK clock %d\n", ret);
		ret = snd_soc_dai_set_pll(codec_dai, 0, 0, ACP5X_NUVOTON_BCLK,
					  ACP5X_NAU8821_FREQ_OUT);
		if (ret < 0)
			dev_err(codec_dai->dev, "can't set FLL: %d\n", ret);
	}
	return ret;
}
@@ -289,7 +310,7 @@ static const struct snd_soc_dapm_widget acp5x_8821_widgets[] = {
	SND_SOC_DAPM_MIC("Headset Mic", NULL),
	SND_SOC_DAPM_MIC("Int Mic", NULL),
	SND_SOC_DAPM_SUPPLY("Platform Clock", SND_SOC_NOPM, 0, 0,
			    platform_clock_control, SND_SOC_DAPM_POST_PMD),
			    platform_clock_control, SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD),
};

static const struct snd_soc_dapm_route acp5x_8821_audio_route[] = {
+29 −0
Original line number Diff line number Diff line
@@ -105,6 +105,8 @@ struct i2s_stream_instance {
	dma_addr_t dma_addr;
	u64 bytescount;
	void __iomem *acp5x_base;
	u32 lrclk_div;
	u32 bclk_div;
};

union acp_dma_count {
@@ -191,3 +193,30 @@ static inline u64 acp_get_byte_count(struct i2s_stream_instance *rtd,
	}
	return byte_count.bytescount;
}

static inline void acp5x_set_i2s_clk(struct i2s_dev_data *adata,
				     struct i2s_stream_instance *rtd)
{
	union acp_i2stdm_mstrclkgen mclkgen;
	u32 master_reg;

	switch (rtd->i2s_instance) {
	case I2S_HS_INSTANCE:
		master_reg = ACP_I2STDM2_MSTRCLKGEN;
		break;
	case I2S_SP_INSTANCE:
	default:
		master_reg = ACP_I2STDM0_MSTRCLKGEN;
		break;
	}

	mclkgen.bits.i2stdm_master_mode = 0x1;
	if (adata->tdm_mode)
		mclkgen.bits.i2stdm_format_mode = 0x01;
	else
		mclkgen.bits.i2stdm_format_mode = 0x00;

	mclkgen.bits.i2stdm_bclk_div_val = rtd->bclk_div;
	mclkgen.bits.i2stdm_lrclk_div_val = rtd->lrclk_div;
	acp_writel(mclkgen.u32_all, rtd->acp5x_base + master_reg);
}
+4 −0
Original line number Diff line number Diff line
@@ -92,12 +92,14 @@ static int acp5x_init(void __iomem *acp5x_base)
		pr_err("ACP5x power on failed\n");
		return ret;
	}
	acp_writel(0x01, acp5x_base + ACP_CONTROL);
	/* Reset */
	ret = acp5x_reset(acp5x_base);
	if (ret) {
		pr_err("ACP5x reset failed\n");
		return ret;
	}
	acp_writel(0x03, acp5x_base + ACP_CLKMUX_SEL);
	acp5x_enable_interrupts(acp5x_base);
	return 0;
}
@@ -113,6 +115,8 @@ static int acp5x_deinit(void __iomem *acp5x_base)
		pr_err("ACP5x reset failed\n");
		return ret;
	}
	acp_writel(0x00, acp5x_base + ACP_CLKMUX_SEL);
	acp_writel(0x00, acp5x_base + ACP_CONTROL);
	return 0;
}

+5 −5
Original line number Diff line number Diff line
@@ -573,7 +573,7 @@ static int cs35l41_main_amp_event(struct snd_soc_dapm_widget *w,
	int ret = 0;

	switch (event) {
	case SND_SOC_DAPM_POST_PMU:
	case SND_SOC_DAPM_PRE_PMU:
		regmap_multi_reg_write_bypassed(cs35l41->regmap,
						cs35l41_pup_patch,
						ARRAY_SIZE(cs35l41_pup_patch));
@@ -649,7 +649,7 @@ static const struct snd_soc_dapm_widget cs35l41_dapm_widgets[] = {

	SND_SOC_DAPM_OUT_DRV_E("Main AMP", CS35L41_PWR_CTRL2, 0, 0, NULL, 0,
			       cs35l41_main_amp_event,
			       SND_SOC_DAPM_POST_PMD |	SND_SOC_DAPM_POST_PMU),
			       SND_SOC_DAPM_POST_PMD |	SND_SOC_DAPM_PRE_PMU),

	SND_SOC_DAPM_MUX("ASP TX1 Source", SND_SOC_NOPM, 0, 0, &asp_tx1_mux),
	SND_SOC_DAPM_MUX("ASP TX2 Source", SND_SOC_NOPM, 0, 0, &asp_tx2_mux),
@@ -1035,8 +1035,8 @@ static int cs35l41_irq_gpio_config(struct cs35l41_private *cs35l41)

	regmap_update_bits(cs35l41->regmap, CS35L41_GPIO2_CTRL1,
			   CS35L41_GPIO_POL_MASK | CS35L41_GPIO_DIR_MASK,
			   irq_gpio_cfg1->irq_pol_inv << CS35L41_GPIO_POL_SHIFT |
			   !irq_gpio_cfg1->irq_out_en << CS35L41_GPIO_DIR_SHIFT);
			   irq_gpio_cfg2->irq_pol_inv << CS35L41_GPIO_POL_SHIFT |
			   !irq_gpio_cfg2->irq_out_en << CS35L41_GPIO_DIR_SHIFT);

	regmap_update_bits(cs35l41->regmap, CS35L41_GPIO_PAD_CONTROL,
			   CS35L41_GPIO1_CTRL_MASK | CS35L41_GPIO2_CTRL_MASK,
@@ -1091,7 +1091,7 @@ static struct snd_soc_dai_driver cs35l41_dai[] = {
		.capture = {
			.stream_name = "AMP Capture",
			.channels_min = 1,
			.channels_max = 8,
			.channels_max = 4,
			.rates = SNDRV_PCM_RATE_KNOT,
			.formats = CS35L41_TX_FORMATS,
		},
Loading