Merge branch 'linus' into cpus4096
[pandora-kernel.git] / drivers / media / dvb / dvb-usb / cxusb.c
index c583650..0286156 100644 (file)
@@ -23,6 +23,9 @@
  *
  * see Documentation/dvb/README.dvb-usb for more information
  */
+#include <media/tuner.h>
+#include <linux/vmalloc.h>
+
 #include "cxusb.h"
 
 #include "cx22702.h"
 #include "mt352_priv.h"
 #include "zl10353.h"
 #include "tuner-xc2028.h"
-#include "tuner-xc2028-types.h"
+#include "tuner-simple.h"
 
 /* debug */
 static int dvb_usb_cxusb_debug;
 module_param_named(debug, dvb_usb_cxusb_debug, int, 0644);
 MODULE_PARM_DESC(debug, "set debugging level (1=rc (or-able))." DVB_USB_DEBUG_STATUS);
+
+DVB_DEFINE_MOD_OPT_ADAPTER_NR(adapter_nr);
+
 #define deb_info(args...)   dprintk(dvb_usb_cxusb_debug,0x01,args)
 #define deb_i2c(args...)    if (d->udev->descriptor.idVendor == USB_VID_MEDION) \
                                dprintk(dvb_usb_cxusb_debug,0x01,args)
@@ -450,8 +456,9 @@ static struct mt352_config cxusb_mt352_xc3028_config = {
 /* Callbacks for DVB USB */
 static int cxusb_fmd1216me_tuner_attach(struct dvb_usb_adapter *adap)
 {
-       dvb_attach(dvb_pll_attach, adap->fe, 0x61, &adap->dev->i2c_adap,
-                  DVB_PLL_FMD1216ME);
+       dvb_attach(simple_tuner_attach, adap->fe,
+                  &adap->dev->i2c_adap, 0x61,
+                  TUNER_PHILIPS_FMD1216ME_MK3);
        return 0;
 }
 
@@ -477,8 +484,8 @@ static int cxusb_dtt7579_tuner_attach(struct dvb_usb_adapter *adap)
 
 static int cxusb_lgh064f_tuner_attach(struct dvb_usb_adapter *adap)
 {
-       dvb_attach(dvb_pll_attach, adap->fe, 0x61, &adap->dev->i2c_adap,
-                  DVB_PLL_LG_TDVS_H06XF);
+       dvb_attach(simple_tuner_attach, adap->fe,
+                  &adap->dev->i2c_adap, 0x61, TUNER_LG_TDVS_H06XF);
        return 0;
 }
 
@@ -488,14 +495,14 @@ static int dvico_bluebird_xc2028_callback(void *ptr, int command, int arg)
 
        switch (command) {
        case XC2028_TUNER_RESET:
-               deb_info("%s: XC2028_TUNER_RESET %d\n", __FUNCTION__, arg);
+               deb_info("%s: XC2028_TUNER_RESET %d\n", __func__, arg);
                cxusb_bluebird_gpio_pulse(d, 0x01, 1);
                break;
        case XC2028_RESET_CLK:
-               deb_info("%s: XC2028_RESET_CLK %d\n", __FUNCTION__, arg);
+               deb_info("%s: XC2028_RESET_CLK %d\n", __func__, arg);
                break;
        default:
-               deb_info("%s: unknown command %d, arg %d\n", __FUNCTION__,
+               deb_info("%s: unknown command %d, arg %d\n", __func__,
                         command, arg);
                return -EINVAL;
        }
@@ -509,13 +516,12 @@ static int cxusb_dvico_xc3028_tuner_attach(struct dvb_usb_adapter *adap)
        struct xc2028_config      cfg = {
                .i2c_adap  = &adap->dev->i2c_adap,
                .i2c_addr  = 0x61,
-               .video_dev = adap->dev,
                .callback  = dvico_bluebird_xc2028_callback,
        };
        static struct xc2028_ctrl ctl = {
                .fname       = "xc3028-dvico-au-01.fw",
                .max_len     = 64,
-               .scode_table = ZARLINK456,
+               .scode_table = XC3028_FE_ZARLINK456,
        };
 
        fe = dvb_attach(xc2028_attach, adap->fe, &cfg);
@@ -695,12 +701,26 @@ static int bluebird_patch_dvico_firmware_download(struct usb_device *udev,
 
                if (fw->data[idoff] == (USB_VID_DVICO & 0xff) &&
                    fw->data[idoff + 1] == USB_VID_DVICO >> 8) {
-                       fw->data[idoff + 2] =
+                       struct firmware new_fw;
+                       u8 *new_fw_data = vmalloc(fw->size);
+                       int ret;
+
+                       if (!new_fw_data)
+                               return -ENOMEM;
+
+                       memcpy(new_fw_data, fw->data, fw->size);
+                       new_fw.size = fw->size;
+                       new_fw.data = new_fw_data;
+
+                       new_fw_data[idoff + 2] =
                                le16_to_cpu(udev->descriptor.idProduct) + 1;
-                       fw->data[idoff + 3] =
+                       new_fw_data[idoff + 3] =
                                le16_to_cpu(udev->descriptor.idProduct) >> 8;
 
-                       return usb_cypress_load_firmware(udev, fw, CYPRESS_FX2);
+                       ret = usb_cypress_load_firmware(udev, &new_fw,
+                                                       CYPRESS_FX2);
+                       vfree(new_fw_data);
+                       return ret;
                }
        }
 
@@ -720,16 +740,24 @@ static struct dvb_usb_device_properties cxusb_bluebird_nano2_needsfirmware_prope
 static int cxusb_probe(struct usb_interface *intf,
                       const struct usb_device_id *id)
 {
-       if (dvb_usb_device_init(intf,&cxusb_medion_properties,THIS_MODULE,NULL) == 0 ||
-               dvb_usb_device_init(intf,&cxusb_bluebird_lgh064f_properties,THIS_MODULE,NULL) == 0 ||
-               dvb_usb_device_init(intf,&cxusb_bluebird_dee1601_properties,THIS_MODULE,NULL) == 0 ||
-               dvb_usb_device_init(intf,&cxusb_bluebird_lgz201_properties,THIS_MODULE,NULL) == 0 ||
-               dvb_usb_device_init(intf,&cxusb_bluebird_dtt7579_properties,THIS_MODULE,NULL) == 0 ||
-               dvb_usb_device_init(intf,&cxusb_bluebird_dualdig4_properties,THIS_MODULE,NULL) == 0 ||
-               dvb_usb_device_init(intf,&cxusb_bluebird_nano2_properties,THIS_MODULE,NULL) == 0 ||
-               dvb_usb_device_init(intf,&cxusb_bluebird_nano2_needsfirmware_properties,THIS_MODULE,NULL) == 0) {
+       if (0 == dvb_usb_device_init(intf, &cxusb_medion_properties,
+                                    THIS_MODULE, NULL, adapter_nr) ||
+           0 == dvb_usb_device_init(intf, &cxusb_bluebird_lgh064f_properties,
+                                    THIS_MODULE, NULL, adapter_nr) ||
+           0 == dvb_usb_device_init(intf, &cxusb_bluebird_dee1601_properties,
+                                    THIS_MODULE, NULL, adapter_nr) ||
+           0 == dvb_usb_device_init(intf, &cxusb_bluebird_lgz201_properties,
+                                    THIS_MODULE, NULL, adapter_nr) ||
+           0 == dvb_usb_device_init(intf, &cxusb_bluebird_dtt7579_properties,
+                                    THIS_MODULE, NULL, adapter_nr) ||
+           0 == dvb_usb_device_init(intf, &cxusb_bluebird_dualdig4_properties,
+                                    THIS_MODULE, NULL, adapter_nr) ||
+           0 == dvb_usb_device_init(intf, &cxusb_bluebird_nano2_properties,
+                                    THIS_MODULE, NULL, adapter_nr) ||
+           0 == dvb_usb_device_init(intf,
+                               &cxusb_bluebird_nano2_needsfirmware_properties,
+                                    THIS_MODULE, NULL, adapter_nr))
                return 0;
-       }
 
        return -EINVAL;
 }