mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
synced 2025-01-08 14:23:19 +00:00
ASoC: Merge up fixes for CI
Avoid tripping over fixed issues in CI.
This commit is contained in:
commit
1946dda47c
@ -55,7 +55,9 @@ properties:
|
|||||||
description: TDM TX current sense time slot.
|
description: TDM TX current sense time slot.
|
||||||
|
|
||||||
'#sound-dai-cells':
|
'#sound-dai-cells':
|
||||||
const: 1
|
# The codec has a single DAI, the #sound-dai-cells=<1>; case is left in for backward
|
||||||
|
# compatibility but is deprecated.
|
||||||
|
enum: [0, 1]
|
||||||
|
|
||||||
required:
|
required:
|
||||||
- compatible
|
- compatible
|
||||||
@ -72,7 +74,7 @@ examples:
|
|||||||
codec: codec@4c {
|
codec: codec@4c {
|
||||||
compatible = "ti,tas2562";
|
compatible = "ti,tas2562";
|
||||||
reg = <0x4c>;
|
reg = <0x4c>;
|
||||||
#sound-dai-cells = <1>;
|
#sound-dai-cells = <0>;
|
||||||
interrupt-parent = <&gpio1>;
|
interrupt-parent = <&gpio1>;
|
||||||
interrupts = <14>;
|
interrupts = <14>;
|
||||||
shutdown-gpios = <&gpio1 15 0>;
|
shutdown-gpios = <&gpio1 15 0>;
|
||||||
|
@ -57,7 +57,9 @@ properties:
|
|||||||
- 1 # Falling edge
|
- 1 # Falling edge
|
||||||
|
|
||||||
'#sound-dai-cells':
|
'#sound-dai-cells':
|
||||||
const: 1
|
# The codec has a single DAI, the #sound-dai-cells=<1>; case is left in for backward
|
||||||
|
# compatibility but is deprecated.
|
||||||
|
enum: [0, 1]
|
||||||
|
|
||||||
required:
|
required:
|
||||||
- compatible
|
- compatible
|
||||||
@ -74,7 +76,7 @@ examples:
|
|||||||
codec: codec@41 {
|
codec: codec@41 {
|
||||||
compatible = "ti,tas2770";
|
compatible = "ti,tas2770";
|
||||||
reg = <0x41>;
|
reg = <0x41>;
|
||||||
#sound-dai-cells = <1>;
|
#sound-dai-cells = <0>;
|
||||||
interrupt-parent = <&gpio1>;
|
interrupt-parent = <&gpio1>;
|
||||||
interrupts = <14>;
|
interrupts = <14>;
|
||||||
reset-gpio = <&gpio1 15 0>;
|
reset-gpio = <&gpio1 15 0>;
|
||||||
|
@ -50,7 +50,9 @@ properties:
|
|||||||
description: TDM TX voltage sense time slot.
|
description: TDM TX voltage sense time slot.
|
||||||
|
|
||||||
'#sound-dai-cells':
|
'#sound-dai-cells':
|
||||||
const: 1
|
# The codec has a single DAI, the #sound-dai-cells=<1>; case is left in for backward
|
||||||
|
# compatibility but is deprecated.
|
||||||
|
enum: [0, 1]
|
||||||
|
|
||||||
required:
|
required:
|
||||||
- compatible
|
- compatible
|
||||||
@ -67,7 +69,7 @@ examples:
|
|||||||
codec: codec@38 {
|
codec: codec@38 {
|
||||||
compatible = "ti,tas2764";
|
compatible = "ti,tas2764";
|
||||||
reg = <0x38>;
|
reg = <0x38>;
|
||||||
#sound-dai-cells = <1>;
|
#sound-dai-cells = <0>;
|
||||||
interrupt-parent = <&gpio1>;
|
interrupt-parent = <&gpio1>;
|
||||||
interrupts = <14>;
|
interrupts = <14>;
|
||||||
reset-gpios = <&gpio1 15 0>;
|
reset-gpios = <&gpio1 15 0>;
|
||||||
|
@ -318,6 +318,13 @@ static const struct dmi_system_id yc_acp_quirk_table[] = {
|
|||||||
DMI_MATCH(DMI_BOARD_NAME, "MRID6"),
|
DMI_MATCH(DMI_BOARD_NAME, "MRID6"),
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
.driver_data = &acp6x_card,
|
||||||
|
.matches = {
|
||||||
|
DMI_MATCH(DMI_BOARD_VENDOR, "System76"),
|
||||||
|
DMI_MATCH(DMI_PRODUCT_VERSION, "pang12"),
|
||||||
|
}
|
||||||
|
},
|
||||||
{}
|
{}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -53,6 +53,18 @@ static const struct reg_default ssm2602_reg[SSM2602_CACHEREGNUM] = {
|
|||||||
{ .reg = 0x09, .def = 0x0000 }
|
{ .reg = 0x09, .def = 0x0000 }
|
||||||
};
|
};
|
||||||
|
|
||||||
|
/*
|
||||||
|
* ssm2602 register patch
|
||||||
|
* Workaround for playback distortions after power up: activates digital
|
||||||
|
* core, and then powers on output, DAC, and whole chip at the same time
|
||||||
|
*/
|
||||||
|
|
||||||
|
static const struct reg_sequence ssm2602_patch[] = {
|
||||||
|
{ SSM2602_ACTIVE, 0x01 },
|
||||||
|
{ SSM2602_PWR, 0x07 },
|
||||||
|
{ SSM2602_RESET, 0x00 },
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
/*Appending several "None"s just for OSS mixer use*/
|
/*Appending several "None"s just for OSS mixer use*/
|
||||||
static const char *ssm2602_input_select[] = {
|
static const char *ssm2602_input_select[] = {
|
||||||
@ -598,6 +610,9 @@ static int ssm260x_component_probe(struct snd_soc_component *component)
|
|||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
regmap_register_patch(ssm2602->regmap, ssm2602_patch,
|
||||||
|
ARRAY_SIZE(ssm2602_patch));
|
||||||
|
|
||||||
/* set the update bits */
|
/* set the update bits */
|
||||||
regmap_update_bits(ssm2602->regmap, SSM2602_LINVOL,
|
regmap_update_bits(ssm2602->regmap, SSM2602_LINVOL,
|
||||||
LINVOL_LRIN_BOTH, LINVOL_LRIN_BOTH);
|
LINVOL_LRIN_BOTH, LINVOL_LRIN_BOTH);
|
||||||
|
@ -133,13 +133,13 @@ static irqreturn_t i2s_irq_handler(int irq, void *dev_id)
|
|||||||
|
|
||||||
/* Error Handling: TX */
|
/* Error Handling: TX */
|
||||||
if (isr[i] & ISR_TXFO) {
|
if (isr[i] & ISR_TXFO) {
|
||||||
dev_err(dev->dev, "TX overrun (ch_id=%d)\n", i);
|
dev_err_ratelimited(dev->dev, "TX overrun (ch_id=%d)\n", i);
|
||||||
irq_valid = true;
|
irq_valid = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Error Handling: TX */
|
/* Error Handling: TX */
|
||||||
if (isr[i] & ISR_RXFO) {
|
if (isr[i] & ISR_RXFO) {
|
||||||
dev_err(dev->dev, "RX overrun (ch_id=%d)\n", i);
|
dev_err_ratelimited(dev->dev, "RX overrun (ch_id=%d)\n", i);
|
||||||
irq_valid = true;
|
irq_valid = true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1159,7 +1159,7 @@ static int fsl_micfil_probe(struct platform_device *pdev)
|
|||||||
ret = devm_snd_dmaengine_pcm_register(&pdev->dev, NULL, 0);
|
ret = devm_snd_dmaengine_pcm_register(&pdev->dev, NULL, 0);
|
||||||
if (ret) {
|
if (ret) {
|
||||||
dev_err(&pdev->dev, "failed to pcm register\n");
|
dev_err(&pdev->dev, "failed to pcm register\n");
|
||||||
return ret;
|
goto err_pm_disable;
|
||||||
}
|
}
|
||||||
|
|
||||||
fsl_micfil_dai.capture.formats = micfil->soc->formats;
|
fsl_micfil_dai.capture.formats = micfil->soc->formats;
|
||||||
@ -1169,9 +1169,20 @@ static int fsl_micfil_probe(struct platform_device *pdev)
|
|||||||
if (ret) {
|
if (ret) {
|
||||||
dev_err(&pdev->dev, "failed to register component %s\n",
|
dev_err(&pdev->dev, "failed to register component %s\n",
|
||||||
fsl_micfil_component.name);
|
fsl_micfil_component.name);
|
||||||
|
goto err_pm_disable;
|
||||||
}
|
}
|
||||||
|
|
||||||
return ret;
|
return ret;
|
||||||
|
|
||||||
|
err_pm_disable:
|
||||||
|
pm_runtime_disable(&pdev->dev);
|
||||||
|
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void fsl_micfil_remove(struct platform_device *pdev)
|
||||||
|
{
|
||||||
|
pm_runtime_disable(&pdev->dev);
|
||||||
}
|
}
|
||||||
|
|
||||||
static int __maybe_unused fsl_micfil_runtime_suspend(struct device *dev)
|
static int __maybe_unused fsl_micfil_runtime_suspend(struct device *dev)
|
||||||
@ -1232,6 +1243,7 @@ static const struct dev_pm_ops fsl_micfil_pm_ops = {
|
|||||||
|
|
||||||
static struct platform_driver fsl_micfil_driver = {
|
static struct platform_driver fsl_micfil_driver = {
|
||||||
.probe = fsl_micfil_probe,
|
.probe = fsl_micfil_probe,
|
||||||
|
.remove_new = fsl_micfil_remove,
|
||||||
.driver = {
|
.driver = {
|
||||||
.name = "fsl-micfil-dai",
|
.name = "fsl-micfil-dai",
|
||||||
.pm = &fsl_micfil_pm_ops,
|
.pm = &fsl_micfil_pm_ops,
|
||||||
|
@ -218,18 +218,48 @@ static int jz4740_i2s_set_fmt(struct snd_soc_dai *dai, unsigned int fmt)
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int jz4740_i2s_get_i2sdiv(unsigned long mclk, unsigned long rate,
|
||||||
|
unsigned long i2sdiv_max)
|
||||||
|
{
|
||||||
|
unsigned long div, rate1, rate2, err1, err2;
|
||||||
|
|
||||||
|
div = mclk / (64 * rate);
|
||||||
|
if (div == 0)
|
||||||
|
div = 1;
|
||||||
|
|
||||||
|
rate1 = mclk / (64 * div);
|
||||||
|
rate2 = mclk / (64 * (div + 1));
|
||||||
|
|
||||||
|
err1 = abs(rate1 - rate);
|
||||||
|
err2 = abs(rate2 - rate);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Choose the divider that produces the smallest error in the
|
||||||
|
* output rate and reject dividers with a 5% or higher error.
|
||||||
|
* In the event that both dividers are outside the acceptable
|
||||||
|
* error margin, reject the rate to prevent distorted audio.
|
||||||
|
* (The number 5% is arbitrary.)
|
||||||
|
*/
|
||||||
|
if (div <= i2sdiv_max && err1 <= err2 && err1 < rate/20)
|
||||||
|
return div;
|
||||||
|
if (div < i2sdiv_max && err2 < rate/20)
|
||||||
|
return div + 1;
|
||||||
|
|
||||||
|
return -EINVAL;
|
||||||
|
}
|
||||||
|
|
||||||
static int jz4740_i2s_hw_params(struct snd_pcm_substream *substream,
|
static int jz4740_i2s_hw_params(struct snd_pcm_substream *substream,
|
||||||
struct snd_pcm_hw_params *params, struct snd_soc_dai *dai)
|
struct snd_pcm_hw_params *params, struct snd_soc_dai *dai)
|
||||||
{
|
{
|
||||||
struct jz4740_i2s *i2s = snd_soc_dai_get_drvdata(dai);
|
struct jz4740_i2s *i2s = snd_soc_dai_get_drvdata(dai);
|
||||||
struct regmap_field *div_field;
|
struct regmap_field *div_field;
|
||||||
|
unsigned long i2sdiv_max;
|
||||||
unsigned int sample_size;
|
unsigned int sample_size;
|
||||||
uint32_t ctrl;
|
uint32_t ctrl, conf;
|
||||||
int div;
|
int div = 1;
|
||||||
|
|
||||||
regmap_read(i2s->regmap, JZ_REG_AIC_CTRL, &ctrl);
|
regmap_read(i2s->regmap, JZ_REG_AIC_CTRL, &ctrl);
|
||||||
|
regmap_read(i2s->regmap, JZ_REG_AIC_CONF, &conf);
|
||||||
div = clk_get_rate(i2s->clk_i2s) / (64 * params_rate(params));
|
|
||||||
|
|
||||||
switch (params_format(params)) {
|
switch (params_format(params)) {
|
||||||
case SNDRV_PCM_FORMAT_S8:
|
case SNDRV_PCM_FORMAT_S8:
|
||||||
@ -258,11 +288,27 @@ static int jz4740_i2s_hw_params(struct snd_pcm_substream *substream,
|
|||||||
ctrl &= ~JZ_AIC_CTRL_MONO_TO_STEREO;
|
ctrl &= ~JZ_AIC_CTRL_MONO_TO_STEREO;
|
||||||
|
|
||||||
div_field = i2s->field_i2sdiv_playback;
|
div_field = i2s->field_i2sdiv_playback;
|
||||||
|
i2sdiv_max = GENMASK(i2s->soc_info->field_i2sdiv_playback.msb,
|
||||||
|
i2s->soc_info->field_i2sdiv_playback.lsb);
|
||||||
} else {
|
} else {
|
||||||
ctrl &= ~JZ_AIC_CTRL_INPUT_SAMPLE_SIZE;
|
ctrl &= ~JZ_AIC_CTRL_INPUT_SAMPLE_SIZE;
|
||||||
ctrl |= FIELD_PREP(JZ_AIC_CTRL_INPUT_SAMPLE_SIZE, sample_size);
|
ctrl |= FIELD_PREP(JZ_AIC_CTRL_INPUT_SAMPLE_SIZE, sample_size);
|
||||||
|
|
||||||
div_field = i2s->field_i2sdiv_capture;
|
div_field = i2s->field_i2sdiv_capture;
|
||||||
|
i2sdiv_max = GENMASK(i2s->soc_info->field_i2sdiv_capture.msb,
|
||||||
|
i2s->soc_info->field_i2sdiv_capture.lsb);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Only calculate I2SDIV if we're supplying the bit or frame clock.
|
||||||
|
* If the codec is supplying both clocks then the divider output is
|
||||||
|
* unused, and we don't want it to limit the allowed sample rates.
|
||||||
|
*/
|
||||||
|
if (conf & (JZ_AIC_CONF_BIT_CLK_MASTER | JZ_AIC_CONF_SYNC_CLK_MASTER)) {
|
||||||
|
div = jz4740_i2s_get_i2sdiv(clk_get_rate(i2s->clk_i2s),
|
||||||
|
params_rate(params), i2sdiv_max);
|
||||||
|
if (div < 0)
|
||||||
|
return div;
|
||||||
}
|
}
|
||||||
|
|
||||||
regmap_write(i2s->regmap, JZ_REG_AIC_CTRL, ctrl);
|
regmap_write(i2s->regmap, JZ_REG_AIC_CTRL, ctrl);
|
||||||
|
@ -209,7 +209,12 @@ int acp_sof_ipc_msg_data(struct snd_sof_dev *sdev, struct snd_sof_pcm_stream *sp
|
|||||||
acp_mailbox_read(sdev, offset, p, sz);
|
acp_mailbox_read(sdev, offset, p, sz);
|
||||||
} else {
|
} else {
|
||||||
struct snd_pcm_substream *substream = sps->substream;
|
struct snd_pcm_substream *substream = sps->substream;
|
||||||
struct acp_dsp_stream *stream = substream->runtime->private_data;
|
struct acp_dsp_stream *stream;
|
||||||
|
|
||||||
|
if (!substream || !substream->runtime)
|
||||||
|
return -ESTRPIPE;
|
||||||
|
|
||||||
|
stream = substream->runtime->private_data;
|
||||||
|
|
||||||
if (!stream)
|
if (!stream)
|
||||||
return -ESTRPIPE;
|
return -ESTRPIPE;
|
||||||
|
Loading…
Reference in New Issue
Block a user