Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit f3d092b8 authored by Hans Verkuil's avatar Hans Verkuil Committed by Mauro Carvalho Chehab
Browse files

V4L/DVB (5304): Improve chip matching in v4l2_register



The chip matching in struct v4l2_register for VIDIOC_DBG_G/S_REGISTER 
was rather primitive. It could not be extended to other busses besides 
i2c and it lacked a way to.

Signed-off-by: default avatarHans Verkuil <hverkuil@xs4all.nl>
Signed-off-by: default avatarMauro Carvalho Chehab <mchehab@infradead.org>
parent d55c7aec
Loading
Loading
Loading
Loading
+1 −1
Original line number Diff line number Diff line
@@ -633,7 +633,7 @@ static int cx25840_command(struct i2c_client *client, unsigned int cmd,
	{
		struct v4l2_register *reg = arg;

		if (reg->i2c_id != I2C_DRIVERID_CX25840)
		if (!v4l2_chip_match_i2c_client(client, reg->match_type, reg->match_chip))
			return -EINVAL;
		if (!capable(CAP_SYS_ADMIN))
			return -EPERM;
+2 −2
Original line number Diff line number Diff line
@@ -1389,7 +1389,7 @@ static int vidioc_g_register (struct file *file, void *fh,
{
	struct cx88_core *core = ((struct cx8800_fh*)fh)->dev->core;

	if (reg->i2c_id != 0)
	if (!v4l2_chip_match_host(reg->match_type, reg->match_chip))
		return -EINVAL;
	/* cx2388x has a 24-bit register space */
	reg->val = cx_read(reg->reg&0xffffff);
@@ -1401,7 +1401,7 @@ static int vidioc_s_register (struct file *file, void *fh,
{
	struct cx88_core *core = ((struct cx8800_fh*)fh)->dev->core;

	if (reg->i2c_id != 0)
	if (!v4l2_chip_match_host(reg->match_type, reg->match_chip))
		return -EINVAL;
	cx_write(reg->reg&0xffffff, reg->val);
	return 0;
+7 −4
Original line number Diff line number Diff line
@@ -3256,8 +3256,8 @@ static int pvr2_hdw_get_eeprom_addr(struct pvr2_hdw *hdw)


int pvr2_hdw_register_access(struct pvr2_hdw *hdw,
			     u32 chip_id, u64 reg_id,
			     int setFl,u32 *val_ptr)
			     u32 match_type, u32 match_chip, u64 reg_id,
			     int setFl,u64 *val_ptr)
{
#ifdef CONFIG_VIDEO_ADV_DEBUG
	struct list_head *item;
@@ -3268,13 +3268,16 @@ int pvr2_hdw_register_access(struct pvr2_hdw *hdw,

	if (!capable(CAP_SYS_ADMIN)) return -EPERM;

	req.i2c_id = chip_id;
	req.match_type = match_type;
	req.match_chip = match_chip;
	req.reg = reg_id;
	if (setFl) req.val = *val_ptr;
	mutex_lock(&hdw->i2c_list_lock); do {
		list_for_each(item,&hdw->i2c_clients) {
			cp = list_entry(item,struct pvr2_i2c_client,list);
			if (cp->client->driver->id != chip_id) continue;
			if (!v4l2_chip_match_i2c_client(cp->client, req.match_type, req.match_chip)) {
				continue;
			}
			stat = pvr2_i2c_client_cmd(
				cp,(setFl ? VIDIOC_DBG_S_REGISTER :
				    VIDIOC_DBG_G_REGISTER),&req);
+4 −3
Original line number Diff line number Diff line
@@ -217,13 +217,14 @@ void pvr2_hdw_v4l_store_minor_number(struct pvr2_hdw *,
				     enum pvr2_v4l_type index,int);

/* Direct read/write access to chip's registers:
   chip_id - unique id of chip (e.g. I2C_DRIVERD_xxxx)
   match_type - how to interpret match_chip (e.g. driver ID, i2c address)
   match_chip - chip match value (e.g. I2C_DRIVERD_xxxx)
   reg_id  - register number to access
   setFl   - true to set the register, false to read it
   val_ptr - storage location for source / result. */
int pvr2_hdw_register_access(struct pvr2_hdw *,
			     u32 chip_id,u64 reg_id,
			     int setFl,u32 *val_ptr);
			     u32 match_type, u32 match_chip,u64 reg_id,
			     int setFl,u64 *val_ptr);

/* The following entry points are all lower level things you normally don't
   want to worry about. */
+2 −2
Original line number Diff line number Diff line
@@ -740,11 +740,11 @@ static int pvr2_v4l2_do_ioctl(struct inode *inode, struct file *file,
	case VIDIOC_DBG_S_REGISTER:
	case VIDIOC_DBG_G_REGISTER:
	{
		u32 val;
		u64 val;
		struct v4l2_register *req = (struct v4l2_register *)arg;
		if (cmd == VIDIOC_DBG_S_REGISTER) val = req->val;
		ret = pvr2_hdw_register_access(
			hdw,req->i2c_id,req->reg,
			hdw,req->match_type,req->match_chip,req->reg,
			cmd == VIDIOC_DBG_S_REGISTER,&val);
		if (cmd == VIDIOC_DBG_G_REGISTER) req->val = val;
		break;
Loading