aboutsummaryrefslogtreecommitdiffstats
path: root/sound/soc/soc-dapm.c
diff options
context:
space:
mode:
authorMark Brown <broonie@opensource.wolfsonmicro.com>2011-01-15 08:40:50 -0500
committerMark Brown <broonie@opensource.wolfsonmicro.com>2011-01-19 08:02:32 -0500
commit20e4859dedfc7e7b620d1756b29f8483c5be5fcc (patch)
treee7fff82807a50a5e0930438d7bf2f93826a95ec7 /sound/soc/soc-dapm.c
parent828a842f2e02de5d884ee14bd3c21ddbc77ec60e (diff)
ASoC: Add support for sequencing within
With larger devices there may be many widgets of the same type in series in an audio path. Allow drivers to specify an additional level of ordering within each widget type by adding a subsequence number to widgets and then splitting operations on widgets so that widgets of the same type but different sequence numbers are processed separately. A typical example would be a supply widget which requires that another widget be enabled to provide power or clocking. SND_SOC_DAPM_PGA_S() and SND_SOC_DAPM_SUPPLY_S() macros are provided allowing this to be used with PGAs and supplies as these are the most commonly affected widgets. Signed-off-by: Mark Brown <broonie@opensource.wolfsonmicro.com> Acked-by: Liam Girdwood <lrg@slimlogic.co.uk>
Diffstat (limited to 'sound/soc/soc-dapm.c')
-rw-r--r--sound/soc/soc-dapm.c11
1 files changed, 10 insertions, 1 deletions
diff --git a/sound/soc/soc-dapm.c b/sound/soc/soc-dapm.c
index 57e1c9f71149..eb7436c7acad 100644
--- a/sound/soc/soc-dapm.c
+++ b/sound/soc/soc-dapm.c
@@ -737,6 +737,12 @@ static int dapm_seq_compare(struct snd_soc_dapm_widget *a,
737 737
738 if (sort[a->id] != sort[b->id]) 738 if (sort[a->id] != sort[b->id])
739 return sort[a->id] - sort[b->id]; 739 return sort[a->id] - sort[b->id];
740 if (a->subseq != b->subseq) {
741 if (power_up)
742 return a->subseq - b->subseq;
743 else
744 return b->subseq - a->subseq;
745 }
740 if (a->reg != b->reg) 746 if (a->reg != b->reg)
741 return a->reg - b->reg; 747 return a->reg - b->reg;
742 if (a->dapm != b->dapm) 748 if (a->dapm != b->dapm)
@@ -869,6 +875,7 @@ static void dapm_seq_run(struct snd_soc_dapm_context *dapm,
869 struct snd_soc_dapm_widget *w, *n; 875 struct snd_soc_dapm_widget *w, *n;
870 LIST_HEAD(pending); 876 LIST_HEAD(pending);
871 int cur_sort = -1; 877 int cur_sort = -1;
878 int cur_subseq = -1;
872 int cur_reg = SND_SOC_NOPM; 879 int cur_reg = SND_SOC_NOPM;
873 struct snd_soc_dapm_context *cur_dapm = NULL; 880 struct snd_soc_dapm_context *cur_dapm = NULL;
874 int ret; 881 int ret;
@@ -884,12 +891,13 @@ static void dapm_seq_run(struct snd_soc_dapm_context *dapm,
884 891
885 /* Do we need to apply any queued changes? */ 892 /* Do we need to apply any queued changes? */
886 if (sort[w->id] != cur_sort || w->reg != cur_reg || 893 if (sort[w->id] != cur_sort || w->reg != cur_reg ||
887 w->dapm != cur_dapm) { 894 w->dapm != cur_dapm || w->subseq != cur_subseq) {
888 if (!list_empty(&pending)) 895 if (!list_empty(&pending))
889 dapm_seq_run_coalesced(cur_dapm, &pending); 896 dapm_seq_run_coalesced(cur_dapm, &pending);
890 897
891 INIT_LIST_HEAD(&pending); 898 INIT_LIST_HEAD(&pending);
892 cur_sort = -1; 899 cur_sort = -1;
900 cur_subseq = -1;
893 cur_reg = SND_SOC_NOPM; 901 cur_reg = SND_SOC_NOPM;
894 cur_dapm = NULL; 902 cur_dapm = NULL;
895 } 903 }
@@ -934,6 +942,7 @@ static void dapm_seq_run(struct snd_soc_dapm_context *dapm,
934 default: 942 default:
935 /* Queue it up for application */ 943 /* Queue it up for application */
936 cur_sort = sort[w->id]; 944 cur_sort = sort[w->id];
945 cur_subseq = w->subseq;
937 cur_reg = w->reg; 946 cur_reg = w->reg;
938 cur_dapm = w->dapm; 947 cur_dapm = w->dapm;
939 list_move(&w->power_list, &pending); 948 list_move(&w->power_list, &pending);