ASoC: Fixes for v5.7
A collection of fixes that have been accumilated since the merge window, mainly relating to x86 platform support. -----BEGIN PGP SIGNATURE----- iQFHBAABCgAxFiEEreZoqmdXGLWf4p/qJNaLcl1Uh9AFAl6N8tITHGJyb29uaWVA a2VybmVsLm9yZwAKCRAk1otyXVSH0PEcB/9uSF5cBy7917NwXCJ6NuyVpKlytJPx Abqf4bZ3WbhhONBBZ0VWvCqfW9KpiOsSiU3pngmNAGy/9DCirvhX5GUrHaiPHVN8 PeKqy4eGbB1Pj4qZ00HT12bDx3imPKHGmR+LCOXusnEn4vhW1gkfkLFWksiGM35d lrmNCBKl90fRJC81dm3RUpH6gwnR5cosu15XhTKpKBqDQPraDWyjfmMNtQhKDpvB /r+qmOYMCz0UM51yfsjEqAz88BYVmR6xjh3+tkaXU6hg6nacnBYy70ycGmDSoUpd 31WmjCZ6wZ74I0Fltybg6S3zuMYHoJfI19b8Z6rrGE2MiSFZKlohALes =NRG8 -----END PGP SIGNATURE----- Merge tag 'asoc-fix-v5.7' of https://git.kernel.org/pub/scm/linux/kernel/git/broonie/sound into for-linus ASoC: Fixes for v5.7 A collection of fixes that have been accumilated since the merge window, mainly relating to x86 platform support.
This commit is contained in:
commit
ddd5609fe8
|
@ -49,7 +49,7 @@ required:
|
|||
examples:
|
||||
- |
|
||||
#include <dt-bindings/gpio/gpio.h>
|
||||
i2c@0 {
|
||||
i2c {
|
||||
#address-cells = <1>;
|
||||
#size-cells = <0>;
|
||||
|
||||
|
|
|
@ -351,7 +351,7 @@ struct snd_soc_dai {
|
|||
|
||||
/* bit field */
|
||||
unsigned int probed:1;
|
||||
unsigned int started:1;
|
||||
unsigned int started[SNDRV_PCM_STREAM_LAST + 1];
|
||||
};
|
||||
|
||||
static inline struct snd_soc_pcm_stream *
|
||||
|
|
|
@ -139,6 +139,7 @@ static int acp3x_i2s_hwparams(struct snd_pcm_substream *substream,
|
|||
rv_writel(adata->tdm_fmt, rtd->acp3x_base + frmt_reg);
|
||||
}
|
||||
val = rv_readl(rtd->acp3x_base + reg_val);
|
||||
val &= ~ACP3x_ITER_IRER_SAMP_LEN_MASK;
|
||||
val = val | (rtd->xfer_resolution << 3);
|
||||
rv_writel(val, rtd->acp3x_base + reg_val);
|
||||
return 0;
|
||||
|
|
|
@ -76,6 +76,8 @@
|
|||
#define ACP_POWERED_OFF 0x02
|
||||
#define ACP_POWER_OFF_IN_PROGRESS 0x03
|
||||
|
||||
#define ACP3x_ITER_IRER_SAMP_LEN_MASK 0x38
|
||||
|
||||
struct acp3x_platform_info {
|
||||
u16 play_i2s_instance;
|
||||
u16 cap_i2s_instance;
|
||||
|
|
|
@ -181,7 +181,7 @@ bcm63xx_pcm_pointer(struct snd_soc_component *component,
|
|||
snd_pcm_uframes_t x;
|
||||
struct bcm63xx_runtime_data *prtd = substream->runtime->private_data;
|
||||
|
||||
if ((void *)prtd->dma_addr_next == NULL)
|
||||
if (!prtd->dma_addr_next)
|
||||
prtd->dma_addr_next = substream->runtime->dma_addr;
|
||||
|
||||
x = bytes_to_frames(substream->runtime,
|
||||
|
|
|
@ -137,6 +137,9 @@ struct cs4270_private {
|
|||
|
||||
/* power domain regulators */
|
||||
struct regulator_bulk_data supplies[ARRAY_SIZE(supply_names)];
|
||||
|
||||
/* reset gpio */
|
||||
struct gpio_desc *reset_gpio;
|
||||
};
|
||||
|
||||
static const struct snd_soc_dapm_widget cs4270_dapm_widgets[] = {
|
||||
|
@ -648,6 +651,22 @@ static const struct regmap_config cs4270_regmap = {
|
|||
.volatile_reg = cs4270_reg_is_volatile,
|
||||
};
|
||||
|
||||
/**
|
||||
* cs4270_i2c_remove - deinitialize the I2C interface of the CS4270
|
||||
* @i2c_client: the I2C client object
|
||||
*
|
||||
* This function puts the chip into low power mode when the i2c device
|
||||
* is removed.
|
||||
*/
|
||||
static int cs4270_i2c_remove(struct i2c_client *i2c_client)
|
||||
{
|
||||
struct cs4270_private *cs4270 = i2c_get_clientdata(i2c_client);
|
||||
|
||||
gpiod_set_value_cansleep(cs4270->reset_gpio, 0);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
/**
|
||||
* cs4270_i2c_probe - initialize the I2C interface of the CS4270
|
||||
* @i2c_client: the I2C client object
|
||||
|
@ -660,7 +679,6 @@ static int cs4270_i2c_probe(struct i2c_client *i2c_client,
|
|||
const struct i2c_device_id *id)
|
||||
{
|
||||
struct cs4270_private *cs4270;
|
||||
struct gpio_desc *reset_gpiod;
|
||||
unsigned int val;
|
||||
int ret, i;
|
||||
|
||||
|
@ -679,10 +697,21 @@ static int cs4270_i2c_probe(struct i2c_client *i2c_client,
|
|||
if (ret < 0)
|
||||
return ret;
|
||||
|
||||
reset_gpiod = devm_gpiod_get_optional(&i2c_client->dev, "reset",
|
||||
GPIOD_OUT_HIGH);
|
||||
if (PTR_ERR(reset_gpiod) == -EPROBE_DEFER)
|
||||
return -EPROBE_DEFER;
|
||||
/* reset the device */
|
||||
cs4270->reset_gpio = devm_gpiod_get_optional(&i2c_client->dev, "reset",
|
||||
GPIOD_OUT_LOW);
|
||||
if (IS_ERR(cs4270->reset_gpio)) {
|
||||
dev_dbg(&i2c_client->dev, "Error getting CS4270 reset GPIO\n");
|
||||
return PTR_ERR(cs4270->reset_gpio);
|
||||
}
|
||||
|
||||
if (cs4270->reset_gpio) {
|
||||
dev_dbg(&i2c_client->dev, "Found reset GPIO\n");
|
||||
gpiod_set_value_cansleep(cs4270->reset_gpio, 1);
|
||||
}
|
||||
|
||||
/* Sleep 500ns before i2c communications */
|
||||
ndelay(500);
|
||||
|
||||
cs4270->regmap = devm_regmap_init_i2c(i2c_client, &cs4270_regmap);
|
||||
if (IS_ERR(cs4270->regmap))
|
||||
|
@ -735,6 +764,7 @@ static struct i2c_driver cs4270_i2c_driver = {
|
|||
},
|
||||
.id_table = cs4270_id,
|
||||
.probe = cs4270_i2c_probe,
|
||||
.remove = cs4270_i2c_remove,
|
||||
};
|
||||
|
||||
module_i2c_driver(cs4270_i2c_driver);
|
||||
|
|
|
@ -3758,6 +3758,14 @@ static const struct dmi_system_id dmi_platform_data[] = {
|
|||
},
|
||||
.driver_data = (void *)&kahlee_platform_data,
|
||||
},
|
||||
{
|
||||
.ident = "Medion E1239T",
|
||||
.matches = {
|
||||
DMI_EXACT_MATCH(DMI_SYS_VENDOR, "MEDION"),
|
||||
DMI_MATCH(DMI_PRODUCT_NAME, "E1239T MD60568"),
|
||||
},
|
||||
.driver_data = (void *)&intel_braswell_platform_data,
|
||||
},
|
||||
{ }
|
||||
};
|
||||
|
||||
|
|
|
@ -3703,7 +3703,7 @@ static const struct acpi_device_id rt5682_acpi_match[] = {
|
|||
MODULE_DEVICE_TABLE(acpi, rt5682_acpi_match);
|
||||
#endif
|
||||
|
||||
static struct i2c_driver rt5682_i2c_driver = {
|
||||
static struct i2c_driver __maybe_unused rt5682_i2c_driver = {
|
||||
.driver = {
|
||||
.name = "rt5682",
|
||||
.of_match_table = of_match_ptr(rt5682_of_match),
|
||||
|
@ -3713,7 +3713,10 @@ static struct i2c_driver rt5682_i2c_driver = {
|
|||
.shutdown = rt5682_i2c_shutdown,
|
||||
.id_table = rt5682_i2c_id,
|
||||
};
|
||||
|
||||
#ifdef CONFIG_I2C
|
||||
module_i2c_driver(rt5682_i2c_driver);
|
||||
#endif
|
||||
|
||||
MODULE_DESCRIPTION("ASoC RT5682 driver");
|
||||
MODULE_AUTHOR("Bard Liao <bardliao@realtek.com>");
|
||||
|
|
|
@ -50,6 +50,8 @@ static int sst_fill_and_send_cmd_unlocked(struct sst_data *drv,
|
|||
{
|
||||
int ret = 0;
|
||||
|
||||
WARN_ON(!mutex_is_locked(&drv->lock));
|
||||
|
||||
ret = sst_fill_byte_control(drv, ipc_msg,
|
||||
block, task_id, pipe_id, len, cmd_data);
|
||||
if (ret < 0)
|
||||
|
@ -966,7 +968,9 @@ static int sst_set_be_modules(struct snd_soc_dapm_widget *w,
|
|||
dev_dbg(c->dev, "Enter: widget=%s\n", w->name);
|
||||
|
||||
if (SND_SOC_DAPM_EVENT_ON(event)) {
|
||||
mutex_lock(&drv->lock);
|
||||
ret = sst_send_slot_map(drv);
|
||||
mutex_unlock(&drv->lock);
|
||||
if (ret)
|
||||
return ret;
|
||||
ret = sst_send_pipe_module_params(w, k);
|
||||
|
|
|
@ -223,9 +223,9 @@ int sst_prepare_and_post_msg(struct intel_sst_drv *sst,
|
|||
size_t mbox_data_len, const void *mbox_data, void **data,
|
||||
bool large, bool fill_dsp, bool sync, bool response)
|
||||
{
|
||||
struct sst_block *block = NULL;
|
||||
struct ipc_post *msg = NULL;
|
||||
struct ipc_dsp_hdr dsp_hdr;
|
||||
struct sst_block *block;
|
||||
int ret = 0, pvt_id;
|
||||
|
||||
pvt_id = sst_assign_pvt_id(sst);
|
||||
|
|
|
@ -254,7 +254,6 @@ static struct snd_soc_dai_link bdw_rt5650_dais[] = {
|
|||
.no_pcm = 1,
|
||||
.dai_fmt = SND_SOC_DAIFMT_DSP_B | SND_SOC_DAIFMT_NB_NF |
|
||||
SND_SOC_DAIFMT_CBS_CFS,
|
||||
.ignore_suspend = 1,
|
||||
.ignore_pmdown_time = 1,
|
||||
.be_hw_params_fixup = broadwell_ssp0_fixup,
|
||||
.ops = &bdw_rt5650_ops,
|
||||
|
|
|
@ -340,7 +340,6 @@ static struct snd_soc_dai_link bdw_rt5677_dais[] = {
|
|||
.no_pcm = 1,
|
||||
.dai_fmt = SND_SOC_DAIFMT_I2S | SND_SOC_DAIFMT_NB_NF |
|
||||
SND_SOC_DAIFMT_CBS_CFS,
|
||||
.ignore_suspend = 1,
|
||||
.ignore_pmdown_time = 1,
|
||||
.be_hw_params_fixup = broadwell_ssp0_fixup,
|
||||
.ops = &bdw_rt5677_ops,
|
||||
|
|
|
@ -217,7 +217,6 @@ static struct snd_soc_dai_link broadwell_rt286_dais[] = {
|
|||
.init = broadwell_rt286_codec_init,
|
||||
.dai_fmt = SND_SOC_DAIFMT_I2S | SND_SOC_DAIFMT_NB_NF |
|
||||
SND_SOC_DAIFMT_CBS_CFS,
|
||||
.ignore_suspend = 1,
|
||||
.ignore_pmdown_time = 1,
|
||||
.be_hw_params_fixup = broadwell_ssp0_fixup,
|
||||
.ops = &broadwell_rt286_ops,
|
||||
|
|
|
@ -591,6 +591,17 @@ static const struct dmi_system_id byt_rt5640_quirk_table[] = {
|
|||
BYT_RT5640_SSP0_AIF1 |
|
||||
BYT_RT5640_MCLK_EN),
|
||||
},
|
||||
{
|
||||
/* MPMAN MPWIN895CL */
|
||||
.matches = {
|
||||
DMI_EXACT_MATCH(DMI_SYS_VENDOR, "MPMAN"),
|
||||
DMI_EXACT_MATCH(DMI_PRODUCT_NAME, "MPWIN8900CL"),
|
||||
},
|
||||
.driver_data = (void *)(BYTCR_INPUT_DEFAULTS |
|
||||
BYT_RT5640_MONO_SPEAKER |
|
||||
BYT_RT5640_SSP0_AIF1 |
|
||||
BYT_RT5640_MCLK_EN),
|
||||
},
|
||||
{ /* MSI S100 tablet */
|
||||
.matches = {
|
||||
DMI_EXACT_MATCH(DMI_SYS_VENDOR, "Micro-Star International Co., Ltd."),
|
||||
|
|
|
@ -162,7 +162,6 @@ static struct snd_soc_dai_link haswell_rt5640_dais[] = {
|
|||
.no_pcm = 1,
|
||||
.dai_fmt = SND_SOC_DAIFMT_I2S | SND_SOC_DAIFMT_NB_NF |
|
||||
SND_SOC_DAIFMT_CBS_CFS,
|
||||
.ignore_suspend = 1,
|
||||
.ignore_pmdown_time = 1,
|
||||
.be_hw_params_fixup = haswell_ssp0_fixup,
|
||||
.ops = &haswell_rt5640_ops,
|
||||
|
|
|
@ -78,7 +78,7 @@ struct q6asm_dai_data {
|
|||
};
|
||||
|
||||
static const struct snd_pcm_hardware q6asm_dai_hardware_capture = {
|
||||
.info = (SNDRV_PCM_INFO_MMAP |
|
||||
.info = (SNDRV_PCM_INFO_MMAP | SNDRV_PCM_INFO_BATCH |
|
||||
SNDRV_PCM_INFO_BLOCK_TRANSFER |
|
||||
SNDRV_PCM_INFO_MMAP_VALID |
|
||||
SNDRV_PCM_INFO_INTERLEAVED |
|
||||
|
@ -100,7 +100,7 @@ static const struct snd_pcm_hardware q6asm_dai_hardware_capture = {
|
|||
};
|
||||
|
||||
static struct snd_pcm_hardware q6asm_dai_hardware_playback = {
|
||||
.info = (SNDRV_PCM_INFO_MMAP |
|
||||
.info = (SNDRV_PCM_INFO_MMAP | SNDRV_PCM_INFO_BATCH |
|
||||
SNDRV_PCM_INFO_BLOCK_TRANSFER |
|
||||
SNDRV_PCM_INFO_MMAP_VALID |
|
||||
SNDRV_PCM_INFO_INTERLEAVED |
|
||||
|
|
|
@ -295,12 +295,12 @@ int snd_soc_dai_startup(struct snd_soc_dai *dai,
|
|||
{
|
||||
int ret = 0;
|
||||
|
||||
if (!dai->started &&
|
||||
if (!dai->started[substream->stream] &&
|
||||
dai->driver->ops->startup)
|
||||
ret = dai->driver->ops->startup(substream, dai);
|
||||
|
||||
if (ret == 0)
|
||||
dai->started = 1;
|
||||
dai->started[substream->stream] = 1;
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
@ -308,11 +308,11 @@ int snd_soc_dai_startup(struct snd_soc_dai *dai,
|
|||
void snd_soc_dai_shutdown(struct snd_soc_dai *dai,
|
||||
struct snd_pcm_substream *substream)
|
||||
{
|
||||
if (dai->started &&
|
||||
if (dai->started[substream->stream] &&
|
||||
dai->driver->ops->shutdown)
|
||||
dai->driver->ops->shutdown(substream, dai);
|
||||
|
||||
dai->started = 0;
|
||||
dai->started[substream->stream] = 0;
|
||||
}
|
||||
|
||||
int snd_soc_dai_prepare(struct snd_soc_dai *dai,
|
||||
|
|
|
@ -802,7 +802,13 @@ static void dapm_set_mixer_path_status(struct snd_soc_dapm_path *p, int i,
|
|||
val = max - val;
|
||||
p->connect = !!val;
|
||||
} else {
|
||||
p->connect = 0;
|
||||
/* since a virtual mixer has no backing registers to
|
||||
* decide which path to connect, it will try to match
|
||||
* with initial state. This is to ensure
|
||||
* that the default mixer choice will be
|
||||
* correctly powered up during initialization.
|
||||
*/
|
||||
p->connect = invert;
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -825,7 +825,7 @@ int snd_soc_get_xr_sx(struct snd_kcontrol *kcontrol,
|
|||
unsigned int regbase = mc->regbase;
|
||||
unsigned int regcount = mc->regcount;
|
||||
unsigned int regwshift = component->val_bytes * BITS_PER_BYTE;
|
||||
unsigned int regwmask = (1<<regwshift)-1;
|
||||
unsigned int regwmask = (1UL<<regwshift)-1;
|
||||
unsigned int invert = mc->invert;
|
||||
unsigned long mask = (1UL<<mc->nbits)-1;
|
||||
long min = mc->min;
|
||||
|
@ -874,7 +874,7 @@ int snd_soc_put_xr_sx(struct snd_kcontrol *kcontrol,
|
|||
unsigned int regbase = mc->regbase;
|
||||
unsigned int regcount = mc->regcount;
|
||||
unsigned int regwshift = component->val_bytes * BITS_PER_BYTE;
|
||||
unsigned int regwmask = (1<<regwshift)-1;
|
||||
unsigned int regwmask = (1UL<<regwshift)-1;
|
||||
unsigned int invert = mc->invert;
|
||||
unsigned long mask = (1UL<<mc->nbits)-1;
|
||||
long max = mc->max;
|
||||
|
|
|
@ -2324,7 +2324,8 @@ int dpcm_be_dai_trigger(struct snd_soc_pcm_runtime *fe, int stream,
|
|||
switch (cmd) {
|
||||
case SNDRV_PCM_TRIGGER_START:
|
||||
if ((be->dpcm[stream].state != SND_SOC_DPCM_STATE_PREPARE) &&
|
||||
(be->dpcm[stream].state != SND_SOC_DPCM_STATE_STOP))
|
||||
(be->dpcm[stream].state != SND_SOC_DPCM_STATE_STOP) &&
|
||||
(be->dpcm[stream].state != SND_SOC_DPCM_STATE_PAUSED))
|
||||
continue;
|
||||
|
||||
ret = dpcm_do_trigger(dpcm, be_substream, cmd);
|
||||
|
@ -2354,7 +2355,8 @@ int dpcm_be_dai_trigger(struct snd_soc_pcm_runtime *fe, int stream,
|
|||
be->dpcm[stream].state = SND_SOC_DPCM_STATE_START;
|
||||
break;
|
||||
case SNDRV_PCM_TRIGGER_STOP:
|
||||
if (be->dpcm[stream].state != SND_SOC_DPCM_STATE_START)
|
||||
if ((be->dpcm[stream].state != SND_SOC_DPCM_STATE_START) &&
|
||||
(be->dpcm[stream].state != SND_SOC_DPCM_STATE_PAUSED))
|
||||
continue;
|
||||
|
||||
if (!snd_soc_dpcm_can_be_free_stop(fe, be, stream))
|
||||
|
|
|
@ -362,7 +362,7 @@ static int soc_tplg_add_kcontrol(struct soc_tplg *tplg,
|
|||
struct snd_soc_component *comp = tplg->comp;
|
||||
|
||||
return soc_tplg_add_dcontrol(comp->card->snd_card,
|
||||
comp->dev, k, NULL, comp, kcontrol);
|
||||
comp->dev, k, comp->name_prefix, comp, kcontrol);
|
||||
}
|
||||
|
||||
/* remove a mixer kcontrol */
|
||||
|
|
|
@ -597,7 +597,7 @@ int snd_sof_run_firmware(struct snd_sof_dev *sdev)
|
|||
}
|
||||
|
||||
if (sdev->fw_state == SOF_FW_BOOT_COMPLETE)
|
||||
dev_info(sdev->dev, "firmware boot complete\n");
|
||||
dev_dbg(sdev->dev, "firmware boot complete\n");
|
||||
else
|
||||
return -EIO; /* FW boots but fw_ready op failed */
|
||||
|
||||
|
|
|
@ -1556,8 +1556,10 @@ static int stm32_sai_sub_probe(struct platform_device *pdev)
|
|||
|
||||
ret = snd_soc_register_component(&pdev->dev, &stm32_component,
|
||||
&sai->cpu_dai_drv, 1);
|
||||
if (ret)
|
||||
if (ret) {
|
||||
snd_dmaengine_pcm_unregister(&pdev->dev);
|
||||
return ret;
|
||||
}
|
||||
|
||||
if (STM_SAI_PROTOCOL_IS_SPDIF(sai))
|
||||
conf = &stm32_sai_pcm_config_spdif;
|
||||
|
|
Loading…
Reference in New Issue