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

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

V4L/DVB (12540): v4l: simplify v4l2_i2c_new_subdev and friends



Rewrite v4l2_i2c_new_subdev as a simplified version of v4l2_i2c_new_subdev_cfg
and remove v4l2_i2c_new_probed_subdev and v4l2_i2c_new_probed_subdev_addr.

This simplifies this API substantially.

Signed-off-by: default avatarHans Verkuil <hverkuil@xs4all.nl>
Signed-off-by: default avatarMauro Carvalho Chehab <mchehab@redhat.com>
parent 0da2808c
Loading
Loading
Loading
Loading
+6 −10
Original line number Diff line number Diff line
@@ -370,19 +370,20 @@ from the remove() callback ensures that this is always done correctly.
The bridge driver also has some helper functions it can use:

struct v4l2_subdev *sd = v4l2_i2c_new_subdev(v4l2_dev, adapter,
	       "module_foo", "chipid", 0x36);
	       "module_foo", "chipid", 0x36, NULL);

This loads the given module (can be NULL if no module needs to be loaded) and
calls i2c_new_device() with the given i2c_adapter and chip/address arguments.
If all goes well, then it registers the subdev with the v4l2_device.

You can also use v4l2_i2c_new_probed_subdev() which is very similar to
v4l2_i2c_new_subdev(), except that it has an array of possible I2C addresses
that it should probe. Internally it calls i2c_new_probed_device().
You can also use the last argument of v4l2_i2c_new_subdev() to pass an array
of possible I2C addresses that it should probe. These probe addresses are
only used if the previous argument is 0. A non-zero argument means that you
know the exact i2c address so in that case no probing will take place.

Both functions return NULL if something went wrong.

Note that the chipid you pass to v4l2_i2c_new_(probed_)subdev() is usually
Note that the chipid you pass to v4l2_i2c_new_subdev() is usually
the same as the module name. It allows you to specify a chip variant, e.g.
"saa7114" or "saa7115". In general though the i2c driver autodetects this.
The use of chipid is something that needs to be looked at more closely at a
@@ -410,11 +411,6 @@ the irq and platform_data arguments after the subdev was setup. The older
v4l2_i2c_new_(probed_)subdev functions will call s_config as well, but with
irq set to 0 and platform_data set to NULL.

Note that in the next kernel release the functions v4l2_i2c_new_subdev,
v4l2_i2c_new_probed_subdev and v4l2_i2c_new_probed_subdev_addr will all be
replaced by a single v4l2_i2c_new_subdev that is identical to
v4l2_i2c_new_subdev_cfg but without the irq and platform_data arguments.

struct video_device
-------------------

+2 −2
Original line number Diff line number Diff line
@@ -212,7 +212,7 @@ void au0828_card_setup(struct au0828_dev *dev)
		   be abstracted out if we ever need to support a different
		   demod) */
		sd = v4l2_i2c_new_subdev(&dev->v4l2_dev, &dev->i2c_adap,
				"au8522", "au8522", 0x8e >> 1);
				"au8522", "au8522", 0x8e >> 1, NULL);
		if (sd == NULL)
			printk(KERN_ERR "analog subdev registration failed\n");
	}
@@ -221,7 +221,7 @@ void au0828_card_setup(struct au0828_dev *dev)
	if (dev->board.tuner_type != TUNER_ABSENT) {
		/* Load the tuner module, which does the attach */
		sd = v4l2_i2c_new_subdev(&dev->v4l2_dev, &dev->i2c_adap,
				"tuner", "tuner", dev->board.tuner_addr);
				"tuner", "tuner", dev->board.tuner_addr, NULL);
		if (sd == NULL)
			printk(KERN_ERR "tuner subdev registration fail\n");

+22 −22
Original line number Diff line number Diff line
@@ -3524,8 +3524,8 @@ void __devinit bttv_init_card2(struct bttv *btv)
		};
		struct v4l2_subdev *sd;

		sd = v4l2_i2c_new_probed_subdev(&btv->c.v4l2_dev,
			&btv->c.i2c_adap, "saa6588", "saa6588", addrs);
		sd = v4l2_i2c_new_subdev(&btv->c.v4l2_dev,
			&btv->c.i2c_adap, "saa6588", "saa6588", 0, addrs);
		btv->has_saa6588 = (sd != NULL);
	}

