summaryrefslogtreecommitdiff
path: root/linux/drivers/media
diff options
context:
space:
mode:
authorHans Verkuil <hverkuil@xs4all.nl>2007-02-24 01:27:26 +0100
committerHans Verkuil <hverkuil@xs4all.nl>2007-02-24 01:27:26 +0100
commit2be3674b75c83865e9a131c6c54aaee005df47ed (patch)
treecc5e7a7c47afcd0254c0a40459f5c5629574c26e /linux/drivers/media
parentf3e6f8836e980f471dbd3e9746a40199cd121f72 (diff)
downloadmediapointer-dvb-s2-2be3674b75c83865e9a131c6c54aaee005df47ed.tar.gz
mediapointer-dvb-s2-2be3674b75c83865e9a131c6c54aaee005df47ed.tar.bz2
Add support for VIDIOC_G_CHIP_IDENT
From: Hans Verkuil <hverkuil@xs4all.nl> VIDIOC_G_CHIP_IDENT improves debugging of card problems: it can be used to detect which chips are on the board and based on that information selected register dumps can be made, making it easy to debug complicated media chips containing tens or hundreds of registers. This ioctl replaces the internal VIDIOC_INT_G_CHIP_IDENT ioctl. Signed-off-by: Hans Verkuil <hverkuil@xs4all.nl> CC: Jonathan Corbet <corbet@lwn.net>
Diffstat (limited to 'linux/drivers/media')
-rw-r--r--linux/drivers/media/video/cafe_ccic.c7
-rw-r--r--linux/drivers/media/video/cx25840/cx25840-core.c15
-rw-r--r--linux/drivers/media/video/cx25840/cx25840-core.h3
-rw-r--r--linux/drivers/media/video/ov7670.c12
-rw-r--r--linux/drivers/media/video/saa7115.c15
-rw-r--r--linux/drivers/media/video/saa7127.c14
-rw-r--r--linux/drivers/media/video/v4l2-common.c3
-rw-r--r--linux/drivers/media/video/videodev.c10
8 files changed, 63 insertions, 16 deletions
diff --git a/linux/drivers/media/video/cafe_ccic.c b/linux/drivers/media/video/cafe_ccic.c
index a21d1b5b7..5f35836ad 100644
--- a/linux/drivers/media/video/cafe_ccic.c
+++ b/linux/drivers/media/video/cafe_ccic.c
@@ -23,6 +23,7 @@
#include <linux/videodev2.h>
#include "compat.h"
#include <media/v4l2-common.h>
+#include <media/v4l2-chip-ident.h>
#include <linux/device.h>
#include <linux/wait.h>
#include <linux/list.h>
@@ -165,7 +166,7 @@ struct cafe_camera
struct tasklet_struct s_tasklet;
/* Current operating parameters */
- enum v4l2_chip_ident sensor_type; /* Currently ov7670 only */
+ u32 sensor_type; /* Currently ov7670 only */
struct v4l2_pix_format pix_format;
/* Locks */
@@ -825,6 +826,7 @@ static int __cafe_cam_reset(struct cafe_camera *cam)
*/
static int cafe_cam_init(struct cafe_camera *cam)
{
+ struct v4l2_chip_ident chip = { V4L2_CHIP_MATCH_ALWAYS };
int ret;
mutex_lock(&cam->s_mutex);
@@ -834,9 +836,10 @@ static int cafe_cam_init(struct cafe_camera *cam)
ret = __cafe_cam_reset(cam);
if (ret)
goto out;
- ret = __cafe_cam_cmd(cam, VIDIOC_INT_G_CHIP_IDENT, &cam->sensor_type);
+ ret = __cafe_cam_cmd(cam, VIDIOC_G_CHIP_IDENT, &chip);
if (ret)
goto out;
+ cam->sensor_type = chip.ident;
// if (cam->sensor->addr != OV7xx0_SID) {
if (cam->sensor_type != V4L2_IDENT_OV7670) {
cam_err(cam, "Unsupported sensor type %d", cam->sensor->addr);
diff --git a/linux/drivers/media/video/cx25840/cx25840-core.c b/linux/drivers/media/video/cx25840/cx25840-core.c
index 5fafe6b23..d5a0789bc 100644
--- a/linux/drivers/media/video/cx25840/cx25840-core.c
+++ b/linux/drivers/media/video/cx25840/cx25840-core.c
@@ -35,6 +35,7 @@
#include <linux/videodev2.h>
#include <linux/i2c.h>
#include <media/v4l2-common.h>
+#include <media/v4l2-chip-ident.h>
#include <media/cx25840.h>
#include "compat.h"
#if LINUX_VERSION_CODE < KERNEL_VERSION(2,5,0)
@@ -838,9 +839,16 @@ static int cx25840_command(struct i2c_client *client, unsigned int cmd,
cx25840_initialize(client, 0);
break;
- case VIDIOC_INT_G_CHIP_IDENT:
- *(enum v4l2_chip_ident *)arg = state->id;
+ case VIDIOC_G_CHIP_IDENT:
+ {
+ struct v4l2_chip_ident *chip = arg;
+
+ if (!v4l2_chip_match_i2c_client(client, chip->match_type, chip->match_chip))
+ return -EINVAL;
+ chip->ident = state->id;
+ chip->revision = state->rev;
break;
+ }
default:
return -EINVAL;
@@ -861,7 +869,7 @@ static int cx25840_detect_client(struct i2c_adapter *adapter, int address,
{
struct i2c_client *client;
struct cx25840_state *state;
- enum v4l2_chip_ident id;
+ u32 id;
u16 device_id;
/* Check if the adapter supports the needed features
@@ -923,6 +931,7 @@ static int cx25840_detect_client(struct i2c_adapter *adapter, int address,
state->audmode = V4L2_TUNER_MODE_LANG1;
state->vbi_line_offset = 8;
state->id = id;
+ state->rev = device_id;
i2c_attach_client(client);
diff --git a/linux/drivers/media/video/cx25840/cx25840-core.h b/linux/drivers/media/video/cx25840/cx25840-core.h
index 2bfedc95d..bcb624124 100644
--- a/linux/drivers/media/video/cx25840/cx25840-core.h
+++ b/linux/drivers/media/video/cx25840/cx25840-core.h
@@ -44,7 +44,8 @@ struct cx25840_state {
u32 audclk_freq;
int audmode;
int vbi_line_offset;
- enum v4l2_chip_ident id;
+ u32 id;
+ u32 rev;
int is_cx25836;
};
diff --git a/linux/drivers/media/video/ov7670.c b/linux/drivers/media/video/ov7670.c
index 1fee42eaa..d68f36851 100644
--- a/linux/drivers/media/video/ov7670.c
+++ b/linux/drivers/media/video/ov7670.c
@@ -16,6 +16,7 @@
#include <linux/videodev.h>
#include "compat.h"
#include <media/v4l2-common.h>
+#include <media/v4l2-chip-ident.h>
#include <linux/i2c.h>
@@ -1314,9 +1315,16 @@ static int ov7670_command(struct i2c_client *client, unsigned int cmd,
void *arg)
{
switch (cmd) {
- case VIDIOC_INT_G_CHIP_IDENT:
- * (enum v4l2_chip_ident *) arg = V4L2_IDENT_OV7670;
+ case VIDIOC_G_CHIP_IDENT:
+ {
+ struct v4l2_chip_ident *chip = arg;
+
+ if (!v4l2_chip_match_i2c_client(client, chip->match_type, chip->match_chip))
+ return -EINVAL;
+ chip->ident = V4L2_IDENT_OV7670;
+ chip->revision = 0;
return 0;
+ }
case VIDIOC_INT_RESET:
ov7670_reset(client);
diff --git a/linux/drivers/media/video/saa7115.c b/linux/drivers/media/video/saa7115.c
index 8e92c91ed..8b4abb3a1 100644
--- a/linux/drivers/media/video/saa7115.c
+++ b/linux/drivers/media/video/saa7115.c
@@ -45,6 +45,7 @@
#include <linux/i2c.h>
#include <linux/videodev2.h>
#include <media/v4l2-common.h>
+#include <media/v4l2-chip-ident.h>
#include <media/saa7115.h>
#if LINUX_VERSION_CODE < KERNEL_VERSION(2,5,0)
#include "i2c-compat.h"
@@ -91,7 +92,7 @@ struct saa711x_state {
int sat;
int width;
int height;
- enum v4l2_chip_ident ident;
+ u32 ident;
u32 audclk_freq;
u32 crystal_freq;
u8 ucgc;
@@ -1243,7 +1244,6 @@ static void saa711x_decode_vbi_line(struct i2c_client *client,
static int saa711x_command(struct i2c_client *client, unsigned int cmd, void *arg)
{
struct saa711x_state *state = i2c_get_clientdata(client);
- int *iarg = arg;
/* ioctls to allow direct access to the saa7115 registers for testing */
switch (cmd) {
@@ -1448,9 +1448,16 @@ static int saa711x_command(struct i2c_client *client, unsigned int cmd, void *ar
}
#endif
- case VIDIOC_INT_G_CHIP_IDENT:
- *iarg = state->ident;
+ case VIDIOC_G_CHIP_IDENT:
+ {
+ struct v4l2_chip_ident *chip = arg;
+
+ if (!v4l2_chip_match_i2c_client(client, chip->match_type, chip->match_chip))
+ return -EINVAL;
+ chip->ident = state->ident;
+ chip->revision = 0;
break;
+ }
default:
return -EINVAL;
diff --git a/linux/drivers/media/video/saa7127.c b/linux/drivers/media/video/saa7127.c
index 455c6f74a..28306f15d 100644
--- a/linux/drivers/media/video/saa7127.c
+++ b/linux/drivers/media/video/saa7127.c
@@ -54,6 +54,7 @@
#include <linux/i2c.h>
#include <linux/videodev2.h>
#include <media/v4l2-common.h>
+#include <media/v4l2-chip-ident.h>
#include <media/saa7127.h>
#if LINUX_VERSION_CODE < KERNEL_VERSION(2,5,0)
#include "i2c-compat.h"
@@ -246,7 +247,7 @@ static struct i2c_reg_value saa7127_init_config_50hz[] = {
struct saa7127_state {
v4l2_std_id std;
- enum v4l2_chip_ident ident;
+ u32 ident;
enum saa7127_input_type input_type;
enum saa7127_output_type output_type;
int video_enable;
@@ -662,9 +663,16 @@ static int saa7127_command(struct i2c_client *client,
break;
}
- case VIDIOC_INT_G_CHIP_IDENT:
- *(enum v4l2_chip_ident *)arg = state->ident;
+ case VIDIOC_G_CHIP_IDENT:
+ {
+ struct v4l2_chip_ident *chip = arg;
+
+ if (!v4l2_chip_match_i2c_client(client, chip->match_type, chip->match_chip))
+ return -EINVAL;
+ chip->ident = state->ident;
+ chip->revision = 0;
break;
+ }
default:
return -EINVAL;
diff --git a/linux/drivers/media/video/v4l2-common.c b/linux/drivers/media/video/v4l2-common.c
index 6df4d7ea1..b2d57d888 100644
--- a/linux/drivers/media/video/v4l2-common.c
+++ b/linux/drivers/media/video/v4l2-common.c
@@ -410,6 +410,8 @@ static const char *v4l2_ioctls[] = {
[_IOC_NR(VIDIOC_DBG_S_REGISTER)] = "VIDIOC_DBG_S_REGISTER",
[_IOC_NR(VIDIOC_DBG_G_REGISTER)] = "VIDIOC_DBG_G_REGISTER",
+
+ [_IOC_NR(VIDIOC_G_CHIP_IDENT)] = "VIDIOC_G_CHIP_IDENT",
#endif
};
#define V4L2_IOCTLS ARRAY_SIZE(v4l2_ioctls)
@@ -440,7 +442,6 @@ static const char *v4l2_int_ioctls[] = {
[_IOC_NR(VIDIOC_INT_DECODE_VBI_LINE)] = "VIDIOC_INT_DECODE_VBI_LINE",
[_IOC_NR(VIDIOC_INT_S_VBI_DATA)] = "VIDIOC_INT_S_VBI_DATA",
[_IOC_NR(VIDIOC_INT_G_VBI_DATA)] = "VIDIOC_INT_G_VBI_DATA",
- [_IOC_NR(VIDIOC_INT_G_CHIP_IDENT)] = "VIDIOC_INT_G_CHIP_IDENT",
[_IOC_NR(VIDIOC_INT_I2S_CLOCK_FREQ)] = "VIDIOC_INT_I2S_CLOCK_FREQ",
[_IOC_NR(VIDIOC_INT_S_STANDBY)] = "VIDIOC_INT_S_STANDBY",
[_IOC_NR(VIDIOC_INT_S_AUDIO_ROUTING)] = "VIDIOC_INT_S_AUDIO_ROUTING",
diff --git a/linux/drivers/media/video/videodev.c b/linux/drivers/media/video/videodev.c
index b1cd0bb72..acb3c4fbf 100644
--- a/linux/drivers/media/video/videodev.c
+++ b/linux/drivers/media/video/videodev.c
@@ -1555,6 +1555,16 @@ static int __video_do_ioctl(struct inode *inode, struct file *file,
break;
}
#endif
+ case VIDIOC_G_CHIP_IDENT:
+ {
+ struct v4l2_chip_ident *p=arg;
+ if (!vfd->vidioc_g_chip_ident)
+ break;
+ ret=vfd->vidioc_g_chip_ident(file, fh, p);
+ if (!ret)
+ dbgarg (cmd, "chip_ident=%u, revision=0x%x\n", p->ident, p->revision);
+ break;
+ }
} /* switch */
if (vfd->debug & V4L2_DEBUG_IOCTL_ARG) {