diff options
author | Mark Brown <broonie@opensource.wolfsonmicro.com> | 2008-07-02 06:51:20 -0400 |
---|---|---|
committer | Jaroslav Kysela <perex@perex.cz> | 2008-07-10 03:32:18 -0400 |
commit | 15e4c72f520d1db9adc38ba157547a7c1fca45b2 (patch) | |
tree | d0fe7fbd9be8a3765518fd45fd30711db4858f50 /sound/soc/soc-dapm.c | |
parent | 5415552d21150dbfbff012de2b59e685ea232b1e (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.c | 67 |
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 */ |
68 | static int dapm_up_seq[] = { | 58 | static 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; | |||
80 | module_param(dapm_status, int, 0); | 70 | module_param(dapm_status, int, 0); |
81 | MODULE_PARM_DESC(dapm_status, "enable DPM sysfs entries"); | 71 | MODULE_PARM_DESC(dapm_status, "enable DPM sysfs entries"); |
82 | 72 | ||
73 | static unsigned int pop_time; | ||
74 | |||
75 | static void pop_wait(void) | ||
76 | { | ||
77 | if (pop_time) | ||
78 | schedule_timeout_uninterruptible(msecs_to_jiffies(pop_time)); | ||
79 | } | ||
80 | |||
81 | static 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 */ |
84 | static inline struct snd_soc_dapm_widget *dapm_cnew_widget( | 96 | static 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 | ||
804 | static DEVICE_ATTR(dapm_widget, 0444, dapm_widget_show, NULL); | 816 | static DEVICE_ATTR(dapm_widget, 0444, dapm_widget_show, NULL); |
805 | 817 | ||
818 | /* pop/click delay times */ | ||
819 | static 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 | |||
825 | static 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 | |||
836 | static DEVICE_ATTR(dapm_pop_time, 0744, dapm_pop_time_show, | ||
837 | dapm_pop_time_store); | ||
838 | |||
806 | int snd_soc_dapm_sys_add(struct device *dev) | 839 | int 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 | ||
816 | static void snd_soc_dapm_sys_remove(struct device *dev) | 853 | static 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 */ |