@@ -3549,8 +3549,8 @@ void __devinit bttv_init_card2(struct bttv *btv)
			I2C_CLIENT_END
		};

		btv->sd_msp34xx = v4l2_i2c_new_probed_subdev(&btv->c.v4l2_dev,
			&btv->c.i2c_adap, "msp3400", "msp3400", addrs);
		btv->sd_msp34xx = v4l2_i2c_new_subdev(&btv->c.v4l2_dev,
			&btv->c.i2c_adap, "msp3400", "msp3400", 0, addrs);
		if (btv->sd_msp34xx)
			return;
		goto no_audio;
@@ -3563,16 +3563,16 @@ void __devinit bttv_init_card2(struct bttv *btv)
			I2C_CLIENT_END
		};

		if (v4l2_i2c_new_probed_subdev(&btv->c.v4l2_dev,
				&btv->c.i2c_adap, "tda7432", "tda7432", addrs))
		if (v4l2_i2c_new_subdev(&btv->c.v4l2_dev,
				&btv->c.i2c_adap, "tda7432", "tda7432", 0, addrs))
			return;
		goto no_audio;
	}

	case 3: {
		/* The user specified that we should probe for tvaudio */
		btv->sd_tvaudio = v4l2_i2c_new_probed_subdev(&btv->c.v4l2_dev,
			&btv->c.i2c_adap, "tvaudio", "tvaudio", tvaudio_addrs());
		btv->sd_tvaudio = v4l2_i2c_new_subdev(&btv->c.v4l2_dev,
			&btv->c.i2c_adap, "tvaudio", "tvaudio", 0, tvaudio_addrs());
		if (btv->sd_tvaudio)
			return;
		goto no_audio;
@@ -3591,13 +3591,13 @@ void __devinit bttv_init_card2(struct bttv *btv)
	   it really is a msp3400, so it will return NULL when the device
	   found is really something else (e.g. a tea6300). */
	if (!bttv_tvcards[btv->c.type].no_msp34xx) {
		btv->sd_msp34xx = v4l2_i2c_new_probed_subdev_addr(&btv->c.v4l2_dev,
		btv->sd_msp34xx = v4l2_i2c_new_subdev(&btv->c.v4l2_dev,
			&btv->c.i2c_adap, "msp3400", "msp3400",
			I2C_ADDR_MSP3400 >> 1);
			0, I2C_ADDRS(I2C_ADDR_MSP3400 >> 1));
	} else if (bttv_tvcards[btv->c.type].msp34xx_alt) {
		btv->sd_msp34xx = v4l2_i2c_new_probed_subdev_addr(&btv->c.v4l2_dev,
		btv->sd_msp34xx = v4l2_i2c_new_subdev(&btv->c.v4l2_dev,
			&btv->c.i2c_adap, "msp3400", "msp3400",
			I2C_ADDR_MSP3400_ALT >> 1);
			0, I2C_ADDRS(I2C_ADDR_MSP3400_ALT >> 1));
	}

	/* If we found a msp34xx, then we're done. */
@@ -3611,14 +3611,14 @@ void __devinit bttv_init_card2(struct bttv *btv)
			I2C_CLIENT_END
		};

		if (v4l2_i2c_new_probed_subdev(&btv->c.v4l2_dev,
				&btv->c.i2c_adap, "tda7432", "tda7432", addrs))
		if (v4l2_i2c_new_subdev(&btv->c.v4l2_dev,
				&btv->c.i2c_adap, "tda7432", "tda7432", 0, addrs))
			return;
	}

	/* Now see if we can find one of the tvaudio devices. */
	btv->sd_tvaudio = v4l2_i2c_new_probed_subdev(&btv->c.v4l2_dev,
		&btv->c.i2c_adap, "tvaudio", "tvaudio", tvaudio_addrs());
	btv->sd_tvaudio = v4l2_i2c_new_subdev(&btv->c.v4l2_dev,
		&btv->c.i2c_adap, "tvaudio", "tvaudio", 0, tvaudio_addrs());
	if (btv->sd_tvaudio)
		return;

