[media] anysee: convert to new DVB USB
authorAntti Palosaari <crope@iki.fi>
Thu, 14 Jun 2012 07:56:09 +0000 (04:56 -0300)
committerMauro Carvalho Chehab <mchehab@redhat.com>
Sat, 4 Aug 2012 10:56:32 +0000 (07:56 -0300)
Signed-off-by: Antti Palosaari <crope@iki.fi>
Signed-off-by: Mauro Carvalho Chehab <mchehab@redhat.com>
drivers/media/dvb/dvb-usb/Kconfig
drivers/media/dvb/dvb-usb/anysee.c
drivers/media/dvb/dvb-usb/anysee.h

index 52b3108601a61eccdfc61e376c94e4a20e07ba2c..f172e14718777bbef91f42f20b3e06c5cfb18238 100644 (file)
@@ -320,7 +320,7 @@ config DVB_USB_CINERGY_T2
 
 config DVB_USB_ANYSEE
        tristate "Anysee DVB-T/C USB2.0 support"
-       depends on DVB_USB
+       depends on DVB_USB_V2
        select DVB_PLL if !DVB_FE_CUSTOMISE
        select DVB_MT352 if !DVB_FE_CUSTOMISE
        select DVB_ZL10353 if !DVB_FE_CUSTOMISE
index 03c28655af1be54eec6e10486ab5fa71ccc58787..2a0798cfb3656d8862f14311898632420024e178 100644 (file)
@@ -32,6 +32,7 @@
  */
 
 #include "anysee.h"
+#include "dvb-pll.h"
 #include "tda1002x.h"
 #include "mt352.h"
 #include "mt352_priv.h"
@@ -47,9 +48,6 @@
 static int dvb_usb_anysee_debug;
 module_param_named(debug, dvb_usb_anysee_debug, int, 0644);
 MODULE_PARM_DESC(debug, "set debugging level" DVB_USB_DEBUG_STATUS);
-static int dvb_usb_anysee_delsys;
-module_param_named(delsys, dvb_usb_anysee_delsys, int, 0644);
-MODULE_PARM_DESC(delsys, "select delivery mode (0=DVB-C, 1=DVB-T)");
 DVB_DEFINE_MOD_OPT_ADAPTER_NR(adapter_nr);
 
 static DEFINE_MUTEX(anysee_usb_mutex);
