mirror of
https://github.com/Dasharo/linux.git
synced 2026-03-06 15:25:10 -08:00
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:
@@ -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,
|
||||
|
||||
Reference in New Issue
Block a user