|
@@ -2596,14 +2596,18 @@ int snd_soc_get_enum_double(struct snd_kcontrol *kcontrol,
|
|
|
{
|
|
|
struct snd_soc_codec *codec = snd_kcontrol_chip(kcontrol);
|
|
|
struct soc_enum *e = (struct soc_enum *)kcontrol->private_value;
|
|
|
- unsigned int val;
|
|
|
+ unsigned int val, item;
|
|
|
+ unsigned int reg_val;
|
|
|
|
|
|
- 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] =
|
|
|
- (val >> e->shift_r) & e->mask;
|
|
|
+ reg_val = snd_soc_read(codec, e->reg);
|
|
|
+ val = (reg_val >> e->shift_l) & e->mask;
|
|
|
+ item = snd_soc_enum_val_to_item(e, val);
|
|
|
+ ucontrol->value.enumerated.item[0] = item;
|
|
|
+ if (e->shift_l != e->shift_r) {
|
|
|
+ val = (reg_val >> e->shift_l) & e->mask;
|
|
|
+ item = snd_soc_enum_val_to_item(e, val);
|
|
|
+ ucontrol->value.enumerated.item[1] = item;
|
|
|
+ }
|
|
|
|
|
|
return 0;
|
|
|
}
|
|
@@ -2623,17 +2627,18 @@ int snd_soc_put_enum_double(struct snd_kcontrol *kcontrol,
|
|
|
{
|
|
|
struct snd_soc_codec *codec = snd_kcontrol_chip(kcontrol);
|
|
|
struct soc_enum *e = (struct soc_enum *)kcontrol->private_value;
|
|
|
+ unsigned int *item = ucontrol->value.enumerated.item;
|
|
|
unsigned int val;
|
|
|
unsigned int mask;
|
|
|
|
|
|
- if (ucontrol->value.enumerated.item[0] >= e->items)
|
|
|
+ if (item[0] >= e->items)
|
|
|
return -EINVAL;
|
|
|
- val = ucontrol->value.enumerated.item[0] << e->shift_l;
|
|
|
+ val = snd_soc_enum_item_to_val(e, item[0]) << e->shift_l;
|
|
|
mask = e->mask << e->shift_l;
|
|
|
if (e->shift_l != e->shift_r) {
|
|
|
- if (ucontrol->value.enumerated.item[1] >= e->items)
|
|
|
+ if (item[1] >= e->items)
|
|
|
return -EINVAL;
|
|
|
- val |= ucontrol->value.enumerated.item[1] << e->shift_r;
|
|
|
+ val |= snd_soc_enum_item_to_val(e, item[1]) << e->shift_r;
|
|
|
mask |= e->mask << e->shift_r;
|
|
|
}
|
|
|
|
|
@@ -2641,80 +2646,6 @@ int snd_soc_put_enum_double(struct snd_kcontrol *kcontrol,
|
|
|
}
|
|
|
EXPORT_SYMBOL_GPL(snd_soc_put_enum_double);
|
|
|
|
|
|
-/**
|
|
|
- * snd_soc_get_value_enum_double - semi enumerated double mixer get callback
|
|
|
- * @kcontrol: mixer control
|
|
|
- * @ucontrol: control element information
|
|
|
- *
|
|
|
- * Callback to get the value of a double semi enumerated mixer.
|
|
|
- *
|
|
|
- * Semi enumerated mixer: the enumerated items are referred as values. Can be
|
|
|
- * used for handling bitfield coded enumeration for example.
|
|
|
- *
|
|
|
- * Returns 0 for success.
|
|
|
- */
|
|
|
-int snd_soc_get_value_enum_double(struct snd_kcontrol *kcontrol,
|
|
|
- struct snd_ctl_elem_value *ucontrol)
|
|
|
-{
|
|
|
- struct snd_soc_codec *codec = snd_kcontrol_chip(kcontrol);
|
|
|
- struct soc_enum *e = (struct soc_enum *)kcontrol->private_value;
|
|
|
- unsigned int reg_val, val, mux;
|
|
|
-
|
|
|
- reg_val = snd_soc_read(codec, e->reg);
|
|
|
- val = (reg_val >> e->shift_l) & e->mask;
|
|
|
- for (mux = 0; mux < e->items; mux++) {
|
|
|
- if (val == e->values[mux])
|
|
|
- break;
|
|
|
- }
|
|
|
- ucontrol->value.enumerated.item[0] = mux;
|
|
|
- if (e->shift_l != e->shift_r) {
|
|
|
- val = (reg_val >> e->shift_r) & e->mask;
|
|
|
- for (mux = 0; mux < e->items; mux++) {
|
|
|
- if (val == e->values[mux])
|
|
|
- break;
|
|
|
- }
|
|
|
- ucontrol->value.enumerated.item[1] = mux;
|
|
|
- }
|
|
|
-
|
|
|
- return 0;
|
|
|
-}
|
|
|
-EXPORT_SYMBOL_GPL(snd_soc_get_value_enum_double);
|
|
|
-
|
|
|
-/**
|
|
|
- * snd_soc_put_value_enum_double - semi enumerated double mixer put callback
|
|
|
- * @kcontrol: mixer control
|
|
|
- * @ucontrol: control element information
|
|
|
- *
|
|
|
- * Callback to set the value of a double semi enumerated mixer.
|
|
|
- *
|
|
|
- * Semi enumerated mixer: the enumerated items are referred as values. Can be
|
|
|
- * used for handling bitfield coded enumeration for example.
|
|
|
- *
|
|
|
- * Returns 0 for success.
|
|
|
- */
|
|
|
-int snd_soc_put_value_enum_double(struct snd_kcontrol *kcontrol,
|
|
|
- struct snd_ctl_elem_value *ucontrol)
|
|
|
-{
|
|
|
- struct snd_soc_codec *codec = snd_kcontrol_chip(kcontrol);
|
|
|
- struct soc_enum *e = (struct soc_enum *)kcontrol->private_value;
|
|
|
- unsigned int val;
|
|
|
- unsigned int mask;
|
|
|
-
|
|
|
- if (ucontrol->value.enumerated.item[0] >= e->items)
|
|
|
- return -EINVAL;
|
|
|
- val = e->values[ucontrol->value.enumerated.item[0]] << e->shift_l;
|
|
|
- mask = e->mask << e->shift_l;
|
|
|
- if (e->shift_l != e->shift_r) {
|
|
|
- if (ucontrol->value.enumerated.item[1] >= e->items)
|
|
|
- return -EINVAL;
|
|
|
- val |= e->values[ucontrol->value.enumerated.item[1]] << e->shift_r;
|
|
|
- mask |= e->mask << e->shift_r;
|
|
|
- }
|
|
|
-
|
|
|
- return snd_soc_update_bits_locked(codec, e->reg, mask, val);
|
|
|
-}
|
|
|
-EXPORT_SYMBOL_GPL(snd_soc_put_value_enum_double);
|
|
|
-
|
|
|
/**
|
|
|
* snd_soc_read_signed - Read a codec register and interprete as signed value
|
|
|
* @codec: codec
|