Hi! > These types devices aren't directly related to the sensor, but are > nevertheless handled by the smiapp driver due to the relationship of these > component to the main part of the camera module --- the sensor. > > Additionally, for the async sub-device registration to work, the notifier > containing matching fwnodes will need to be registered. This is natural to > perform in a sensor driver as well. > > This does not yet address providing the user space with information on how > to associate the sensor, lens or EEPROM devices but the kernel now has the > necessary information to do that. Let me see... I guess this is going to be quite interesting for me, too, because I'll be able to remove similar code in omap3 isp driver. I'm getting same error as the build bot... which is expected as you did mention it depends on some other series. (I'll take a look if I can test it easily.) Acked-by: Pavel Machek <pavel@xxxxxx> > @@ -2849,6 +2878,45 @@ static struct smiapp_hwconfig *smiapp_get_hwconfig(struct device *dev) > > v4l2_fwnode_endpoint_free(bus_cfg); > fwnode_handle_put(ep); > + > + sensor->notifier.subdevs = > + devm_kcalloc(dev, SMIAPP_MAX_ASYNC_SUBDEVS, > + sizeof(struct v4l2_async_subdev *), GFP_KERNEL); > + if (!sensor->notifier.subdevs) > + goto out_err; > + > + for (i = 0; i < ARRAY_SIZE(props); i++) { > + struct device_node *node; > + unsigned int j = 0; > + > + while ((node = of_parse_phandle(dev->of_node, props[i], j++))) { > + struct v4l2_async_subdev **asd = > + &sensor->notifier.subdevs[ > + sensor->notifier.num_subdevs]; > + > + if (WARN_ON(sensor->notifier.num_subdevs >= > + SMIAPP_MAX_ASYNC_SUBDEVS)) { > + of_node_put(node); > + goto out; > + } > + > + *asd = devm_kzalloc( > + dev, sizeof(struct v4l2_async_subdev), > + GFP_KERNEL); > + if (!*asd) { > + of_node_put(node); > + goto out_err; > + } > + > + (*asd)->match.fwnode.fwnode = of_fwnode_handle(node); > + (*asd)->match_type = V4L2_ASYNC_MATCH_FWNODE; > + sensor->notifier.num_subdevs++; > + > + of_node_put(node); > + } > + } > + > +out: > return hwcfg; > > out_err: > @@ -2861,18 +2929,17 @@ static int smiapp_probe(struct i2c_client *client, > const struct i2c_device_id *devid) > { > struct smiapp_sensor *sensor; > - struct smiapp_hwconfig *hwcfg = smiapp_get_hwconfig(&client->dev); > unsigned int i; > int rval; > > - if (hwcfg == NULL) > - return -ENODEV; > - > sensor = devm_kzalloc(&client->dev, sizeof(*sensor), GFP_KERNEL); > if (sensor == NULL) > return -ENOMEM; > > - sensor->hwcfg = hwcfg; > + sensor->hwcfg = smiapp_get_hwconfig(&client->dev, sensor); > + if (sensor->hwcfg == NULL) > + return -ENODEV; > + > mutex_init(&sensor->mutex); > sensor->src = &sensor->ssds[sensor->ssds_used]; > > diff --git a/drivers/media/i2c/smiapp/smiapp.h b/drivers/media/i2c/smiapp/smiapp.h > index f74d695..21a55de 100644 > --- a/drivers/media/i2c/smiapp/smiapp.h > +++ b/drivers/media/i2c/smiapp/smiapp.h > @@ -20,6 +20,7 @@ > #define __SMIAPP_PRIV_H_ > > #include <linux/mutex.h> > +#include <media/v4l2-async.h> > #include <media/v4l2-ctrls.h> > #include <media/v4l2-subdev.h> > #include <media/i2c/smiapp.h> > @@ -143,6 +144,9 @@ struct smiapp_csi_data_format { > u8 pixel_order; > }; > > +/* Lens, EEPROM and a flash LEDs? */ > +#define SMIAPP_MAX_ASYNC_SUBDEVS 3 > + > #define SMIAPP_SUBDEVS 3 > > #define SMIAPP_PA_PAD_SRC 0 > @@ -189,6 +193,7 @@ struct smiapp_sensor { > struct regulator *vana; > struct clk *ext_clk; > struct gpio_desc *xshutdown; > + struct v4l2_async_notifier notifier; > u32 limits[SMIAPP_LIMIT_LAST]; > u8 nbinning_subtypes; > struct smiapp_binning_subtype binning_subtypes[SMIAPP_BINNING_SUBTYPES]; -- (english) http://www.livejournal.com/~pavelmachek (cesky, pictures) http://atrey.karlin.mff.cuni.cz/~pavel/picture/horses/blog.html
Attachment:
signature.asc
Description: Digital signature