diff options
Diffstat (limited to 'drivers/media/video/em28xx/em28xx-video.c')
-rw-r--r-- | drivers/media/video/em28xx/em28xx-video.c | 103 |
1 files changed, 58 insertions, 45 deletions
diff --git a/drivers/media/video/em28xx/em28xx-video.c b/drivers/media/video/em28xx/em28xx-video.c index ffbc91f2ecbd..1ac90322d681 100644 --- a/drivers/media/video/em28xx/em28xx-video.c +++ b/drivers/media/video/em28xx/em28xx-video.c | |||
@@ -1,5 +1,6 @@ | |||
1 | /* | 1 | /* |
2 | em28xx-video.c - driver for Empia EM2800/EM2820/2840 USB video capture devices | 2 | em28xx-video.c - driver for Empia EM2800/EM2820/2840 USB |
3 | video capture devices | ||
3 | 4 | ||
4 | Copyright (C) 2005 Ludovico Cavedon <cavedon@sssup.it> | 5 | Copyright (C) 2005 Ludovico Cavedon <cavedon@sssup.it> |
5 | Markus Rechberger <mrechberger@gmail.com> | 6 | Markus Rechberger <mrechberger@gmail.com> |
@@ -58,10 +59,13 @@ static unsigned int isoc_debug; | |||
58 | module_param(isoc_debug, int, 0644); | 59 | module_param(isoc_debug, int, 0644); |
59 | MODULE_PARM_DESC(isoc_debug, "enable debug messages [isoc transfers]"); | 60 | MODULE_PARM_DESC(isoc_debug, "enable debug messages [isoc transfers]"); |
60 | 61 | ||
61 | #define em28xx_isocdbg(fmt, arg...) do {\ | 62 | #define em28xx_isocdbg(fmt, arg...) \ |
62 | if (isoc_debug) \ | 63 | do {\ |
64 | if (isoc_debug) { \ | ||
63 | printk(KERN_INFO "%s %s :"fmt, \ | 65 | printk(KERN_INFO "%s %s :"fmt, \ |
64 | dev->name, __func__ , ##arg); } while (0) | 66 | dev->name, __func__ , ##arg); \ |
67 | } \ | ||
68 | } while (0) | ||
65 | 69 | ||
66 | MODULE_AUTHOR(DRIVER_AUTHOR); | 70 | MODULE_AUTHOR(DRIVER_AUTHOR); |
67 | MODULE_DESCRIPTION(DRIVER_DESC); | 71 | MODULE_DESCRIPTION(DRIVER_DESC); |
@@ -84,8 +88,8 @@ MODULE_PARM_DESC(vbi_nr, "vbi device numbers"); | |||
84 | MODULE_PARM_DESC(radio_nr, "radio device numbers"); | 88 | MODULE_PARM_DESC(radio_nr, "radio device numbers"); |
85 | 89 | ||
86 | static unsigned int video_debug; | 90 | static unsigned int video_debug; |
87 | module_param(video_debug,int,0644); | 91 | module_param(video_debug, int, 0644); |
88 | MODULE_PARM_DESC(video_debug,"enable debug messages [video]"); | 92 | MODULE_PARM_DESC(video_debug, "enable debug messages [video]"); |
89 | 93 | ||
90 | /* Bitmask marking allocated devices from 0 to EM28XX_MAXBOARDS */ | 94 | /* Bitmask marking allocated devices from 0 to EM28XX_MAXBOARDS */ |
91 | static unsigned long em28xx_devused; | 95 | static unsigned long em28xx_devused; |
@@ -102,7 +106,7 @@ static struct v4l2_queryctrl em28xx_qctrl[] = { | |||
102 | .step = 0x1, | 106 | .step = 0x1, |
103 | .default_value = 0x1f, | 107 | .default_value = 0x1f, |
104 | .flags = 0, | 108 | .flags = 0, |
105 | },{ | 109 | }, { |
106 | .id = V4L2_CID_AUDIO_MUTE, | 110 | .id = V4L2_CID_AUDIO_MUTE, |
107 | .type = V4L2_CTRL_TYPE_BOOLEAN, | 111 | .type = V4L2_CTRL_TYPE_BOOLEAN, |
108 | .name = "Mute", | 112 | .name = "Mute", |
@@ -390,7 +394,7 @@ buffer_setup(struct videobuf_queue *vq, unsigned int *count, unsigned int *size) | |||
390 | dev->mode = EM28XX_ANALOG_MODE; | 394 | dev->mode = EM28XX_ANALOG_MODE; |
391 | 395 | ||
392 | /* Ask tuner to go to analog mode */ | 396 | /* Ask tuner to go to analog mode */ |
393 | memset (&f, 0, sizeof(f)); | 397 | memset(&f, 0, sizeof(f)); |
394 | f.frequency = dev->ctl_freq; | 398 | f.frequency = dev->ctl_freq; |
395 | 399 | ||
396 | em28xx_i2c_call_clients(dev, VIDIOC_S_FREQUENCY, &f); | 400 | em28xx_i2c_call_clients(dev, VIDIOC_S_FREQUENCY, &f); |
@@ -483,7 +487,8 @@ buffer_queue(struct videobuf_queue *vq, struct videobuf_buffer *vb) | |||
483 | 487 | ||
484 | } | 488 | } |
485 | 489 | ||
486 | static void buffer_release(struct videobuf_queue *vq, struct videobuf_buffer *vb) | 490 | static void buffer_release(struct videobuf_queue *vq, |
491 | struct videobuf_buffer *vb) | ||
487 | { | 492 | { |
488 | struct em28xx_buffer *buf = container_of(vb, struct em28xx_buffer, vb); | 493 | struct em28xx_buffer *buf = container_of(vb, struct em28xx_buffer, vb); |
489 | struct em28xx_fh *fh = vq->priv_data; | 494 | struct em28xx_fh *fh = vq->priv_data; |
@@ -501,7 +506,7 @@ static struct videobuf_queue_ops em28xx_video_qops = { | |||
501 | .buf_release = buffer_release, | 506 | .buf_release = buffer_release, |
502 | }; | 507 | }; |
503 | 508 | ||
504 | /********************* v4l2 interface ******************************************/ | 509 | /********************* v4l2 interface **************************************/ |
505 | 510 | ||
506 | /* | 511 | /* |
507 | * em28xx_config() | 512 | * em28xx_config() |
@@ -516,9 +521,9 @@ static int em28xx_config(struct em28xx *dev) | |||
516 | 521 | ||
517 | /* enable vbi capturing */ | 522 | /* enable vbi capturing */ |
518 | 523 | ||
519 | /* em28xx_write_regs_req(dev,0x00,0x0e,"\xC0",1); audio register */ | 524 | /* em28xx_write_regs_req(dev, 0x00, 0x0e, "\xC0", 1); audio register */ |
520 | /* em28xx_write_regs_req(dev,0x00,0x0f,"\x80",1); clk register */ | 525 | /* em28xx_write_regs_req(dev, 0x00, 0x0f, "\x80", 1); clk register */ |
521 | em28xx_write_regs_req(dev,0x00,0x11,"\x51",1); | 526 | em28xx_write_regs_req(dev, 0x00, 0x11, "\x51", 1); |
522 | 527 | ||
523 | dev->mute = 1; /* maybe not the right place... */ | 528 | dev->mute = 1; /* maybe not the right place... */ |
524 | dev->volume = 0x1f; | 529 | dev->volume = 0x1f; |
@@ -557,12 +562,15 @@ static void video_mux(struct em28xx *dev, int index) | |||
557 | em28xx_i2c_call_clients(dev, VIDIOC_INT_S_VIDEO_ROUTING, &route); | 562 | em28xx_i2c_call_clients(dev, VIDIOC_INT_S_VIDEO_ROUTING, &route); |
558 | 563 | ||
559 | if (dev->has_msp34xx) { | 564 | if (dev->has_msp34xx) { |
560 | if (dev->i2s_speed) | 565 | if (dev->i2s_speed) { |
561 | em28xx_i2c_call_clients(dev, VIDIOC_INT_I2S_CLOCK_FREQ, &dev->i2s_speed); | 566 | em28xx_i2c_call_clients(dev, VIDIOC_INT_I2S_CLOCK_FREQ, |
567 | &dev->i2s_speed); | ||
568 | } | ||
562 | route.input = dev->ctl_ainput; | 569 | route.input = dev->ctl_ainput; |
563 | route.output = MSP_OUTPUT(MSP_SC_IN_DSP_SCART1); | 570 | route.output = MSP_OUTPUT(MSP_SC_IN_DSP_SCART1); |
564 | /* Note: this is msp3400 specific */ | 571 | /* Note: this is msp3400 specific */ |
565 | em28xx_i2c_call_clients(dev, VIDIOC_INT_S_AUDIO_ROUTING, &route); | 572 | em28xx_i2c_call_clients(dev, VIDIOC_INT_S_AUDIO_ROUTING, |
573 | &route); | ||
566 | } | 574 | } |
567 | 575 | ||
568 | em28xx_audio_analog_set(dev); | 576 | em28xx_audio_analog_set(dev); |
@@ -802,7 +810,7 @@ out: | |||
802 | return rc; | 810 | return rc; |
803 | } | 811 | } |
804 | 812 | ||
805 | static int vidioc_s_std(struct file *file, void *priv, v4l2_std_id *norm) | 813 | static int vidioc_s_std(struct file *file, void *priv, v4l2_std_id * norm) |
806 | { | 814 | { |
807 | struct em28xx_fh *fh = priv; | 815 | struct em28xx_fh *fh = priv; |
808 | struct em28xx *dev = fh->dev; | 816 | struct em28xx *dev = fh->dev; |
@@ -919,11 +927,11 @@ static int vidioc_g_audio(struct file *file, void *priv, struct v4l2_audio *a) | |||
919 | 927 | ||
920 | index = dev->ctl_ainput; | 928 | index = dev->ctl_ainput; |
921 | 929 | ||
922 | if (index == 0) { | 930 | if (index == 0) |
923 | strcpy(a->name, "Television"); | 931 | strcpy(a->name, "Television"); |
924 | } else { | 932 | else |
925 | strcpy(a->name, "Line In"); | 933 | strcpy(a->name, "Line In"); |
926 | } | 934 | |
927 | a->capability = V4L2_AUDCAP_STEREO; | 935 | a->capability = V4L2_AUDCAP_STEREO; |
928 | a->index = index; | 936 | a->index = index; |
929 | 937 | ||
@@ -1501,7 +1509,7 @@ static int em28xx_v4l2_open(struct inode *inode, struct file *filp) | |||
1501 | { | 1509 | { |
1502 | int minor = iminor(inode); | 1510 | int minor = iminor(inode); |
1503 | int errCode = 0, radio = 0; | 1511 | int errCode = 0, radio = 0; |
1504 | struct em28xx *h,*dev = NULL; | 1512 | struct em28xx *h, *dev = NULL; |
1505 | struct em28xx_fh *fh; | 1513 | struct em28xx_fh *fh; |
1506 | enum v4l2_buf_type fh_type = 0; | 1514 | enum v4l2_buf_type fh_type = 0; |
1507 | 1515 | ||
@@ -1602,12 +1610,13 @@ static void em28xx_release_resources(struct em28xx *dev) | |||
1602 | usb_put_dev(dev->udev); | 1610 | usb_put_dev(dev->udev); |
1603 | 1611 | ||
1604 | /* Mark device as unused */ | 1612 | /* Mark device as unused */ |
1605 | em28xx_devused&=~(1<<dev->devno); | 1613 | em28xx_devused &= ~(1<<dev->devno); |
1606 | } | 1614 | } |
1607 | 1615 | ||
1608 | /* | 1616 | /* |
1609 | * em28xx_v4l2_close() | 1617 | * em28xx_v4l2_close() |
1610 | * stops streaming and deallocates all resources allocated by the v4l2 calls and ioctls | 1618 | * stops streaming and deallocates all resources allocated by the v4l2 |
1619 | * calls and ioctls | ||
1611 | */ | 1620 | */ |
1612 | static int em28xx_v4l2_close(struct inode *inode, struct file *filp) | 1621 | static int em28xx_v4l2_close(struct inode *inode, struct file *filp) |
1613 | { | 1622 | { |
@@ -1660,7 +1669,7 @@ static int em28xx_v4l2_close(struct inode *inode, struct file *filp) | |||
1660 | * will allocate buffers when called for the first time | 1669 | * will allocate buffers when called for the first time |
1661 | */ | 1670 | */ |
1662 | static ssize_t | 1671 | static ssize_t |
1663 | em28xx_v4l2_read(struct file *filp, char __user * buf, size_t count, | 1672 | em28xx_v4l2_read(struct file *filp, char __user *buf, size_t count, |
1664 | loff_t *pos) | 1673 | loff_t *pos) |
1665 | { | 1674 | { |
1666 | struct em28xx_fh *fh = filp->private_data; | 1675 | struct em28xx_fh *fh = filp->private_data; |
@@ -1825,7 +1834,7 @@ static struct video_device em28xx_radio_template = { | |||
1825 | #endif | 1834 | #endif |
1826 | }; | 1835 | }; |
1827 | 1836 | ||
1828 | /******************************** usb interface *****************************************/ | 1837 | /******************************** usb interface ******************************/ |
1829 | 1838 | ||
1830 | 1839 | ||
1831 | static LIST_HEAD(em28xx_extension_devlist); | 1840 | static LIST_HEAD(em28xx_extension_devlist); |
@@ -2088,22 +2097,24 @@ static int em28xx_usb_probe(struct usb_interface *interface, | |||
2088 | ifnum = interface->altsetting[0].desc.bInterfaceNumber; | 2097 | ifnum = interface->altsetting[0].desc.bInterfaceNumber; |
2089 | 2098 | ||
2090 | /* Check to see next free device and mark as used */ | 2099 | /* Check to see next free device and mark as used */ |
2091 | nr=find_first_zero_bit(&em28xx_devused,EM28XX_MAXBOARDS); | 2100 | nr = find_first_zero_bit(&em28xx_devused, EM28XX_MAXBOARDS); |
2092 | em28xx_devused|=1<<nr; | 2101 | em28xx_devused |= 1<<nr; |
2093 | 2102 | ||
2094 | /* Don't register audio interfaces */ | 2103 | /* Don't register audio interfaces */ |
2095 | if (interface->altsetting[0].desc.bInterfaceClass == USB_CLASS_AUDIO) { | 2104 | if (interface->altsetting[0].desc.bInterfaceClass == USB_CLASS_AUDIO) { |
2096 | em28xx_err(DRIVER_NAME " audio device (%04x:%04x): interface %i, class %i\n", | 2105 | em28xx_err(DRIVER_NAME " audio device (%04x:%04x): interface %i, class %i\n", |
2097 | udev->descriptor.idVendor,udev->descriptor.idProduct, | 2106 | udev->descriptor.idVendor, |
2107 | udev->descriptor.idProduct, | ||
2098 | ifnum, | 2108 | ifnum, |
2099 | interface->altsetting[0].desc.bInterfaceClass); | 2109 | interface->altsetting[0].desc.bInterfaceClass); |
2100 | 2110 | ||
2101 | em28xx_devused&=~(1<<nr); | 2111 | em28xx_devused &= ~(1<<nr); |
2102 | return -ENODEV; | 2112 | return -ENODEV; |
2103 | } | 2113 | } |
2104 | 2114 | ||
2105 | em28xx_err(DRIVER_NAME " new video device (%04x:%04x): interface %i, class %i\n", | 2115 | em28xx_err(DRIVER_NAME " new video device (%04x:%04x): interface %i, class %i\n", |
2106 | udev->descriptor.idVendor,udev->descriptor.idProduct, | 2116 | udev->descriptor.idVendor, |
2117 | udev->descriptor.idProduct, | ||
2107 | ifnum, | 2118 | ifnum, |
2108 | interface->altsetting[0].desc.bInterfaceClass); | 2119 | interface->altsetting[0].desc.bInterfaceClass); |
2109 | 2120 | ||
@@ -2113,18 +2124,19 @@ static int em28xx_usb_probe(struct usb_interface *interface, | |||
2113 | if ((endpoint->bmAttributes & USB_ENDPOINT_XFERTYPE_MASK) != | 2124 | if ((endpoint->bmAttributes & USB_ENDPOINT_XFERTYPE_MASK) != |
2114 | USB_ENDPOINT_XFER_ISOC) { | 2125 | USB_ENDPOINT_XFER_ISOC) { |
2115 | em28xx_err(DRIVER_NAME " probing error: endpoint is non-ISO endpoint!\n"); | 2126 | em28xx_err(DRIVER_NAME " probing error: endpoint is non-ISO endpoint!\n"); |
2116 | em28xx_devused&=~(1<<nr); | 2127 | em28xx_devused &= ~(1<<nr); |
2117 | return -ENODEV; | 2128 | return -ENODEV; |
2118 | } | 2129 | } |
2119 | if ((endpoint->bEndpointAddress & USB_ENDPOINT_DIR_MASK) == USB_DIR_OUT) { | 2130 | if ((endpoint->bEndpointAddress & USB_ENDPOINT_DIR_MASK) == USB_DIR_OUT) { |
2120 | em28xx_err(DRIVER_NAME " probing error: endpoint is ISO OUT endpoint!\n"); | 2131 | em28xx_err(DRIVER_NAME " probing error: endpoint is ISO OUT endpoint!\n"); |
2121 | em28xx_devused&=~(1<<nr); | 2132 | em28xx_devused &= ~(1<<nr); |
2122 | return -ENODEV; | 2133 | return -ENODEV; |
2123 | } | 2134 | } |
2124 | 2135 | ||
2125 | if (nr >= EM28XX_MAXBOARDS) { | 2136 | if (nr >= EM28XX_MAXBOARDS) { |
2126 | printk (DRIVER_NAME ": Supports only %i em28xx boards.\n",EM28XX_MAXBOARDS); | 2137 | printk(DRIVER_NAME ": Supports only %i em28xx boards.\n", |
2127 | em28xx_devused&=~(1<<nr); | 2138 | EM28XX_MAXBOARDS); |
2139 | em28xx_devused &= ~(1<<nr); | ||
2128 | return -ENOMEM; | 2140 | return -ENOMEM; |
2129 | } | 2141 | } |
2130 | 2142 | ||
@@ -2132,7 +2144,7 @@ static int em28xx_usb_probe(struct usb_interface *interface, | |||
2132 | dev = kzalloc(sizeof(*dev), GFP_KERNEL); | 2144 | dev = kzalloc(sizeof(*dev), GFP_KERNEL); |
2133 | if (dev == NULL) { | 2145 | if (dev == NULL) { |
2134 | em28xx_err(DRIVER_NAME ": out of memory!\n"); | 2146 | em28xx_err(DRIVER_NAME ": out of memory!\n"); |
2135 | em28xx_devused&=~(1<<nr); | 2147 | em28xx_devused &= ~(1<<nr); |
2136 | return -ENOMEM; | 2148 | return -ENOMEM; |
2137 | } | 2149 | } |
2138 | 2150 | ||
@@ -2156,14 +2168,14 @@ static int em28xx_usb_probe(struct usb_interface *interface, | |||
2156 | /* compute alternate max packet sizes */ | 2168 | /* compute alternate max packet sizes */ |
2157 | uif = udev->actconfig->interface[0]; | 2169 | uif = udev->actconfig->interface[0]; |
2158 | 2170 | ||
2159 | dev->num_alt=uif->num_altsetting; | 2171 | dev->num_alt = uif->num_altsetting; |
2160 | em28xx_info("Alternate settings: %i\n",dev->num_alt); | 2172 | em28xx_info("Alternate settings: %i\n", dev->num_alt); |
2161 | // dev->alt_max_pkt_size = kmalloc(sizeof(*dev->alt_max_pkt_size)* | 2173 | /* dev->alt_max_pkt_size = kmalloc(sizeof(*dev->alt_max_pkt_size)* */ |
2162 | dev->alt_max_pkt_size = kmalloc(32* | 2174 | dev->alt_max_pkt_size = kmalloc(32 * dev->num_alt, GFP_KERNEL); |
2163 | dev->num_alt,GFP_KERNEL); | 2175 | |
2164 | if (dev->alt_max_pkt_size == NULL) { | 2176 | if (dev->alt_max_pkt_size == NULL) { |
2165 | em28xx_errdev("out of memory!\n"); | 2177 | em28xx_errdev("out of memory!\n"); |
2166 | em28xx_devused&=~(1<<nr); | 2178 | em28xx_devused &= ~(1<<nr); |
2167 | kfree(dev); | 2179 | kfree(dev); |
2168 | return -ENOMEM; | 2180 | return -ENOMEM; |
2169 | } | 2181 | } |
@@ -2173,11 +2185,11 @@ static int em28xx_usb_probe(struct usb_interface *interface, | |||
2173 | wMaxPacketSize); | 2185 | wMaxPacketSize); |
2174 | dev->alt_max_pkt_size[i] = | 2186 | dev->alt_max_pkt_size[i] = |
2175 | (tmp & 0x07ff) * (((tmp & 0x1800) >> 11) + 1); | 2187 | (tmp & 0x07ff) * (((tmp & 0x1800) >> 11) + 1); |
2176 | em28xx_info("Alternate setting %i, max size= %i\n",i, | 2188 | em28xx_info("Alternate setting %i, max size= %i\n", i, |
2177 | dev->alt_max_pkt_size[i]); | 2189 | dev->alt_max_pkt_size[i]); |
2178 | } | 2190 | } |
2179 | 2191 | ||
2180 | if ((card[nr]>=0)&&(card[nr]<em28xx_bcount)) | 2192 | if ((card[nr] >= 0) && (card[nr] < em28xx_bcount)) |
2181 | dev->model = card[nr]; | 2193 | dev->model = card[nr]; |
2182 | 2194 | ||
2183 | /* allocate device struct */ | 2195 | /* allocate device struct */ |
@@ -2213,7 +2225,8 @@ static void em28xx_usb_disconnect(struct usb_interface *interface) | |||
2213 | 2225 | ||
2214 | em28xx_info("disconnecting %s\n", dev->vdev->name); | 2226 | em28xx_info("disconnecting %s\n", dev->vdev->name); |
2215 | 2227 | ||
2216 | /* wait until all current v4l2 io is finished then deallocate resources */ | 2228 | /* wait until all current v4l2 io is finished then deallocate |
2229 | resources */ | ||
2217 | mutex_lock(&dev->lock); | 2230 | mutex_lock(&dev->lock); |
2218 | 2231 | ||
2219 | wake_up_interruptible_all(&dev->open); | 2232 | wake_up_interruptible_all(&dev->open); |