aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/media/video/em28xx
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/media/video/em28xx')
-rw-r--r--drivers/media/video/em28xx/em28xx-cards.c4
-rw-r--r--drivers/media/video/em28xx/em28xx-dvb.c25
-rw-r--r--drivers/media/video/em28xx/em28xx-i2c.c35
-rw-r--r--drivers/media/video/em28xx/em28xx-video.c60
-rw-r--r--drivers/media/video/em28xx/em28xx.h6
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
1274int em28xx_tuner_callback(void *ptr, int command, int arg) 1274int 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
277int register_dvb(struct em28xx_dvb *dvb, 276static 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 */
586int em28xx_i2c_register(struct em28xx *dev) 590int 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 */
514static int em28xx_config(struct em28xx *dev) 514static 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[];
528extern struct usb_device_id em28xx_id_table[]; 528extern struct usb_device_id em28xx_id_table[];
529extern const unsigned int em28xx_bcount; 529extern const unsigned int em28xx_bcount;
530void em28xx_set_ir(struct em28xx *dev, struct IR_i2c *ir); 530void em28xx_set_ir(struct em28xx *dev, struct IR_i2c *ir);
531int em28xx_tuner_callback(void *ptr, int command, int arg); 531int 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 */