Commit 9229f43f authored by Takashi Iwai's avatar Takashi Iwai

Merge branch 'topic/asoc' into for-linus

parents c5976504 c6d1662b
...@@ -178,7 +178,7 @@ ...@@ -178,7 +178,7 @@
.private_value = (unsigned long)&xenum } .private_value = (unsigned long)&xenum }
#define SOC_DAPM_VALUE_ENUM(xname, xenum) \ #define SOC_DAPM_VALUE_ENUM(xname, xenum) \
{ .iface = SNDRV_CTL_ELEM_IFACE_MIXER, .name = xname, \ { .iface = SNDRV_CTL_ELEM_IFACE_MIXER, .name = xname, \
.info = snd_soc_info_value_enum_double, \ .info = snd_soc_info_enum_double, \
.get = snd_soc_dapm_get_value_enum_double, \ .get = snd_soc_dapm_get_value_enum_double, \
.put = snd_soc_dapm_put_value_enum_double, \ .put = snd_soc_dapm_put_value_enum_double, \
.private_value = (unsigned long)&xenum } .private_value = (unsigned long)&xenum }
......
...@@ -106,7 +106,7 @@ ...@@ -106,7 +106,7 @@
.private_value = (unsigned long)&xenum } .private_value = (unsigned long)&xenum }
#define SOC_VALUE_ENUM(xname, xenum) \ #define SOC_VALUE_ENUM(xname, xenum) \
{ .iface = SNDRV_CTL_ELEM_IFACE_MIXER, .name = xname,\ { .iface = SNDRV_CTL_ELEM_IFACE_MIXER, .name = xname,\
.info = snd_soc_info_value_enum_double, \ .info = snd_soc_info_enum_double, \
.get = snd_soc_get_value_enum_double, \ .get = snd_soc_get_value_enum_double, \
.put = snd_soc_put_value_enum_double, \ .put = snd_soc_put_value_enum_double, \
.private_value = (unsigned long)&xenum } .private_value = (unsigned long)&xenum }
...@@ -211,8 +211,6 @@ int snd_soc_get_enum_double(struct snd_kcontrol *kcontrol, ...@@ -211,8 +211,6 @@ int snd_soc_get_enum_double(struct snd_kcontrol *kcontrol,
struct snd_ctl_elem_value *ucontrol); struct snd_ctl_elem_value *ucontrol);
int snd_soc_put_enum_double(struct snd_kcontrol *kcontrol, int snd_soc_put_enum_double(struct snd_kcontrol *kcontrol,
struct snd_ctl_elem_value *ucontrol); struct snd_ctl_elem_value *ucontrol);
int snd_soc_info_value_enum_double(struct snd_kcontrol *kcontrol,
struct snd_ctl_elem_info *uinfo);
int snd_soc_get_value_enum_double(struct snd_kcontrol *kcontrol, int snd_soc_get_value_enum_double(struct snd_kcontrol *kcontrol,
struct snd_ctl_elem_value *ucontrol); struct snd_ctl_elem_value *ucontrol);
int snd_soc_put_value_enum_double(struct snd_kcontrol *kcontrol, int snd_soc_put_value_enum_double(struct snd_kcontrol *kcontrol,
...@@ -414,17 +412,6 @@ struct soc_mixer_control { ...@@ -414,17 +412,6 @@ struct soc_mixer_control {
/* enumerated kcontrol */ /* enumerated kcontrol */
struct soc_enum { struct soc_enum {
unsigned short reg;
unsigned short reg2;
unsigned char shift_l;
unsigned char shift_r;
unsigned int max;
const char **texts;
void *dapm;
};
/* semi enumerated kcontrol */
struct soc_value_enum {
unsigned short reg; unsigned short reg;
unsigned short reg2; unsigned short reg2;
unsigned char shift_l; unsigned char shift_l;
......
...@@ -197,7 +197,7 @@ static const char *twl4030_earpiece_texts[] = ...@@ -197,7 +197,7 @@ static const char *twl4030_earpiece_texts[] =
static const unsigned int twl4030_earpiece_values[] = static const unsigned int twl4030_earpiece_values[] =
{0x0, 0x1, 0x2, 0x4}; {0x0, 0x1, 0x2, 0x4};
static const struct soc_value_enum twl4030_earpiece_enum = static const struct soc_enum twl4030_earpiece_enum =
SOC_VALUE_ENUM_SINGLE(TWL4030_REG_EAR_CTL, 1, 0x7, SOC_VALUE_ENUM_SINGLE(TWL4030_REG_EAR_CTL, 1, 0x7,
ARRAY_SIZE(twl4030_earpiece_texts), ARRAY_SIZE(twl4030_earpiece_texts),
twl4030_earpiece_texts, twl4030_earpiece_texts,
...@@ -213,7 +213,7 @@ static const char *twl4030_predrivel_texts[] = ...@@ -213,7 +213,7 @@ static const char *twl4030_predrivel_texts[] =
static const unsigned int twl4030_predrivel_values[] = static const unsigned int twl4030_predrivel_values[] =
{0x0, 0x1, 0x2, 0x4}; {0x0, 0x1, 0x2, 0x4};
static const struct soc_value_enum twl4030_predrivel_enum = static const struct soc_enum twl4030_predrivel_enum =
SOC_VALUE_ENUM_SINGLE(TWL4030_REG_PREDL_CTL, 1, 0x7, SOC_VALUE_ENUM_SINGLE(TWL4030_REG_PREDL_CTL, 1, 0x7,
ARRAY_SIZE(twl4030_predrivel_texts), ARRAY_SIZE(twl4030_predrivel_texts),
twl4030_predrivel_texts, twl4030_predrivel_texts,
...@@ -229,7 +229,7 @@ static const char *twl4030_predriver_texts[] = ...@@ -229,7 +229,7 @@ static const char *twl4030_predriver_texts[] =
static const unsigned int twl4030_predriver_values[] = static const unsigned int twl4030_predriver_values[] =
{0x0, 0x1, 0x2, 0x4}; {0x0, 0x1, 0x2, 0x4};
static const struct soc_value_enum twl4030_predriver_enum = static const struct soc_enum twl4030_predriver_enum =
SOC_VALUE_ENUM_SINGLE(TWL4030_REG_PREDR_CTL, 1, 0x7, SOC_VALUE_ENUM_SINGLE(TWL4030_REG_PREDR_CTL, 1, 0x7,
ARRAY_SIZE(twl4030_predriver_texts), ARRAY_SIZE(twl4030_predriver_texts),
twl4030_predriver_texts, twl4030_predriver_texts,
...@@ -317,7 +317,7 @@ static const char *twl4030_analoglmic_texts[] = ...@@ -317,7 +317,7 @@ static const char *twl4030_analoglmic_texts[] =
static const unsigned int twl4030_analoglmic_values[] = static const unsigned int twl4030_analoglmic_values[] =
{0x0, 0x1, 0x2, 0x4, 0x8}; {0x0, 0x1, 0x2, 0x4, 0x8};
static const struct soc_value_enum twl4030_analoglmic_enum = static const struct soc_enum twl4030_analoglmic_enum =
SOC_VALUE_ENUM_SINGLE(TWL4030_REG_ANAMICL, 0, 0xf, SOC_VALUE_ENUM_SINGLE(TWL4030_REG_ANAMICL, 0, 0xf,
ARRAY_SIZE(twl4030_analoglmic_texts), ARRAY_SIZE(twl4030_analoglmic_texts),
twl4030_analoglmic_texts, twl4030_analoglmic_texts,
...@@ -333,7 +333,7 @@ static const char *twl4030_analogrmic_texts[] = ...@@ -333,7 +333,7 @@ static const char *twl4030_analogrmic_texts[] =
static const unsigned int twl4030_analogrmic_values[] = static const unsigned int twl4030_analogrmic_values[] =
{0x0, 0x1, 0x4}; {0x0, 0x1, 0x4};
static const struct soc_value_enum twl4030_analogrmic_enum = static const struct soc_enum twl4030_analogrmic_enum =
SOC_VALUE_ENUM_SINGLE(TWL4030_REG_ANAMICR, 0, 0x5, SOC_VALUE_ENUM_SINGLE(TWL4030_REG_ANAMICR, 0, 0x5,
ARRAY_SIZE(twl4030_analogrmic_texts), ARRAY_SIZE(twl4030_analogrmic_texts),
twl4030_analogrmic_texts, twl4030_analogrmic_texts,
...@@ -1280,6 +1280,8 @@ static int twl4030_remove(struct platform_device *pdev) ...@@ -1280,6 +1280,8 @@ static int twl4030_remove(struct platform_device *pdev)
struct snd_soc_codec *codec = socdev->codec; struct snd_soc_codec *codec = socdev->codec;
printk(KERN_INFO "TWL4030 Audio Codec remove\n"); printk(KERN_INFO "TWL4030 Audio Codec remove\n");
snd_soc_free_pcms(socdev);
snd_soc_dapm_free(socdev);
kfree(codec); kfree(codec);
return 0; return 0;
......
...@@ -1584,37 +1584,6 @@ int snd_soc_put_enum_double(struct snd_kcontrol *kcontrol, ...@@ -1584,37 +1584,6 @@ int snd_soc_put_enum_double(struct snd_kcontrol *kcontrol,
} }
EXPORT_SYMBOL_GPL(snd_soc_put_enum_double); EXPORT_SYMBOL_GPL(snd_soc_put_enum_double);
/**
* snd_soc_info_value_enum_double - semi enumerated double mixer info callback
* @kcontrol: mixer control
* @uinfo: control element information
*
* Callback to provide information about a double semi enumerated
* mixer control.
*
* 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_info_value_enum_double(struct snd_kcontrol *kcontrol,
struct snd_ctl_elem_info *uinfo)
{
struct soc_value_enum *e = (struct soc_value_enum *)
kcontrol->private_value;
uinfo->type = SNDRV_CTL_ELEM_TYPE_ENUMERATED;
uinfo->count = e->shift_l == e->shift_r ? 1 : 2;
uinfo->value.enumerated.items = e->max;
if (uinfo->value.enumerated.item > e->max - 1)
uinfo->value.enumerated.item = e->max - 1;
strcpy(uinfo->value.enumerated.name,
e->texts[uinfo->value.enumerated.item]);
return 0;
}
EXPORT_SYMBOL_GPL(snd_soc_info_value_enum_double);
/** /**
* snd_soc_get_value_enum_double - semi enumerated double mixer get callback * snd_soc_get_value_enum_double - semi enumerated double mixer get callback
* @kcontrol: mixer control * @kcontrol: mixer control
...@@ -1631,8 +1600,7 @@ int snd_soc_get_value_enum_double(struct snd_kcontrol *kcontrol, ...@@ -1631,8 +1600,7 @@ int snd_soc_get_value_enum_double(struct snd_kcontrol *kcontrol,
struct snd_ctl_elem_value *ucontrol) struct snd_ctl_elem_value *ucontrol)
{ {
struct snd_soc_codec *codec = snd_kcontrol_chip(kcontrol); struct snd_soc_codec *codec = snd_kcontrol_chip(kcontrol);
struct soc_value_enum *e = (struct soc_value_enum *) struct soc_enum *e = (struct soc_enum *)kcontrol->private_value;
kcontrol->private_value;
unsigned short reg_val, val, mux; unsigned short reg_val, val, mux;
reg_val = snd_soc_read(codec, e->reg); reg_val = snd_soc_read(codec, e->reg);
...@@ -1671,8 +1639,7 @@ int snd_soc_put_value_enum_double(struct snd_kcontrol *kcontrol, ...@@ -1671,8 +1639,7 @@ int snd_soc_put_value_enum_double(struct snd_kcontrol *kcontrol,
struct snd_ctl_elem_value *ucontrol) struct snd_ctl_elem_value *ucontrol)
{ {
struct snd_soc_codec *codec = snd_kcontrol_chip(kcontrol); struct snd_soc_codec *codec = snd_kcontrol_chip(kcontrol);
struct soc_value_enum *e = (struct soc_value_enum *) struct soc_enum *e = (struct soc_enum *)kcontrol->private_value;
kcontrol->private_value;
unsigned short val; unsigned short val;
unsigned short mask; unsigned short mask;
......
...@@ -137,7 +137,7 @@ static void dapm_set_path_status(struct snd_soc_dapm_widget *w, ...@@ -137,7 +137,7 @@ static void dapm_set_path_status(struct snd_soc_dapm_widget *w,
} }
break; break;
case snd_soc_dapm_value_mux: { case snd_soc_dapm_value_mux: {
struct soc_value_enum *e = (struct soc_value_enum *) struct soc_enum *e = (struct soc_enum *)
w->kcontrols[i].private_value; w->kcontrols[i].private_value;
int val, item; int val, item;
...@@ -200,30 +200,6 @@ static int dapm_connect_mux(struct snd_soc_codec *codec, ...@@ -200,30 +200,6 @@ static int dapm_connect_mux(struct snd_soc_codec *codec,
return -ENODEV; return -ENODEV;
} }
/* connect value_mux widget to it's interconnecting audio paths */
static int dapm_connect_value_mux(struct snd_soc_codec *codec,
struct snd_soc_dapm_widget *src, struct snd_soc_dapm_widget *dest,
struct snd_soc_dapm_path *path, const char *control_name,
const struct snd_kcontrol_new *kcontrol)
{
struct soc_value_enum *e = (struct soc_value_enum *)
kcontrol->private_value;
int i;
for (i = 0; i < e->max; i++) {
if (!(strcmp(control_name, e->texts[i]))) {
list_add(&path->list, &codec->dapm_paths);
list_add(&path->list_sink, &dest->sources);
list_add(&path->list_source, &src->sinks);
path->name = (char *)e->texts[i];
dapm_set_path_status(dest, path, 0);
return 0;
}
}
return -ENODEV;
}
/* connect mixer widget to it's interconnecting audio paths */ /* connect mixer widget to it's interconnecting audio paths */
static int dapm_connect_mixer(struct snd_soc_codec *codec, static int dapm_connect_mixer(struct snd_soc_codec *codec,
struct snd_soc_dapm_widget *src, struct snd_soc_dapm_widget *dest, struct snd_soc_dapm_widget *src, struct snd_soc_dapm_widget *dest,
...@@ -774,45 +750,6 @@ static int dapm_mux_update_power(struct snd_soc_dapm_widget *widget, ...@@ -774,45 +750,6 @@ static int dapm_mux_update_power(struct snd_soc_dapm_widget *widget,
return 0; return 0;
} }
/* test and update the power status of a value_mux widget */
static int dapm_value_mux_update_power(struct snd_soc_dapm_widget *widget,
struct snd_kcontrol *kcontrol, int mask,
int mux, int val, struct soc_value_enum *e)
{
struct snd_soc_dapm_path *path;
int found = 0;
if (widget->id != snd_soc_dapm_value_mux)
return -ENODEV;
if (!snd_soc_test_bits(widget->codec, e->reg, mask, val))
return 0;
/* find dapm widget path assoc with kcontrol */
list_for_each_entry(path, &widget->codec->dapm_paths, list) {
if (path->kcontrol != kcontrol)
continue;
if (!path->name || !e->texts[mux])
continue;
found = 1;
/* we now need to match the string in the enum to the path */
if (!(strcmp(path->name, e->texts[mux])))
path->connect = 1; /* new connection */
else
path->connect = 0; /* old connection must be
powered down */
}
if (found) {
dapm_power_widgets(widget->codec, SND_SOC_DAPM_STREAM_NOP);
dump_dapm(widget->codec, "mux power update");
}
return 0;
}
/* test and update the power status of a mixer or switch widget */ /* test and update the power status of a mixer or switch widget */
static int dapm_mixer_update_power(struct snd_soc_dapm_widget *widget, static int dapm_mixer_update_power(struct snd_soc_dapm_widget *widget,
struct snd_kcontrol *kcontrol, int reg, struct snd_kcontrol *kcontrol, int reg,
...@@ -1045,17 +982,12 @@ static int snd_soc_dapm_add_route(struct snd_soc_codec *codec, ...@@ -1045,17 +982,12 @@ static int snd_soc_dapm_add_route(struct snd_soc_codec *codec,
path->connect = 1; path->connect = 1;
return 0; return 0;
case snd_soc_dapm_mux: case snd_soc_dapm_mux:
case snd_soc_dapm_value_mux:
ret = dapm_connect_mux(codec, wsource, wsink, path, control, ret = dapm_connect_mux(codec, wsource, wsink, path, control,
&wsink->kcontrols[0]); &wsink->kcontrols[0]);
if (ret != 0) if (ret != 0)
goto err; goto err;
break; break;
case snd_soc_dapm_value_mux:
ret = dapm_connect_value_mux(codec, wsource, wsink, path,
control, &wsink->kcontrols[0]);
if (ret != 0)
goto err;
break;
case snd_soc_dapm_switch: case snd_soc_dapm_switch:
case snd_soc_dapm_mixer: case snd_soc_dapm_mixer:
ret = dapm_connect_mixer(codec, wsource, wsink, path, control); ret = dapm_connect_mixer(codec, wsource, wsink, path, control);
...@@ -1382,8 +1314,7 @@ int snd_soc_dapm_get_value_enum_double(struct snd_kcontrol *kcontrol, ...@@ -1382,8 +1314,7 @@ int snd_soc_dapm_get_value_enum_double(struct snd_kcontrol *kcontrol,
struct snd_ctl_elem_value *ucontrol) struct snd_ctl_elem_value *ucontrol)
{ {
struct snd_soc_dapm_widget *widget = snd_kcontrol_chip(kcontrol); struct snd_soc_dapm_widget *widget = snd_kcontrol_chip(kcontrol);
struct soc_value_enum *e = (struct soc_value_enum *) struct soc_enum *e = (struct soc_enum *)kcontrol->private_value;
kcontrol->private_value;
unsigned short reg_val, val, mux; unsigned short reg_val, val, mux;
reg_val = snd_soc_read(widget->codec, e->reg); reg_val = snd_soc_read(widget->codec, e->reg);
...@@ -1423,8 +1354,7 @@ int snd_soc_dapm_put_value_enum_double(struct snd_kcontrol *kcontrol, ...@@ -1423,8 +1354,7 @@ int snd_soc_dapm_put_value_enum_double(struct snd_kcontrol *kcontrol,
struct snd_ctl_elem_value *ucontrol) struct snd_ctl_elem_value *ucontrol)
{ {
struct snd_soc_dapm_widget *widget = snd_kcontrol_chip(kcontrol); struct snd_soc_dapm_widget *widget = snd_kcontrol_chip(kcontrol);
struct soc_value_enum *e = (struct soc_value_enum *) struct soc_enum *e = (struct soc_enum *)kcontrol->private_value;
kcontrol->private_value;
unsigned short val, mux; unsigned short val, mux;
unsigned short mask; unsigned short mask;
int ret = 0; int ret = 0;
...@@ -1443,7 +1373,7 @@ int snd_soc_dapm_put_value_enum_double(struct snd_kcontrol *kcontrol, ...@@ -1443,7 +1373,7 @@ int snd_soc_dapm_put_value_enum_double(struct snd_kcontrol *kcontrol,
mutex_lock(&widget->codec->mutex); mutex_lock(&widget->codec->mutex);
widget->value = val; widget->value = val;
dapm_value_mux_update_power(widget, kcontrol, mask, mux, val, e); dapm_mux_update_power(widget, kcontrol, mask, mux, val, e);
if (widget->event) { if (widget->event) {
if (widget->event_flags & SND_SOC_DAPM_PRE_REG) { if (widget->event_flags & SND_SOC_DAPM_PRE_REG) {
ret = widget->event(widget, ret = widget->event(widget,
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment