* [PATCH 1/3] ASoC: dapm: Mark widgets as dirty when a route is added
@ 2012-07-05 16:27 Mark Brown
2012-07-05 16:27 ` [PATCH 2/3] ASoC: dapm: Allow routes to be deleted at runtime Mark Brown
` (2 more replies)
0 siblings, 3 replies; 4+ messages in thread
From: Mark Brown @ 2012-07-05 16:27 UTC (permalink / raw)
To: Liam Girdwood; +Cc: alsa-devel, Mark Brown
If we add a new route at runtime then we'll need to recheck the connections
to the affected widgets.
Signed-off-by: Mark Brown <broonie@opensource.wolfsonmicro.com>
---
sound/soc/soc-dapm.c | 4 ++++
1 file changed, 4 insertions(+)
diff --git a/sound/soc/soc-dapm.c b/sound/soc/soc-dapm.c
index ed1860c..beac5e6 100644
--- a/sound/soc/soc-dapm.c
+++ b/sound/soc/soc-dapm.c
@@ -2250,6 +2250,10 @@ static int snd_soc_dapm_add_route(struct snd_soc_dapm_context *dapm,
path->connect = 0;
return 0;
}
+
+ dapm_mark_dirty(wsource, "Route added");
+ dapm_mark_dirty(wsink, "Route added");
+
return 0;
err:
--
1.7.10
^ permalink raw reply related [flat|nested] 4+ messages in thread
* [PATCH 2/3] ASoC: dapm: Allow routes to be deleted at runtime
2012-07-05 16:27 [PATCH 1/3] ASoC: dapm: Mark widgets as dirty when a route is added Mark Brown
@ 2012-07-05 16:27 ` Mark Brown
2012-07-05 16:28 ` [PATCH 3/3] ASoC: arizona: Change DAPM routes for AIF clocks when we change them Mark Brown
2012-07-06 14:04 ` [PATCH 1/3] ASoC: dapm: Mark widgets as dirty when a route is added Liam Girdwood
2 siblings, 0 replies; 4+ messages in thread
From: Mark Brown @ 2012-07-05 16:27 UTC (permalink / raw)
To: Liam Girdwood; +Cc: alsa-devel, Mark Brown
Since we're now relying on DAPM for things like enabling clocks when we
reparent the clocks for widgets we need to either use conditional routes
(which are expensive) or remove routes at runtime. Add a route removal
API to support this use case.
Currently only unconditional routes are supported.
Signed-off-by: Mark Brown <broonie@opensource.wolfsonmicro.com>
---
include/sound/soc-dapm.h | 2 ++
sound/soc/soc-dapm.c | 77 ++++++++++++++++++++++++++++++++++++++++++++++
2 files changed, 79 insertions(+)
diff --git a/include/sound/soc-dapm.h b/include/sound/soc-dapm.h
index 05559e5..abe373d 100644
--- a/include/sound/soc-dapm.h
+++ b/include/sound/soc-dapm.h
@@ -374,6 +374,8 @@ int snd_soc_dapm_new_widgets(struct snd_soc_dapm_context *dapm);
void snd_soc_dapm_free(struct snd_soc_dapm_context *dapm);
int snd_soc_dapm_add_routes(struct snd_soc_dapm_context *dapm,
const struct snd_soc_dapm_route *route, int num);
+int snd_soc_dapm_del_routes(struct snd_soc_dapm_context *dapm,
+ const struct snd_soc_dapm_route *route, int num);
int snd_soc_dapm_weak_routes(struct snd_soc_dapm_context *dapm,
const struct snd_soc_dapm_route *route, int num);
diff --git a/sound/soc/soc-dapm.c b/sound/soc/soc-dapm.c
index beac5e6..5a0fc86 100644
--- a/sound/soc/soc-dapm.c
+++ b/sound/soc/soc-dapm.c
@@ -2263,6 +2263,59 @@ err:
return ret;
}
+static int snd_soc_dapm_del_route(struct snd_soc_dapm_context *dapm,
+ const struct snd_soc_dapm_route *route)
+{
+ struct snd_soc_dapm_path *path, *p;
+ const char *sink;
+ const char *source;
+ char prefixed_sink[80];
+ char prefixed_source[80];
+
+ if (route->control) {
+ dev_err(dapm->dev,
+ "Removal of routes with controls not supported\n");
+ return -EINVAL;
+ }
+
+ if (dapm->codec && dapm->codec->name_prefix) {
+ snprintf(prefixed_sink, sizeof(prefixed_sink), "%s %s",
+ dapm->codec->name_prefix, route->sink);
+ sink = prefixed_sink;
+ snprintf(prefixed_source, sizeof(prefixed_source), "%s %s",
+ dapm->codec->name_prefix, route->source);
+ source = prefixed_source;
+ } else {
+ sink = route->sink;
+ source = route->source;
+ }
+
+ path = NULL;
+ list_for_each_entry(p, &dapm->card->paths, list) {
+ if (strcmp(p->source->name, source) != 0)
+ continue;
+ if (strcmp(p->sink->name, sink) != 0)
+ continue;
+ path = p;
+ break;
+ }
+
+ if (path) {
+ dapm_mark_dirty(path->source, "Route removed");
+ dapm_mark_dirty(path->sink, "Route removed");
+
+ list_del(&path->list);
+ list_del(&path->list_sink);
+ list_del(&path->list_source);
+ kfree(path);
+ } else {
+ dev_warn(dapm->dev, "Route %s->%s does not exist\n",
+ source, sink);
+ }
+
+ return 0;
+}
+
/**
* snd_soc_dapm_add_routes - Add routes between DAPM widgets
* @dapm: DAPM context
@@ -2297,6 +2350,30 @@ int snd_soc_dapm_add_routes(struct snd_soc_dapm_context *dapm,
}
EXPORT_SYMBOL_GPL(snd_soc_dapm_add_routes);
+/**
+ * snd_soc_dapm_del_routes - Remove routes between DAPM widgets
+ * @dapm: DAPM context
+ * @route: audio routes
+ * @num: number of routes
+ *
+ * Removes routes from the DAPM context.
+ */
+int snd_soc_dapm_del_routes(struct snd_soc_dapm_context *dapm,
+ const struct snd_soc_dapm_route *route, int num)
+{
+ int i, ret = 0;
+
+ mutex_lock_nested(&dapm->card->dapm_mutex, SND_SOC_DAPM_CLASS_INIT);
+ for (i = 0; i < num; i++) {
+ snd_soc_dapm_del_route(dapm, route);
+ route++;
+ }
+ mutex_unlock(&dapm->card->dapm_mutex);
+
+ return ret;
+}
+EXPORT_SYMBOL_GPL(snd_soc_dapm_del_routes);
+
static int snd_soc_dapm_weak_route(struct snd_soc_dapm_context *dapm,
const struct snd_soc_dapm_route *route)
{
--
1.7.10
^ permalink raw reply related [flat|nested] 4+ messages in thread
* [PATCH 3/3] ASoC: arizona: Change DAPM routes for AIF clocks when we change them
2012-07-05 16:27 [PATCH 1/3] ASoC: dapm: Mark widgets as dirty when a route is added Mark Brown
2012-07-05 16:27 ` [PATCH 2/3] ASoC: dapm: Allow routes to be deleted at runtime Mark Brown
@ 2012-07-05 16:28 ` Mark Brown
2012-07-06 14:04 ` [PATCH 1/3] ASoC: dapm: Mark widgets as dirty when a route is added Liam Girdwood
2 siblings, 0 replies; 4+ messages in thread
From: Mark Brown @ 2012-07-05 16:28 UTC (permalink / raw)
To: Liam Girdwood; +Cc: alsa-devel, Mark Brown
Signed-off-by: Mark Brown <broonie@opensource.wolfsonmicro.com>
---
sound/soc/codecs/arizona.c | 32 +++++++++++++++++++++++++++++---
1 file changed, 29 insertions(+), 3 deletions(-)
diff --git a/sound/soc/codecs/arizona.c b/sound/soc/codecs/arizona.c
index d0bcca9..901b53e 100644
--- a/sound/soc/codecs/arizona.c
+++ b/sound/soc/codecs/arizona.c
@@ -588,12 +588,25 @@ static int arizona_hw_params(struct snd_pcm_substream *substream,
return 0;
}
+static const char *arizona_dai_clk_str(int clk_id)
+{
+ switch (clk_id) {
+ case ARIZONA_CLK_SYSCLK:
+ return "SYSCLK";
+ case ARIZONA_CLK_ASYNCCLK:
+ return "ASYNCCLK";
+ default:
+ return "Unknown clock";
+ }
+}
+
static int arizona_dai_set_sysclk(struct snd_soc_dai *dai,
int clk_id, unsigned int freq, int dir)
{
struct snd_soc_codec *codec = dai->codec;
struct arizona_priv *priv = snd_soc_codec_get_drvdata(codec);
struct arizona_dai_priv *dai_priv = &priv->dai[dai->id - 1];
+ struct snd_soc_dapm_route routes[2];
switch (clk_id) {
case ARIZONA_CLK_SYSCLK:
@@ -603,15 +616,28 @@ static int arizona_dai_set_sysclk(struct snd_soc_dai *dai,
return -EINVAL;
}
- if (clk_id != dai_priv->clk && dai->active) {
+ if (clk_id == dai_priv->clk)
+ return 0;
+
+ if (dai->active) {
dev_err(codec->dev, "Can't change clock on active DAI %d\n",
dai->id);
return -EBUSY;
}
- dai_priv->clk = clk_id;
+ memset(&routes, 0, sizeof(routes));
+ routes[0].sink = dai->driver->capture.stream_name;
+ routes[1].sink = dai->driver->playback.stream_name;
- return 0;
+ routes[0].source = arizona_dai_clk_str(dai_priv->clk);
+ routes[1].source = arizona_dai_clk_str(dai_priv->clk);
+ snd_soc_dapm_del_routes(&codec->dapm, routes, ARRAY_SIZE(routes));
+
+ routes[0].source = arizona_dai_clk_str(clk_id);
+ routes[1].source = arizona_dai_clk_str(clk_id);
+ snd_soc_dapm_add_routes(&codec->dapm, routes, ARRAY_SIZE(routes));
+
+ return snd_soc_dapm_sync(&codec->dapm);
}
const struct snd_soc_dai_ops arizona_dai_ops = {
--
1.7.10
^ permalink raw reply related [flat|nested] 4+ messages in thread
* Re: [PATCH 1/3] ASoC: dapm: Mark widgets as dirty when a route is added
2012-07-05 16:27 [PATCH 1/3] ASoC: dapm: Mark widgets as dirty when a route is added Mark Brown
2012-07-05 16:27 ` [PATCH 2/3] ASoC: dapm: Allow routes to be deleted at runtime Mark Brown
2012-07-05 16:28 ` [PATCH 3/3] ASoC: arizona: Change DAPM routes for AIF clocks when we change them Mark Brown
@ 2012-07-06 14:04 ` Liam Girdwood
2 siblings, 0 replies; 4+ messages in thread
From: Liam Girdwood @ 2012-07-06 14:04 UTC (permalink / raw)
To: Mark Brown; +Cc: alsa-devel
On Thu, 2012-07-05 at 17:27 +0100, Mark Brown wrote:
> If we add a new route at runtime then we'll need to recheck the connections
> to the affected widgets.
>
> Signed-off-by: Mark Brown <broonie@opensource.wolfsonmicro.com>
> ---
> sound/soc/soc-dapm.c | 4 ++++
> 1 file changed, 4 insertions(+)
>
> diff --git a/sound/soc/soc-dapm.c b/sound/soc/soc-dapm.c
> index ed1860c..beac5e6 100644
> --- a/sound/soc/soc-dapm.c
> +++ b/sound/soc/soc-dapm.c
> @@ -2250,6 +2250,10 @@ static int snd_soc_dapm_add_route(struct snd_soc_dapm_context *dapm,
> path->connect = 0;
> return 0;
> }
> +
> + dapm_mark_dirty(wsource, "Route added");
> + dapm_mark_dirty(wsink, "Route added");
> +
> return 0;
>
> err:
All
Acked-by: Liam Girdwood <lrg@ti.com>
^ permalink raw reply [flat|nested] 4+ messages in thread
end of thread, other threads:[~2012-07-06 14:04 UTC | newest]
Thread overview: 4+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2012-07-05 16:27 [PATCH 1/3] ASoC: dapm: Mark widgets as dirty when a route is added Mark Brown
2012-07-05 16:27 ` [PATCH 2/3] ASoC: dapm: Allow routes to be deleted at runtime Mark Brown
2012-07-05 16:28 ` [PATCH 3/3] ASoC: arizona: Change DAPM routes for AIF clocks when we change them Mark Brown
2012-07-06 14:04 ` [PATCH 1/3] ASoC: dapm: Mark widgets as dirty when a route is added Liam Girdwood
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox