Commit 342fd472 authored by Mark Brown's avatar Mark Brown

Merge remote-tracking branch 'asoc/topic/dapm' into asoc-next

parents 9914574d 5b2d15bb
...@@ -269,6 +269,13 @@ struct device; ...@@ -269,6 +269,13 @@ struct device;
.reg = SND_SOC_NOPM, .shift = wdelay, .event = dapm_regulator_event, \ .reg = SND_SOC_NOPM, .shift = wdelay, .event = dapm_regulator_event, \
.event_flags = SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD, \ .event_flags = SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD, \
.on_val = wflags} .on_val = wflags}
#define SND_SOC_DAPM_PINCTRL(wname, active, sleep) \
{ .id = snd_soc_dapm_pinctrl, .name = wname, \
.priv = (&(struct snd_soc_dapm_pinctrl_priv) \
{ .active_state = active, .sleep_state = sleep,}), \
.reg = SND_SOC_NOPM, .event = dapm_pinctrl_event, \
.event_flags = SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD }
/* dapm kcontrol types */ /* dapm kcontrol types */
...@@ -374,6 +381,8 @@ int dapm_regulator_event(struct snd_soc_dapm_widget *w, ...@@ -374,6 +381,8 @@ int dapm_regulator_event(struct snd_soc_dapm_widget *w,
struct snd_kcontrol *kcontrol, int event); struct snd_kcontrol *kcontrol, int event);
int dapm_clock_event(struct snd_soc_dapm_widget *w, int dapm_clock_event(struct snd_soc_dapm_widget *w,
struct snd_kcontrol *kcontrol, int event); struct snd_kcontrol *kcontrol, int event);
int dapm_pinctrl_event(struct snd_soc_dapm_widget *w,
struct snd_kcontrol *kcontrol, int event);
/* dapm controls */ /* dapm controls */
int snd_soc_dapm_put_volsw(struct snd_kcontrol *kcontrol, int snd_soc_dapm_put_volsw(struct snd_kcontrol *kcontrol,
...@@ -500,6 +509,7 @@ enum snd_soc_dapm_type { ...@@ -500,6 +509,7 @@ enum snd_soc_dapm_type {
snd_soc_dapm_pre, /* machine specific pre widget - exec first */ snd_soc_dapm_pre, /* machine specific pre widget - exec first */
snd_soc_dapm_post, /* machine specific post widget - exec last */ snd_soc_dapm_post, /* machine specific post widget - exec last */
snd_soc_dapm_supply, /* power/clock supply */ snd_soc_dapm_supply, /* power/clock supply */
snd_soc_dapm_pinctrl, /* pinctrl */
snd_soc_dapm_regulator_supply, /* external regulator */ snd_soc_dapm_regulator_supply, /* external regulator */
snd_soc_dapm_clock_supply, /* external clock */ snd_soc_dapm_clock_supply, /* external clock */
snd_soc_dapm_aif_in, /* audio interface input */ snd_soc_dapm_aif_in, /* audio interface input */
...@@ -581,6 +591,7 @@ struct snd_soc_dapm_widget { ...@@ -581,6 +591,7 @@ struct snd_soc_dapm_widget {
void *priv; /* widget specific data */ void *priv; /* widget specific data */
struct regulator *regulator; /* attached regulator */ struct regulator *regulator; /* attached regulator */
struct pinctrl *pinctrl; /* attached pinctrl */
const struct snd_soc_pcm_stream *params; /* params for dai links */ const struct snd_soc_pcm_stream *params; /* params for dai links */
unsigned int num_params; /* number of params for dai links */ unsigned int num_params; /* number of params for dai links */
unsigned int params_select; /* currently selected param for dai link */ unsigned int params_select; /* currently selected param for dai link */
...@@ -683,6 +694,11 @@ struct snd_soc_dapm_stats { ...@@ -683,6 +694,11 @@ struct snd_soc_dapm_stats {
int neighbour_checks; int neighbour_checks;
}; };
struct snd_soc_dapm_pinctrl_priv {
const char *active_state;
const char *sleep_state;
};
/** /**
* snd_soc_dapm_init_bias_level() - Initialize DAPM bias level * snd_soc_dapm_init_bias_level() - Initialize DAPM bias level
* @dapm: The DAPM context to initialize * @dapm: The DAPM context to initialize
......
...@@ -35,6 +35,7 @@ ...@@ -35,6 +35,7 @@
#include <linux/debugfs.h> #include <linux/debugfs.h>
#include <linux/pm_runtime.h> #include <linux/pm_runtime.h>
#include <linux/regulator/consumer.h> #include <linux/regulator/consumer.h>
#include <linux/pinctrl/consumer.h>
#include <linux/clk.h> #include <linux/clk.h>
#include <linux/slab.h> #include <linux/slab.h>
#include <sound/core.h> #include <sound/core.h>
...@@ -72,6 +73,7 @@ snd_soc_dapm_new_control_unlocked(struct snd_soc_dapm_context *dapm, ...@@ -72,6 +73,7 @@ snd_soc_dapm_new_control_unlocked(struct snd_soc_dapm_context *dapm,
static int dapm_up_seq[] = { static int dapm_up_seq[] = {
[snd_soc_dapm_pre] = 0, [snd_soc_dapm_pre] = 0,
[snd_soc_dapm_regulator_supply] = 1, [snd_soc_dapm_regulator_supply] = 1,
[snd_soc_dapm_pinctrl] = 1,
[snd_soc_dapm_clock_supply] = 1, [snd_soc_dapm_clock_supply] = 1,
[snd_soc_dapm_supply] = 2, [snd_soc_dapm_supply] = 2,
[snd_soc_dapm_micbias] = 3, [snd_soc_dapm_micbias] = 3,
...@@ -121,6 +123,7 @@ static int dapm_down_seq[] = { ...@@ -121,6 +123,7 @@ static int dapm_down_seq[] = {
[snd_soc_dapm_dai_link] = 11, [snd_soc_dapm_dai_link] = 11,
[snd_soc_dapm_supply] = 12, [snd_soc_dapm_supply] = 12,
[snd_soc_dapm_clock_supply] = 13, [snd_soc_dapm_clock_supply] = 13,
[snd_soc_dapm_pinctrl] = 13,
[snd_soc_dapm_regulator_supply] = 13, [snd_soc_dapm_regulator_supply] = 13,
[snd_soc_dapm_post] = 14, [snd_soc_dapm_post] = 14,
}; };
...@@ -1289,6 +1292,31 @@ int dapm_regulator_event(struct snd_soc_dapm_widget *w, ...@@ -1289,6 +1292,31 @@ int dapm_regulator_event(struct snd_soc_dapm_widget *w,
} }
EXPORT_SYMBOL_GPL(dapm_regulator_event); EXPORT_SYMBOL_GPL(dapm_regulator_event);
/*
* Handler for pinctrl widget.
*/
int dapm_pinctrl_event(struct snd_soc_dapm_widget *w,
struct snd_kcontrol *kcontrol, int event)
{
struct snd_soc_dapm_pinctrl_priv *priv = w->priv;
struct pinctrl *p = w->pinctrl;
struct pinctrl_state *s;
if (!p || !priv)
return -EIO;
if (SND_SOC_DAPM_EVENT_ON(event))
s = pinctrl_lookup_state(p, priv->active_state);
else
s = pinctrl_lookup_state(p, priv->sleep_state);
if (IS_ERR(s))
return PTR_ERR(s);
return pinctrl_select_state(p, s);
}
EXPORT_SYMBOL_GPL(dapm_pinctrl_event);
/* /*
* Handler for clock supply widget. * Handler for clock supply widget.
*/ */
...@@ -1902,6 +1930,7 @@ static int dapm_power_widgets(struct snd_soc_card *card, int event) ...@@ -1902,6 +1930,7 @@ static int dapm_power_widgets(struct snd_soc_card *card, int event)
break; break;
case snd_soc_dapm_supply: case snd_soc_dapm_supply:
case snd_soc_dapm_regulator_supply: case snd_soc_dapm_regulator_supply:
case snd_soc_dapm_pinctrl:
case snd_soc_dapm_clock_supply: case snd_soc_dapm_clock_supply:
case snd_soc_dapm_micbias: case snd_soc_dapm_micbias:
if (d->target_bias_level < SND_SOC_BIAS_STANDBY) if (d->target_bias_level < SND_SOC_BIAS_STANDBY)
...@@ -2315,6 +2344,7 @@ static ssize_t dapm_widget_show_component(struct snd_soc_component *cmpnt, ...@@ -2315,6 +2344,7 @@ static ssize_t dapm_widget_show_component(struct snd_soc_component *cmpnt,
case snd_soc_dapm_mixer_named_ctl: case snd_soc_dapm_mixer_named_ctl:
case snd_soc_dapm_supply: case snd_soc_dapm_supply:
case snd_soc_dapm_regulator_supply: case snd_soc_dapm_regulator_supply:
case snd_soc_dapm_pinctrl:
case snd_soc_dapm_clock_supply: case snd_soc_dapm_clock_supply:
if (w->name) if (w->name)
count += sprintf(buf + count, "%s: %s\n", count += sprintf(buf + count, "%s: %s\n",
...@@ -3464,6 +3494,17 @@ snd_soc_dapm_new_control_unlocked(struct snd_soc_dapm_context *dapm, ...@@ -3464,6 +3494,17 @@ snd_soc_dapm_new_control_unlocked(struct snd_soc_dapm_context *dapm,
w->name, ret); w->name, ret);
} }
break; break;
case snd_soc_dapm_pinctrl:
w->pinctrl = devm_pinctrl_get(dapm->dev);
if (IS_ERR_OR_NULL(w->pinctrl)) {
ret = PTR_ERR(w->pinctrl);
if (ret == -EPROBE_DEFER)
return ERR_PTR(ret);
dev_err(dapm->dev, "ASoC: Failed to request %s: %d\n",
w->name, ret);
return NULL;
}
break;
case snd_soc_dapm_clock_supply: case snd_soc_dapm_clock_supply:
#ifdef CONFIG_CLKDEV_LOOKUP #ifdef CONFIG_CLKDEV_LOOKUP
w->clk = devm_clk_get(dapm->dev, w->name); w->clk = devm_clk_get(dapm->dev, w->name);
...@@ -3543,6 +3584,7 @@ snd_soc_dapm_new_control_unlocked(struct snd_soc_dapm_context *dapm, ...@@ -3543,6 +3584,7 @@ snd_soc_dapm_new_control_unlocked(struct snd_soc_dapm_context *dapm,
break; break;
case snd_soc_dapm_supply: case snd_soc_dapm_supply:
case snd_soc_dapm_regulator_supply: case snd_soc_dapm_regulator_supply:
case snd_soc_dapm_pinctrl:
case snd_soc_dapm_clock_supply: case snd_soc_dapm_clock_supply:
case snd_soc_dapm_kcontrol: case snd_soc_dapm_kcontrol:
w->is_supply = 1; w->is_supply = 1;
......
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