diff options
author | Luca Risolia <luca.risolia@studio.unibo.it> | 2007-01-08 09:34:35 -0500 |
---|---|---|
committer | Mauro Carvalho Chehab <mchehab@infradead.org> | 2007-02-21 10:34:19 -0500 |
commit | 7e3a0660700ad47ee6e296fe7090d771becfcf96 (patch) | |
tree | 562ca1d5f649db663d941fe3bc269c07a029bdb6 /drivers/media/video/zc0301/zc0301_core.c | |
parent | f327ebbd004fb2f08291ca4c6637f5f27319683c (diff) |
V4L/DVB (5063): ZC0301 driver updates.
- Implement audio ioctl's and VIDIOC_ENUM_FRAMESIZES
- Documentation updates
- Generic improvements
Signed-off-by: Luca Risolia <luca.risolia@studio.unibo.it>
Signed-off-by: Mauro Carvalho Chehab <mchehab@infradead.org>
Diffstat (limited to 'drivers/media/video/zc0301/zc0301_core.c')
-rw-r--r-- | drivers/media/video/zc0301/zc0301_core.c | 55 |
1 files changed, 47 insertions, 8 deletions
diff --git a/drivers/media/video/zc0301/zc0301_core.c b/drivers/media/video/zc0301/zc0301_core.c index 8da7f15f629..f1120551c70 100644 --- a/drivers/media/video/zc0301/zc0301_core.c +++ b/drivers/media/video/zc0301/zc0301_core.c | |||
@@ -1,7 +1,7 @@ | |||
1 | /*************************************************************************** | 1 | /*************************************************************************** |
2 | * Video4Linux2 driver for ZC0301[P] Image Processor and Control Chip * | 2 | * Video4Linux2 driver for ZC0301[P] Image Processor and Control Chip * |
3 | * * | 3 | * * |
4 | * Copyright (C) 2006 by Luca Risolia <luca.risolia@studio.unibo.it> * | 4 | * Copyright (C) 2006-2007 by Luca Risolia <luca.risolia@studio.unibo.it> * |
5 | * * | 5 | * * |
6 | * Informations about the chip internals needed to enable the I2C protocol * | 6 | * Informations about the chip internals needed to enable the I2C protocol * |
7 | * have been taken from the documentation of the ZC030x Video4Linux1 * | 7 | * have been taken from the documentation of the ZC030x Video4Linux1 * |
@@ -52,8 +52,8 @@ | |||
52 | #define ZC0301_MODULE_AUTHOR "(C) 2006 Luca Risolia" | 52 | #define ZC0301_MODULE_AUTHOR "(C) 2006 Luca Risolia" |
53 | #define ZC0301_AUTHOR_EMAIL "<luca.risolia@studio.unibo.it>" | 53 | #define ZC0301_AUTHOR_EMAIL "<luca.risolia@studio.unibo.it>" |
54 | #define ZC0301_MODULE_LICENSE "GPL" | 54 | #define ZC0301_MODULE_LICENSE "GPL" |
55 | #define ZC0301_MODULE_VERSION "1:1.05" | 55 | #define ZC0301_MODULE_VERSION "1:1.07" |
56 | #define ZC0301_MODULE_VERSION_CODE KERNEL_VERSION(1, 0, 5) | 56 | #define ZC0301_MODULE_VERSION_CODE KERNEL_VERSION(1, 1, 7) |
57 | 57 | ||
58 | /*****************************************************************************/ | 58 | /*****************************************************************************/ |
59 | 59 | ||
@@ -89,7 +89,7 @@ MODULE_PARM_DESC(force_munmap, | |||
89 | "\ndetected camera." | 89 | "\ndetected camera." |
90 | "\n 0 = do not force memory unmapping" | 90 | "\n 0 = do not force memory unmapping" |
91 | "\n 1 = force memory unmapping (save memory)" | 91 | "\n 1 = force memory unmapping (save memory)" |
92 | "\nDefault value is "__MODULE_STRING(SN9C102_FORCE_MUNMAP)"." | 92 | "\nDefault value is "__MODULE_STRING(ZC0301_FORCE_MUNMAP)"." |
93 | "\n"); | 93 | "\n"); |
94 | 94 | ||
95 | static unsigned int frame_timeout[] = {[0 ... ZC0301_MAX_DEVICES-1] = | 95 | static unsigned int frame_timeout[] = {[0 ... ZC0301_MAX_DEVICES-1] = |
@@ -136,7 +136,8 @@ zc0301_request_buffers(struct zc0301_device* cam, u32 count, | |||
136 | 136 | ||
137 | cam->nbuffers = count; | 137 | cam->nbuffers = count; |
138 | while (cam->nbuffers > 0) { | 138 | while (cam->nbuffers > 0) { |
139 | if ((buff = vmalloc_32(cam->nbuffers * PAGE_ALIGN(imagesize)))) | 139 | if ((buff = vmalloc_32_user(cam->nbuffers * |
140 | PAGE_ALIGN(imagesize)))) | ||
140 | break; | 141 | break; |
141 | cam->nbuffers--; | 142 | cam->nbuffers--; |
142 | } | 143 | } |
@@ -430,7 +431,8 @@ static int zc0301_start_transfer(struct zc0301_device* cam) | |||
430 | struct usb_host_interface* altsetting = usb_altnum_to_altsetting( | 431 | struct usb_host_interface* altsetting = usb_altnum_to_altsetting( |
431 | usb_ifnum_to_if(udev, 0), | 432 | usb_ifnum_to_if(udev, 0), |
432 | ZC0301_ALTERNATE_SETTING); | 433 | ZC0301_ALTERNATE_SETTING); |
433 | const unsigned int psz = altsetting->endpoint[0].desc.wMaxPacketSize; | 434 | const unsigned int psz = le16_to_cpu(altsetting-> |
435 | endpoint[0].desc.wMaxPacketSize); | ||
434 | struct urb* urb; | 436 | struct urb* urb; |
435 | s8 i, j; | 437 | s8 i, j; |
436 | int err = 0; | 438 | int err = 0; |
@@ -489,7 +491,7 @@ static int zc0301_start_transfer(struct zc0301_device* cam) | |||
489 | return 0; | 491 | return 0; |
490 | 492 | ||
491 | free_urbs: | 493 | free_urbs: |
492 | for (i = 0; i < ZC0301_URBS; i++) | 494 | for (i = 0; (i < ZC0301_URBS) && cam->urb[i]; i++) |
493 | usb_free_urb(cam->urb[i]); | 495 | usb_free_urb(cam->urb[i]); |
494 | 496 | ||
495 | free_buffers: | 497 | free_buffers: |
@@ -1288,6 +1290,35 @@ zc0301_vidioc_s_crop(struct zc0301_device* cam, void __user * arg) | |||
1288 | 1290 | ||
1289 | 1291 | ||
1290 | static int | 1292 | static int |
1293 | zc0301_vidioc_enum_framesizes(struct zc0301_device* cam, void __user * arg) | ||
1294 | { | ||
1295 | struct v4l2_frmsizeenum frmsize; | ||
1296 | |||
1297 | if (copy_from_user(&frmsize, arg, sizeof(frmsize))) | ||
1298 | return -EFAULT; | ||
1299 | |||
1300 | if (frmsize.index != 0 && frmsize.index != 1) | ||
1301 | return -EINVAL; | ||
1302 | |||
1303 | if (frmsize.pixel_format != V4L2_PIX_FMT_JPEG) | ||
1304 | return -EINVAL; | ||
1305 | |||
1306 | frmsize.type = V4L2_FRMSIZE_TYPE_DISCRETE; | ||
1307 | |||
1308 | if (frmsize.index == 1) { | ||
1309 | frmsize.discrete.width = cam->sensor.cropcap.defrect.width; | ||
1310 | frmsize.discrete.height = cam->sensor.cropcap.defrect.height; | ||
1311 | } | ||
1312 | memset(&frmsize.reserved, 0, sizeof(frmsize.reserved)); | ||
1313 | |||
1314 | if (copy_to_user(arg, &frmsize, sizeof(frmsize))) | ||
1315 | return -EFAULT; | ||
1316 | |||
1317 | return 0; | ||
1318 | } | ||
1319 | |||
1320 | |||
1321 | static int | ||
1291 | zc0301_vidioc_enum_fmt(struct zc0301_device* cam, void __user * arg) | 1322 | zc0301_vidioc_enum_fmt(struct zc0301_device* cam, void __user * arg) |
1292 | { | 1323 | { |
1293 | struct v4l2_fmtdesc fmtd; | 1324 | struct v4l2_fmtdesc fmtd; |
@@ -1295,6 +1326,9 @@ zc0301_vidioc_enum_fmt(struct zc0301_device* cam, void __user * arg) | |||
1295 | if (copy_from_user(&fmtd, arg, sizeof(fmtd))) | 1326 | if (copy_from_user(&fmtd, arg, sizeof(fmtd))) |
1296 | return -EFAULT; | 1327 | return -EFAULT; |
1297 | 1328 | ||
1329 | if (fmtd.type != V4L2_BUF_TYPE_VIDEO_CAPTURE) | ||
1330 | return -EINVAL; | ||
1331 | |||
1298 | if (fmtd.index == 0) { | 1332 | if (fmtd.index == 0) { |
1299 | strcpy(fmtd.description, "JPEG"); | 1333 | strcpy(fmtd.description, "JPEG"); |
1300 | fmtd.pixelformat = V4L2_PIX_FMT_JPEG; | 1334 | fmtd.pixelformat = V4L2_PIX_FMT_JPEG; |
@@ -1795,6 +1829,9 @@ static int zc0301_ioctl_v4l2(struct inode* inode, struct file* filp, | |||
1795 | case VIDIOC_S_FMT: | 1829 | case VIDIOC_S_FMT: |
1796 | return zc0301_vidioc_try_s_fmt(cam, cmd, arg); | 1830 | return zc0301_vidioc_try_s_fmt(cam, cmd, arg); |
1797 | 1831 | ||
1832 | case VIDIOC_ENUM_FRAMESIZES: | ||
1833 | return zc0301_vidioc_enum_framesizes(cam, arg); | ||
1834 | |||
1798 | case VIDIOC_G_JPEGCOMP: | 1835 | case VIDIOC_G_JPEGCOMP: |
1799 | return zc0301_vidioc_g_jpegcomp(cam, arg); | 1836 | return zc0301_vidioc_g_jpegcomp(cam, arg); |
1800 | 1837 | ||
@@ -1830,6 +1867,7 @@ static int zc0301_ioctl_v4l2(struct inode* inode, struct file* filp, | |||
1830 | case VIDIOC_QUERYSTD: | 1867 | case VIDIOC_QUERYSTD: |
1831 | case VIDIOC_ENUMSTD: | 1868 | case VIDIOC_ENUMSTD: |
1832 | case VIDIOC_QUERYMENU: | 1869 | case VIDIOC_QUERYMENU: |
1870 | case VIDIOC_ENUM_FRAMEINTERVALS: | ||
1833 | return -EINVAL; | 1871 | return -EINVAL; |
1834 | 1872 | ||
1835 | default: | 1873 | default: |
@@ -1876,6 +1914,7 @@ static const struct file_operations zc0301_fops = { | |||
1876 | .open = zc0301_open, | 1914 | .open = zc0301_open, |
1877 | .release = zc0301_release, | 1915 | .release = zc0301_release, |
1878 | .ioctl = zc0301_ioctl, | 1916 | .ioctl = zc0301_ioctl, |
1917 | .compat_ioctl = v4l_compat_ioctl32, | ||
1879 | .read = zc0301_read, | 1918 | .read = zc0301_read, |
1880 | .poll = zc0301_poll, | 1919 | .poll = zc0301_poll, |
1881 | .mmap = zc0301_mmap, | 1920 | .mmap = zc0301_mmap, |
@@ -1913,7 +1952,7 @@ zc0301_usb_probe(struct usb_interface* intf, const struct usb_device_id* id) | |||
1913 | mutex_init(&cam->dev_mutex); | 1952 | mutex_init(&cam->dev_mutex); |
1914 | 1953 | ||
1915 | DBG(2, "ZC0301[P] Image Processor and Control Chip detected " | 1954 | DBG(2, "ZC0301[P] Image Processor and Control Chip detected " |
1916 | "(vid/pid 0x%04X/0x%04X)",id->idVendor, id->idProduct); | 1955 | "(vid/pid 0x%04X:0x%04X)",id->idVendor, id->idProduct); |
1917 | 1956 | ||
1918 | for (i = 0; zc0301_sensor_table[i]; i++) { | 1957 | for (i = 0; zc0301_sensor_table[i]; i++) { |
1919 | err = zc0301_sensor_table[i](cam); | 1958 | err = zc0301_sensor_table[i](cam); |