11da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/* (C) 1999-2003 Nemosoft Unv.
22b455db6d456ef2d44808a8377fd3bc832e08317Luc Saillard   (C) 2004-2006 Luc Saillard (luc@saillard.org)
31da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
41da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds   NOTE: this version of pwc is an unofficial (modified) release of pwc & pcwx
51da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds   driver and thus may have bugs that are not present in the original version.
61da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds   Please send bug reports and support requests to <luc@saillard.org>.
71da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds   The decompression routines have been implemented by reverse-engineering the
81da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds   Nemosoft binary pwcx module. Caveat emptor.
91da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
101da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds   This program is free software; you can redistribute it and/or modify
111da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds   it under the terms of the GNU General Public License as published by
121da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds   the Free Software Foundation; either version 2 of the License, or
131da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds   (at your option) any later version.
141da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
151da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds   This program is distributed in the hope that it will be useful,
161da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds   but WITHOUT ANY WARRANTY; without even the implied warranty of
171da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
181da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds   GNU General Public License for more details.
191da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
201da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds   You should have received a copy of the GNU General Public License
211da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds   along with this program; if not, write to the Free Software
221da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds   Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
231da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds*/
241da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
251da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#ifndef PWC_H
261da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define PWC_H
271da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
281da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#include <linux/module.h>
291da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#include <linux/usb.h>
301da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#include <linux/spinlock.h>
311da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#include <linux/wait.h>
32b9378fdbc334d1575b492108eac822a78c0c46d9Matthias Kaehlcke#include <linux/mutex.h>
3338413fd2d82b0e75ae0492518f1b80a5cfd81956Mauro Carvalho Chehab#include <linux/mm.h>
345a0e3ad6af8660be21ca98a971cd00f331318c05Tejun Heo#include <linux/slab.h>
351da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#include <asm/errno.h>
36479567ce3af7b99d645a3c53b8ca2fc65e46efdcHans Verkuil#include <linux/videodev2.h>
375e87efa3b29c105f81fea785babafb098e4e046dMauro Carvalho Chehab#include <media/v4l2-common.h>
3876ae853844dff124559e1b609b0c71c792a98221Hans de Goede#include <media/v4l2-device.h>
3935ea11ff84719b1bfab2909903a9640a86552fd1Hans Verkuil#include <media/v4l2-ioctl.h>
406c9cac89c009c049a9ad29cdf0f51892410fe751Hans de Goede#include <media/v4l2-ctrls.h>
4176ae853844dff124559e1b609b0c71c792a98221Hans de Goede#include <media/v4l2-fh.h>
4276ae853844dff124559e1b609b0c71c792a98221Hans de Goede#include <media/v4l2-event.h>
43885fe18f5542fe283a17f70583383c6cadcba1c3Hans de Goede#include <media/videobuf2-vmalloc.h>
44e32a7eccd7f016928dd864711ac654e6db62c5f3Nam Phạm Thành#ifdef CONFIG_USB_PWC_INPUT_EVDEV
45e32a7eccd7f016928dd864711ac654e6db62c5f3Nam Phạm Thành#include <linux/input.h>
46e32a7eccd7f016928dd864711ac654e6db62c5f3Nam Phạm Thành#endif
4756ae24aad8f9e25dfef995c3e898e5f394cf0bebHans de Goede#include "pwc-dec1.h"
4856ae24aad8f9e25dfef995c3e898e5f394cf0bebHans de Goede#include "pwc-dec23.h"
491da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
502b455db6d456ef2d44808a8377fd3bc832e08317Luc Saillard/* Version block */
51880c35c5850464c934f02a5ec7d4c1a4df386fceMauro Carvalho Chehab#define PWC_VERSION	"10.0.15"
522b455db6d456ef2d44808a8377fd3bc832e08317Luc Saillard#define PWC_NAME 	"pwc"
532b455db6d456ef2d44808a8377fd3bc832e08317Luc Saillard#define PFX		PWC_NAME ": "
542b455db6d456ef2d44808a8377fd3bc832e08317Luc Saillard
551da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
561da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/* Trace certain actions in the driver */
572b455db6d456ef2d44808a8377fd3bc832e08317Luc Saillard#define PWC_DEBUG_LEVEL_MODULE	(1<<0)
582b455db6d456ef2d44808a8377fd3bc832e08317Luc Saillard#define PWC_DEBUG_LEVEL_PROBE	(1<<1)
592b455db6d456ef2d44808a8377fd3bc832e08317Luc Saillard#define PWC_DEBUG_LEVEL_OPEN	(1<<2)
602b455db6d456ef2d44808a8377fd3bc832e08317Luc Saillard#define PWC_DEBUG_LEVEL_READ	(1<<3)
612b455db6d456ef2d44808a8377fd3bc832e08317Luc Saillard#define PWC_DEBUG_LEVEL_MEMORY	(1<<4)
622b455db6d456ef2d44808a8377fd3bc832e08317Luc Saillard#define PWC_DEBUG_LEVEL_FLOW	(1<<5)
632b455db6d456ef2d44808a8377fd3bc832e08317Luc Saillard#define PWC_DEBUG_LEVEL_SIZE	(1<<6)
642b455db6d456ef2d44808a8377fd3bc832e08317Luc Saillard#define PWC_DEBUG_LEVEL_IOCTL	(1<<7)
652b455db6d456ef2d44808a8377fd3bc832e08317Luc Saillard#define PWC_DEBUG_LEVEL_TRACE	(1<<8)
662b455db6d456ef2d44808a8377fd3bc832e08317Luc Saillard
672b455db6d456ef2d44808a8377fd3bc832e08317Luc Saillard#define PWC_DEBUG_MODULE(fmt, args...) PWC_DEBUG(MODULE, fmt, ##args)
682b455db6d456ef2d44808a8377fd3bc832e08317Luc Saillard#define PWC_DEBUG_PROBE(fmt, args...) PWC_DEBUG(PROBE, fmt, ##args)
692b455db6d456ef2d44808a8377fd3bc832e08317Luc Saillard#define PWC_DEBUG_OPEN(fmt, args...) PWC_DEBUG(OPEN, fmt, ##args)
702b455db6d456ef2d44808a8377fd3bc832e08317Luc Saillard#define PWC_DEBUG_READ(fmt, args...) PWC_DEBUG(READ, fmt, ##args)
712b455db6d456ef2d44808a8377fd3bc832e08317Luc Saillard#define PWC_DEBUG_MEMORY(fmt, args...) PWC_DEBUG(MEMORY, fmt, ##args)
722b455db6d456ef2d44808a8377fd3bc832e08317Luc Saillard#define PWC_DEBUG_FLOW(fmt, args...) PWC_DEBUG(FLOW, fmt, ##args)
732b455db6d456ef2d44808a8377fd3bc832e08317Luc Saillard#define PWC_DEBUG_SIZE(fmt, args...) PWC_DEBUG(SIZE, fmt, ##args)
742b455db6d456ef2d44808a8377fd3bc832e08317Luc Saillard#define PWC_DEBUG_IOCTL(fmt, args...) PWC_DEBUG(IOCTL, fmt, ##args)
752b455db6d456ef2d44808a8377fd3bc832e08317Luc Saillard#define PWC_DEBUG_TRACE(fmt, args...) PWC_DEBUG(TRACE, fmt, ##args)
762b455db6d456ef2d44808a8377fd3bc832e08317Luc Saillard
772b455db6d456ef2d44808a8377fd3bc832e08317Luc Saillard
7805ad390724d1f307111a322325df83282a1479e6Trent Piepho#ifdef CONFIG_USB_PWC_DEBUG
792b455db6d456ef2d44808a8377fd3bc832e08317Luc Saillard
802b455db6d456ef2d44808a8377fd3bc832e08317Luc Saillard#define PWC_DEBUG_LEVEL	(PWC_DEBUG_LEVEL_MODULE)
812b455db6d456ef2d44808a8377fd3bc832e08317Luc Saillard
822b455db6d456ef2d44808a8377fd3bc832e08317Luc Saillard#define PWC_DEBUG(level, fmt, args...) do {\
831a4ede65f30315a31cb9b239bec0d4bb32834691Hans de Goede	if ((PWC_DEBUG_LEVEL_ ##level) & pwc_trace) \
841a4ede65f30315a31cb9b239bec0d4bb32834691Hans de Goede		printk(KERN_DEBUG PFX fmt, ##args); \
851a4ede65f30315a31cb9b239bec0d4bb32834691Hans de Goede	} while (0)
862b455db6d456ef2d44808a8377fd3bc832e08317Luc Saillard
872b455db6d456ef2d44808a8377fd3bc832e08317Luc Saillard#define PWC_ERROR(fmt, args...) printk(KERN_ERR PFX fmt, ##args)
882b455db6d456ef2d44808a8377fd3bc832e08317Luc Saillard#define PWC_WARNING(fmt, args...) printk(KERN_WARNING PFX fmt, ##args)
892b455db6d456ef2d44808a8377fd3bc832e08317Luc Saillard#define PWC_INFO(fmt, args...) printk(KERN_INFO PFX fmt, ##args)
902b455db6d456ef2d44808a8377fd3bc832e08317Luc Saillard#define PWC_TRACE(fmt, args...) PWC_DEBUG(TRACE, fmt, ##args)
912b455db6d456ef2d44808a8377fd3bc832e08317Luc Saillard
929ee6d78cd4112c0f5a257a01383c64dadbf66da9Luc Saillard#else /* if ! CONFIG_USB_PWC_DEBUG */
932b455db6d456ef2d44808a8377fd3bc832e08317Luc Saillard
942b455db6d456ef2d44808a8377fd3bc832e08317Luc Saillard#define PWC_ERROR(fmt, args...) printk(KERN_ERR PFX fmt, ##args)
952b455db6d456ef2d44808a8377fd3bc832e08317Luc Saillard#define PWC_WARNING(fmt, args...) printk(KERN_WARNING PFX fmt, ##args)
962b455db6d456ef2d44808a8377fd3bc832e08317Luc Saillard#define PWC_INFO(fmt, args...) printk(KERN_INFO PFX fmt, ##args)
972b455db6d456ef2d44808a8377fd3bc832e08317Luc Saillard#define PWC_TRACE(fmt, args...) do { } while(0)
982b455db6d456ef2d44808a8377fd3bc832e08317Luc Saillard#define PWC_DEBUG(level, fmt, args...) do { } while(0)
992b455db6d456ef2d44808a8377fd3bc832e08317Luc Saillard
1002b455db6d456ef2d44808a8377fd3bc832e08317Luc Saillard#define pwc_trace 0
1011da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
1022b455db6d456ef2d44808a8377fd3bc832e08317Luc Saillard#endif
1031da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
1041da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/* Defines for ToUCam cameras */
1051da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define TOUCAM_HEADER_SIZE		8
1061da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define TOUCAM_TRAILER_SIZE		4
1071da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
1081da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define FEATURE_MOTOR_PANTILT		0x0001
1092b455db6d456ef2d44808a8377fd3bc832e08317Luc Saillard#define FEATURE_CODEC1			0x0002
1102b455db6d456ef2d44808a8377fd3bc832e08317Luc Saillard#define FEATURE_CODEC2			0x0004
1111da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
112795e6eb3262d3b7247ce450835eea6df6571d103Hans de Goede#define MAX_WIDTH		640
113795e6eb3262d3b7247ce450835eea6df6571d103Hans de Goede#define MAX_HEIGHT		480
114795e6eb3262d3b7247ce450835eea6df6571d103Hans de Goede
1151da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/* Ignore errors in the first N frames, to allow for startup delays */
1161da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define FRAME_LOWMARK 5
1171da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
1181da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/* Size and number of buffers for the ISO pipe. */
119885fe18f5542fe283a17f70583383c6cadcba1c3Hans de Goede#define MAX_ISO_BUFS		3
1201da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define ISO_FRAMES_PER_DESC	10
1211da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define ISO_MAX_FRAME_SIZE	960
1221da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define ISO_BUFFER_SIZE 	(ISO_FRAMES_PER_DESC * ISO_MAX_FRAME_SIZE)
1231da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
1241da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/* Maximum size after decompression is 640x480 YUV data, 1.5 * 640 * 480 */
1251da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define PWC_FRAME_SIZE 		(460800 + TOUCAM_HEADER_SIZE + TOUCAM_TRAILER_SIZE)
1261da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
127885fe18f5542fe283a17f70583383c6cadcba1c3Hans de Goede/* Absolute minimum and maximum number of buffers available for mmap() */
128885fe18f5542fe283a17f70583383c6cadcba1c3Hans de Goede#define MIN_FRAMES		2
129885fe18f5542fe283a17f70583383c6cadcba1c3Hans de Goede#define MAX_FRAMES		16
1301da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
1312b455db6d456ef2d44808a8377fd3bc832e08317Luc Saillard/* Some macros to quickly find the type of a webcam */
1322b455db6d456ef2d44808a8377fd3bc832e08317Luc Saillard#define DEVICE_USE_CODEC1(x) ((x)<675)
1332b455db6d456ef2d44808a8377fd3bc832e08317Luc Saillard#define DEVICE_USE_CODEC2(x) ((x)>=675 && (x)<700)
1342b455db6d456ef2d44808a8377fd3bc832e08317Luc Saillard#define DEVICE_USE_CODEC3(x) ((x)>=700)
1352b455db6d456ef2d44808a8377fd3bc832e08317Luc Saillard#define DEVICE_USE_CODEC23(x) ((x)>=675)
1362b455db6d456ef2d44808a8377fd3bc832e08317Luc Saillard
1376c9cac89c009c049a9ad29cdf0f51892410fe751Hans de Goede/* Request types: video */
1386c9cac89c009c049a9ad29cdf0f51892410fe751Hans de Goede#define SET_LUM_CTL			0x01
1396c9cac89c009c049a9ad29cdf0f51892410fe751Hans de Goede#define GET_LUM_CTL			0x02
1406c9cac89c009c049a9ad29cdf0f51892410fe751Hans de Goede#define SET_CHROM_CTL			0x03
1416c9cac89c009c049a9ad29cdf0f51892410fe751Hans de Goede#define GET_CHROM_CTL			0x04
1426c9cac89c009c049a9ad29cdf0f51892410fe751Hans de Goede#define SET_STATUS_CTL			0x05
1436c9cac89c009c049a9ad29cdf0f51892410fe751Hans de Goede#define GET_STATUS_CTL			0x06
1446c9cac89c009c049a9ad29cdf0f51892410fe751Hans de Goede#define SET_EP_STREAM_CTL		0x07
1456c9cac89c009c049a9ad29cdf0f51892410fe751Hans de Goede#define GET_EP_STREAM_CTL		0x08
1466c9cac89c009c049a9ad29cdf0f51892410fe751Hans de Goede#define GET_XX_CTL			0x09
1476c9cac89c009c049a9ad29cdf0f51892410fe751Hans de Goede#define SET_XX_CTL			0x0A
1486c9cac89c009c049a9ad29cdf0f51892410fe751Hans de Goede#define GET_XY_CTL			0x0B
1496c9cac89c009c049a9ad29cdf0f51892410fe751Hans de Goede#define SET_XY_CTL			0x0C
1506c9cac89c009c049a9ad29cdf0f51892410fe751Hans de Goede#define SET_MPT_CTL			0x0D
1516c9cac89c009c049a9ad29cdf0f51892410fe751Hans de Goede#define GET_MPT_CTL			0x0E
1526c9cac89c009c049a9ad29cdf0f51892410fe751Hans de Goede
1536c9cac89c009c049a9ad29cdf0f51892410fe751Hans de Goede/* Selectors for the Luminance controls [GS]ET_LUM_CTL */
1546c9cac89c009c049a9ad29cdf0f51892410fe751Hans de Goede#define AGC_MODE_FORMATTER			0x2000
1556c9cac89c009c049a9ad29cdf0f51892410fe751Hans de Goede#define PRESET_AGC_FORMATTER			0x2100
1566c9cac89c009c049a9ad29cdf0f51892410fe751Hans de Goede#define SHUTTER_MODE_FORMATTER			0x2200
1576c9cac89c009c049a9ad29cdf0f51892410fe751Hans de Goede#define PRESET_SHUTTER_FORMATTER		0x2300
1586c9cac89c009c049a9ad29cdf0f51892410fe751Hans de Goede#define PRESET_CONTOUR_FORMATTER		0x2400
1596c9cac89c009c049a9ad29cdf0f51892410fe751Hans de Goede#define AUTO_CONTOUR_FORMATTER			0x2500
1606c9cac89c009c049a9ad29cdf0f51892410fe751Hans de Goede#define BACK_LIGHT_COMPENSATION_FORMATTER	0x2600
1616c9cac89c009c049a9ad29cdf0f51892410fe751Hans de Goede#define CONTRAST_FORMATTER			0x2700
1626c9cac89c009c049a9ad29cdf0f51892410fe751Hans de Goede#define DYNAMIC_NOISE_CONTROL_FORMATTER		0x2800
1636c9cac89c009c049a9ad29cdf0f51892410fe751Hans de Goede#define FLICKERLESS_MODE_FORMATTER		0x2900
1646c9cac89c009c049a9ad29cdf0f51892410fe751Hans de Goede#define AE_CONTROL_SPEED			0x2A00
1656c9cac89c009c049a9ad29cdf0f51892410fe751Hans de Goede#define BRIGHTNESS_FORMATTER			0x2B00
1666c9cac89c009c049a9ad29cdf0f51892410fe751Hans de Goede#define GAMMA_FORMATTER				0x2C00
1676c9cac89c009c049a9ad29cdf0f51892410fe751Hans de Goede
1686c9cac89c009c049a9ad29cdf0f51892410fe751Hans de Goede/* Selectors for the Chrominance controls [GS]ET_CHROM_CTL */
1696c9cac89c009c049a9ad29cdf0f51892410fe751Hans de Goede#define WB_MODE_FORMATTER			0x1000
1706c9cac89c009c049a9ad29cdf0f51892410fe751Hans de Goede#define AWB_CONTROL_SPEED_FORMATTER		0x1100
1716c9cac89c009c049a9ad29cdf0f51892410fe751Hans de Goede#define AWB_CONTROL_DELAY_FORMATTER		0x1200
1726c9cac89c009c049a9ad29cdf0f51892410fe751Hans de Goede#define PRESET_MANUAL_RED_GAIN_FORMATTER	0x1300
1736c9cac89c009c049a9ad29cdf0f51892410fe751Hans de Goede#define PRESET_MANUAL_BLUE_GAIN_FORMATTER	0x1400
1746c9cac89c009c049a9ad29cdf0f51892410fe751Hans de Goede#define COLOUR_MODE_FORMATTER			0x1500
1756c9cac89c009c049a9ad29cdf0f51892410fe751Hans de Goede#define SATURATION_MODE_FORMATTER1		0x1600
1766c9cac89c009c049a9ad29cdf0f51892410fe751Hans de Goede#define SATURATION_MODE_FORMATTER2		0x1700
1776c9cac89c009c049a9ad29cdf0f51892410fe751Hans de Goede
1786c9cac89c009c049a9ad29cdf0f51892410fe751Hans de Goede/* Selectors for the Status controls [GS]ET_STATUS_CTL */
1796c9cac89c009c049a9ad29cdf0f51892410fe751Hans de Goede#define SAVE_USER_DEFAULTS_FORMATTER		0x0200
1806c9cac89c009c049a9ad29cdf0f51892410fe751Hans de Goede#define RESTORE_USER_DEFAULTS_FORMATTER		0x0300
1816c9cac89c009c049a9ad29cdf0f51892410fe751Hans de Goede#define RESTORE_FACTORY_DEFAULTS_FORMATTER	0x0400
1826c9cac89c009c049a9ad29cdf0f51892410fe751Hans de Goede#define READ_AGC_FORMATTER			0x0500
1836c9cac89c009c049a9ad29cdf0f51892410fe751Hans de Goede#define READ_SHUTTER_FORMATTER			0x0600
1846c9cac89c009c049a9ad29cdf0f51892410fe751Hans de Goede#define READ_RED_GAIN_FORMATTER			0x0700
1856c9cac89c009c049a9ad29cdf0f51892410fe751Hans de Goede#define READ_BLUE_GAIN_FORMATTER		0x0800
1866c9cac89c009c049a9ad29cdf0f51892410fe751Hans de Goede
1876c9cac89c009c049a9ad29cdf0f51892410fe751Hans de Goede/* Formatters for the motorized pan & tilt [GS]ET_MPT_CTL */
1886c9cac89c009c049a9ad29cdf0f51892410fe751Hans de Goede#define PT_RELATIVE_CONTROL_FORMATTER		0x01
1896c9cac89c009c049a9ad29cdf0f51892410fe751Hans de Goede#define PT_RESET_CONTROL_FORMATTER		0x02
1906c9cac89c009c049a9ad29cdf0f51892410fe751Hans de Goede#define PT_STATUS_FORMATTER			0x03
1916c9cac89c009c049a9ad29cdf0f51892410fe751Hans de Goede
192a08d2c727153dc6cea1d5d54a43fd7d69c1467c3Hans de Goede/* Enumeration of image sizes */
193a08d2c727153dc6cea1d5d54a43fd7d69c1467c3Hans de Goede#define PSZ_SQCIF	0x00
194a08d2c727153dc6cea1d5d54a43fd7d69c1467c3Hans de Goede#define PSZ_QSIF	0x01
195a08d2c727153dc6cea1d5d54a43fd7d69c1467c3Hans de Goede#define PSZ_QCIF	0x02
196a08d2c727153dc6cea1d5d54a43fd7d69c1467c3Hans de Goede#define PSZ_SIF		0x03
197a08d2c727153dc6cea1d5d54a43fd7d69c1467c3Hans de Goede#define PSZ_CIF		0x04
198a08d2c727153dc6cea1d5d54a43fd7d69c1467c3Hans de Goede#define PSZ_VGA		0x05
199a08d2c727153dc6cea1d5d54a43fd7d69c1467c3Hans de Goede#define PSZ_MAX		6
200a08d2c727153dc6cea1d5d54a43fd7d69c1467c3Hans de Goede
201a08d2c727153dc6cea1d5d54a43fd7d69c1467c3Hans de Goedestruct pwc_raw_frame {
202a08d2c727153dc6cea1d5d54a43fd7d69c1467c3Hans de Goede	__le16 type;		/* type of the webcam */
203a08d2c727153dc6cea1d5d54a43fd7d69c1467c3Hans de Goede	__le16 vbandlength;	/* Size of 4 lines compressed (used by the
204a08d2c727153dc6cea1d5d54a43fd7d69c1467c3Hans de Goede				   decompressor) */
205a08d2c727153dc6cea1d5d54a43fd7d69c1467c3Hans de Goede	__u8   cmd[4];		/* the four byte of the command (in case of
206a08d2c727153dc6cea1d5d54a43fd7d69c1467c3Hans de Goede				   nala, only the first 3 bytes is filled) */
207a08d2c727153dc6cea1d5d54a43fd7d69c1467c3Hans de Goede	__u8   rawframe[0];	/* frame_size = H / 4 * vbandlength */
208a08d2c727153dc6cea1d5d54a43fd7d69c1467c3Hans de Goede} __packed;
209a08d2c727153dc6cea1d5d54a43fd7d69c1467c3Hans de Goede
2101da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/* intermediate buffers with raw data from the USB cam */
2111da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstruct pwc_frame_buf
2121da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{
213885fe18f5542fe283a17f70583383c6cadcba1c3Hans de Goede	struct vb2_buffer vb;	/* common v4l buffer stuff -- must be first */
214885fe18f5542fe283a17f70583383c6cadcba1c3Hans de Goede	struct list_head list;
215885fe18f5542fe283a17f70583383c6cadcba1c3Hans de Goede	void *data;
216885fe18f5542fe283a17f70583383c6cadcba1c3Hans de Goede	int filled;		/* number of bytes filled */
2171da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds};
2181da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
2191da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstruct pwc_device
2201da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{
2219a7b2d1f0eb0a6b674726c9a9d77ce83fd0b27feHans de Goede	struct video_device vdev;
22276ae853844dff124559e1b609b0c71c792a98221Hans de Goede	struct v4l2_device v4l2_dev;
2231a4ede65f30315a31cb9b239bec0d4bb32834691Hans de Goede
2241a4ede65f30315a31cb9b239bec0d4bb32834691Hans de Goede	/* Pointer to our usb_device, may be NULL after unplug */
2251a4ede65f30315a31cb9b239bec0d4bb32834691Hans de Goede	struct usb_device *udev;
226c11271349ad5d4647e69e511fc481b2dd390efc4Hans de Goede	struct mutex udevlock;
227c11271349ad5d4647e69e511fc481b2dd390efc4Hans de Goede
2281a4ede65f30315a31cb9b239bec0d4bb32834691Hans de Goede	/* type of cam (645, 646, 675, 680, 690, 720, 730, 740, 750) */
2291a4ede65f30315a31cb9b239bec0d4bb32834691Hans de Goede	int type;
2301a4ede65f30315a31cb9b239bec0d4bb32834691Hans de Goede	int release;		/* release number */
2311a4ede65f30315a31cb9b239bec0d4bb32834691Hans de Goede	int features;		/* feature bits */
2321a4ede65f30315a31cb9b239bec0d4bb32834691Hans de Goede
2331a4ede65f30315a31cb9b239bec0d4bb32834691Hans de Goede	/*** Video data ***/
2344fba471e405f8f983085fd9f2fd9637bfc275f8fHans de Goede	struct file *capt_file;	/* file doing video capture */
235c20d78cde37018caa0313469c9320424995cc489Hans de Goede	struct mutex capt_file_lock;
2361a4ede65f30315a31cb9b239bec0d4bb32834691Hans de Goede	int vendpoint;		/* video isoc endpoint */
2371a4ede65f30315a31cb9b239bec0d4bb32834691Hans de Goede	int vcinterface;	/* video control interface */
2381a4ede65f30315a31cb9b239bec0d4bb32834691Hans de Goede	int valternate;		/* alternate interface needed */
239dc8a7e83aaf8bb1bcf7163bda8926a6dd29c409bHans de Goede	int vframes;		/* frames-per-second */
2401a4ede65f30315a31cb9b239bec0d4bb32834691Hans de Goede	int pixfmt;		/* pixelformat: V4L2_PIX_FMT_YUV420 or _PWCX */
2411a4ede65f30315a31cb9b239bec0d4bb32834691Hans de Goede	int vframe_count;	/* received frames */
2421a4ede65f30315a31cb9b239bec0d4bb32834691Hans de Goede	int vmax_packet_size;	/* USB maxpacket size */
2431a4ede65f30315a31cb9b239bec0d4bb32834691Hans de Goede	int vlast_packet_size;	/* for frame synchronisation */
2441a4ede65f30315a31cb9b239bec0d4bb32834691Hans de Goede	int visoc_errors;	/* number of contiguous ISOC errors */
2451a4ede65f30315a31cb9b239bec0d4bb32834691Hans de Goede	int vbandlength;	/* compressed band length; 0 is uncompressed */
2461a4ede65f30315a31cb9b239bec0d4bb32834691Hans de Goede	char vsync;		/* used by isoc handler */
2471a4ede65f30315a31cb9b239bec0d4bb32834691Hans de Goede	char vmirror;		/* for ToUCaM series */
2483b4d0ec79113e77b3fe90749ae00bfa015c73048Hans de Goede	char power_save;	/* Do powersaving for this cam */
249d56410e0a594150c5ca06319da7bc8901c4d455eMauro Carvalho Chehab
2501a4ede65f30315a31cb9b239bec0d4bb32834691Hans de Goede	unsigned char cmd_buf[13];
25124be689bfbbcd6c047d7918784ff810e97648006Hans de Goede	unsigned char *ctrl_buf;
2521da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
25304613c5e600e64840e4f753bd881cd5ab96ae403Hans de Goede	struct urb *urbs[MAX_ISO_BUFS];
2541a4ede65f30315a31cb9b239bec0d4bb32834691Hans de Goede	char iso_init;
2551da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
256885fe18f5542fe283a17f70583383c6cadcba1c3Hans de Goede	/* videobuf2 queue and queued buffers list */
257885fe18f5542fe283a17f70583383c6cadcba1c3Hans de Goede	struct vb2_queue vb_queue;
258885fe18f5542fe283a17f70583383c6cadcba1c3Hans de Goede	struct list_head queued_bufs;
259885fe18f5542fe283a17f70583383c6cadcba1c3Hans de Goede	spinlock_t queued_bufs_lock;
260885fe18f5542fe283a17f70583383c6cadcba1c3Hans de Goede
261885fe18f5542fe283a17f70583383c6cadcba1c3Hans de Goede	/*
262885fe18f5542fe283a17f70583383c6cadcba1c3Hans de Goede	 * Frame currently being filled, this only gets touched by the
263885fe18f5542fe283a17f70583383c6cadcba1c3Hans de Goede	 * isoc urb complete handler, and by stream start / stop since
264885fe18f5542fe283a17f70583383c6cadcba1c3Hans de Goede	 * start / stop touch it before / after starting / killing the urbs
265885fe18f5542fe283a17f70583383c6cadcba1c3Hans de Goede	 * no locking is needed around this
266885fe18f5542fe283a17f70583383c6cadcba1c3Hans de Goede	 */
267885fe18f5542fe283a17f70583383c6cadcba1c3Hans de Goede	struct pwc_frame_buf *fill_buf;
268885fe18f5542fe283a17f70583383c6cadcba1c3Hans de Goede
2691a4ede65f30315a31cb9b239bec0d4bb32834691Hans de Goede	int frame_header_size, frame_trailer_size;
2701a4ede65f30315a31cb9b239bec0d4bb32834691Hans de Goede	int frame_size;
2711a4ede65f30315a31cb9b239bec0d4bb32834691Hans de Goede	int frame_total_size;	/* including header & trailer */
2721a4ede65f30315a31cb9b239bec0d4bb32834691Hans de Goede	int drop_frames;
2731a4ede65f30315a31cb9b239bec0d4bb32834691Hans de Goede
27456ae24aad8f9e25dfef995c3e898e5f394cf0bebHans de Goede	union {	/* private data for decompression engine */
27556ae24aad8f9e25dfef995c3e898e5f394cf0bebHans de Goede		struct pwc_dec1_private dec1;
27656ae24aad8f9e25dfef995c3e898e5f394cf0bebHans de Goede		struct pwc_dec23_private dec23;
27756ae24aad8f9e25dfef995c3e898e5f394cf0bebHans de Goede	};
2781a4ede65f30315a31cb9b239bec0d4bb32834691Hans de Goede
2791a4ede65f30315a31cb9b239bec0d4bb32834691Hans de Goede	/*
2801a4ede65f30315a31cb9b239bec0d4bb32834691Hans de Goede	 * We have an 'image' and a 'view', where 'image' is the fixed-size img
2811a4ede65f30315a31cb9b239bec0d4bb32834691Hans de Goede	 * as delivered by the camera, and 'view' is the size requested by the
2821a4ede65f30315a31cb9b239bec0d4bb32834691Hans de Goede	 * program. The camera image is centered in this viewport, laced with
2831a4ede65f30315a31cb9b239bec0d4bb32834691Hans de Goede	 * a gray or black border. view_min <= image <= view <= view_max;
2841a4ede65f30315a31cb9b239bec0d4bb32834691Hans de Goede	 */
2851a4ede65f30315a31cb9b239bec0d4bb32834691Hans de Goede	int image_mask;				/* supported sizes */
286795e6eb3262d3b7247ce450835eea6df6571d103Hans de Goede	int width, height;			/* current resolution */
2871a4ede65f30315a31cb9b239bec0d4bb32834691Hans de Goede
288e32a7eccd7f016928dd864711ac654e6db62c5f3Nam Phạm Thành#ifdef CONFIG_USB_PWC_INPUT_EVDEV
2891a4ede65f30315a31cb9b239bec0d4bb32834691Hans de Goede	struct input_dev *button_dev;	/* webcam snapshot button input */
2901a4ede65f30315a31cb9b239bec0d4bb32834691Hans de Goede	char button_phys[64];
291e32a7eccd7f016928dd864711ac654e6db62c5f3Nam Phạm Thành#endif
2926c9cac89c009c049a9ad29cdf0f51892410fe751Hans de Goede
2936c9cac89c009c049a9ad29cdf0f51892410fe751Hans de Goede	/* controls */
2946c9cac89c009c049a9ad29cdf0f51892410fe751Hans de Goede	struct v4l2_ctrl_handler	ctrl_handler;
2956c9cac89c009c049a9ad29cdf0f51892410fe751Hans de Goede	u16				saturation_fmt;
2966c9cac89c009c049a9ad29cdf0f51892410fe751Hans de Goede	struct v4l2_ctrl		*brightness;
2976c9cac89c009c049a9ad29cdf0f51892410fe751Hans de Goede	struct v4l2_ctrl		*contrast;
2986c9cac89c009c049a9ad29cdf0f51892410fe751Hans de Goede	struct v4l2_ctrl		*saturation;
2996c9cac89c009c049a9ad29cdf0f51892410fe751Hans de Goede	struct v4l2_ctrl		*gamma;
3006c9cac89c009c049a9ad29cdf0f51892410fe751Hans de Goede	struct {
3016c9cac89c009c049a9ad29cdf0f51892410fe751Hans de Goede		/* awb / red-blue balance cluster */
3026c9cac89c009c049a9ad29cdf0f51892410fe751Hans de Goede		struct v4l2_ctrl	*auto_white_balance;
3036c9cac89c009c049a9ad29cdf0f51892410fe751Hans de Goede		struct v4l2_ctrl	*red_balance;
3046c9cac89c009c049a9ad29cdf0f51892410fe751Hans de Goede		struct v4l2_ctrl	*blue_balance;
3056c9cac89c009c049a9ad29cdf0f51892410fe751Hans de Goede		/* usb ctrl transfers are slow, so we cache things */
3066c9cac89c009c049a9ad29cdf0f51892410fe751Hans de Goede		int			color_bal_valid;
3076c9cac89c009c049a9ad29cdf0f51892410fe751Hans de Goede		unsigned long		last_color_bal_update; /* In jiffies */
3086c9cac89c009c049a9ad29cdf0f51892410fe751Hans de Goede		s32			last_red_balance;
3096c9cac89c009c049a9ad29cdf0f51892410fe751Hans de Goede		s32			last_blue_balance;
3106c9cac89c009c049a9ad29cdf0f51892410fe751Hans de Goede	};
3116c9cac89c009c049a9ad29cdf0f51892410fe751Hans de Goede	struct {
3126c9cac89c009c049a9ad29cdf0f51892410fe751Hans de Goede		/* autogain / gain cluster */
3136c9cac89c009c049a9ad29cdf0f51892410fe751Hans de Goede		struct v4l2_ctrl	*autogain;
3146c9cac89c009c049a9ad29cdf0f51892410fe751Hans de Goede		struct v4l2_ctrl	*gain;
3156c9cac89c009c049a9ad29cdf0f51892410fe751Hans de Goede		int			gain_valid;
3166c9cac89c009c049a9ad29cdf0f51892410fe751Hans de Goede		unsigned long		last_gain_update; /* In jiffies */
3176c9cac89c009c049a9ad29cdf0f51892410fe751Hans de Goede		s32			last_gain;
3186c9cac89c009c049a9ad29cdf0f51892410fe751Hans de Goede	};
3196c9cac89c009c049a9ad29cdf0f51892410fe751Hans de Goede	struct {
3206c9cac89c009c049a9ad29cdf0f51892410fe751Hans de Goede		/* exposure_auto / exposure cluster */
3216c9cac89c009c049a9ad29cdf0f51892410fe751Hans de Goede		struct v4l2_ctrl	*exposure_auto;
3226c9cac89c009c049a9ad29cdf0f51892410fe751Hans de Goede		struct v4l2_ctrl	*exposure;
3236c9cac89c009c049a9ad29cdf0f51892410fe751Hans de Goede		int			exposure_valid;
3246c9cac89c009c049a9ad29cdf0f51892410fe751Hans de Goede		unsigned long		last_exposure_update; /* In jiffies */
3256c9cac89c009c049a9ad29cdf0f51892410fe751Hans de Goede		s32			last_exposure;
3266c9cac89c009c049a9ad29cdf0f51892410fe751Hans de Goede	};
3276c9cac89c009c049a9ad29cdf0f51892410fe751Hans de Goede	struct v4l2_ctrl		*colorfx;
3286c9cac89c009c049a9ad29cdf0f51892410fe751Hans de Goede	struct {
3296c9cac89c009c049a9ad29cdf0f51892410fe751Hans de Goede		/* autocontour/contour cluster */
3306c9cac89c009c049a9ad29cdf0f51892410fe751Hans de Goede		struct v4l2_ctrl	*autocontour;
3316c9cac89c009c049a9ad29cdf0f51892410fe751Hans de Goede		struct v4l2_ctrl	*contour;
3326c9cac89c009c049a9ad29cdf0f51892410fe751Hans de Goede	};
3336c9cac89c009c049a9ad29cdf0f51892410fe751Hans de Goede	struct v4l2_ctrl		*backlight;
3346c9cac89c009c049a9ad29cdf0f51892410fe751Hans de Goede	struct v4l2_ctrl		*flicker;
3356c9cac89c009c049a9ad29cdf0f51892410fe751Hans de Goede	struct v4l2_ctrl		*noise_reduction;
3366c9cac89c009c049a9ad29cdf0f51892410fe751Hans de Goede	struct v4l2_ctrl		*save_user;
3376c9cac89c009c049a9ad29cdf0f51892410fe751Hans de Goede	struct v4l2_ctrl		*restore_user;
3386c9cac89c009c049a9ad29cdf0f51892410fe751Hans de Goede	struct v4l2_ctrl		*restore_factory;
339f4af65958a6ea987ff61504ad9f053f8ba8da674Hans de Goede	struct v4l2_ctrl		*awb_speed;
340f4af65958a6ea987ff61504ad9f053f8ba8da674Hans de Goede	struct v4l2_ctrl		*awb_delay;
341294e289602d7827f1389b081535fda3b7553a651Hans de Goede	struct {
342294e289602d7827f1389b081535fda3b7553a651Hans de Goede		/* motor control cluster */
343294e289602d7827f1389b081535fda3b7553a651Hans de Goede		struct v4l2_ctrl	*motor_pan;
344294e289602d7827f1389b081535fda3b7553a651Hans de Goede		struct v4l2_ctrl	*motor_tilt;
345294e289602d7827f1389b081535fda3b7553a651Hans de Goede		struct v4l2_ctrl	*motor_pan_reset;
346294e289602d7827f1389b081535fda3b7553a651Hans de Goede		struct v4l2_ctrl	*motor_tilt_reset;
347294e289602d7827f1389b081535fda3b7553a651Hans de Goede	};
3486c9cac89c009c049a9ad29cdf0f51892410fe751Hans de Goede	/* CODEC3 models have both gain and exposure controlled by autogain */
3496c9cac89c009c049a9ad29cdf0f51892410fe751Hans de Goede	struct v4l2_ctrl		*autogain_expo_cluster[3];
3501da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds};
3511da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
3522b455db6d456ef2d44808a8377fd3bc832e08317Luc Saillard/* Global variables */
35305ad390724d1f307111a322325df83282a1479e6Trent Piepho#ifdef CONFIG_USB_PWC_DEBUG
3541da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsextern int pwc_trace;
3552b455db6d456ef2d44808a8377fd3bc832e08317Luc Saillard#endif
3561da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
357c20d78cde37018caa0313469c9320424995cc489Hans de Goedeint pwc_test_n_set_capt_file(struct pwc_device *pdev, struct file *file);
358c20d78cde37018caa0313469c9320424995cc489Hans de Goede
3591da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/** Functions in pwc-misc.c */
3601da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/* sizes in pixels */
361795e6eb3262d3b7247ce450835eea6df6571d103Hans de Goedeextern const int pwc_image_sizes[PSZ_MAX][2];
3621da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
363795e6eb3262d3b7247ce450835eea6df6571d103Hans de Goedeint pwc_get_size(struct pwc_device *pdev, int width, int height);
3641da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsvoid pwc_construct(struct pwc_device *pdev);
3651da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
3661da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/** Functions in pwc-ctrl.c */
3671da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/* Request a certain video mode. Returns < 0 if not possible */
368dc8a7e83aaf8bb1bcf7163bda8926a6dd29c409bHans de Goedeextern int pwc_set_video_mode(struct pwc_device *pdev, int width, int height,
369938d5b9e7c2e20a7e609ad5874c6e7d8d391e6e9Hans de Goede	int pixfmt, int frames, int *compression, int send_to_cam);
3709ee6d78cd4112c0f5a257a01383c64dadbf66da9Luc Saillardextern unsigned int pwc_get_fps(struct pwc_device *pdev, unsigned int index, unsigned int size);
3711da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsextern int pwc_set_leds(struct pwc_device *pdev, int on_value, int off_value);
3721da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsextern int pwc_get_cmos_sensor(struct pwc_device *pdev, int *sensor);
373294e289602d7827f1389b081535fda3b7553a651Hans de Goedeextern int send_control_msg(struct pwc_device *pdev,
374294e289602d7827f1389b081535fda3b7553a651Hans de Goede			    u8 request, u16 value, void *buf, int buflen);
3756c9cac89c009c049a9ad29cdf0f51892410fe751Hans de Goede
3766c9cac89c009c049a9ad29cdf0f51892410fe751Hans de Goede/* Control get / set helpers */
3776c9cac89c009c049a9ad29cdf0f51892410fe751Hans de Goedeint pwc_get_u8_ctrl(struct pwc_device *pdev, u8 request, u16 value, int *data);
3786c9cac89c009c049a9ad29cdf0f51892410fe751Hans de Goedeint pwc_set_u8_ctrl(struct pwc_device *pdev, u8 request, u16 value, u8 data);
3796c9cac89c009c049a9ad29cdf0f51892410fe751Hans de Goedeint pwc_get_s8_ctrl(struct pwc_device *pdev, u8 request, u16 value, int *data);
3806c9cac89c009c049a9ad29cdf0f51892410fe751Hans de Goede#define pwc_set_s8_ctrl pwc_set_u8_ctrl
3816c9cac89c009c049a9ad29cdf0f51892410fe751Hans de Goedeint pwc_get_u16_ctrl(struct pwc_device *pdev, u8 request, u16 value, int *dat);
3826c9cac89c009c049a9ad29cdf0f51892410fe751Hans de Goedeint pwc_set_u16_ctrl(struct pwc_device *pdev, u8 request, u16 value, u16 data);
3836c9cac89c009c049a9ad29cdf0f51892410fe751Hans de Goedeint pwc_button_ctrl(struct pwc_device *pdev, u16 value);
3846c9cac89c009c049a9ad29cdf0f51892410fe751Hans de Goedeint pwc_init_controls(struct pwc_device *pdev);
3851da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
3861da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/* Power down or up the camera; not supported by all models */
3873b4d0ec79113e77b3fe90749ae00bfa015c73048Hans de Goedeextern void pwc_camera_power(struct pwc_device *pdev, int power);
3881da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
389afa38521614dcdfe12c765ff76d4c137a056e905Hans Verkuilextern const struct v4l2_ioctl_ops pwc_ioctl_ops;
3901da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
3911da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/** pwc-uncompress.c */
3921da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/* Expand frame to image, possibly including decompression. Uses read_frame and fill_image */
393885fe18f5542fe283a17f70583383c6cadcba1c3Hans de Goedeint pwc_decompress(struct pwc_device *pdev, struct pwc_frame_buf *fbuf);
3941da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
3951da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#endif
396