aboutsummaryrefslogtreecommitdiffstats
path: root/sound/soc/soc-dapm.c
diff options
context:
space:
mode:
authorMark Brown <broonie@opensource.wolfsonmicro.com>2008-07-02 06:51:20 -0400
committerJaroslav Kysela <perex@perex.cz>2008-07-10 03:32:18 -0400
commit15e4c72f520d1db9adc38ba157547a7c1fca45b2 (patch)
treed0fe7fbd9be8a3765518fd45fd30711db4858f50 /sound/soc/soc-dapm.c
parent5415552d21150dbfbff012de2b59e685ea232b1e (diff)
ALSA: ASoC: Make pop/click debug wait times dynamically configurable
DAPM supports adding a compile time configurable delay to the widget power sequences, aiding diagnosis of problems with pops and clicks being generated during them. This patch converts this to be configurable at run time via a sysfs file. Signed-off-by: Mark Brown <broonie@opensource.wolfsonmicro.com> Signed-off-by: Takashi Iwai <tiwai@suse.de> Signed-off-by: Jaroslav Kysela <perex@perex.cz>
Diffstat (limited to 'sound/soc/soc-dapm.c')
-rw-r--r--sound/soc/soc-dapm.c67
1 files changed, 53 insertions, 14 deletions
diff --git a/sound/soc/soc-dapm.c b/sound/soc/soc-dapm.c
index 25363829e605..7c2dd4ec8df1 100644
--- a/sound/soc/soc-dapm.c
+++ b/sound/soc/soc-dapm.c
@@ -54,16 +54,6 @@
54#define dbg(format, arg...) 54#define dbg(format, arg...)
55#endif 55#endif
56 56
57#define POP_DEBUG 0
58#if POP_DEBUG
59#define POP_TIME 500 /* 500 msecs - change if pop debug is too fast */
60#define pop_wait(time) schedule_timeout_uninterruptible(msecs_to_jiffies(time))
61#define pop_dbg(format, arg...) printk(format, ## arg); pop_wait(POP_TIME)
62#else
63#define pop_dbg(format, arg...)
64#define pop_wait(time)
65#endif
66
67/* dapm power sequences - make this per codec in the future */ 57/* dapm power sequences - make this per codec in the future */
68static int dapm_up_seq[] = { 58static int dapm_up_seq[] = {
69 snd_soc_dapm_pre, snd_soc_dapm_micbias, snd_soc_dapm_mic, 59 snd_soc_dapm_pre, snd_soc_dapm_micbias, snd_soc_dapm_mic,
@@ -80,6 +70,28 @@ static int dapm_status = 1;
80module_param(dapm_status, int, 0); 70module_param(dapm_status, int, 0);
81MODULE_PARM_DESC(dapm_status, "enable DPM sysfs entries"); 71MODULE_PARM_DESC(dapm_status, "enable DPM sysfs entries");
82 72
73static unsigned int pop_time;
74
75static void pop_wait(void)
76{
77 if (pop_time)
78 schedule_timeout_uninterruptible(msecs_to_jiffies(pop_time));
79}
80
81static void pop_dbg(const char *fmt, ...)
82{
83 va_list args;
84
85 va_start(args, fmt);
86
87 if (pop_time) {
88 vprintk(fmt, args);
89 pop_wait();
90 }
91
92 va_end(args);
93}
94
83/* create a new dapm widget */ 95/* create a new dapm widget */
84static inline struct snd_soc_dapm_widget *dapm_cnew_widget( 96static inline struct snd_soc_dapm_widget *dapm_cnew_widget(
85 const struct snd_soc_dapm_widget *_widget) 97 const struct snd_soc_dapm_widget *_widget)
@@ -217,9 +229,9 @@ static int dapm_update_bits(struct snd_soc_dapm_widget *widget)
217 change = old != new; 229 change = old != new;
218 if (change) { 230 if (change) {
219 pop_dbg("pop test %s : %s in %d ms\n", widget->name, 231 pop_dbg("pop test %s : %s in %d ms\n", widget->name,
220 widget->power ? "on" : "off", POP_TIME); 232 widget->power ? "on" : "off", pop_time);
221 snd_soc_write(codec, widget->reg, new); 233 snd_soc_write(codec, widget->reg, new);
222 pop_wait(POP_TIME); 234 pop_wait();
223 } 235 }
224 dbg("reg %x old %x new %x change %d\n", widget->reg, old, new, change); 236 dbg("reg %x old %x new %x change %d\n", widget->reg, old, new, change);
225 return change; 237 return change;
@@ -803,20 +815,47 @@ static ssize_t dapm_widget_show(struct device *dev,
803 815
804static DEVICE_ATTR(dapm_widget, 0444, dapm_widget_show, NULL); 816static DEVICE_ATTR(dapm_widget, 0444, dapm_widget_show, NULL);
805 817
818/* pop/click delay times */
819static ssize_t dapm_pop_time_show(struct device *dev,
820 struct device_attribute *attr, char *buf)
821{
822 return sprintf(buf, "%d\n", pop_time);
823}
824
825static ssize_t dapm_pop_time_store(struct device *dev,
826 struct device_attribute *attr,
827 const char *buf, size_t count)
828
829{
830 if (strict_strtoul(buf, 10, &pop_time) < 0)
831 printk(KERN_ERR "Unable to parse pop_time setting\n");
832
833 return count;
834}
835
836static DEVICE_ATTR(dapm_pop_time, 0744, dapm_pop_time_show,
837 dapm_pop_time_store);
838
806int snd_soc_dapm_sys_add(struct device *dev) 839int snd_soc_dapm_sys_add(struct device *dev)
807{ 840{
808 int ret = 0; 841 int ret = 0;
809 842
810 if (dapm_status) 843 if (dapm_status) {
811 ret = device_create_file(dev, &dev_attr_dapm_widget); 844 ret = device_create_file(dev, &dev_attr_dapm_widget);
812 845
846 if (ret == 0)
847 ret = device_create_file(dev, &dev_attr_dapm_pop_time);
848 }
849
813 return ret; 850 return ret;
814} 851}
815 852
816static void snd_soc_dapm_sys_remove(struct device *dev) 853static void snd_soc_dapm_sys_remove(struct device *dev)
817{ 854{
818 if (dapm_status) 855 if (dapm_status) {
856 device_remove_file(dev, &dev_attr_dapm_pop_time);
819 device_remove_file(dev, &dev_attr_dapm_widget); 857 device_remove_file(dev, &dev_attr_dapm_widget);
858 }
820} 859}
821 860
822/* free all dapm widgets and resources */ 861/* free all dapm widgets and resources */