--- driver/ivtv-ioctl.c.bak 2007-04-14 21:56:46.000000000 -0400 +++ driver/ivtv-ioctl.c 2007-04-14 22:01:37.000000000 -0400 @@ -554,22 +554,22 @@ switch (cmd) { /* ioctls to allow direct access to the encoder registers for testing */ - case VIDIOC_INT_G_REGISTER: - IVTV_DEBUG_IOCTL("VIDIOC_INT_G_REGISTER\n"); - if (reg->i2c_id) - return ivtv_i2c_id(itv, reg->i2c_id, cmd, reg); - return ivtv_itvc(itv, cmd, arg); - - case VIDIOC_INT_S_REGISTER: -#if LINUX_VERSION_CODE <= KERNEL_VERSION(2, 6, 18) - case IVTV_INT_S_REGISTER: - cmd = VIDIOC_INT_S_REGISTER; -#endif - IVTV_DEBUG_IOCTL("VIDIOC_INT_S_REGISTER\n"); - if (reg->i2c_id) - return ivtv_i2c_id(itv, reg->i2c_id, cmd, reg); - return ivtv_itvc(itv, cmd, arg); - + case VIDIOC_INT_G_REGISTER: + IVTV_DEBUG_IOCTL("VIDIOC_INT_G_REGISTER\n"); + if (v4l2_chip_match_host(reg->match_type, reg->match_chip)) + return ivtv_itvc(itv, cmd, arg); + if (reg->match_type == V4L2_CHIP_MATCH_I2C_DRIVER) + return ivtv_i2c_id(itv, reg->match_chip, cmd, arg); + return ivtv_call_i2c_client(itv, reg->match_chip, cmd, arg); + + case VIDIOC_INT_S_REGISTER: + IVTV_DEBUG_IOCTL("VIDIOC_INT_S_REGISTER\n"); + if (v4l2_chip_match_host(reg->match_type, reg->match_chip)) + return ivtv_itvc(itv, cmd, arg); + if (reg->match_type == V4L2_CHIP_MATCH_I2C_DRIVER) + return ivtv_i2c_id(itv, reg->match_chip, cmd, arg); + return ivtv_call_i2c_client(itv, reg->match_chip, cmd, arg); + case VIDIOC_INT_S_AUDIO_ROUTING: { struct v4l2_routing *route = arg; --- driver/ivtv-i2c.c.bak 2007-04-14 22:08:26.000000000 -0400 +++ driver/ivtv-i2c.c 2007-04-14 22:08:32.000000000 -0400 @@ -549,7 +549,7 @@ .name = "ivtv internal use only", }; -static int ivtv_call_i2c_client(struct ivtv *itv, int addr, unsigned int cmd, +int ivtv_call_i2c_client(struct ivtv *itv, int addr, unsigned int cmd, void *arg) { struct i2c_client *client; --- driver/ivtv-i2c.h.bak 2007-04-14 22:09:05.000000000 -0400 +++ driver/ivtv-i2c.h 2007-04-14 22:09:29.000000000 -0400 @@ -28,6 +28,7 @@ int ivtv_i2c_hw(struct ivtv *itv, u32 hw, unsigned int cmd, void *arg); int ivtv_i2c_id(struct ivtv *itv, u32 id, unsigned int cmd, void *arg); void ivtv_call_i2c_clients(struct ivtv *itv, unsigned int cmd, void *arg); +int ivtv_call_i2c_client(struct ivtv *itv, int addr, unsigned int cmd, void *arg); /* init + register i2c algo-bit adapter */ int __devinit init_ivtv_i2c(struct ivtv *itv); --- i2c-drivers/saa717x.c.bak 2007-04-14 22:13:08.000000000 -0400 +++ i2c-drivers/saa717x.c 2007-04-14 22:17:26.000000000 -0400 @@ -62,6 +62,11 @@ #include #include +#ifdef VIDIOC_DBG_S_REGISTER +#define VIDIOC_INT_S_REGISTER VIDIOC_DBG_S_REGISTER +#define VIDIOC_INT_G_REGISTER VIDIOC_DBG_G_REGISTER +#endif + MODULE_DESCRIPTION("Philips SAA717x video decoder driver"); MODULE_AUTHOR("Kevin Thayer, K. Ohta"); MODULE_LICENSE("GPL"); @@ -1253,23 +1258,25 @@ } #ifdef CONFIG_VIDEO_ADV_DEBUG - case VIDIOC_INT_G_REGISTER: + case VIDIOC_DBG_G_REGISTER: { struct v4l2_register *reg = arg; - if (reg->i2c_id != I2C_DRIVERID_SAA717X) + if (!v4l2_chip_match_i2c_client(client, reg->match_type, reg->match_chip)) return -EINVAL; + if (!capable(CAP_SYS_ADMIN)) + return -EPERM; reg->val = saa717x_read(client, reg->reg); break; } - case VIDIOC_INT_S_REGISTER: + case VIDIOC_DBG_S_REGISTER: { struct v4l2_register *reg = arg; u16 addr = reg->reg & 0xffff; u8 val = reg->val & 0xff; - if (reg->i2c_id != I2C_DRIVERID_SAA717X) + if (!v4l2_chip_match_i2c_client(client, reg->match_type, reg->match_chip)) return -EINVAL; if (!capable(CAP_SYS_ADMIN)) return -EPERM; @@ -1277,7 +1284,7 @@ break; } #endif - + case VIDIOC_S_FMT: { struct v4l2_format *fmt = (struct v4l2_format *)arg;