mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/next/linux-next.git
synced 2025-01-18 06:15:12 +00:00
ASoC: Fixes for v6.8
A few small fixes, some driver specific and one slightly larger one from Richard which adds a new core helper and updates a small clutch of drivers to deal with the fact that they were using a helper which requires that the lock for the list of controls without holding that lock. We also have some quirks for new AMD based Lenovo systems. -----BEGIN PGP SIGNATURE----- iQEzBAABCgAdFiEEreZoqmdXGLWf4p/qJNaLcl1Uh9AFAmXfbaEACgkQJNaLcl1U h9BebQf/aFqaqCH76TIyVpJgzFKb4Gxt5cZGtnQTFFGvwr20qLdDpcu0KddepiMF eRYIzGu0F7KsLOKhUFy06qoti7b3QMyJtRmCIjBt9+RAt8QgmZGG9jSYqJ2lbXHR cyomj24Kh4UMYopO7WuVxAiXzp1dz2AKqg4a2BiutZymqkYZGvfvt86P/iT5ovUA U8bM94EWe+/6HoqkPBpOo5hb0zwXQ0NNYSCnwcCufqDTT0jdWIgboxJA2Kic1xvb h2wdHgwydbOgdINaDQLphQHZ5BtukYo+KIAYFj9OvLVkVYxkMbwcjmFZSZlYQhcC OOuiBoXC2IUfBrCJlOaXvqKZa1m43Q== =qMZl -----END PGP SIGNATURE----- Merge tag 'asoc-fix-v6.8-rc5' of https://git.kernel.org/pub/scm/linux/kernel/git/broonie/sound into for-linus ASoC: Fixes for v6.8 A few small fixes, some driver specific and one slightly larger one from Richard which adds a new core helper and updates a small clutch of drivers to deal with the fact that they were using a helper which requires that the lock for the list of controls without holding that lock. We also have some quirks for new AMD based Lenovo systems.
This commit is contained in:
commit
17c6a0c986
@ -30,6 +30,8 @@ static inline void snd_soc_card_mutex_unlock(struct snd_soc_card *card)
|
||||
|
||||
struct snd_kcontrol *snd_soc_card_get_kcontrol(struct snd_soc_card *soc_card,
|
||||
const char *name);
|
||||
struct snd_kcontrol *snd_soc_card_get_kcontrol_locked(struct snd_soc_card *soc_card,
|
||||
const char *name);
|
||||
int snd_soc_card_jack_new(struct snd_soc_card *card, const char *id, int type,
|
||||
struct snd_soc_jack *jack);
|
||||
int snd_soc_card_jack_new_pins(struct snd_soc_card *card, const char *id,
|
||||
|
@ -199,6 +199,20 @@ static const struct dmi_system_id yc_acp_quirk_table[] = {
|
||||
DMI_MATCH(DMI_PRODUCT_NAME, "21HY"),
|
||||
}
|
||||
},
|
||||
{
|
||||
.driver_data = &acp6x_card,
|
||||
.matches = {
|
||||
DMI_MATCH(DMI_BOARD_VENDOR, "LENOVO"),
|
||||
DMI_MATCH(DMI_PRODUCT_NAME, "21J2"),
|
||||
}
|
||||
},
|
||||
{
|
||||
.driver_data = &acp6x_card,
|
||||
.matches = {
|
||||
DMI_MATCH(DMI_BOARD_VENDOR, "LENOVO"),
|
||||
DMI_MATCH(DMI_PRODUCT_NAME, "21J0"),
|
||||
}
|
||||
},
|
||||
{
|
||||
.driver_data = &acp6x_card,
|
||||
.matches = {
|
||||
|
@ -162,6 +162,7 @@ static int snd_acp6x_probe(struct pci_dev *pci,
|
||||
/* Yellow Carp device check */
|
||||
switch (pci->revision) {
|
||||
case 0x60:
|
||||
case 0x63:
|
||||
case 0x6f:
|
||||
break;
|
||||
default:
|
||||
|
@ -184,7 +184,7 @@ static int cs35l45_activate_ctl(struct snd_soc_component *component,
|
||||
else
|
||||
snprintf(name, SNDRV_CTL_ELEM_ID_NAME_MAXLEN, "%s", ctl_name);
|
||||
|
||||
kcontrol = snd_soc_card_get_kcontrol(component->card, name);
|
||||
kcontrol = snd_soc_card_get_kcontrol_locked(component->card, name);
|
||||
if (!kcontrol) {
|
||||
dev_err(component->dev, "Can't find kcontrol %s\n", name);
|
||||
return -EINVAL;
|
||||
|
@ -335,6 +335,7 @@ void cs35l56_wait_min_reset_pulse(void)
|
||||
EXPORT_SYMBOL_NS_GPL(cs35l56_wait_min_reset_pulse, SND_SOC_CS35L56_SHARED);
|
||||
|
||||
static const struct reg_sequence cs35l56_system_reset_seq[] = {
|
||||
REG_SEQ0(CS35L56_DSP1_HALO_STATE, 0),
|
||||
REG_SEQ0(CS35L56_DSP_VIRTUAL1_MBOX_1, CS35L56_MBOX_CMD_SYSTEM_RESET),
|
||||
};
|
||||
|
||||
|
@ -114,7 +114,7 @@ static int cs35l56_sync_asp1_mixer_widgets_with_firmware(struct cs35l56_private
|
||||
name = full_name;
|
||||
}
|
||||
|
||||
kcontrol = snd_soc_card_get_kcontrol(dapm->card, name);
|
||||
kcontrol = snd_soc_card_get_kcontrol_locked(dapm->card, name);
|
||||
if (!kcontrol) {
|
||||
dev_warn(cs35l56->base.dev, "Could not find control %s\n", name);
|
||||
continue;
|
||||
|
@ -174,7 +174,9 @@ static int fsl_xcvr_activate_ctl(struct snd_soc_dai *dai, const char *name,
|
||||
struct snd_kcontrol *kctl;
|
||||
bool enabled;
|
||||
|
||||
kctl = snd_soc_card_get_kcontrol(card, name);
|
||||
lockdep_assert_held(&card->snd_card->controls_rwsem);
|
||||
|
||||
kctl = snd_soc_card_get_kcontrol_locked(card, name);
|
||||
if (kctl == NULL)
|
||||
return -ENOENT;
|
||||
|
||||
@ -576,10 +578,14 @@ static int fsl_xcvr_startup(struct snd_pcm_substream *substream,
|
||||
xcvr->streams |= BIT(substream->stream);
|
||||
|
||||
if (!xcvr->soc_data->spdif_only) {
|
||||
struct snd_soc_card *card = dai->component->card;
|
||||
|
||||
/* Disable XCVR controls if there is stream started */
|
||||
down_read(&card->snd_card->controls_rwsem);
|
||||
fsl_xcvr_activate_ctl(dai, fsl_xcvr_mode_kctl.name, false);
|
||||
fsl_xcvr_activate_ctl(dai, fsl_xcvr_arc_mode_kctl.name, false);
|
||||
fsl_xcvr_activate_ctl(dai, fsl_xcvr_earc_capds_kctl.name, false);
|
||||
up_read(&card->snd_card->controls_rwsem);
|
||||
}
|
||||
|
||||
return 0;
|
||||
@ -598,11 +604,15 @@ static void fsl_xcvr_shutdown(struct snd_pcm_substream *substream,
|
||||
/* Enable XCVR controls if there is no stream started */
|
||||
if (!xcvr->streams) {
|
||||
if (!xcvr->soc_data->spdif_only) {
|
||||
struct snd_soc_card *card = dai->component->card;
|
||||
|
||||
down_read(&card->snd_card->controls_rwsem);
|
||||
fsl_xcvr_activate_ctl(dai, fsl_xcvr_mode_kctl.name, true);
|
||||
fsl_xcvr_activate_ctl(dai, fsl_xcvr_arc_mode_kctl.name,
|
||||
(xcvr->mode == FSL_XCVR_MODE_ARC));
|
||||
fsl_xcvr_activate_ctl(dai, fsl_xcvr_earc_capds_kctl.name,
|
||||
(xcvr->mode == FSL_XCVR_MODE_EARC));
|
||||
up_read(&card->snd_card->controls_rwsem);
|
||||
}
|
||||
ret = regmap_update_bits(xcvr->regmap, FSL_XCVR_EXT_IER0,
|
||||
FSL_XCVR_IRQ_EARC_ALL, 0);
|
||||
|
@ -259,7 +259,7 @@ static int lpass_cdc_dma_daiops_trigger(struct snd_pcm_substream *substream,
|
||||
int cmd, struct snd_soc_dai *dai)
|
||||
{
|
||||
struct snd_soc_pcm_runtime *soc_runtime = snd_soc_substream_to_rtd(substream);
|
||||
struct lpaif_dmactl *dmactl;
|
||||
struct lpaif_dmactl *dmactl = NULL;
|
||||
int ret = 0, id;
|
||||
|
||||
switch (cmd) {
|
||||
|
@ -5,6 +5,9 @@
|
||||
// Copyright (C) 2019 Renesas Electronics Corp.
|
||||
// Kuninori Morimoto <kuninori.morimoto.gx@renesas.com>
|
||||
//
|
||||
|
||||
#include <linux/lockdep.h>
|
||||
#include <linux/rwsem.h>
|
||||
#include <sound/soc.h>
|
||||
#include <sound/jack.h>
|
||||
|
||||
@ -26,12 +29,15 @@ static inline int _soc_card_ret(struct snd_soc_card *card,
|
||||
return ret;
|
||||
}
|
||||
|
||||
struct snd_kcontrol *snd_soc_card_get_kcontrol(struct snd_soc_card *soc_card,
|
||||
const char *name)
|
||||
struct snd_kcontrol *snd_soc_card_get_kcontrol_locked(struct snd_soc_card *soc_card,
|
||||
const char *name)
|
||||
{
|
||||
struct snd_card *card = soc_card->snd_card;
|
||||
struct snd_kcontrol *kctl;
|
||||
|
||||
/* must be held read or write */
|
||||
lockdep_assert_held(&card->controls_rwsem);
|
||||
|
||||
if (unlikely(!name))
|
||||
return NULL;
|
||||
|
||||
@ -40,6 +46,20 @@ struct snd_kcontrol *snd_soc_card_get_kcontrol(struct snd_soc_card *soc_card,
|
||||
return kctl;
|
||||
return NULL;
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(snd_soc_card_get_kcontrol_locked);
|
||||
|
||||
struct snd_kcontrol *snd_soc_card_get_kcontrol(struct snd_soc_card *soc_card,
|
||||
const char *name)
|
||||
{
|
||||
struct snd_card *card = soc_card->snd_card;
|
||||
struct snd_kcontrol *kctl;
|
||||
|
||||
down_read(&card->controls_rwsem);
|
||||
kctl = snd_soc_card_get_kcontrol_locked(soc_card, name);
|
||||
up_read(&card->controls_rwsem);
|
||||
|
||||
return kctl;
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(snd_soc_card_get_kcontrol);
|
||||
|
||||
static int jack_new(struct snd_soc_card *card, const char *id, int type,
|
||||
|
Loading…
x
Reference in New Issue
Block a user