[media] em28xx: prevent registering wrong interfaces for audio-only
authorMauro Carvalho Chehab <m.chehab@samsung.com>
Mon, 6 Jan 2014 08:27:47 +0000 (05:27 -0300)
committerMauro Carvalho Chehab <m.chehab@samsung.com>
Tue, 7 Jan 2014 07:14:50 +0000 (05:14 -0200)
A few devices (em2860) use a separate interface for audio only
Audio Vendor Class USB. That interface should not be used by
Remote Controller, Analog TV or Digital TV.

Prevents initializing all non-audio extensions for the audio
only interface.

Signed-off-by: Mauro Carvalho Chehab <m.chehab@samsung.com>
drivers/media/usb/em28xx/em28xx-dvb.c
drivers/media/usb/em28xx/em28xx-input.c
drivers/media/usb/em28xx/em28xx-video.c

index 7fa1c80..5c6be66 100644 (file)
@@ -992,6 +992,11 @@ static int em28xx_dvb_init(struct em28xx *dev)
        int result = 0, mfe_shared = 0;
        struct em28xx_dvb *dvb;
 
+       if (dev->is_audio_only) {
+               /* Shouldn't initialize IR for this interface */
+               return 0;
+       }
+
        if (!dev->board.has_dvb) {
                /* This device does not support the extension */
                return 0;
@@ -1431,6 +1436,11 @@ static inline void prevent_sleep(struct dvb_frontend_ops *ops)
 
 static int em28xx_dvb_fini(struct em28xx *dev)
 {
+       if (dev->is_audio_only) {
+               /* Shouldn't initialize IR for this interface */
+               return 0;
+       }
+
        if (!dev->board.has_dvb) {
                /* This device does not support the extension */
                return 0;
index f3b629d..9a5dad9 100644 (file)
@@ -673,6 +673,11 @@ static int em28xx_ir_init(struct em28xx *dev)
        u64 rc_type;
        u16 i2c_rc_dev_addr = 0;
 
+       if (dev->is_audio_only) {
+               /* Shouldn't initialize IR for this interface */
+               return 0;
+       }
+
        if (dev->board.buttons)
                em28xx_init_buttons(dev);
 
@@ -802,6 +807,11 @@ static int em28xx_ir_fini(struct em28xx *dev)
 {
        struct em28xx_IR *ir = dev->ir;
 
+       if (dev->is_audio_only) {
+               /* Shouldn't initialize IR for this interface */
+               return 0;
+       }
+
        em28xx_shutdown_buttons(dev);
 
        /* skip detach on non attached boards */
index 8da96f6..9c44628 100644 (file)
@@ -1877,6 +1877,11 @@ static int em28xx_v4l2_open(struct file *filp)
 */
 static int em28xx_v4l2_fini(struct em28xx *dev)
 {
+       if (dev->is_audio_only) {
+               /* Shouldn't initialize IR for this interface */
+               return 0;
+       }
+
        if (!dev->has_video) {
                /* This device does not support the v4l2 extension */
                return 0;
@@ -2209,6 +2214,11 @@ static int em28xx_v4l2_init(struct em28xx *dev)
        unsigned int maxw;
        struct v4l2_ctrl_handler *hdl = &dev->ctrl_handler;
 
+       if (dev->is_audio_only) {
+               /* Shouldn't initialize IR for this interface */
+               return 0;
+       }
+
        if (!dev->has_video) {
                /* This device does not support the v4l2 extension */
                return 0;