Commit 0d58cef6 authored by Amerigo Wang's avatar Amerigo Wang Committed by Mauro Carvalho Chehab

V4L/DVB: Remove obsolete zc0301 v4l driver

On 05/29/10 01:30, Jean-Francois Moine wrote:
> On Fri, 28 May 2010 13:03:28 -0400
> Amerigo Wang<amwang@redhat.com>  wrote:
>
>> Subject: [PATCH 6/6] Remove obsolete zc0301 v4l driver
>>
>> Duplicate functionality with the gspca_zc3xx driver, zc0301 only
>> supports 2 USB-ID's (because it only supports a limited set of
>> sensors) wich are also supported by the gspca_zc3xx driver
>> (which supports 53 USB-ID's in total).
>
> You forgot to remove the conditionnal compilation in the gspca_zc3xx
> driver (USB_DEVICE(0x046d, 0x08ae) in gspca/zc3xx.c)
>

Right, thanks for pointing this out!

Attached is the updated patch, please use this one instead.

Thanks!

Duplicate functionality with the gspca_zc3xx driver, zc0301 only
supports 2 USB-ID's (because it only supports a limited set of
sensors) wich are also supported by the gspca_zc3xx driver
(which supports 53 USB-ID's in total).
Signed-off-by: default avatarAmerigo Wang <amwang@redhat.com>
Signed-off-by: default avatarMauro Carvalho Chehab <mchehab@redhat.com>
parent a9607609
......@@ -459,17 +459,6 @@ Who: Corentin Chary <corentin.chary@gmail.com>
----------------------------
What: zc0301 v4l driver
When: 2.6.35
Files: drivers/media/video/zc0301/*
Why: Duplicate functionality with the gspca_zc3xx driver, zc0301 only
supports 2 USB-ID's (because it only supports a limited set of
sensors) wich are also supported by the gspca_zc3xx driver
(which supports 53 USB-ID's in total)
Who: Hans de Goede <hdegoede@redhat.com>
----------------------------
What: sysfs-class-rfkill state file
When: Feb 2014
Files: net/rfkill/core.c
......
......@@ -1014,8 +1014,6 @@ config USB_SE401
source "drivers/media/video/sn9c102/Kconfig"
source "drivers/media/video/zc0301/Kconfig"
source "drivers/media/video/pwc/Kconfig"
config USB_ZR364XX
......
......@@ -133,7 +133,6 @@ obj-$(CONFIG_USB_STKWEBCAM) += stkwebcam.o
obj-$(CONFIG_USB_SN9C102) += sn9c102/
obj-$(CONFIG_USB_ET61X251) += et61x251/
obj-$(CONFIG_USB_PWC) += pwc/
obj-$(CONFIG_USB_ZC0301) += zc0301/
obj-$(CONFIG_USB_GSPCA) += gspca/
obj-$(CONFIG_VIDEO_HDPVR) += hdpvr/
......
......@@ -7193,9 +7193,7 @@ static const __devinitdata struct usb_device_id device_table[] = {
{USB_DEVICE(0x046d, 0x08aa)},
{USB_DEVICE(0x046d, 0x08ac)},
{USB_DEVICE(0x046d, 0x08ad)},
#if !defined CONFIG_USB_ZC0301 && !defined CONFIG_USB_ZC0301_MODULE
{USB_DEVICE(0x046d, 0x08ae)},
#endif
{USB_DEVICE(0x046d, 0x08af)},
{USB_DEVICE(0x046d, 0x08b9)},
{USB_DEVICE(0x046d, 0x08d7)},
......
config USB_ZC0301
tristate "USB ZC0301[P] webcam support (DEPRECATED)"
depends on VIDEO_V4L2
default n
---help---
This driver is DEPRECATED please use the gspca zc3xx module
instead.
Say Y here if you want support for cameras based on the ZC0301 or
ZC0301P Image Processors and Control Chips.
See <file:Documentation/video4linux/zc0301.txt> for more info.
To compile this driver as a module, choose M here: the
module will be called zc0301.
zc0301-objs := zc0301_core.o zc0301_pb0330.o zc0301_pas202bcb.o
obj-$(CONFIG_USB_ZC0301) += zc0301.o
/***************************************************************************
* V4L2 driver for ZC0301[P] Image Processor and Control Chip *
* *
* Copyright (C) 2006-2007 by Luca Risolia <luca.risolia@studio.unibo.it> *
* *
* This program is free software; you can redistribute it and/or modify *
* it under the terms of the GNU General Public License as published by *
* the Free Software Foundation; either version 2 of the License, or *
* (at your option) any later version. *
* *
* This program is distributed in the hope that it will be useful, *
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
* GNU General Public License for more details. *
* *
* You should have received a copy of the GNU General Public License *
* along with this program; if not, write to the Free Software *
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. *
***************************************************************************/
#ifndef _ZC0301_H_
#define _ZC0301_H_
#include <linux/version.h>
#include <linux/usb.h>
#include <linux/videodev2.h>
#include <media/v4l2-common.h>
#include <media/v4l2-ioctl.h>
#include <linux/device.h>
#include <linux/list.h>
#include <linux/spinlock.h>
#include <linux/time.h>
#include <linux/wait.h>
#include <linux/types.h>
#include <linux/param.h>
#include <linux/mutex.h>
#include <linux/rwsem.h>
#include <linux/stddef.h>
#include <linux/string.h>
#include <linux/kref.h>
#include "zc0301_sensor.h"
/*****************************************************************************/
#define ZC0301_DEBUG
#define ZC0301_DEBUG_LEVEL 2
#define ZC0301_MAX_DEVICES 64
#define ZC0301_FORCE_MUNMAP 0
#define ZC0301_MAX_FRAMES 32
#define ZC0301_COMPRESSION_QUALITY 0
#define ZC0301_URBS 2
#define ZC0301_ISO_PACKETS 7
#define ZC0301_ALTERNATE_SETTING 7
#define ZC0301_URB_TIMEOUT msecs_to_jiffies(2 * ZC0301_ISO_PACKETS)
#define ZC0301_CTRL_TIMEOUT 100
#define ZC0301_FRAME_TIMEOUT 2
/*****************************************************************************/
ZC0301_ID_TABLE
ZC0301_SENSOR_TABLE
enum zc0301_frame_state {
F_UNUSED,
F_QUEUED,
F_GRABBING,
F_DONE,
F_ERROR,
};
struct zc0301_frame_t {
void* bufmem;
struct v4l2_buffer buf;
enum zc0301_frame_state state;
struct list_head frame;
unsigned long vma_use_count;
};
enum zc0301_dev_state {
DEV_INITIALIZED = 0x01,
DEV_DISCONNECTED = 0x02,
DEV_MISCONFIGURED = 0x04,
};
enum zc0301_io_method {
IO_NONE,
IO_READ,
IO_MMAP,
};
enum zc0301_stream_state {
STREAM_OFF,
STREAM_INTERRUPT,
STREAM_ON,
};
struct zc0301_module_param {
u8 force_munmap;
u16 frame_timeout;
};
static DECLARE_RWSEM(zc0301_dev_lock);
struct zc0301_device {
struct video_device* v4ldev;
struct zc0301_sensor sensor;
struct usb_device* usbdev;
struct urb* urb[ZC0301_URBS];
void* transfer_buffer[ZC0301_URBS];
u8* control_buffer;
struct zc0301_frame_t *frame_current, frame[ZC0301_MAX_FRAMES];
struct list_head inqueue, outqueue;
u32 frame_count, nbuffers, nreadbuffers;
enum zc0301_io_method io;
enum zc0301_stream_state stream;
struct v4l2_jpegcompression compression;
struct zc0301_module_param module_param;
struct kref kref;
enum zc0301_dev_state state;
u8 users;
struct completion probe;
struct mutex open_mutex, fileop_mutex;
spinlock_t queue_lock;
wait_queue_head_t wait_open, wait_frame, wait_stream;
};
/*****************************************************************************/
struct zc0301_device*
zc0301_match_id(struct zc0301_device* cam, const struct usb_device_id *id)
{
return usb_match_id(usb_ifnum_to_if(cam->usbdev, 0), id) ? cam : NULL;
}
void
zc0301_attach_sensor(struct zc0301_device* cam, struct zc0301_sensor* sensor)
{
memcpy(&cam->sensor, sensor, sizeof(struct zc0301_sensor));
}
/*****************************************************************************/
#undef DBG
#undef KDBG
#ifdef ZC0301_DEBUG
# define DBG(level, fmt, args...) \
do { \
if (debug >= (level)) { \
if ((level) == 1) \
dev_err(&cam->usbdev->dev, fmt "\n", ## args); \
else if ((level) == 2) \
dev_info(&cam->usbdev->dev, fmt "\n", ## args); \
else if ((level) >= 3) \
dev_info(&cam->usbdev->dev, "[%s:%s:%d] " fmt "\n", \
__FILE__, __func__, __LINE__ , ## args); \
} \
} while (0)
# define KDBG(level, fmt, args...) \
do { \
if (debug >= (level)) { \
if ((level) == 1 || (level) == 2) \
pr_info("zc0301: " fmt "\n", ## args); \
else if ((level) == 3) \
pr_debug("sn9c102: [%s:%s:%d] " fmt "\n", __FILE__, \
__func__, __LINE__ , ## args); \
} \
} while (0)
# define V4LDBG(level, name, cmd) \
do { \
if (debug >= (level)) \
v4l_print_ioctl(name, cmd); \
} while (0)
#else
# define DBG(level, fmt, args...) do {;} while(0)
# define KDBG(level, fmt, args...) do {;} while(0)
# define V4LDBG(level, name, cmd) do {;} while(0)
#endif
#undef PDBG
#define PDBG(fmt, args...) \
dev_info(&cam->usbdev->dev, "[%s:%s:%d] " fmt "\n", __FILE__, __func__, \
__LINE__ , ## args)
#undef PDBGG
#define PDBGG(fmt, args...) do {;} while(0) /* placeholder */
#endif /* _ZC0301_H_ */
This diff is collapsed.
This diff is collapsed.
/***************************************************************************
* Plug-in for PB-0330 image sensor connected to the ZC0301P Image *
* Processor and Control Chip *
* *
* Copyright (C) 2006-2007 by Luca Risolia <luca.risolia@studio.unibo.it> *
* *
* Initialization values of the ZC0301[P] have been taken from the SPCA5XX *
* driver maintained by Michel Xhaard <mxhaard@magic.fr> *
* *
* This program is free software; you can redistribute it and/or modify *
* it under the terms of the GNU General Public License as published by *
* the Free Software Foundation; either version 2 of the License, or *
* (at your option) any later version. *
* *
* This program is distributed in the hope that it will be useful, *
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
* GNU General Public License for more details. *
* *
* You should have received a copy of the GNU General Public License *
* along with this program; if not, write to the Free Software *
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. *
***************************************************************************/
#include <linux/delay.h>
#include "zc0301_sensor.h"
static struct zc0301_sensor pb0330;
static int pb0330_init(struct zc0301_device* cam)
{
int err = 0;
err += zc0301_write_reg(cam, 0x0000, 0x01);
err += zc0301_write_reg(cam, 0x0008, 0x03);
err += zc0301_write_reg(cam, 0x0010, 0x0A);
err += zc0301_write_reg(cam, 0x0002, 0x00);
err += zc0301_write_reg(cam, 0x0003, 0x02);
err += zc0301_write_reg(cam, 0x0004, 0x80);
err += zc0301_write_reg(cam, 0x0005, 0x01);
err += zc0301_write_reg(cam, 0x0006, 0xE0);
err += zc0301_write_reg(cam, 0x0001, 0x01);
err += zc0301_write_reg(cam, 0x0012, 0x05);
err += zc0301_write_reg(cam, 0x0012, 0x07);
err += zc0301_write_reg(cam, 0x0098, 0x00);
err += zc0301_write_reg(cam, 0x009A, 0x00);
err += zc0301_write_reg(cam, 0x011A, 0x00);
err += zc0301_write_reg(cam, 0x011C, 0x00);
err += zc0301_write_reg(cam, 0x0012, 0x05);
err += zc0301_i2c_write(cam, 0x01, 0x0006);
err += zc0301_i2c_write(cam, 0x02, 0x0011);
err += zc0301_i2c_write(cam, 0x03, 0x01E7);
err += zc0301_i2c_write(cam, 0x04, 0x0287);
err += zc0301_i2c_write(cam, 0x06, 0x0003);
err += zc0301_i2c_write(cam, 0x07, 0x3002);
err += zc0301_i2c_write(cam, 0x20, 0x1100);
err += zc0301_i2c_write(cam, 0x2F, 0xF7B0);
err += zc0301_i2c_write(cam, 0x30, 0x0005);
err += zc0301_i2c_write(cam, 0x31, 0x0000);
err += zc0301_i2c_write(cam, 0x34, 0x0100);
err += zc0301_i2c_write(cam, 0x35, 0x0060);
err += zc0301_i2c_write(cam, 0x3D, 0x068F);
err += zc0301_i2c_write(cam, 0x40, 0x01E0);
err += zc0301_i2c_write(cam, 0x58, 0x0078);
err += zc0301_i2c_write(cam, 0x62, 0x0411);
err += zc0301_write_reg(cam, 0x0087, 0x10);
err += zc0301_write_reg(cam, 0x0101, 0x37);
err += zc0301_write_reg(cam, 0x0012, 0x05);
err += zc0301_write_reg(cam, 0x0100, 0x0D);
err += zc0301_write_reg(cam, 0x0189, 0x06);
err += zc0301_write_reg(cam, 0x01AD, 0x00);
err += zc0301_write_reg(cam, 0x01C5, 0x03);
err += zc0301_write_reg(cam, 0x01CB, 0x13);
err += zc0301_write_reg(cam, 0x0250, 0x08);
err += zc0301_write_reg(cam, 0x0301, 0x08);
err += zc0301_write_reg(cam, 0x01A8, 0x60);
err += zc0301_write_reg(cam, 0x018D, 0x6C);
err += zc0301_write_reg(cam, 0x01AD, 0x09);
err += zc0301_write_reg(cam, 0x01AE, 0x15);
err += zc0301_write_reg(cam, 0x010A, 0x50);
err += zc0301_write_reg(cam, 0x010B, 0xF8);
err += zc0301_write_reg(cam, 0x010C, 0xF8);
err += zc0301_write_reg(cam, 0x010D, 0xF8);
err += zc0301_write_reg(cam, 0x010E, 0x50);
err += zc0301_write_reg(cam, 0x010F, 0xF8);
err += zc0301_write_reg(cam, 0x0110, 0xF8);
err += zc0301_write_reg(cam, 0x0111, 0xF8);
err += zc0301_write_reg(cam, 0x0112, 0x50);
err += zc0301_write_reg(cam, 0x0008, 0x03);
err += zc0301_write_reg(cam, 0x01C6, 0x08);
err += zc0301_write_reg(cam, 0x01CB, 0x0F);
err += zc0301_write_reg(cam, 0x010A, 0x50);
err += zc0301_write_reg(cam, 0x010B, 0xF8);
err += zc0301_write_reg(cam, 0x010C, 0xF8);
err += zc0301_write_reg(cam, 0x010D, 0xF8);
err += zc0301_write_reg(cam, 0x010E, 0x50);
err += zc0301_write_reg(cam, 0x010F, 0xF8);
err += zc0301_write_reg(cam, 0x0110, 0xF8);
err += zc0301_write_reg(cam, 0x0111, 0xF8);
err += zc0301_write_reg(cam, 0x0112, 0x50);
err += zc0301_write_reg(cam, 0x0180, 0x00);
err += zc0301_write_reg(cam, 0x0019, 0x00);
err += zc0301_i2c_write(cam, 0x05, 0x0066);
err += zc0301_i2c_write(cam, 0x09, 0x02B2);
err += zc0301_i2c_write(cam, 0x10, 0x0002);
err += zc0301_write_reg(cam, 0x011D, 0x60);
err += zc0301_write_reg(cam, 0x0190, 0x00);
err += zc0301_write_reg(cam, 0x0191, 0x07);
err += zc0301_write_reg(cam, 0x0192, 0x8C);
err += zc0301_write_reg(cam, 0x0195, 0x00);
err += zc0301_write_reg(cam, 0x0196, 0x00);
err += zc0301_write_reg(cam, 0x0197, 0x8A);
err += zc0301_write_reg(cam, 0x018C, 0x10);
err += zc0301_write_reg(cam, 0x018F, 0x20);
err += zc0301_write_reg(cam, 0x01A9, 0x14);
err += zc0301_write_reg(cam, 0x01AA, 0x24);
err += zc0301_write_reg(cam, 0x001D, 0xD7);
err += zc0301_write_reg(cam, 0x001E, 0xF0);
err += zc0301_write_reg(cam, 0x001F, 0xF8);
err += zc0301_write_reg(cam, 0x0020, 0xFF);
err += zc0301_write_reg(cam, 0x01AD, 0x09);
err += zc0301_write_reg(cam, 0x01AE, 0x15);
err += zc0301_write_reg(cam, 0x0180, 0x40);
err += zc0301_write_reg(cam, 0x0180, 0x42);
msleep(100);
return err;
}
static struct zc0301_sensor pb0330 = {
.name = "PB-0330",
.init = &pb0330_init,
.cropcap = {
.bounds = {
.left = 0,
.top = 0,
.width = 640,
.height = 480,
},
.defrect = {
.left = 0,
.top = 0,
.width = 640,
.height = 480,
},
},
.pix_format = {
.width = 640,
.height = 480,
.pixelformat = V4L2_PIX_FMT_JPEG,
.priv = 8,
.colorspace = V4L2_COLORSPACE_JPEG,
},
};
int zc0301_probe_pb0330(struct zc0301_device* cam)
{
int r0, err = 0;
err += zc0301_write_reg(cam, 0x0000, 0x01);
err += zc0301_write_reg(cam, 0x0010, 0x0a);
err += zc0301_write_reg(cam, 0x0001, 0x01);
err += zc0301_write_reg(cam, 0x0012, 0x03);
err += zc0301_write_reg(cam, 0x0012, 0x01);
msleep(10);
r0 = zc0301_i2c_read(cam, 0x00, 2);
if (r0 < 0 || err)
return -EIO;
if (r0 != 0x8243)
return -ENODEV;
zc0301_attach_sensor(cam, &pb0330);
return 0;
}
/***************************************************************************
* API for image sensors connected to the ZC0301[P] Image Processor and *
* Control Chip *
* *
* Copyright (C) 2006-2007 by Luca Risolia <luca.risolia@studio.unibo.it> *
* *
* This program is free software; you can redistribute it and/or modify *
* it under the terms of the GNU General Public License as published by *
* the Free Software Foundation; either version 2 of the License, or *
* (at your option) any later version. *
* *
* This program is distributed in the hope that it will be useful, *
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
* GNU General Public License for more details. *
* *
* You should have received a copy of the GNU General Public License *
* along with this program; if not, write to the Free Software *
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. *
***************************************************************************/
#ifndef _ZC0301_SENSOR_H_
#define _ZC0301_SENSOR_H_
#include <linux/usb.h>
#include <linux/videodev2.h>
#include <linux/device.h>
#include <linux/stddef.h>
#include <linux/errno.h>
#include <asm/types.h>
struct zc0301_device;
struct zc0301_sensor;
/*****************************************************************************/
extern int zc0301_probe_pas202bcb(struct zc0301_device* cam);
extern int zc0301_probe_pb0330(struct zc0301_device* cam);
#define ZC0301_SENSOR_TABLE \
/* Weak detections must go at the end of the list */ \
static int (*zc0301_sensor_table[])(struct zc0301_device*) = { \
&zc0301_probe_pas202bcb, \
&zc0301_probe_pb0330, \
NULL, \
};
extern struct zc0301_device*
zc0301_match_id(struct zc0301_device* cam, const struct usb_device_id *id);
extern void
zc0301_attach_sensor(struct zc0301_device* cam, struct zc0301_sensor* sensor);
#define ZC0301_USB_DEVICE(vend, prod, intclass) \
.match_flags = USB_DEVICE_ID_MATCH_DEVICE | \
USB_DEVICE_ID_MATCH_INT_CLASS, \
.idVendor = (vend), \
.idProduct = (prod), \
.bInterfaceClass = (intclass)
#if !defined CONFIG_USB_GSPCA_ZC3XX && !defined CONFIG_USB_GSPCA_ZC3XX_MODULE
#define ZC0301_ID_TABLE \
static const struct usb_device_id zc0301_id_table[] = { \
{ ZC0301_USB_DEVICE(0x046d, 0x08ae, 0xff), }, /* PAS202 */ \
{ ZC0301_USB_DEVICE(0x0ac8, 0x303b, 0xff), }, /* PB-0330 */ \
{ } \
};
#else
#define ZC0301_ID_TABLE \
static const struct usb_device_id zc0301_id_table[] = { \
{ ZC0301_USB_DEVICE(0x046d, 0x08ae, 0xff), }, /* PAS202 */ \
{ } \
};
#endif
/*****************************************************************************/
extern int zc0301_write_reg(struct zc0301_device*, u16 index, u16 value);
extern int zc0301_read_reg(struct zc0301_device*, u16 index);
extern int zc0301_i2c_write(struct zc0301_device*, u16 address, u16 value);
extern int zc0301_i2c_read(struct zc0301_device*, u16 address, u8 length);
/*****************************************************************************/
#define ZC0301_MAX_CTRLS (V4L2_CID_LASTP1 - V4L2_CID_BASE + 10)
#define ZC0301_V4L2_CID_DAC_MAGNITUDE (V4L2_CID_PRIVATE_BASE + 0)
#define ZC0301_V4L2_CID_GREEN_BALANCE (V4L2_CID_PRIVATE_BASE + 1)
struct zc0301_sensor {
char name[32];
struct v4l2_queryctrl qctrl[ZC0301_MAX_CTRLS];
struct v4l2_cropcap cropcap;
struct v4l2_pix_format pix_format;
int (*init)(struct zc0301_device*);
int (*get_ctrl)(struct zc0301_device*, struct v4l2_control* ctrl);
int (*set_ctrl)(struct zc0301_device*,
const struct v4l2_control* ctrl);
int (*set_crop)(struct zc0301_device*, const struct v4l2_rect* rect);
/* Private */
struct v4l2_queryctrl _qctrl[ZC0301_MAX_CTRLS];
struct v4l2_rect _rect;
};
#endif /* _ZC0301_SENSOR_H_ */
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment