.has_remote = 1,
},
.gpio = {
- .tuner_reset = TM6000_GPIO_2,
+ .tuner_reset = TM6010_GPIO_0,
+ .demod_reset = TM6010_GPIO_1,
+ .power_led = TM6010_GPIO_6,
},
},
[TM6010_BOARD_BEHOLD_VOYAGER] = {
.has_remote = 1,
},
.gpio = {
- .tuner_reset = TM6000_GPIO_2,
+ .tuner_reset = TM6010_GPIO_0,
+ .power_led = TM6010_GPIO_6,
},
},
[TM6010_BOARD_TERRATEC_CINERGY_HYBRID_XE] = {
};
/* table of devices that work with this driver */
-struct usb_device_id tm6000_id_table [] = {
+struct usb_device_id tm6000_id_table[] = {
{ USB_DEVICE(0x6000, 0x0001), .driver_info = TM5600_BOARD_10MOONS_UT821 },
{ USB_DEVICE(0x6000, 0x0002), .driver_info = TM6010_BOARD_GENERIC },
{ USB_DEVICE(0x06e1, 0xf332), .driver_info = TM6000_BOARD_ADSTECH_DUAL_TV },
{ },
};
+/* Tuner callback to provide the proper gpio changes needed for xc5000 */
+int tm6000_xc5000_callback(void *ptr, int component, int command, int arg)
+{
+ int rc = 0;
+ struct tm6000_core *dev = ptr;
+
+ if (dev->tuner_type != TUNER_XC5000)
+ return 0;
+
+ switch (command) {
+ case XC5000_TUNER_RESET:
+ tm6000_set_reg(dev, REQ_03_SET_GET_MCU_PIN,
+ dev->gpio.tuner_reset, 0x01);
+ msleep(15);
+ tm6000_set_reg(dev, REQ_03_SET_GET_MCU_PIN,
+ dev->gpio.tuner_reset, 0x00);
+ msleep(15);
+ tm6000_set_reg(dev, REQ_03_SET_GET_MCU_PIN,
+ dev->gpio.tuner_reset, 0x01);
+ break;
+ }
+ return (rc);
+}
+
+
/* Tuner callback to provide the proper gpio changes needed for xc2028 */
int tm6000_tuner_callback(void *ptr, int component, int command, int arg)
{
- int rc=0;
+ int rc = 0;
struct tm6000_core *dev = ptr;
- if (dev->tuner_type!=TUNER_XC2028)
+ if (dev->tuner_type != TUNER_XC2028)
return 0;
switch (command) {
case XC2028_RESET_CLK:
- tm6000_set_reg (dev, REQ_04_EN_DISABLE_MCU_INT,
+ tm6000_set_reg(dev, REQ_04_EN_DISABLE_MCU_INT,
0x02, arg);
msleep(10);
- rc=tm6000_set_reg (dev, REQ_03_SET_GET_MCU_PIN,
+ rc = tm6000_set_reg(dev, REQ_03_SET_GET_MCU_PIN,
TM6000_GPIO_CLK, 0);
- if (rc<0)
+ if (rc < 0)
return rc;
msleep(10);
- rc=tm6000_set_reg (dev, REQ_03_SET_GET_MCU_PIN,
+ rc = tm6000_set_reg(dev, REQ_03_SET_GET_MCU_PIN,
TM6000_GPIO_CLK, 1);
break;
case XC2028_TUNER_RESET:
}
break;
case 1:
- tm6000_set_reg (dev, REQ_04_EN_DISABLE_MCU_INT,
+ tm6000_set_reg(dev, REQ_04_EN_DISABLE_MCU_INT,
0x02, 0x01);
msleep(10);
break;
case 2:
- rc=tm6000_set_reg (dev, REQ_03_SET_GET_MCU_PIN,
+ rc = tm6000_set_reg(dev, REQ_03_SET_GET_MCU_PIN,
TM6000_GPIO_CLK, 0);
- if (rc<0)
+ if (rc < 0)
return rc;
msleep(100);
- rc=tm6000_set_reg (dev, REQ_03_SET_GET_MCU_PIN,
+ rc = tm6000_set_reg(dev, REQ_03_SET_GET_MCU_PIN,
TM6000_GPIO_CLK, 1);
msleep(100);
break;
}
}
- return (rc);
+ return rc;
}
int tm6000_cards_setup(struct tm6000_core *dev)
tm6000_set_reg(dev, REQ_03_SET_GET_MCU_PIN, dev->gpio.demod_on, 0x00);
msleep(15);
break;
+ case TM6010_BOARD_BEHOLD_WANDER:
+ /* Power led on (blue) */
+ tm6000_set_reg(dev, REQ_03_SET_GET_MCU_PIN, dev->gpio.power_led, 0x01);
+ msleep(15);
+ /* Reset zarlink zl10353 */
+ tm6000_set_reg(dev, REQ_03_SET_GET_MCU_PIN, dev->gpio.demod_reset, 0x00);
+ msleep(50);
+ tm6000_set_reg(dev, REQ_03_SET_GET_MCU_PIN, dev->gpio.demod_reset, 0x01);
+ msleep(15);
+ break;
+ case TM6010_BOARD_BEHOLD_VOYAGER:
+ /* Power led on (blue) */
+ tm6000_set_reg(dev, REQ_03_SET_GET_MCU_PIN, dev->gpio.power_led, 0x01);
+ msleep(15);
+ break;
default:
break;
}
* If a device uses a different sequence or different GPIO pins for
* reset, just add the code at the board-specific part
*/
- for (i = 0; i < 2; i++) {
- rc = tm6000_set_reg(dev, REQ_03_SET_GET_MCU_PIN,
- dev->gpio.tuner_reset, 0x00);
- if (rc < 0) {
- printk(KERN_ERR "Error %i doing GPIO1 reset\n", rc);
- return rc;
- }
- msleep(10); /* Just to be conservative */
- rc = tm6000_set_reg(dev, REQ_03_SET_GET_MCU_PIN,
- dev->gpio.tuner_reset, 0x01);
- if (rc < 0) {
- printk(KERN_ERR "Error %i doing GPIO1 reset\n", rc);
- return rc;
- }
-
- msleep(10);
- rc = tm6000_set_reg(dev, REQ_03_SET_GET_MCU_PIN, TM6000_GPIO_4, 0);
- if (rc < 0) {
- printk(KERN_ERR "Error %i doing GPIO4 reset\n", rc);
- return rc;
- }
+ if (dev->gpio.tuner_reset) {
+ for (i = 0; i < 2; i++) {
+ rc = tm6000_set_reg(dev, REQ_03_SET_GET_MCU_PIN,
+ dev->gpio.tuner_reset, 0x00);
+ if (rc < 0) {
+ printk(KERN_ERR "Error %i doing tuner reset\n", rc);
+ return rc;
+ }
- msleep(10);
- rc = tm6000_set_reg(dev, REQ_03_SET_GET_MCU_PIN, TM6000_GPIO_4, 1);
- if (rc < 0) {
- printk(KERN_ERR "Error %i doing GPIO4 reset\n", rc);
- return rc;
- }
+ msleep(10); /* Just to be conservative */
+ rc = tm6000_set_reg(dev, REQ_03_SET_GET_MCU_PIN,
+ dev->gpio.tuner_reset, 0x01);
+ if (rc < 0) {
+ printk(KERN_ERR "Error %i doing tuner reset\n", rc);
+ return rc;
+ }
+ msleep(10);
- if (!i) {
- rc = tm6000_get_reg32(dev, REQ_40_GET_VERSION, 0, 0);
- if (rc >= 0)
- printk(KERN_DEBUG "board=0x%08x\n", rc);
+ if (!i) {
+ rc = tm6000_get_reg32(dev, REQ_40_GET_VERSION, 0, 0);
+ if (rc >= 0)
+ printk(KERN_DEBUG "board=0x%08x\n", rc);
+ }
}
+ } else {
+ printk(KERN_ERR "Tuner reset is not configured\n");
+ return -1;
}
msleep(50);
return 0;
};
-static void tm6000_config_tuner (struct tm6000_core *dev)
+static void tm6000_config_tuner(struct tm6000_core *dev)
{
- struct tuner_setup tun_setup;
+ struct tuner_setup tun_setup;
/* Load tuner module */
v4l2_i2c_new_subdev(&dev->v4l2_dev, &dev->i2c_adap,
- "tuner", "tuner",dev->tuner_addr, NULL);
+ "tuner", "tuner", dev->tuner_addr, NULL);
memset(&tun_setup, 0, sizeof(tun_setup));
- tun_setup.type = dev->tuner_type;
- tun_setup.addr = dev->tuner_addr;
- tun_setup.mode_mask = T_ANALOG_TV | T_RADIO | T_DIGITAL_TV;
- tun_setup.tuner_callback = tm6000_tuner_callback;
+ tun_setup.type = dev->tuner_type;
+ tun_setup.addr = dev->tuner_addr;
+
+ tun_setup.mode_mask = 0;
+ if (dev->caps.has_tuner)
+ tun_setup.mode_mask |= (T_ANALOG_TV | T_RADIO);
+ if (dev->caps.has_dvb)
+ tun_setup.mode_mask |= T_DIGITAL_TV;
+
+ switch (dev->tuner_type) {
+ case TUNER_XC2028:
+ tun_setup.tuner_callback = tm6000_tuner_callback;;
+ break;
+ case TUNER_XC5000:
+ tun_setup.tuner_callback = tm6000_xc5000_callback;
+ break;
+ }
v4l2_device_call_all(&dev->v4l2_dev, 0, tuner, s_type_addr, &tun_setup);
- if (dev->tuner_type == TUNER_XC2028) {
- struct v4l2_priv_tun_config xc2028_cfg;
- struct xc2028_ctrl ctl;
+ switch (dev->tuner_type) {
+ case TUNER_XC2028: {
+ struct v4l2_priv_tun_config xc2028_cfg;
+ struct xc2028_ctrl ctl;
memset(&xc2028_cfg, 0, sizeof(xc2028_cfg));
- memset (&ctl,0,sizeof(ctl));
+ memset(&ctl, 0, sizeof(ctl));
ctl.input1 = 1;
ctl.read_not_reliable = 0;
xc2028_cfg.tuner = TUNER_XC2028;
xc2028_cfg.priv = &ctl;
- switch(dev->model) {
+ switch (dev->model) {
case TM6010_BOARD_HAUPPAUGE_900H:
case TM6010_BOARD_TERRATEC_CINERGY_HYBRID_XE:
case TM6010_BOARD_TWINHAN_TU501:
if (dev->dev_type == TM6010)
ctl.fname = "xc3028-v27.fw";
else
- ctl.fname = "tm6000-xc3028.fw";
+ ctl.fname = "xc3028-v24.fw";
}
printk(KERN_INFO "Setting firmware parameters for xc2028\n");
-
v4l2_device_call_all(&dev->v4l2_dev, 0, tuner, s_config,
&xc2028_cfg);
+
+ }
+ break;
+ case TUNER_XC5000:
+ {
+ struct v4l2_priv_tun_config xc5000_cfg;
+ struct xc5000_config ctl = {
+ .i2c_address = dev->tuner_addr,
+ .if_khz = 4570,
+ .radio_input = XC5000_RADIO_FM1,
+ };
+
+ xc5000_cfg.tuner = TUNER_XC5000;
+ xc5000_cfg.priv = &ctl;
+
+
+ v4l2_device_call_all(&dev->v4l2_dev, 0, tuner, s_config,
+ &xc5000_cfg);
+ }
+ break;
+ default:
+ printk(KERN_INFO "Unknown tuner type. Tuner is not configured.\n");
+ break;
}
}
dev->caps = tm6000_boards[dev->model].caps;
/* initialize hardware */
- rc=tm6000_init (dev);
- if (rc<0)
+ rc = tm6000_init(dev);
+ if (rc < 0)
goto err;
rc = v4l2_device_register(&dev->udev->dev, &dev->v4l2_dev);
goto err;
/* register i2c bus */
- rc=tm6000_i2c_register(dev);
- if (rc<0)
+ rc = tm6000_i2c_register(dev);
+ if (rc < 0)
goto err;
/* Default values for STD and resolutions */
dev->norm = V4L2_STD_PAL_M;
/* Configure tuner */
- tm6000_config_tuner (dev);
+ tm6000_config_tuner(dev);
/* Set video standard */
v4l2_device_call_all(&dev->v4l2_dev, 0, core, s_std, dev->norm);
"tvaudio", "tvaudio", I2C_ADDR_TDA9874, NULL);
/* register and initialize V4L2 */
- rc=tm6000_v4l2_register(dev);
- if (rc<0)
+ rc = tm6000_v4l2_register(dev);
+ if (rc < 0)
goto err;
- if(dev->caps.has_dvb) {
+ if (dev->caps.has_dvb) {
dev->dvb = kzalloc(sizeof(*(dev->dvb)), GFP_KERNEL);
- if(!dev->dvb) {
+ if (!dev->dvb) {
rc = -ENOMEM;
goto err2;
}
#ifdef CONFIG_VIDEO_TM6000_DVB
rc = tm6000_dvb_register(dev);
- if(rc < 0) {
+ if (rc < 0) {
kfree(dev->dvb);
dev->dvb = NULL;
goto err2;
tm_ep->bInterfaceNumber = alt->desc.bInterfaceNumber;
tm_ep->bAlternateSetting = alt->desc.bAlternateSetting;
- printk("tm6000: %s endpoint: 0x%02x (max size=%u bytes)\n",
+ printk(KERN_INFO "tm6000: %s endpoint: 0x%02x (max size=%u bytes)\n",
msgtype, curr_e->desc.bEndpointAddress,
size);
}
{
struct usb_device *usbdev;
struct tm6000_core *dev = NULL;
- int i,rc=0;
- int nr=0;
+ int i, rc = 0;
+ int nr = 0;
char *speed;
-
- usbdev=usb_get_dev(interface_to_usbdev(interface));
+ usbdev = usb_get_dev(interface_to_usbdev(interface));
/* Selects the proper interface */
- rc=usb_set_interface(usbdev,0,1);
- if (rc<0)
+ rc = usb_set_interface(usbdev, 0, 1);
+ if (rc < 0)
goto err;
/* Check to see next free device and mark as used */
- nr=find_first_zero_bit(&tm6000_devused,TM6000_MAXBOARDS);
+ nr = find_first_zero_bit(&tm6000_devused, TM6000_MAXBOARDS);
if (nr >= TM6000_MAXBOARDS) {
- printk ("tm6000: Supports only %i tm60xx boards.\n",TM6000_MAXBOARDS);
+ printk(KERN_ERR "tm6000: Supports only %i tm60xx boards.\n", TM6000_MAXBOARDS);
usb_put_dev(usbdev);
return -ENOMEM;
}
/* Create and initialize dev struct */
dev = kzalloc(sizeof(*dev), GFP_KERNEL);
if (dev == NULL) {
- printk ("tm6000" ": out of memory!\n");
+ printk(KERN_ERR "tm6000" ": out of memory!\n");
usb_put_dev(usbdev);
return -ENOMEM;
}
spin_lock_init(&dev->slock);
/* Increment usage count */
- tm6000_devused|=1<<nr;
+ tm6000_devused |= 1<<nr;
snprintf(dev->name, 29, "tm6000 #%d", nr);
- dev->model=id->driver_info;
- if ((card[nr]>=0) && (card[nr]<ARRAY_SIZE(tm6000_boards))) {
- dev->model=card[nr];
- }
+ dev->model = id->driver_info;
+ if ((card[nr] >= 0) && (card[nr] < ARRAY_SIZE(tm6000_boards)))
+ dev->model = card[nr];
- INIT_LIST_HEAD(&dev->tm6000_corelist);
- dev->udev= usbdev;
- dev->devno=nr;
+ dev->udev = usbdev;
+ dev->devno = nr;
switch (usbdev->speed) {
case USB_SPEED_LOW:
dir_out = ((e->desc.bEndpointAddress &
USB_ENDPOINT_DIR_MASK) == USB_DIR_OUT);
- printk("tm6000: alt %d, interface %i, class %i\n",
+ printk(KERN_INFO "tm6000: alt %d, interface %i, class %i\n",
i,
interface->altsetting[i].desc.bInterfaceNumber,
interface->altsetting[i].desc.bInterfaceClass);
}
- printk("tm6000: New video device @ %s Mbps (%04x:%04x, ifnum %d)\n",
+ printk(KERN_INFO "tm6000: New video device @ %s Mbps (%04x:%04x, ifnum %d)\n",
speed,
le16_to_cpu(dev->udev->descriptor.idVendor),
le16_to_cpu(dev->udev->descriptor.idProduct),
/* check if the the device has the iso in endpoint at the correct place */
if (!dev->isoc_in.endp) {
- printk("tm6000: probing error: no IN ISOC endpoint!\n");
- rc= -ENODEV;
+ printk(KERN_ERR "tm6000: probing error: no IN ISOC endpoint!\n");
+ rc = -ENODEV;
goto err;
}
/* save our data pointer in this interface device */
usb_set_intfdata(interface, dev);
- printk("tm6000: Found %s\n", tm6000_boards[dev->model].name);
+ printk(KERN_INFO "tm6000: Found %s\n", tm6000_boards[dev->model].name);
- rc=tm6000_init_dev(dev);
+ rc = tm6000_init_dev(dev);
- if (rc<0)
+ if (rc < 0)
goto err;
return 0;
err:
- printk("tm6000: Error %d while registering\n", rc);
+ printk(KERN_ERR "tm6000: Error %d while registering\n", rc);
- tm6000_devused&=~(1<<nr);
+ tm6000_devused &= ~(1<<nr);
usb_put_dev(usbdev);
kfree(dev);
if (!dev)
return;
- printk("tm6000: disconnecting %s\n", dev->name);
+ printk(KERN_INFO "tm6000: disconnecting %s\n", dev->name);
mutex_lock(&dev->lock);
#ifdef CONFIG_VIDEO_TM6000_DVB
- if(dev->dvb) {
+ if (dev->dvb) {
tm6000_dvb_unregister(dev);
kfree(dev->dvb);
}
v4l2_device_unregister(&dev->v4l2_dev);
-// wake_up_interruptible_all(&dev->open);
-
dev->state |= DEV_DISCONNECTED;
usb_put_dev(dev->udev);
/* register this driver with the USB subsystem */
result = usb_register(&tm6000_usb_driver);
if (result)
- printk("tm6000"
+ printk(KERN_ERR "tm6000"
" usb_register failed. Error number %d.\n", result);
return result;