summaryrefslogtreecommitdiff
path: root/sound/usb
diff options
context:
space:
mode:
authorRavindra Lokhande <rlokhande@nvidia.com>2012-07-27 22:36:29 +0530
committerDan Willemsen <dwillemsen@nvidia.com>2013-09-14 12:15:08 -0700
commitfaa14323145eeb44e462dc6fbe423142dbf4ecef (patch)
tree904c275faf5d5718d4bcd1baf0e6cd8a792086ea /sound/usb
parent5f8987a3d259fec43c8352f2c75683b19b09562c (diff)
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 <rlokhande@nvidia.com> Reviewed-by: Automatic_Commit_Validation_User Reviewed-by: Scott Peterson <speterson@nvidia.com> Reviewed-by: Vijay Mali <vmali@nvidia.com> Rebase-Id: Rae95c4dff968d5be2a3bce1b063c0af2ab653973
Diffstat (limited to 'sound/usb')
-rw-r--r--sound/usb/card.c49
1 files changed, 47 insertions, 2 deletions
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 <linux/bitops.h>
#include <linux/init.h>
#include <linux/list.h>
@@ -45,6 +44,9 @@
#include <linux/usb/audio.h>
#include <linux/usb/audio-v2.h>
#include <linux/module.h>
+#ifdef CONFIG_SWITCH
+#include <linux/switch.h>
+#endif
#include <sound/control.h>
#include <sound/core.h>
@@ -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(&register_mutex);
+
return chip;
__error:
@@ -572,6 +591,7 @@ snd_usb_audio_probe(struct usb_device *dev,
}
mutex_unlock(&register_mutex);
__err_val:
+
return NULL;
}
@@ -595,6 +615,11 @@ static void snd_usb_audio_disconnect(struct usb_device *dev,
mutex_lock(&register_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);
}