|
@@ -174,6 +174,17 @@ static inline struct snd_soc_dapm_widget *dapm_cnew_widget(
|
|
|
return kmemdup(_widget, sizeof(*_widget), GFP_KERNEL);
|
|
|
}
|
|
|
|
|
|
+/**
|
|
|
+ * snd_soc_dapm_kcontrol_codec() - Returns the codec associated to a kcontrol
|
|
|
+ * @kcontrol: The kcontrol
|
|
|
+ */
|
|
|
+struct snd_soc_codec *snd_soc_dapm_kcontrol_codec(struct snd_kcontrol *kcontrol)
|
|
|
+{
|
|
|
+ struct snd_soc_dapm_widget_list *wlist = snd_kcontrol_chip(kcontrol);
|
|
|
+ return wlist->widgets[0]->codec;
|
|
|
+}
|
|
|
+EXPORT_SYMBOL_GPL(snd_soc_dapm_kcontrol_codec);
|
|
|
+
|
|
|
static void dapm_reset(struct snd_soc_card *card)
|
|
|
{
|
|
|
struct snd_soc_dapm_widget *w;
|
|
@@ -2617,8 +2628,7 @@ EXPORT_SYMBOL_GPL(snd_soc_dapm_new_widgets);
|
|
|
int snd_soc_dapm_get_volsw(struct snd_kcontrol *kcontrol,
|
|
|
struct snd_ctl_elem_value *ucontrol)
|
|
|
{
|
|
|
- struct snd_soc_dapm_widget_list *wlist = snd_kcontrol_chip(kcontrol);
|
|
|
- struct snd_soc_dapm_widget *widget = wlist->widgets[0];
|
|
|
+ struct snd_soc_codec *codec = snd_soc_dapm_kcontrol_codec(kcontrol);
|
|
|
struct soc_mixer_control *mc =
|
|
|
(struct soc_mixer_control *)kcontrol->private_value;
|
|
|
unsigned int reg = mc->reg;
|
|
@@ -2628,12 +2638,12 @@ int snd_soc_dapm_get_volsw(struct snd_kcontrol *kcontrol,
|
|
|
unsigned int invert = mc->invert;
|
|
|
|
|
|
if (snd_soc_volsw_is_stereo(mc))
|
|
|
- dev_warn(widget->dapm->dev,
|
|
|
+ dev_warn(codec->dapm.dev,
|
|
|
"ASoC: Control '%s' is stereo, which is not supported\n",
|
|
|
kcontrol->id.name);
|
|
|
|
|
|
ucontrol->value.integer.value[0] =
|
|
|
- (snd_soc_read(widget->codec, reg) >> shift) & mask;
|
|
|
+ (snd_soc_read(codec, reg) >> shift) & mask;
|
|
|
if (invert)
|
|
|
ucontrol->value.integer.value[0] =
|
|
|
max - ucontrol->value.integer.value[0];
|
|
@@ -2654,9 +2664,7 @@ EXPORT_SYMBOL_GPL(snd_soc_dapm_get_volsw);
|
|
|
int snd_soc_dapm_put_volsw(struct snd_kcontrol *kcontrol,
|
|
|
struct snd_ctl_elem_value *ucontrol)
|
|
|
{
|
|
|
- struct snd_soc_dapm_widget_list *wlist = snd_kcontrol_chip(kcontrol);
|
|
|
- struct snd_soc_dapm_widget *widget = wlist->widgets[0];
|
|
|
- struct snd_soc_codec *codec = widget->codec;
|
|
|
+ struct snd_soc_codec *codec = snd_soc_dapm_kcontrol_codec(kcontrol);
|
|
|
struct snd_soc_card *card = codec->card;
|
|
|
struct soc_mixer_control *mc =
|
|
|
(struct soc_mixer_control *)kcontrol->private_value;
|
|
@@ -2670,7 +2678,7 @@ int snd_soc_dapm_put_volsw(struct snd_kcontrol *kcontrol,
|
|
|
struct snd_soc_dapm_update update;
|
|
|
|
|
|
if (snd_soc_volsw_is_stereo(mc))
|
|
|
- dev_warn(widget->dapm->dev,
|
|
|
+ dev_warn(codec->dapm.dev,
|
|
|
"ASoC: Control '%s' is stereo, which is not supported\n",
|
|
|
kcontrol->id.name);
|
|
|
|
|
@@ -2684,7 +2692,7 @@ int snd_soc_dapm_put_volsw(struct snd_kcontrol *kcontrol,
|
|
|
|
|
|
mutex_lock_nested(&card->dapm_mutex, SND_SOC_DAPM_CLASS_RUNTIME);
|
|
|
|
|
|
- change = snd_soc_test_bits(widget->codec, reg, mask, val);
|
|
|
+ change = snd_soc_test_bits(codec, reg, mask, val);
|
|
|
if (change) {
|
|
|
update.kcontrol = kcontrol;
|
|
|
update.reg = reg;
|
|
@@ -2715,12 +2723,11 @@ EXPORT_SYMBOL_GPL(snd_soc_dapm_put_volsw);
|
|
|
int snd_soc_dapm_get_enum_double(struct snd_kcontrol *kcontrol,
|
|
|
struct snd_ctl_elem_value *ucontrol)
|
|
|
{
|
|
|
- struct snd_soc_dapm_widget_list *wlist = snd_kcontrol_chip(kcontrol);
|
|
|
- struct snd_soc_dapm_widget *widget = wlist->widgets[0];
|
|
|
+ struct snd_soc_codec *codec = snd_soc_dapm_kcontrol_codec(kcontrol);
|
|
|
struct soc_enum *e = (struct soc_enum *)kcontrol->private_value;
|
|
|
unsigned int val;
|
|
|
|
|
|
- val = snd_soc_read(widget->codec, e->reg);
|
|
|
+ val = snd_soc_read(codec, e->reg);
|
|
|
ucontrol->value.enumerated.item[0] = (val >> e->shift_l) & e->mask;
|
|
|
if (e->shift_l != e->shift_r)
|
|
|
ucontrol->value.enumerated.item[1] =
|
|
@@ -2765,7 +2772,7 @@ int snd_soc_dapm_put_enum_double(struct snd_kcontrol *kcontrol,
|
|
|
|
|
|
mutex_lock_nested(&card->dapm_mutex, SND_SOC_DAPM_CLASS_RUNTIME);
|
|
|
|
|
|
- change = snd_soc_test_bits(widget->codec, e->reg, mask, val);
|
|
|
+ change = snd_soc_test_bits(codec, e->reg, mask, val);
|
|
|
if (change) {
|
|
|
widget->value = val;
|
|
|
|
|
@@ -2854,12 +2861,11 @@ EXPORT_SYMBOL_GPL(snd_soc_dapm_put_enum_virt);
|
|
|
int snd_soc_dapm_get_value_enum_double(struct snd_kcontrol *kcontrol,
|
|
|
struct snd_ctl_elem_value *ucontrol)
|
|
|
{
|
|
|
- struct snd_soc_dapm_widget_list *wlist = snd_kcontrol_chip(kcontrol);
|
|
|
- struct snd_soc_dapm_widget *widget = wlist->widgets[0];
|
|
|
+ struct snd_soc_codec *codec = snd_soc_dapm_kcontrol_codec(kcontrol);
|
|
|
struct soc_enum *e = (struct soc_enum *)kcontrol->private_value;
|
|
|
unsigned int reg_val, val, mux;
|
|
|
|
|
|
- reg_val = snd_soc_read(widget->codec, e->reg);
|
|
|
+ reg_val = snd_soc_read(codec, e->reg);
|
|
|
val = (reg_val >> e->shift_l) & e->mask;
|
|
|
for (mux = 0; mux < e->max; mux++) {
|
|
|
if (val == e->values[mux])
|
|
@@ -2918,7 +2924,7 @@ int snd_soc_dapm_put_value_enum_double(struct snd_kcontrol *kcontrol,
|
|
|
|
|
|
mutex_lock_nested(&card->dapm_mutex, SND_SOC_DAPM_CLASS_RUNTIME);
|
|
|
|
|
|
- change = snd_soc_test_bits(widget->codec, e->reg, mask, val);
|
|
|
+ change = snd_soc_test_bits(codec, e->reg, mask, val);
|
|
|
if (change) {
|
|
|
widget->value = val;
|
|
|
|