mirror of
https://github.com/torvalds/linux.git
synced 2024-11-11 06:31:49 +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.
|
||||
|
||||
'#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:
|
||||
- compatible
|
||||
@ -72,7 +74,7 @@ examples:
|
||||
codec: codec@4c {
|
||||
compatible = "ti,tas2562";
|
||||
reg = <0x4c>;
|
||||
#sound-dai-cells = <1>;
|
||||
#sound-dai-cells = <0>;
|
||||
interrupt-parent = <&gpio1>;
|
||||
interrupts = <14>;
|
||||
shutdown-gpios = <&gpio1 15 0>;
|
||||
|
@ -57,7 +57,9 @@ properties:
|
||||
- 1 # Falling edge
|
||||
|
||||
'#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:
|
||||
- compatible
|
||||
@ -74,7 +76,7 @@ examples:
|
||||
codec: codec@41 {
|
||||
compatible = "ti,tas2770";
|
||||
reg = <0x41>;
|
||||
#sound-dai-cells = <1>;
|
||||
#sound-dai-cells = <0>;
|
||||
interrupt-parent = <&gpio1>;
|
||||
interrupts = <14>;
|
||||
reset-gpio = <&gpio1 15 0>;
|
||||
|
@ -50,7 +50,9 @@ properties:
|
||||
description: TDM TX voltage sense time slot.
|
||||
|
||||
'#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:
|
||||
- compatible
|
||||
@ -67,7 +69,7 @@ examples:
|
||||
codec: codec@38 {
|
||||
compatible = "ti,tas2764";
|
||||
reg = <0x38>;
|
||||
#sound-dai-cells = <1>;
|
||||
#sound-dai-cells = <0>;
|
||||
interrupt-parent = <&gpio1>;
|
||||
interrupts = <14>;
|
||||
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"),
|
||||
}
|
||||
},
|
||||
{
|
||||
.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 }
|
||||
};
|
||||
|
||||
/*
|
||||
* 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*/
|
||||
static const char *ssm2602_input_select[] = {
|
||||
@ -598,6 +610,9 @@ static int ssm260x_component_probe(struct snd_soc_component *component)
|
||||
return ret;
|
||||
}
|
||||
|
||||
regmap_register_patch(ssm2602->regmap, ssm2602_patch,
|
||||
ARRAY_SIZE(ssm2602_patch));
|
||||
|
||||
/* set the update bits */
|
||||
regmap_update_bits(ssm2602->regmap, SSM2602_LINVOL,
|
||||
LINVOL_LRIN_BOTH, LINVOL_LRIN_BOTH);
|
||||
|
@ -133,13 +133,13 @@ static irqreturn_t i2s_irq_handler(int irq, void *dev_id)
|
||||
|
||||
/* Error Handling: TX */
|
||||
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;
|
||||
}
|
||||
|
||||
/* Error Handling: TX */
|
||||
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;
|
||||
}
|
||||
}
|
||||
|
@ -1159,7 +1159,7 @@ static int fsl_micfil_probe(struct platform_device *pdev)
|
||||
ret = devm_snd_dmaengine_pcm_register(&pdev->dev, NULL, 0);
|
||||
if (ret) {
|
||||
dev_err(&pdev->dev, "failed to pcm register\n");
|
||||
return ret;
|
||||
goto err_pm_disable;
|
||||
}
|
||||
|
||||
fsl_micfil_dai.capture.formats = micfil->soc->formats;
|
||||
@ -1169,9 +1169,20 @@ static int fsl_micfil_probe(struct platform_device *pdev)
|
||||
if (ret) {
|
||||
dev_err(&pdev->dev, "failed to register component %s\n",
|
||||
fsl_micfil_component.name);
|
||||
goto err_pm_disable;
|
||||
}
|
||||
|
||||
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)
|
||||
@ -1232,6 +1243,7 @@ static const struct dev_pm_ops fsl_micfil_pm_ops = {
|
||||
|
||||
static struct platform_driver fsl_micfil_driver = {
|
||||
.probe = fsl_micfil_probe,
|
||||
.remove_new = fsl_micfil_remove,
|
||||
.driver = {
|
||||
.name = "fsl-micfil-dai",
|
||||
.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;
|
||||
}
|
||||
|
||||
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,
|
||||
struct snd_pcm_hw_params *params, struct snd_soc_dai *dai)
|
||||
{
|
||||
struct jz4740_i2s *i2s = snd_soc_dai_get_drvdata(dai);
|
||||
struct regmap_field *div_field;
|
||||
unsigned long i2sdiv_max;
|
||||
unsigned int sample_size;
|
||||
uint32_t ctrl;
|
||||
int div;
|
||||
uint32_t ctrl, conf;
|
||||
int div = 1;
|
||||
|
||||
regmap_read(i2s->regmap, JZ_REG_AIC_CTRL, &ctrl);
|
||||
|
||||
div = clk_get_rate(i2s->clk_i2s) / (64 * params_rate(params));
|
||||
regmap_read(i2s->regmap, JZ_REG_AIC_CONF, &conf);
|
||||
|
||||
switch (params_format(params)) {
|
||||
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;
|
||||
|
||||
div_field = i2s->field_i2sdiv_playback;
|
||||
i2sdiv_max = GENMASK(i2s->soc_info->field_i2sdiv_playback.msb,
|
||||
i2s->soc_info->field_i2sdiv_playback.lsb);
|
||||
} else {
|
||||
ctrl &= ~JZ_AIC_CTRL_INPUT_SAMPLE_SIZE;
|
||||
ctrl |= FIELD_PREP(JZ_AIC_CTRL_INPUT_SAMPLE_SIZE, sample_size);
|
||||
|
||||
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);
|
||||
|
@ -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);
|
||||
} else {
|
||||
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)
|
||||
return -ESTRPIPE;
|
||||
|
Loading…
Reference in New Issue
Block a user