@@ -3641,15 +3641,15 @@ void __devinit bttv_init_tuner(struct bttv *btv)

		/* Load tuner module before issuing tuner config call! */
		if (bttv_tvcards[btv->c.type].has_radio)
			v4l2_i2c_new_probed_subdev(&btv->c.v4l2_dev,
			v4l2_i2c_new_subdev(&btv->c.v4l2_dev,
				&btv->c.i2c_adap, "tuner", "tuner",
				v4l2_i2c_tuner_addrs(ADDRS_RADIO));
		v4l2_i2c_new_probed_subdev(&btv->c.v4l2_dev,
				0, v4l2_i2c_tuner_addrs(ADDRS_RADIO));
		v4l2_i2c_new_subdev(&btv->c.v4l2_dev,
				&btv->c.i2c_adap, "tuner", "tuner",
				v4l2_i2c_tuner_addrs(ADDRS_DEMOD));
		v4l2_i2c_new_probed_subdev(&btv->c.v4l2_dev,
				0, v4l2_i2c_tuner_addrs(ADDRS_DEMOD));
		v4l2_i2c_new_subdev(&btv->c.v4l2_dev,
				&btv->c.i2c_adap, "tuner", "tuner",
				v4l2_i2c_tuner_addrs(ADDRS_TV_WITH_DEMOD));
				0, v4l2_i2c_tuner_addrs(ADDRS_TV_WITH_DEMOD));

		tun_setup.mode_mask = T_ANALOG_TV | T_DIGITAL_TV;
		tun_setup.type = btv->tuner_type;
+1 −1
Original line number Diff line number Diff line
@@ -1955,7 +1955,7 @@ static int cafe_pci_probe(struct pci_dev *pdev,

	cam->sensor_addr = 0x42;
	cam->sensor = v4l2_i2c_new_subdev(&cam->v4l2_dev, &cam->i2c_adapter,
			"ov7670", "ov7670", cam->sensor_addr);
			"ov7670", "ov7670", cam->sensor_addr, NULL);
	if (cam->sensor == NULL) {
		ret = -ENODEV;
		goto out_smbus;
+7 −7
Original line number Diff line number Diff line
@@ -139,16 +139,16 @@ int cx18_i2c_register(struct cx18 *cx, unsigned idx)

	if (hw == CX18_HW_TUNER) {
		/* special tuner group handling */
		sd = v4l2_i2c_new_probed_subdev(&cx->v4l2_dev,
				adap, mod, type, cx->card_i2c->radio);
		sd = v4l2_i2c_new_subdev(&cx->v4l2_dev,
				adap, mod, type, 0, cx->card_i2c->radio);
		if (sd != NULL)
			sd->grp_id = hw;
		sd = v4l2_i2c_new_probed_subdev(&cx->v4l2_dev,
				adap, mod, type, cx->card_i2c->demod);
		sd = v4l2_i2c_new_subdev(&cx->v4l2_dev,
				adap, mod, type, 0, cx->card_i2c->demod);
		if (sd != NULL)
			sd->grp_id = hw;
		sd = v4l2_i2c_new_probed_subdev(&cx->v4l2_dev,
				adap, mod, type, cx->card_i2c->tv);
		sd = v4l2_i2c_new_subdev(&cx->v4l2_dev,
				adap, mod, type, 0, cx->card_i2c->tv);
		if (sd != NULL)
			sd->grp_id = hw;
		return sd != NULL ? 0 : -1;
@@ -162,7 +162,7 @@ int cx18_i2c_register(struct cx18 *cx, unsigned idx)
		return -1;

	/* It's an I2C device other than an analog tuner or IR chip */
	sd = v4l2_i2c_new_subdev(&cx->v4l2_dev, adap, mod, type, hw_addrs[idx]);
	sd = v4l2_i2c_new_subdev(&cx->v4l2_dev, adap, mod, type, hw_addrs[idx], NULL);
	if (sd != NULL)
		sd->grp_id = hw;
	return sd != NULL ? 0 : -1;
Loading