From faa14323145eeb44e462dc6fbe423142dbf4ecef Mon Sep 17 00:00:00 2001 From: Ravindra Lokhande Date: Fri, 27 Jul 2012 22:36:29 +0530 Subject: ALSA: usb-audio: register switch device Register android switch device which is used to convey device plug-in and plug-out to userspace. Bug 1009921, Bug 1019877 Change-Id: I8e3c2fce420cc0ce094a6d8f2cf00abb630fcf2f Reviewed-on: http://git-master/r/119033 Tested-by: Ravindra Lokhande Reviewed-by: Automatic_Commit_Validation_User Reviewed-by: Scott Peterson Reviewed-by: Vijay Mali Rebase-Id: Rae95c4dff968d5be2a3bce1b063c0af2ab653973 --- sound/usb/card.c | 49 +++++++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 47 insertions(+), 2 deletions(-) (limited to 'sound') diff --git a/sound/usb/card.c b/sound/usb/card.c index 64952e2d3ed1..e51538b668a9 100644 --- a/sound/usb/card.c +++ b/sound/usb/card.c @@ -32,7 +32,6 @@ * indeed an AC3 stream packed in SPDIF frames (i.e. no real AC3 stream). */ - #include #include #include @@ -45,6 +44,9 @@ #include #include #include +#ifdef CONFIG_SWITCH +#include +#endif #include #include @@ -113,6 +115,18 @@ static DEFINE_MUTEX(register_mutex); static struct snd_usb_audio *usb_chip[SNDRV_CARDS]; static struct usb_driver usb_audio_driver; +#ifdef CONFIG_SWITCH +enum switch_state { + STATE_CONNECTED_UNKNOWN = -1, + STATE_DISCONNECTED = 0, + STATE_CONNECTED = 1 +}; + +static struct switch_dev usb_switch_dev = { + .name = "usb_audio", +}; +#endif + /* * disconnect streams * called from snd_usb_audio_disconnect() @@ -558,10 +572,15 @@ snd_usb_audio_probe(struct usb_device *dev, goto __error; } +#ifdef CONFIG_SWITCH + switch_set_state(&usb_switch_dev, STATE_CONNECTED); +#endif + usb_chip[chip->index] = chip; chip->num_interfaces++; chip->probing = 0; mutex_unlock(®ister_mutex); + return chip; __error: @@ -572,6 +591,7 @@ snd_usb_audio_probe(struct usb_device *dev, } mutex_unlock(®ister_mutex); __err_val: + return NULL; } @@ -595,6 +615,11 @@ static void snd_usb_audio_disconnect(struct usb_device *dev, mutex_lock(®ister_mutex); chip->num_interfaces--; + +#ifdef CONFIG_SWITCH + switch_set_state(&usb_switch_dev, STATE_DISCONNECTED); +#endif + if (chip->num_interfaces <= 0) { snd_card_disconnect(card); /* release the pcm resources */ @@ -756,15 +781,35 @@ static struct usb_driver usb_audio_driver = { static int __init snd_usb_audio_init(void) { + int err = 0; + if (nrpacks < 1 || nrpacks > MAX_PACKS) { printk(KERN_WARNING "invalid nrpacks value.\n"); return -EINVAL; } - return usb_register(&usb_audio_driver); + +#ifdef CONFIG_SWITCH + /* Add usb_audio swith class support */ + err = switch_dev_register(&usb_switch_dev); + if (err < 0){ + printk(KERN_ERR "failed to register switch device"); + return -EINVAL; + } +#endif + + err = usb_register(&usb_audio_driver); + if (err) { + switch_dev_unregister(&usb_switch_dev); + } + + return err; } static void __exit snd_usb_audio_cleanup(void) { +#ifdef CONFIG_SWITCH + switch_dev_unregister(&usb_switch_dev); +#endif usb_deregister(&usb_audio_driver); } -- cgit v1.2.3