aboutsummaryrefslogtreecommitdiffstats
path: root/sound/soc/soc-jack.c
diff options
context:
space:
mode:
authorMark Brown <broonie@opensource.wolfsonmicro.com>2010-03-22 08:06:30 -0400
committerMark Brown <broonie@opensource.wolfsonmicro.com>2010-03-22 13:20:57 -0400
commitd5021ec9fc32edc6f512c2375923d757e9825f6a (patch)
treee3e216f8f39d724dfb6e41cc2d1158cdc5aa3319 /sound/soc/soc-jack.c
parentc96907f21f26a1f8c1a1a9096a22500e4d158c4f (diff)
ASoC: Add a notifier for jack status changes
Some systems provide both mechanical and electrical detection of jack status changes. On such systems power savings can be achieved by only enabling the electrical detection methods when physical insertion has been detected. Begin supporting such systems by providing a notifier for jack status changes which can be used to trigger any reconfiguration. Signed-off-by: Mark Brown <broonie@opensource.wolfsonmicro.com> Acked-by: Liam Girdwood <lrg@slimlogic.co.uk>
Diffstat (limited to 'sound/soc/soc-jack.c')
-rw-r--r--sound/soc/soc-jack.c38
1 files changed, 38 insertions, 0 deletions
diff --git a/sound/soc/soc-jack.c b/sound/soc/soc-jack.c
index 3c07a94c2e30..f8fd22cc70bc 100644
--- a/sound/soc/soc-jack.c
+++ b/sound/soc/soc-jack.c
@@ -37,6 +37,7 @@ int snd_soc_jack_new(struct snd_soc_card *card, const char *id, int type,
37{ 37{
38 jack->card = card; 38 jack->card = card;
39 INIT_LIST_HEAD(&jack->pins); 39 INIT_LIST_HEAD(&jack->pins);
40 BLOCKING_INIT_NOTIFIER_HEAD(&jack->notifier);
40 41
41 return snd_jack_new(card->codec->card, id, type, &jack->jack); 42 return snd_jack_new(card->codec->card, id, type, &jack->jack);
42} 43}
@@ -93,6 +94,9 @@ void snd_soc_jack_report(struct snd_soc_jack *jack, int status, int mask)
93 snd_soc_dapm_disable_pin(codec, pin->pin); 94 snd_soc_dapm_disable_pin(codec, pin->pin);
94 } 95 }
95 96
97 /* Report before the DAPM sync to help users updating micbias status */
98 blocking_notifier_call_chain(&jack->notifier, status, NULL);
99
96 snd_soc_dapm_sync(codec); 100 snd_soc_dapm_sync(codec);
97 101
98 snd_jack_report(jack->jack, status); 102 snd_jack_report(jack->jack, status);
@@ -143,6 +147,40 @@ int snd_soc_jack_add_pins(struct snd_soc_jack *jack, int count,
143} 147}
144EXPORT_SYMBOL_GPL(snd_soc_jack_add_pins); 148EXPORT_SYMBOL_GPL(snd_soc_jack_add_pins);
145 149
150/**
151 * snd_soc_jack_notifier_register - Register a notifier for jack status
152 *
153 * @jack: ASoC jack
154 * @nb: Notifier block to register
155 *
156 * Register for notification of the current status of the jack. Note
157 * that it is not possible to report additional jack events in the
158 * callback from the notifier, this is intended to support
159 * applications such as enabling electrical detection only when a
160 * mechanical detection event has occurred.
161 */
162void snd_soc_jack_notifier_register(struct snd_soc_jack *jack,
163 struct notifier_block *nb)
164{
165 blocking_notifier_chain_register(&jack->notifier, nb);
166}
167EXPORT_SYMBOL_GPL(snd_soc_jack_notifier_register);
168
169/**
170 * snd_soc_jack_notifier_unregister - Unregister a notifier for jack status
171 *
172 * @jack: ASoC jack
173 * @nb: Notifier block to unregister
174 *
175 * Stop notifying for status changes.
176 */
177void snd_soc_jack_notifier_unregister(struct snd_soc_jack *jack,
178 struct notifier_block *nb)
179{
180 blocking_notifier_chain_unregister(&jack->notifier, nb);
181}
182EXPORT_SYMBOL_GPL(snd_soc_jack_notifier_unregister);
183
146#ifdef CONFIG_GPIOLIB 184#ifdef CONFIG_GPIOLIB
147/* gpio detect */ 185/* gpio detect */
148static void snd_soc_jack_gpio_detect(struct snd_soc_jack_gpio *gpio) 186static void snd_soc_jack_gpio_detect(struct snd_soc_jack_gpio *gpio)