diff options
Diffstat (limited to 'drivers/media/video/em28xx')
-rw-r--r-- | drivers/media/video/em28xx/em28xx-cards.c | 4 | ||||
-rw-r--r-- | drivers/media/video/em28xx/em28xx-dvb.c | 25 | ||||
-rw-r--r-- | drivers/media/video/em28xx/em28xx-i2c.c | 35 | ||||
-rw-r--r-- | drivers/media/video/em28xx/em28xx-video.c | 60 | ||||
-rw-r--r-- | drivers/media/video/em28xx/em28xx.h | 6 |
5 files changed, 84 insertions, 46 deletions
diff --git a/drivers/media/video/em28xx/em28xx-cards.c b/drivers/media/video/em28xx/em28xx-cards.c index de943cf6c169..d65d0572403b 100644 --- a/drivers/media/video/em28xx/em28xx-cards.c +++ b/drivers/media/video/em28xx/em28xx-cards.c | |||
@@ -1101,7 +1101,7 @@ struct usb_device_id em28xx_id_table [] = { | |||
1101 | { USB_DEVICE(0xeb1a, 0x2820), | 1101 | { USB_DEVICE(0xeb1a, 0x2820), |
1102 | .driver_info = EM2820_BOARD_UNKNOWN }, | 1102 | .driver_info = EM2820_BOARD_UNKNOWN }, |
1103 | { USB_DEVICE(0xeb1a, 0x2821), | 1103 | { USB_DEVICE(0xeb1a, 0x2821), |
1104 | .driver_info = EM2820_BOARD_UNKNOWN }, | 1104 | .driver_info = EM2820_BOARD_PROLINK_PLAYTV_USB2 }, |
1105 | { USB_DEVICE(0xeb1a, 0x2860), | 1105 | { USB_DEVICE(0xeb1a, 0x2860), |
1106 | .driver_info = EM2820_BOARD_UNKNOWN }, | 1106 | .driver_info = EM2820_BOARD_UNKNOWN }, |
1107 | { USB_DEVICE(0xeb1a, 0x2861), | 1107 | { USB_DEVICE(0xeb1a, 0x2861), |
@@ -1271,7 +1271,7 @@ static struct em28xx_hash_table em28xx_i2c_hash[] = { | |||
1271 | {0x1ba50080, EM2860_BOARD_POINTNIX_INTRAORAL_CAMERA, TUNER_ABSENT}, | 1271 | {0x1ba50080, EM2860_BOARD_POINTNIX_INTRAORAL_CAMERA, TUNER_ABSENT}, |
1272 | }; | 1272 | }; |
1273 | 1273 | ||
1274 | int em28xx_tuner_callback(void *ptr, int command, int arg) | 1274 | int em28xx_tuner_callback(void *ptr, int component, int command, int arg) |
1275 | { | 1275 | { |
1276 | int rc = 0; | 1276 | int rc = 0; |
1277 | struct em28xx *dev = ptr; | 1277 | struct em28xx *dev = ptr; |
diff --git a/drivers/media/video/em28xx/em28xx-dvb.c b/drivers/media/video/em28xx/em28xx-dvb.c index d2b1a1a52689..c99e2383b7ec 100644 --- a/drivers/media/video/em28xx/em28xx-dvb.c +++ b/drivers/media/video/em28xx/em28xx-dvb.c | |||
@@ -249,7 +249,6 @@ static int attach_xc3028(u8 addr, struct em28xx *dev) | |||
249 | memset(&cfg, 0, sizeof(cfg)); | 249 | memset(&cfg, 0, sizeof(cfg)); |
250 | cfg.i2c_adap = &dev->i2c_adap; | 250 | cfg.i2c_adap = &dev->i2c_adap; |
251 | cfg.i2c_addr = addr; | 251 | cfg.i2c_addr = addr; |
252 | cfg.callback = em28xx_tuner_callback; | ||
253 | 252 | ||
254 | if (!dev->dvb->frontend) { | 253 | if (!dev->dvb->frontend) { |
255 | printk(KERN_ERR "%s/2: dvb frontend not attached. " | 254 | printk(KERN_ERR "%s/2: dvb frontend not attached. " |
@@ -274,7 +273,7 @@ static int attach_xc3028(u8 addr, struct em28xx *dev) | |||
274 | 273 | ||
275 | /* ------------------------------------------------------------------ */ | 274 | /* ------------------------------------------------------------------ */ |
276 | 275 | ||
277 | int register_dvb(struct em28xx_dvb *dvb, | 276 | static int register_dvb(struct em28xx_dvb *dvb, |
278 | struct module *module, | 277 | struct module *module, |
279 | struct em28xx *dev, | 278 | struct em28xx *dev, |
280 | struct device *device) | 279 | struct device *device) |
@@ -422,6 +421,8 @@ static int dvb_init(struct em28xx *dev) | |||
422 | } | 421 | } |
423 | break; | 422 | break; |
424 | case EM2880_BOARD_HAUPPAUGE_WINTV_HVR_900: | 423 | case EM2880_BOARD_HAUPPAUGE_WINTV_HVR_900: |
424 | case EM2880_BOARD_TERRATEC_HYBRID_XS: | ||
425 | case EM2880_BOARD_KWORLD_DVB_310U: | ||
425 | dvb->frontend = dvb_attach(zl10353_attach, | 426 | dvb->frontend = dvb_attach(zl10353_attach, |
426 | &em28xx_zl10353_with_xc3028, | 427 | &em28xx_zl10353_with_xc3028, |
427 | &dev->i2c_adap); | 428 | &dev->i2c_adap); |
@@ -443,24 +444,6 @@ static int dvb_init(struct em28xx *dev) | |||
443 | } | 444 | } |
444 | break; | 445 | break; |
445 | #endif | 446 | #endif |
446 | case EM2880_BOARD_TERRATEC_HYBRID_XS: | ||
447 | dvb->frontend = dvb_attach(zl10353_attach, | ||
448 | &em28xx_zl10353_with_xc3028, | ||
449 | &dev->i2c_adap); | ||
450 | if (attach_xc3028(0x61, dev) < 0) { | ||
451 | result = -EINVAL; | ||
452 | goto out_free; | ||
453 | } | ||
454 | break; | ||
455 | case EM2880_BOARD_KWORLD_DVB_310U: | ||
456 | dvb->frontend = dvb_attach(zl10353_attach, | ||
457 | &em28xx_zl10353_with_xc3028, | ||
458 | &dev->i2c_adap); | ||
459 | if (attach_xc3028(0x61, dev) < 0) { | ||
460 | result = -EINVAL; | ||
461 | goto out_free; | ||
462 | } | ||
463 | break; | ||
464 | default: | 447 | default: |
465 | printk(KERN_ERR "%s/2: The frontend of your DVB/ATSC card" | 448 | printk(KERN_ERR "%s/2: The frontend of your DVB/ATSC card" |
466 | " isn't supported yet\n", | 449 | " isn't supported yet\n", |
@@ -474,6 +457,8 @@ static int dvb_init(struct em28xx *dev) | |||
474 | result = -EINVAL; | 457 | result = -EINVAL; |
475 | goto out_free; | 458 | goto out_free; |
476 | } | 459 | } |
460 | /* define general-purpose callback pointer */ | ||
461 | dvb->frontend->callback = em28xx_tuner_callback; | ||
477 | 462 | ||
478 | /* register everything */ | 463 | /* register everything */ |
479 | result = register_dvb(dvb, THIS_MODULE, dev, &dev->udev->dev); | 464 | result = register_dvb(dvb, THIS_MODULE, dev, &dev->udev->dev); |
diff --git a/drivers/media/video/em28xx/em28xx-i2c.c b/drivers/media/video/em28xx/em28xx-i2c.c index 97853384c943..3bab56b997fc 100644 --- a/drivers/media/video/em28xx/em28xx-i2c.c +++ b/drivers/media/video/em28xx/em28xx-i2c.c | |||
@@ -143,10 +143,11 @@ static int em2800_i2c_check_for_device(struct em28xx *dev, unsigned char addr) | |||
143 | } | 143 | } |
144 | for (write_timeout = EM2800_I2C_WRITE_TIMEOUT; write_timeout > 0; | 144 | for (write_timeout = EM2800_I2C_WRITE_TIMEOUT; write_timeout > 0; |
145 | write_timeout -= 5) { | 145 | write_timeout -= 5) { |
146 | unsigned msg = dev->em28xx_read_reg(dev, 0x5); | 146 | unsigned reg = dev->em28xx_read_reg(dev, 0x5); |
147 | if (msg == 0x94) | 147 | |
148 | if (reg == 0x94) | ||
148 | return -ENODEV; | 149 | return -ENODEV; |
149 | else if (msg == 0x84) | 150 | else if (reg == 0x84) |
150 | return 0; | 151 | return 0; |
151 | msleep(5); | 152 | msleep(5); |
152 | } | 153 | } |
@@ -335,8 +336,11 @@ static int em28xx_i2c_eeprom(struct em28xx *dev, unsigned char *eedata, int len) | |||
335 | 336 | ||
336 | /* Check if board has eeprom */ | 337 | /* Check if board has eeprom */ |
337 | err = i2c_master_recv(&dev->i2c_client, &buf, 0); | 338 | err = i2c_master_recv(&dev->i2c_client, &buf, 0); |
338 | if (err < 0) | 339 | if (err < 0) { |
339 | return -1; | 340 | em28xx_errdev("%s: i2c_master_recv failed! err [%d]\n", |
341 | __func__, err); | ||
342 | return err; | ||
343 | } | ||
340 | 344 | ||
341 | buf = 0; | 345 | buf = 0; |
342 | 346 | ||
@@ -344,7 +348,7 @@ static int em28xx_i2c_eeprom(struct em28xx *dev, unsigned char *eedata, int len) | |||
344 | if (err != 1) { | 348 | if (err != 1) { |
345 | printk(KERN_INFO "%s: Huh, no eeprom present (err=%d)?\n", | 349 | printk(KERN_INFO "%s: Huh, no eeprom present (err=%d)?\n", |
346 | dev->name, err); | 350 | dev->name, err); |
347 | return -1; | 351 | return err; |
348 | } | 352 | } |
349 | while (size > 0) { | 353 | while (size > 0) { |
350 | if (size > 16) | 354 | if (size > 16) |
@@ -357,7 +361,7 @@ static int em28xx_i2c_eeprom(struct em28xx *dev, unsigned char *eedata, int len) | |||
357 | printk(KERN_WARNING | 361 | printk(KERN_WARNING |
358 | "%s: i2c eeprom read error (err=%d)\n", | 362 | "%s: i2c eeprom read error (err=%d)\n", |
359 | dev->name, err); | 363 | dev->name, err); |
360 | return -1; | 364 | return err; |
361 | } | 365 | } |
362 | size -= block; | 366 | size -= block; |
363 | p += block; | 367 | p += block; |
@@ -585,18 +589,31 @@ void em28xx_i2c_call_clients(struct em28xx *dev, unsigned int cmd, void *arg) | |||
585 | */ | 589 | */ |
586 | int em28xx_i2c_register(struct em28xx *dev) | 590 | int em28xx_i2c_register(struct em28xx *dev) |
587 | { | 591 | { |
592 | int retval; | ||
593 | |||
588 | BUG_ON(!dev->em28xx_write_regs || !dev->em28xx_read_reg); | 594 | BUG_ON(!dev->em28xx_write_regs || !dev->em28xx_read_reg); |
589 | BUG_ON(!dev->em28xx_write_regs_req || !dev->em28xx_read_reg_req); | 595 | BUG_ON(!dev->em28xx_write_regs_req || !dev->em28xx_read_reg_req); |
590 | dev->i2c_adap = em28xx_adap_template; | 596 | dev->i2c_adap = em28xx_adap_template; |
591 | dev->i2c_adap.dev.parent = &dev->udev->dev; | 597 | dev->i2c_adap.dev.parent = &dev->udev->dev; |
592 | strcpy(dev->i2c_adap.name, dev->name); | 598 | strcpy(dev->i2c_adap.name, dev->name); |
593 | dev->i2c_adap.algo_data = dev; | 599 | dev->i2c_adap.algo_data = dev; |
594 | i2c_add_adapter(&dev->i2c_adap); | 600 | |
601 | retval = i2c_add_adapter(&dev->i2c_adap); | ||
602 | if (retval < 0) { | ||
603 | em28xx_errdev("%s: i2c_add_adapter failed! retval [%d]\n", | ||
604 | __func__, retval); | ||
605 | return retval; | ||
606 | } | ||
595 | 607 | ||
596 | dev->i2c_client = em28xx_client_template; | 608 | dev->i2c_client = em28xx_client_template; |
597 | dev->i2c_client.adapter = &dev->i2c_adap; | 609 | dev->i2c_client.adapter = &dev->i2c_adap; |
598 | 610 | ||
599 | em28xx_i2c_eeprom(dev, dev->eedata, sizeof(dev->eedata)); | 611 | retval = em28xx_i2c_eeprom(dev, dev->eedata, sizeof(dev->eedata)); |
612 | if (retval < 0) { | ||
613 | em28xx_errdev("%s: em28xx_i2_eeprom failed! retval [%d]\n", | ||
614 | __func__, retval); | ||
615 | return retval; | ||
616 | } | ||
600 | 617 | ||
601 | if (i2c_scan) | 618 | if (i2c_scan) |
602 | em28xx_do_i2c_scan(dev); | 619 | em28xx_do_i2c_scan(dev); |
diff --git a/drivers/media/video/em28xx/em28xx-video.c b/drivers/media/video/em28xx/em28xx-video.c index 49ab0629702e..c53649e5315b 100644 --- a/drivers/media/video/em28xx/em28xx-video.c +++ b/drivers/media/video/em28xx/em28xx-video.c | |||
@@ -513,10 +513,17 @@ static struct videobuf_queue_ops em28xx_video_qops = { | |||
513 | */ | 513 | */ |
514 | static int em28xx_config(struct em28xx *dev) | 514 | static int em28xx_config(struct em28xx *dev) |
515 | { | 515 | { |
516 | int retval; | ||
516 | 517 | ||
517 | /* Sets I2C speed to 100 KHz */ | 518 | /* Sets I2C speed to 100 KHz */ |
518 | if (!dev->is_em2800) | 519 | if (!dev->is_em2800) { |
519 | em28xx_write_regs_req(dev, 0x00, 0x06, "\x40", 1); | 520 | retval = em28xx_write_regs_req(dev, 0x00, 0x06, "\x40", 1); |
521 | if (retval < 0) { | ||
522 | em28xx_errdev("%s: em28xx_write_regs_req failed! retval [%d]\n", | ||
523 | __func__, retval); | ||
524 | return retval; | ||
525 | } | ||
526 | } | ||
520 | 527 | ||
521 | /* enable vbi capturing */ | 528 | /* enable vbi capturing */ |
522 | 529 | ||
@@ -1512,6 +1519,7 @@ static int em28xx_v4l2_open(struct inode *inode, struct file *filp) | |||
1512 | struct em28xx_fh *fh; | 1519 | struct em28xx_fh *fh; |
1513 | enum v4l2_buf_type fh_type = 0; | 1520 | enum v4l2_buf_type fh_type = 0; |
1514 | 1521 | ||
1522 | lock_kernel(); | ||
1515 | list_for_each_entry(h, &em28xx_devlist, devlist) { | 1523 | list_for_each_entry(h, &em28xx_devlist, devlist) { |
1516 | if (h->vdev->minor == minor) { | 1524 | if (h->vdev->minor == minor) { |
1517 | dev = h; | 1525 | dev = h; |
@@ -1527,8 +1535,10 @@ static int em28xx_v4l2_open(struct inode *inode, struct file *filp) | |||
1527 | dev = h; | 1535 | dev = h; |
1528 | } | 1536 | } |
1529 | } | 1537 | } |
1530 | if (NULL == dev) | 1538 | if (NULL == dev) { |
1539 | unlock_kernel(); | ||
1531 | return -ENODEV; | 1540 | return -ENODEV; |
1541 | } | ||
1532 | 1542 | ||
1533 | em28xx_videodbg("open minor=%d type=%s users=%d\n", | 1543 | em28xx_videodbg("open minor=%d type=%s users=%d\n", |
1534 | minor, v4l2_type_names[fh_type], dev->users); | 1544 | minor, v4l2_type_names[fh_type], dev->users); |
@@ -1537,6 +1547,7 @@ static int em28xx_v4l2_open(struct inode *inode, struct file *filp) | |||
1537 | fh = kzalloc(sizeof(struct em28xx_fh), GFP_KERNEL); | 1547 | fh = kzalloc(sizeof(struct em28xx_fh), GFP_KERNEL); |
1538 | if (!fh) { | 1548 | if (!fh) { |
1539 | em28xx_errdev("em28xx-video.c: Out of memory?!\n"); | 1549 | em28xx_errdev("em28xx-video.c: Out of memory?!\n"); |
1550 | unlock_kernel(); | ||
1540 | return -ENOMEM; | 1551 | return -ENOMEM; |
1541 | } | 1552 | } |
1542 | mutex_lock(&dev->lock); | 1553 | mutex_lock(&dev->lock); |
@@ -1573,6 +1584,7 @@ static int em28xx_v4l2_open(struct inode *inode, struct file *filp) | |||
1573 | sizeof(struct em28xx_buffer), fh); | 1584 | sizeof(struct em28xx_buffer), fh); |
1574 | 1585 | ||
1575 | mutex_unlock(&dev->lock); | 1586 | mutex_unlock(&dev->lock); |
1587 | unlock_kernel(); | ||
1576 | 1588 | ||
1577 | return errCode; | 1589 | return errCode; |
1578 | } | 1590 | } |
@@ -1588,8 +1600,7 @@ static void em28xx_release_resources(struct em28xx *dev) | |||
1588 | /*FIXME: I2C IR should be disconnected */ | 1600 | /*FIXME: I2C IR should be disconnected */ |
1589 | 1601 | ||
1590 | em28xx_info("V4L2 devices /dev/video%d and /dev/vbi%d deregistered\n", | 1602 | em28xx_info("V4L2 devices /dev/video%d and /dev/vbi%d deregistered\n", |
1591 | dev->vdev->minor-MINOR_VFL_TYPE_GRABBER_MIN, | 1603 | dev->vdev->num, dev->vbi_dev->num); |
1592 | dev->vbi_dev->minor-MINOR_VFL_TYPE_VBI_MIN); | ||
1593 | list_del(&dev->devlist); | 1604 | list_del(&dev->devlist); |
1594 | if (dev->sbutton_input_dev) | 1605 | if (dev->sbutton_input_dev) |
1595 | em28xx_deregister_snapshot_button(dev); | 1606 | em28xx_deregister_snapshot_button(dev); |
@@ -1948,13 +1959,23 @@ static int em28xx_init_dev(struct em28xx **devhandle, struct usb_device *udev, | |||
1948 | } | 1959 | } |
1949 | 1960 | ||
1950 | /* register i2c bus */ | 1961 | /* register i2c bus */ |
1951 | em28xx_i2c_register(dev); | 1962 | errCode = em28xx_i2c_register(dev); |
1963 | if (errCode < 0) { | ||
1964 | em28xx_errdev("%s: em28xx_i2c_register - errCode [%d]!\n", | ||
1965 | __func__, errCode); | ||
1966 | return errCode; | ||
1967 | } | ||
1952 | 1968 | ||
1953 | /* Do board specific init and eeprom reading */ | 1969 | /* Do board specific init and eeprom reading */ |
1954 | em28xx_card_setup(dev); | 1970 | em28xx_card_setup(dev); |
1955 | 1971 | ||
1956 | /* Configure audio */ | 1972 | /* Configure audio */ |
1957 | em28xx_audio_analog_set(dev); | 1973 | errCode = em28xx_audio_analog_set(dev); |
1974 | if (errCode < 0) { | ||
1975 | em28xx_errdev("%s: em28xx_audio_analog_set - errCode [%d]!\n", | ||
1976 | __func__, errCode); | ||
1977 | return errCode; | ||
1978 | } | ||
1958 | 1979 | ||
1959 | /* configure the device */ | 1980 | /* configure the device */ |
1960 | em28xx_config_i2c(dev); | 1981 | em28xx_config_i2c(dev); |
@@ -1974,6 +1995,11 @@ static int em28xx_init_dev(struct em28xx **devhandle, struct usb_device *udev, | |||
1974 | dev->ctl_input = 2; | 1995 | dev->ctl_input = 2; |
1975 | 1996 | ||
1976 | errCode = em28xx_config(dev); | 1997 | errCode = em28xx_config(dev); |
1998 | if (errCode < 0) { | ||
1999 | em28xx_errdev("%s: em28xx_config - errCode [%d]!\n", | ||
2000 | __func__, errCode); | ||
2001 | return errCode; | ||
2002 | } | ||
1977 | 2003 | ||
1978 | list_add_tail(&dev->devlist, &em28xx_devlist); | 2004 | list_add_tail(&dev->devlist, &em28xx_devlist); |
1979 | 2005 | ||
@@ -2026,17 +2052,27 @@ static int em28xx_init_dev(struct em28xx **devhandle, struct usb_device *udev, | |||
2026 | 2052 | ||
2027 | if (dev->has_msp34xx) { | 2053 | if (dev->has_msp34xx) { |
2028 | /* Send a reset to other chips via gpio */ | 2054 | /* Send a reset to other chips via gpio */ |
2029 | em28xx_write_regs_req(dev, 0x00, 0x08, "\xf7", 1); | 2055 | errCode = em28xx_write_regs_req(dev, 0x00, 0x08, "\xf7", 1); |
2056 | if (errCode < 0) { | ||
2057 | em28xx_errdev("%s: em28xx_write_regs_req - msp34xx(1) failed! errCode [%d]\n", | ||
2058 | __func__, errCode); | ||
2059 | return errCode; | ||
2060 | } | ||
2030 | msleep(3); | 2061 | msleep(3); |
2031 | em28xx_write_regs_req(dev, 0x00, 0x08, "\xff", 1); | 2062 | |
2063 | errCode = em28xx_write_regs_req(dev, 0x00, 0x08, "\xff", 1); | ||
2064 | if (errCode < 0) { | ||
2065 | em28xx_errdev("%s: em28xx_write_regs_req - msp34xx(2) failed! errCode [%d]\n", | ||
2066 | __func__, errCode); | ||
2067 | return errCode; | ||
2068 | } | ||
2032 | msleep(3); | 2069 | msleep(3); |
2033 | } | 2070 | } |
2034 | 2071 | ||
2035 | video_mux(dev, 0); | 2072 | video_mux(dev, 0); |
2036 | 2073 | ||
2037 | em28xx_info("V4L2 device registered as /dev/video%d and /dev/vbi%d\n", | 2074 | em28xx_info("V4L2 device registered as /dev/video%d and /dev/vbi%d\n", |
2038 | dev->vdev->minor-MINOR_VFL_TYPE_GRABBER_MIN, | 2075 | dev->vdev->num, dev->vbi_dev->num); |
2039 | dev->vbi_dev->minor-MINOR_VFL_TYPE_VBI_MIN); | ||
2040 | 2076 | ||
2041 | mutex_lock(&em28xx_extension_devlist_lock); | 2077 | mutex_lock(&em28xx_extension_devlist_lock); |
2042 | if (!list_empty(&em28xx_extension_devlist)) { | 2078 | if (!list_empty(&em28xx_extension_devlist)) { |
@@ -2236,7 +2272,7 @@ static void em28xx_usb_disconnect(struct usb_interface *interface) | |||
2236 | em28xx_warn | 2272 | em28xx_warn |
2237 | ("device /dev/video%d is open! Deregistration and memory " | 2273 | ("device /dev/video%d is open! Deregistration and memory " |
2238 | "deallocation are deferred on close.\n", | 2274 | "deallocation are deferred on close.\n", |
2239 | dev->vdev->minor-MINOR_VFL_TYPE_GRABBER_MIN); | 2275 | dev->vdev->num); |
2240 | 2276 | ||
2241 | dev->state |= DEV_MISCONFIGURED; | 2277 | dev->state |= DEV_MISCONFIGURED; |
2242 | em28xx_uninit_isoc(dev); | 2278 | em28xx_uninit_isoc(dev); |
diff --git a/drivers/media/video/em28xx/em28xx.h b/drivers/media/video/em28xx/em28xx.h index 9a3310748685..82781178e0a3 100644 --- a/drivers/media/video/em28xx/em28xx.h +++ b/drivers/media/video/em28xx/em28xx.h | |||
@@ -411,8 +411,8 @@ struct em28xx { | |||
411 | /* frame properties */ | 411 | /* frame properties */ |
412 | int width; /* current frame width */ | 412 | int width; /* current frame width */ |
413 | int height; /* current frame height */ | 413 | int height; /* current frame height */ |
414 | int hscale; /* horizontal scale factor (see datasheet) */ | 414 | unsigned hscale; /* horizontal scale factor (see datasheet) */ |
415 | int vscale; /* vertical scale factor (see datasheet) */ | 415 | unsigned vscale; /* vertical scale factor (see datasheet) */ |
416 | int interlaced; /* 1=interlace fileds, 0=just top fileds */ | 416 | int interlaced; /* 1=interlace fileds, 0=just top fileds */ |
417 | unsigned int video_bytesread; /* Number of bytes read */ | 417 | unsigned int video_bytesread; /* Number of bytes read */ |
418 | 418 | ||
@@ -528,7 +528,7 @@ extern struct em28xx_board em28xx_boards[]; | |||
528 | extern struct usb_device_id em28xx_id_table[]; | 528 | extern struct usb_device_id em28xx_id_table[]; |
529 | extern const unsigned int em28xx_bcount; | 529 | extern const unsigned int em28xx_bcount; |
530 | void em28xx_set_ir(struct em28xx *dev, struct IR_i2c *ir); | 530 | void em28xx_set_ir(struct em28xx *dev, struct IR_i2c *ir); |
531 | int em28xx_tuner_callback(void *ptr, int command, int arg); | 531 | int em28xx_tuner_callback(void *ptr, int component, int command, int arg); |
532 | 532 | ||
533 | /* Provided by em28xx-input.c */ | 533 | /* Provided by em28xx-input.c */ |
534 | /* TODO: Check if the standard get_key handlers on ir-common can be used */ | 534 | /* TODO: Check if the standard get_key handlers on ir-common can be used */ |