@@ -64,15 +62,14 @@ static int anysee_ctrl_msg(struct dvb_usb_device *d, u8 *sbuf, u8 slen,
        memcpy(&buf[0], sbuf, slen);
        buf[60] = state->seq++;
 
-       if (mutex_lock_interruptible(&anysee_usb_mutex) < 0)
-               return -EAGAIN;
+       mutex_lock(&anysee_usb_mutex);
 
        deb_xfer(">>> ");
        debug_dump(buf, slen, deb_xfer);
 
        /* We need receive one message more after dvb_usb_generic_rw due
           to weird transaction flow, which is 1 x send + 2 x receive. */
-       ret = dvb_usb_generic_rw(d, buf, sizeof(buf), buf, sizeof(buf), 0);
+       ret = dvb_usbv2_generic_rw(d, buf, sizeof(buf), buf, sizeof(buf), 0);
        if (ret)
                goto error_unlock;
 
@@ -91,7 +88,7 @@ static int anysee_ctrl_msg(struct dvb_usb_device *d, u8 *sbuf, u8 slen,
        for (i = 0; i < 3; i++) {
                /* receive 2nd answer */
                ret = usb_bulk_msg(d->udev, usb_rcvbulkpipe(d->udev,
-                       d->props.generic_bulk_ctrl_endpoint), buf, sizeof(buf),
+                       d->props->generic_bulk_ctrl_endpoint), buf, sizeof(buf),
                        &act_len, 2000);
 
                if (ret) {
@@ -509,6 +506,32 @@ static struct cxd2820r_config anysee_cxd2820r_config = {
  * IOE[5] STV0903 1=enabled
  */
 
+static int anysee_read_config(struct dvb_usb_device *d)
+{
+       struct anysee_state *state = d->priv;
+       int ret;
+       u8 hw_info[3];
+
+       /*
+        * Check which hardware we have.
+        * We must do this call two times to get reliable values (hw/fw bug).
+        */
+       ret = anysee_get_hw_info(d, hw_info);
+       if (ret)
+               goto error;
+
+       ret = anysee_get_hw_info(d, hw_info);
+       if (ret)
+               goto error;
+
+       /* Meaning of these info bytes are guessed. */
+       info("firmware version:%d.%d hardware id:%d",
+               hw_info[1], hw_info[2], hw_info[0]);
+
+       state->hw = hw_info[0];
+error:
+       return ret;
+}
 
 /* external I2C gate used for DNOD44CDH086A(TDA18212) tuner module */
 static int anysee_i2c_gate_ctrl(struct dvb_frontend *fe, int enable)
@@ -536,7 +559,7 @@ static int anysee_frontend_ctrl(struct dvb_frontend *fe, int onoff)
                /* E30 Combo Plus */
                /* E30 C Plus */
 
-               if ((fe->id ^ dvb_usb_anysee_delsys) == 0)  {
+               if (fe->id == 0)  {
                        /* disable DVB-T demod on IOD[0] */
                        ret = anysee_wr_reg_mask(adap->dev, REG_IOD, (0 << 0),
                                0x01);
@@ -580,7 +603,7 @@ static int anysee_frontend_ctrl(struct dvb_frontend *fe, int onoff)
                /* E7 TC */
                /* E7 PTC */
 
-               if ((fe->id ^ dvb_usb_anysee_delsys) == 0)  {
+               if (fe->id == 0)  {
                        /* disable DVB-T demod on IOD[6] */
                        ret = anysee_wr_reg_mask(adap->dev, REG_IOD, (0 << 6),
                                0x40);
@@ -631,7 +654,6 @@ static int anysee_frontend_attach(struct dvb_usb_adapter *adap)
 {
        int ret;
        struct anysee_state *state = adap->dev->priv;
-       u8 hw_info[3];
        u8 tmp;
        struct i2c_msg msg[2] = {
                {
@@ -647,55 +669,24 @@ static int anysee_frontend_attach(struct dvb_usb_adapter *adap)
                }
        };
 
-       /* detect hardware only once */
-       if (adap->fe_adap[0].fe == NULL) {
-               /* Check which hardware we have.
-                * We must do this call two times to get reliable values
-                * (hw/fw bug).
-                */
-               ret = anysee_get_hw_info(adap->dev, hw_info);
-               if (ret)
-                       goto error;
-
-               ret = anysee_get_hw_info(adap->dev, hw_info);
-               if (ret)
-                       goto error;
-
-               /* Meaning of these info bytes are guessed. */
-               info("firmware version:%d.%d hardware id:%d",
-                       hw_info[1], hw_info[2], hw_info[0]);
-
-               state->hw = hw_info[0];
-       }
-
-       /* set current frondend ID for devices having two frondends */
-       if (adap->fe_adap[0].fe)
-               state->fe_id++;
-
        switch (state->hw) {
        case ANYSEE_HW_507T: /* 2 */
                /* E30 */
 
-               if (state->fe_id)
-                       break;
-
                /* attach demod */
-               adap->fe_adap[0].fe = dvb_attach(mt352_attach,
+               adap->fe[0] = dvb_attach(mt352_attach,
                        &anysee_mt352_config, &adap->dev->i2c_adap);
-               if (adap->fe_adap[0].fe)
+               if (adap->fe[0])
                        break;
 
                /* attach demod */
-               adap->fe_adap[0].fe = dvb_attach(zl10353_attach,
+               adap->fe[0] = dvb_attach(zl10353_attach,
                        &anysee_zl10353_config, &adap->dev->i2c_adap);
 
                break;
        case ANYSEE_HW_507CD: /* 6 */
                /* E30 Plus */
 
-               if (state->fe_id)
-                       break;
-
                /* enable DVB-T demod on IOD[0] */
                ret = anysee_wr_reg_mask(adap->dev, REG_IOD, (1 << 0), 0x01);
                if (ret)
@@ -707,39 +698,33 @@ static int anysee_frontend_attach(struct dvb_usb_adapter *adap)
                        goto error;
 
                /* attach demod */
-               adap->fe_adap[0].fe = dvb_attach(zl10353_attach,
+               adap->fe[0] = dvb_attach(zl10353_attach,
                        &anysee_zl10353_config, &adap->dev->i2c_adap);
 
                break;
        case ANYSEE_HW_507DC: /* 10 */
                /* E30 C Plus */
 
-               if (state->fe_id)
-                       break;
-
                /* enable DVB-C demod on IOD[0] */
                ret = anysee_wr_reg_mask(adap->dev, REG_IOD, (1 << 0), 0x01);
                if (ret)
                        goto error;
 
                /* attach demod */
-               adap->fe_adap[0].fe = dvb_attach(tda10023_attach,
+               adap->fe[0] = dvb_attach(tda10023_attach,
                        &anysee_tda10023_config, &adap->dev->i2c_adap, 0x48);
 
                break;
        case ANYSEE_HW_507SI: /* 11 */
                /* E30 S2 Plus */
 
-               if (state->fe_id)
-                       break;
-
                /* enable DVB-S/S2 demod on IOD[0] */
                ret = anysee_wr_reg_mask(adap->dev, REG_IOD, (1 << 0), 0x01);
                if (ret)
                        goto error;
 
                /* attach demod */
-               adap->fe_adap[0].fe = dvb_attach(cx24116_attach,
+               adap->fe[0] = dvb_attach(cx24116_attach,
                        &anysee_cx24116_config, &adap->dev->i2c_adap);
 
                break;
@@ -765,67 +750,64 @@ static int anysee_frontend_attach(struct dvb_usb_adapter *adap)
                if (ret)
                        goto error;
 
-               if ((state->fe_id ^ dvb_usb_anysee_delsys) == 0)  {
-                       /* disable DVB-T demod on IOD[0] */
-                       ret = anysee_wr_reg_mask(adap->dev, REG_IOD, (0 << 0),
-                               0x01);
-                       if (ret)
-                               goto error;
+               /* disable DVB-T demod on IOD[0] */
+               ret = anysee_wr_reg_mask(adap->dev, REG_IOD, (0 << 0), 0x01);
+               if (ret)
+                       goto error;
 
-                       /* enable DVB-C demod on IOD[5] */
-                       ret = anysee_wr_reg_mask(adap->dev, REG_IOD, (1 << 5),
-                               0x20);
-                       if (ret)
-                               goto error;
+               /* enable DVB-C demod on IOD[5] */
+               ret = anysee_wr_reg_mask(adap->dev, REG_IOD, (1 << 5), 0x20);
+               if (ret)
+                       goto error;
 
-                       /* attach demod */
-                       if (tmp == 0xc7) {
-                               /* TDA18212 config */
-                               adap->fe_adap[state->fe_id].fe = dvb_attach(
-                                       tda10023_attach,
+               /* attach demod */
+               if (tmp == 0xc7) {
+                       /* TDA18212 config */
+                       adap->fe[0] = dvb_attach(tda10023_attach,
                                        &anysee_tda10023_tda18212_config,
                                        &adap->dev->i2c_adap, 0x48);
-                       } else {
-                               /* PLL config */
-                               adap->fe_adap[state->fe_id].fe = dvb_attach(
-                                       tda10023_attach,
+
+                       /* I2C gate for DNOD44CDH086A(TDA18212) tuner module */
+                       if (adap->fe[0])
+                               adap->fe[0]->ops.i2c_gate_ctrl =
+                                               anysee_i2c_gate_ctrl;
+               } else {
+                       /* PLL config */
+                       adap->fe[0] = dvb_attach(tda10023_attach,
                                        &anysee_tda10023_config,
                                        &adap->dev->i2c_adap, 0x48);
-                       }
-               } else {
-                       /* disable DVB-C demod on IOD[5] */
-                       ret = anysee_wr_reg_mask(adap->dev, REG_IOD, (0 << 5),
-                               0x20);
-                       if (ret)
-                               goto error;
+               }
 
-                       /* enable DVB-T demod on IOD[0] */
-                       ret = anysee_wr_reg_mask(adap->dev, REG_IOD, (1 << 0),
-                               0x01);
-                       if (ret)
-                               goto error;
+               /* break out if first frontend attaching fails */
+               if (!adap->fe[0])
+                       break;
+
+               /* disable DVB-C demod on IOD[5] */
+               ret = anysee_wr_reg_mask(adap->dev, REG_IOD, (0 << 5), 0x20);
+               if (ret)
+                       goto error;
+
+               /* enable DVB-T demod on IOD[0] */
+               ret = anysee_wr_reg_mask(adap->dev, REG_IOD, (1 << 0), 0x01);
+               if (ret)
+                       goto error;
 
-                       /* attach demod */
-                       if (tmp == 0xc7) {
-                               /* TDA18212 config */
-                               adap->fe_adap[state->fe_id].fe = dvb_attach(
-                                       zl10353_attach,
+               /* attach demod */
+               if (tmp == 0xc7) {
+                       /* TDA18212 config */
+                       adap->fe[1] = dvb_attach(zl10353_attach,
                                        &anysee_zl10353_tda18212_config2,
                                        &adap->dev->i2c_adap);
-                       } else {
-                               /* PLL config */
-                               adap->fe_adap[state->fe_id].fe = dvb_attach(
-                                       zl10353_attach,
+
+                       /* I2C gate for DNOD44CDH086A(TDA18212) tuner module */
+                       if (adap->fe[1])
+                               adap->fe[1]->ops.i2c_gate_ctrl =
+                                               anysee_i2c_gate_ctrl;
+               } else {
+                       /* PLL config */
+                       adap->fe[1] = dvb_attach(zl10353_attach,
                                        &anysee_zl10353_config,
                                        &adap->dev->i2c_adap);
-                       }
-               }
-
-               /* I2C gate for DNOD44CDH086A(TDA18212) tuner module */
-               if (tmp == 0xc7) {
-                       if (adap->fe_adap[state->fe_id].fe)
-                               adap->fe_adap[state->fe_id].fe->ops.i2c_gate_ctrl =
-                                       anysee_i2c_gate_ctrl;
                }
 
                break;
@@ -834,48 +816,47 @@ static int anysee_frontend_attach(struct dvb_usb_adapter *adap)
                /* E7 TC */
                /* E7 PTC */
 
-               if ((state->fe_id ^ dvb_usb_anysee_delsys) == 0)  {
-                       /* disable DVB-T demod on IOD[6] */
-                       ret = anysee_wr_reg_mask(adap->dev, REG_IOD, (0 << 6),
-                               0x40);
-                       if (ret)
-                               goto error;
+               /* disable DVB-T demod on IOD[6] */
+               ret = anysee_wr_reg_mask(adap->dev, REG_IOD, (0 << 6), 0x40);
+               if (ret)
+                       goto error;
 
-                       /* enable DVB-C demod on IOD[5] */
-                       ret = anysee_wr_reg_mask(adap->dev, REG_IOD, (1 << 5),
-                               0x20);
-                       if (ret)
-                               goto error;
+               /* enable DVB-C demod on IOD[5] */
+               ret = anysee_wr_reg_mask(adap->dev, REG_IOD, (1 << 5), 0x20);
+               if (ret)
+                       goto error;
 
-                       /* attach demod */
-                       adap->fe_adap[state->fe_id].fe =
-                               dvb_attach(tda10023_attach,
+               /* attach demod */
+               adap->fe[0] = dvb_attach(tda10023_attach,
                                &anysee_tda10023_tda18212_config,
                                &adap->dev->i2c_adap, 0x48);
-               } else {
-                       /* disable DVB-C demod on IOD[5] */
-                       ret = anysee_wr_reg_mask(adap->dev, REG_IOD, (0 << 5),
-                               0x20);
-                       if (ret)
-                               goto error;
 
-                       /* enable DVB-T demod on IOD[6] */
-                       ret = anysee_wr_reg_mask(adap->dev, REG_IOD, (1 << 6),
-                               0x40);
-                       if (ret)
-                               goto error;
+               /* I2C gate for DNOD44CDH086A(TDA18212) tuner module */
+               if (adap->fe[0])
+                       adap->fe[0]->ops.i2c_gate_ctrl = anysee_i2c_gate_ctrl;
+
+               /* break out if first frontend attaching fails */
+               if (!adap->fe[0])
+                       break;
+
+               /* disable DVB-C demod on IOD[5] */
+               ret = anysee_wr_reg_mask(adap->dev, REG_IOD, (0 << 5), 0x20);
+               if (ret)
+                       goto error;
+
+               /* enable DVB-T demod on IOD[6] */
+               ret = anysee_wr_reg_mask(adap->dev, REG_IOD, (1 << 6), 0x40);
+               if (ret)
+                       goto error;
 
-                       /* attach demod */
-                       adap->fe_adap[state->fe_id].fe =
-                               dvb_attach(zl10353_attach,
+               /* attach demod */
+               adap->fe[1] = dvb_attach(zl10353_attach,
                                &anysee_zl10353_tda18212_config,
                                &adap->dev->i2c_adap);
-               }
 
                /* I2C gate for DNOD44CDH086A(TDA18212) tuner module */
-               if (adap->fe_adap[state->fe_id].fe)
-                       adap->fe_adap[state->fe_id].fe->ops.i2c_gate_ctrl =
-                               anysee_i2c_gate_ctrl;
+               if (adap->fe[1])
+                       adap->fe[1]->ops.i2c_gate_ctrl = anysee_i2c_gate_ctrl;
 
                state->has_ci = true;
 
@@ -885,16 +866,13 @@ static int anysee_frontend_attach(struct dvb_usb_adapter *adap)
                /* E7 S2 */
                /* E7 PS2 */
 
-               if (state->fe_id)
-                       break;
-
                /* enable DVB-S/S2 demod on IOE[5] */
                ret = anysee_wr_reg_mask(adap->dev, REG_IOE, (1 << 5), 0x20);
                if (ret)
                        goto error;
 
                /* attach demod */
-               adap->fe_adap[0].fe = dvb_attach(stv0900_attach,
+               adap->fe[0] = dvb_attach(stv0900_attach,
                        &anysee_stv0900_config, &adap->dev->i2c_adap, 0);
 
                state->has_ci = true;
@@ -903,16 +881,13 @@ static int anysee_frontend_attach(struct dvb_usb_adapter *adap)
        case ANYSEE_HW_508T2C: /* 20 */
                /* E7 T2C */
 
-               if (state->fe_id)
-                       break;
-
                /* enable DVB-T/T2/C demod on IOE[5] */
                ret = anysee_wr_reg_mask(adap->dev, REG_IOE, (1 << 5), 0x20);
                if (ret)
                        goto error;
 
                /* attach demod */
-               adap->fe_adap[state->fe_id].fe = dvb_attach(cxd2820r_attach,
+               adap->fe[0] = dvb_attach(cxd2820r_attach,
                                &anysee_cxd2820r_config, &adap->dev->i2c_adap);
 
                state->has_ci = true;
@@ -920,7 +895,7 @@ static int anysee_frontend_attach(struct dvb_usb_adapter *adap)
                break;
        }
 
-       if (!adap->fe_adap[0].fe) {
+       if (!adap->fe[0]) {
                /* we have no frontend :-( */
                ret = -ENODEV;
                err("Unsupported Anysee version. " \
@@ -935,14 +910,14 @@ static int anysee_tuner_attach(struct dvb_usb_adapter *adap)
        struct anysee_state *state = adap->dev->priv;
        struct dvb_frontend *fe;
        int ret;
-       deb_info("%s: fe=%d\n", __func__, state->fe_id);
+       deb_info("%s: adap=%d\n", __func__, adap->id);
 
        switch (state->hw) {
        case ANYSEE_HW_507T: /* 2 */
                /* E30 */
 
                /* attach tuner */
-               fe = dvb_attach(dvb_pll_attach, adap->fe_adap[0].fe,
+               fe = dvb_attach(dvb_pll_attach, adap->fe[0],
                        (0xc2 >> 1), NULL, DVB_PLL_THOMSON_DTT7579);
 
                break;
@@ -950,7 +925,7 @@ static int anysee_tuner_attach(struct dvb_usb_adapter *adap)
                /* E30 Plus */
 
                /* attach tuner */
-               fe = dvb_attach(dvb_pll_attach, adap->fe_adap[0].fe,
+               fe = dvb_attach(dvb_pll_attach, adap->fe[0],
                        (0xc2 >> 1), &adap->dev->i2c_adap,
                        DVB_PLL_THOMSON_DTT7579);
 
@@ -959,7 +934,7 @@ static int anysee_tuner_attach(struct dvb_usb_adapter *adap)
                /* E30 C Plus */
 
                /* attach tuner */
-               fe = dvb_attach(dvb_pll_attach, adap->fe_adap[0].fe,
+               fe = dvb_attach(dvb_pll_attach, adap->fe[0],
                        (0xc0 >> 1), &adap->dev->i2c_adap,
                        DVB_PLL_SAMSUNG_DTOS403IH102A);
 
@@ -968,7 +943,7 @@ static int anysee_tuner_attach(struct dvb_usb_adapter *adap)
                /* E30 S2 Plus */
 
                /* attach LNB controller */
-               fe = dvb_attach(isl6423_attach, adap->fe_adap[0].fe,
+               fe = dvb_attach(isl6423_attach, adap->fe[0],
                        &adap->dev->i2c_adap, &anysee_isl6423_config);
 
                break;
@@ -980,15 +955,30 @@ static int anysee_tuner_attach(struct dvb_usb_adapter *adap)
                 * fails attach old simple PLL. */
 
                /* attach tuner */
-               fe = dvb_attach(tda18212_attach, adap->fe_adap[state->fe_id].fe,
-                       &adap->dev->i2c_adap, &anysee_tda18212_config);
-               if (fe)
+               fe = dvb_attach(tda18212_attach, adap->fe[0],
+                               &adap->dev->i2c_adap, &anysee_tda18212_config);
+
+               if (fe && adap->fe[1]) {
+                       /* attach tuner for 2nd FE */
+                       fe = dvb_attach(tda18212_attach, adap->fe[1],
+                                       &adap->dev->i2c_adap,
+                                       &anysee_tda18212_config);
+                       break;
+               } else if (fe) {
                        break;
+               }
 
                /* attach tuner */
-               fe = dvb_attach(dvb_pll_attach, adap->fe_adap[state->fe_id].fe,
-                       (0xc0 >> 1), &adap->dev->i2c_adap,
-                       DVB_PLL_SAMSUNG_DTOS403IH102A);
+               fe = dvb_attach(dvb_pll_attach, adap->fe[0], (0xc0 >> 1),
+                               &adap->dev->i2c_adap,
+                               DVB_PLL_SAMSUNG_DTOS403IH102A);
+
+               if (fe && adap->fe[1]) {
+                       /* attach tuner for 2nd FE */
+                       fe = dvb_attach(dvb_pll_attach, adap->fe[0],
+                                       (0xc0 >> 1), &adap->dev->i2c_adap,
+                                       DVB_PLL_SAMSUNG_DTOS403IH102A);
+               }
 
                break;
        case ANYSEE_HW_508TC: /* 18 */
@@ -997,9 +987,15 @@ static int anysee_tuner_attach(struct dvb_usb_adapter *adap)
                /* E7 PTC */
 
                /* attach tuner */
-               fe = dvb_attach(tda18212_attach, adap->fe_adap[state->fe_id].fe,
+               fe = dvb_attach(tda18212_attach, adap->fe[0],
                        &adap->dev->i2c_adap, &anysee_tda18212_config);
 
+               if (fe) {
+                       /* attach tuner for 2nd FE */
+                       fe = dvb_attach(tda18212_attach, adap->fe[1],
+                               &adap->dev->i2c_adap, &anysee_tda18212_config);
+               }
+
                break;
        case ANYSEE_HW_508S2: /* 19 */
        case ANYSEE_HW_508PS2: /* 22 */
@@ -1007,12 +1003,12 @@ static int anysee_tuner_attach(struct dvb_usb_adapter *adap)
                /* E7 PS2 */
 
                /* attach tuner */
-               fe = dvb_attach(stv6110_attach, adap->fe_adap[0].fe,
+               fe = dvb_attach(stv6110_attach, adap->fe[0],
                        &anysee_stv6110_config, &adap->dev->i2c_adap);
 
                if (fe) {
                        /* attach LNB controller */
-                       fe = dvb_attach(isl6423_attach, adap->fe_adap[0].fe,
+                       fe = dvb_attach(isl6423_attach, adap->fe[0],
                                &adap->dev->i2c_adap, &anysee_isl6423_config);
                }
 
@@ -1022,7 +1018,7 @@ static int anysee_tuner_attach(struct dvb_usb_adapter *adap)
                /* E7 T2C */
 
                /* attach tuner */
-               fe = dvb_attach(tda18212_attach, adap->fe_adap[state->fe_id].fe,
+               fe = dvb_attach(tda18212_attach, adap->fe[0],
                        &adap->dev->i2c_adap, &anysee_tda18212_config2);
 
                break;
@@ -1064,6 +1060,15 @@ static int anysee_rc_query(struct dvb_usb_device *d)
        return 0;
 }
 
+static int anysee_get_rc_config(struct dvb_usb_device *d, struct dvb_usb_rc *rc)
+{
+       rc->allowed_protos = RC_TYPE_NEC;
+       rc->query          = anysee_rc_query;
+       rc->interval       = 250;  /* windows driver uses 500ms */
+
+       return 0;
+}
+
 static int anysee_ci_read_attribute_mem(struct dvb_ca_en50221 *ci, int slot,
        int addr)
 {
@@ -1245,6 +1250,14 @@ static int anysee_init(struct dvb_usb_device *d)
        struct anysee_state *state = d->priv;
        int ret;
 
+       /* There is one interface with two alternate settings.
+          Alternate setting 0 is for bulk transfer.
+          Alternate setting 1 is for isochronous transfer.
+          We use bulk transfer (alternate setting 0). */
+       ret = usb_set_interface(d->udev, 0, 0);
+       if (ret)
+               return ret;
+
        /* LED light */
        ret = anysee_led_ctrl(d, 0x01, 0x03);
        if (ret)
@@ -1267,94 +1280,34 @@ static int anysee_init(struct dvb_usb_device *d)
        return 0;
 }
 
-/* DVB USB Driver stuff */
-static struct dvb_usb_device_properties anysee_properties;
-
-static int anysee_probe(struct usb_interface *intf,
-                       const struct usb_device_id *id)
-{
-       struct dvb_usb_device *d;
-       struct usb_host_interface *alt;
-       int ret;
-
-       /* There is one interface with two alternate settings.
-          Alternate setting 0 is for bulk transfer.
-          Alternate setting 1 is for isochronous transfer.
-          We use bulk transfer (alternate setting 0). */
-       if (intf->num_altsetting < 1)
-               return -ENODEV;
-
-       /*
-        * Anysee is always warm (its USB-bridge, Cypress FX2, uploads
-        * firmware from eeprom).  If dvb_usb_device_init() succeeds that
-        * means d is a valid pointer.
-        */
-       ret = dvb_usb_device_init(intf, &anysee_properties, THIS_MODULE, &d,
-               adapter_nr);
-       if (ret)
-               return ret;
-
-       alt = usb_altnum_to_altsetting(intf, 0);
-       if (alt == NULL) {
-               deb_info("%s: no alt found!\n", __func__);
-               return -ENODEV;
-       }
-
-       ret = usb_set_interface(d->udev, alt->desc.bInterfaceNumber,
-               alt->desc.bAlternateSetting);
-       if (ret)
-               return ret;
-
-       return anysee_init(d);
-}
-
-static void anysee_disconnect(struct usb_interface *intf)
+static void anysee_disconnect(struct dvb_usb_device *d)
 {
-       struct dvb_usb_device *d = usb_get_intfdata(intf);
-
-       anysee_ci_release(d);
-       dvb_usb_device_exit(intf);
-
-       return;
+       return anysee_ci_release(d);
 }
 
-static struct usb_device_id anysee_table[] = {
-       { USB_DEVICE(USB_VID_CYPRESS, USB_PID_ANYSEE) },
-       { USB_DEVICE(USB_VID_AMT,     USB_PID_ANYSEE) },
-       { }             /* Terminating entry */
-};
-MODULE_DEVICE_TABLE(usb, anysee_table);
-
-static struct dvb_usb_device_properties anysee_properties = {
-       .caps             = DVB_USB_IS_AN_I2C_ADAPTER,
+/* DVB USB Driver stuff */
+static struct dvb_usb_device_properties anysee_props = {
+       .driver_name = KBUILD_MODNAME,
+       .owner = THIS_MODULE,
+       .adapter_nr = adapter_nr,
+       .size_of_priv = sizeof(struct anysee_state),
 
-       .usb_ctrl         = DEVICE_SPECIFIC,
+       .generic_bulk_ctrl_endpoint = 0x01,
+       .generic_bulk_ctrl_endpoint_response = 0x81,
 
-       .size_of_priv     = sizeof(struct anysee_state),
+       .i2c_algo         = &anysee_i2c_algo,
+       .read_config      = anysee_read_config,
+       .frontend_attach  = anysee_frontend_attach,
+       .tuner_attach     = anysee_tuner_attach,
+       .init             = anysee_init,
+       .get_rc_config    = anysee_get_rc_config,
+       .frontend_ctrl    = anysee_frontend_ctrl,
+       .streaming_ctrl   = anysee_streaming_ctrl,
+       .disconnect       = anysee_disconnect,
 
        .num_adapters = 1,
        .adapter = {
                {
-               .num_frontends    = 2,
-               .frontend_ctrl    = anysee_frontend_ctrl,
-               .fe = { {
-                       .streaming_ctrl   = anysee_streaming_ctrl,
-                       .frontend_attach  = anysee_frontend_attach,
-                       .tuner_attach     = anysee_tuner_attach,
-                       .stream = {
-                               .type = USB_BULK,
-                               .count = 8,
-                               .endpoint = 0x82,
-                               .u = {
-                                       .bulk = {
-                                               .buffersize = (16*512),
-                                       }
-                               }
-                       },
-               }, {
-                       .streaming_ctrl   = anysee_streaming_ctrl,
-                       .frontend_attach  = anysee_frontend_attach,
-                       .tuner_attach     = anysee_tuner_attach,
                        .stream = {
                                .type = USB_BULK,
                                .count = 8,
@@ -1364,42 +1317,32 @@ static struct dvb_usb_device_properties anysee_properties = {
                                                .buffersize = (16*512),
                                        }
                                }
-                       },
-               } },
+                       }
                }
-       },
-
-       .rc.core = {
-               .rc_codes         = RC_MAP_ANYSEE,
-               .protocol         = RC_TYPE_OTHER,
-               .module_name      = "anysee",
-               .rc_query         = anysee_rc_query,
-               .rc_interval      = 250,  /* windows driver uses 500ms */
-       },
-
-       .i2c_algo         = &anysee_i2c_algo,
-
-       .generic_bulk_ctrl_endpoint = 1,
-
-       .num_device_descs = 1,
-       .devices = {
-               {
-                       .name = "Anysee DVB USB2.0",
-                       .cold_ids = {NULL},
-                       .warm_ids = {&anysee_table[0],
-                                    &anysee_table[1], NULL},
-               },
        }
 };
 
-static struct usb_driver anysee_driver = {
-       .name       = "dvb_usb_anysee",
-       .probe      = anysee_probe,
-       .disconnect = anysee_disconnect,
-       .id_table   = anysee_table,
+static const struct usb_device_id anysee_id_table[] = {
+       { DVB_USB_DEVICE(USB_VID_CYPRESS, USB_PID_ANYSEE,
+               &anysee_props, "Anysee", RC_MAP_ANYSEE) },
+       { DVB_USB_DEVICE(USB_VID_AMT, USB_PID_ANYSEE,
+               &anysee_props, "Anysee", RC_MAP_ANYSEE) },
+       { }
+};
+MODULE_DEVICE_TABLE(usb, anysee_id_table);
+
+static struct usb_driver anysee_usb_driver = {
+       .name = KBUILD_MODNAME,
+       .id_table = anysee_id_table,
+       .probe = dvb_usbv2_probe,
+       .disconnect = dvb_usbv2_disconnect,
+       .suspend = dvb_usbv2_suspend,
+       .resume = dvb_usbv2_resume,
+       .no_dynamic_id = 1,
+       .soft_unbind = 1,
 };
 
-module_usb_driver(anysee_driver);
+module_usb_driver(anysee_usb_driver);
 
 MODULE_AUTHOR("Antti Palosaari <crope@iki.fi>");
 MODULE_DESCRIPTION("Driver Anysee E30 DVB-C & DVB-T USB2.0");
index 8ac8794315401d06a087dcf4614444ce98c8d12b..dc40dcf7c32872e87ee037662241e35545419a6f 100644 (file)
 #define _DVB_USB_ANYSEE_H_
 
 #define DVB_USB_LOG_PREFIX "anysee"
-#include "dvb-usb.h"
+#include "dvb_usb.h"
 #include "dvb_ca_en50221.h"
 
+#ifdef CONFIG_DVB_USB_DEBUG
+#define dprintk(var, level, args...) \
+       do { if ((var & level)) printk(args); } while (0)
+#define DVB_USB_DEBUG_STATUS
+#else
+#define dprintk(args...)
+#define debug_dump(b, l, func)
+#define DVB_USB_DEBUG_STATUS " (debugging is not enabled)"
+#endif
+
+#define debug_dump(b, l, func) {\
+       int loop_; \
+       for (loop_ = 0; loop_ < l; loop_++) \
+               func("%02x ", b[loop_]); \
+       func("\n");\
+}
+
 #define deb_info(args...) dprintk(dvb_usb_anysee_debug, 0x01, args)
 #define deb_xfer(args...) dprintk(dvb_usb_anysee_debug, 0x02, args)
 #define deb_rc(args...)   dprintk(dvb_usb_anysee_debug, 0x04, args)
 #define deb_i2c(args...)  dprintk(dvb_usb_anysee_debug, 0x10, args)
 #define deb_fw(args...)   dprintk(dvb_usb_anysee_debug, 0x20, args)
 
+#undef err
+#define err(format, arg...)  printk(KERN_ERR     DVB_USB_LOG_PREFIX ": " format "\n" , ## arg)
+#undef info
+#define info(format, arg...) printk(KERN_INFO    DVB_USB_LOG_PREFIX ": " format "\n" , ## arg)
+#undef warn
+#define warn(format, arg...) printk(KERN_WARNING DVB_USB_LOG_PREFIX ": " format "\n" , ## arg)
+
 enum cmd {
        CMD_I2C_READ            = 0x33,
        CMD_I2C_WRITE           = 0x31,