]> git.proxmox.com Git - mirror_ubuntu-artful-kernel.git/blobdiff - drivers/media/video/em28xx/em28xx-dvb.c
V4L/DVB (9764): em28xx: Add support for suspend the device when not used
[mirror_ubuntu-artful-kernel.git] / drivers / media / video / em28xx / em28xx-dvb.c
index d2b1a1a52689f57fe5d9b423887d0c169818f347..211156d458f0de94622bb7acd093895bfb577899 100644 (file)
@@ -161,7 +161,7 @@ static int stop_streaming(struct em28xx_dvb *dvb)
 
        em28xx_uninit_isoc(dev);
 
-       em28xx_set_mode(dev, EM28XX_MODE_UNDEFINED);
+       em28xx_set_mode(dev, EM28XX_SUSPEND);
 
        return 0;
 }
@@ -215,7 +215,7 @@ static int em28xx_dvb_bus_ctrl(struct dvb_frontend *fe, int acquire)
        if (acquire)
                return em28xx_set_mode(dev, EM28XX_DIGITAL_MODE);
        else
-               return em28xx_set_mode(dev, EM28XX_MODE_UNDEFINED);
+               return em28xx_set_mode(dev, EM28XX_SUSPEND);
 }
 
 /* ------------------------------------------------------------------ */
@@ -249,7 +249,6 @@ static int attach_xc3028(u8 addr, struct em28xx *dev)
        memset(&cfg, 0, sizeof(cfg));
        cfg.i2c_adap  = &dev->i2c_adap;
        cfg.i2c_addr  = addr;
-       cfg.callback  = em28xx_tuner_callback;
 
        if (!dev->dvb->frontend) {
                printk(KERN_ERR "%s/2: dvb frontend not attached. "
@@ -274,7 +273,7 @@ static int attach_xc3028(u8 addr, struct em28xx *dev)
 
 /* ------------------------------------------------------------------ */
 
-int register_dvb(struct em28xx_dvb *dvb,
+static int register_dvb(struct em28xx_dvb *dvb,
                 struct module *module,
                 struct em28xx *dev,
                 struct device *device)
@@ -394,7 +393,7 @@ static int dvb_init(struct em28xx *dev)
        int result = 0;
        struct em28xx_dvb *dvb;
 
-       if (!dev->has_dvb) {
+       if (!dev->board.has_dvb) {
                /* This device does not support the extension */
                return 0;
        }
@@ -422,6 +421,8 @@ static int dvb_init(struct em28xx *dev)
                }
                break;
        case EM2880_BOARD_HAUPPAUGE_WINTV_HVR_900:
+       case EM2880_BOARD_TERRATEC_HYBRID_XS:
+       case EM2880_BOARD_KWORLD_DVB_310U:
                dvb->frontend = dvb_attach(zl10353_attach,
                                           &em28xx_zl10353_with_xc3028,
                                           &dev->i2c_adap);
@@ -443,24 +444,6 @@ static int dvb_init(struct em28xx *dev)
                }
                break;
 #endif
-       case EM2880_BOARD_TERRATEC_HYBRID_XS:
-               dvb->frontend = dvb_attach(zl10353_attach,
-                                               &em28xx_zl10353_with_xc3028,
-                                               &dev->i2c_adap);
-               if (attach_xc3028(0x61, dev) < 0) {
-                        result = -EINVAL;
-                       goto out_free;
-               }
-               break;
-       case EM2880_BOARD_KWORLD_DVB_310U:
-               dvb->frontend = dvb_attach(zl10353_attach,
-                                               &em28xx_zl10353_with_xc3028,
-                                               &dev->i2c_adap);
-               if (attach_xc3028(0x61, dev) < 0) {
-                       result = -EINVAL;
-                       goto out_free;
-               }
-               break;
        default:
                printk(KERN_ERR "%s/2: The frontend of your DVB/ATSC card"
                                " isn't supported yet\n",
@@ -474,6 +457,8 @@ static int dvb_init(struct em28xx *dev)
                result = -EINVAL;
                goto out_free;
        }
+       /* define general-purpose callback pointer */
+       dvb->frontend->callback = em28xx_tuner_callback;
 
        /* register everything */
        result = register_dvb(dvb, THIS_MODULE, dev, &dev->udev->dev);
@@ -481,12 +466,12 @@ static int dvb_init(struct em28xx *dev)
        if (result < 0)
                goto out_free;
 
-       em28xx_set_mode(dev, EM28XX_MODE_UNDEFINED);
+       em28xx_set_mode(dev, EM28XX_SUSPEND);
        printk(KERN_INFO "Successfully loaded em28xx-dvb\n");
        return 0;
 
 out_free:
-       em28xx_set_mode(dev, EM28XX_MODE_UNDEFINED);
+       em28xx_set_mode(dev, EM28XX_SUSPEND);
        kfree(dvb);
        dev->dvb = NULL;
        return result;
@@ -494,7 +479,7 @@ out_free:
 
 static int dvb_fini(struct em28xx *dev)
 {
-       if (!dev->has_dvb) {
+       if (!dev->board.has_dvb) {
                /* This device does not support the extension */
                return 0;
        }