Čágo Belo Šílenci! :-) > > +static int camera_subdev_parse(struct device *dev, struct v4l2_async_notifier *notifier, > > + const char *key) > > +{ > > + struct device_node *node; > > + struct isp_async_subdev *isd; > > + > > + printk("Looking for %s\n", key); > > + > > + node = of_parse_phandle(dev->of_node, key, 0); > > There may be more than one flash associated with a sensor. Speaking of which > --- how is it associated to the sensors? > > One way to do this could be to simply move the flash property to the sensor > OF node. We could have it here, too, if the flash was not associated with > any sensor, but I doubt that will ever be needed. I don't know what you mean here. Anyway, here's updated version. Best regards, Pavel diff --git a/drivers/media/platform/omap3isp/isp.c b/drivers/media/platform/omap3isp/isp.c index c80397a..22d0e4a 100644 --- a/drivers/media/platform/omap3isp/isp.c +++ b/drivers/media/platform/omap3isp/isp.c @@ -2162,10 +2162,57 @@ static int isp_fwnode_parse(struct device *dev, struct fwnode_handle *fwn, return 0; } +static int camera_subdev_parse(struct device *dev, struct v4l2_async_notifier *notifier, + const char *key, int max) +{ + struct device_node *node; + struct isp_async_subdev *isd; + int num = 0; + + printk("Looking for %s\n", key); + + while (notifier->num_subdevs < max) { + node = of_parse_phandle(dev->of_node, key, num++); + if (!node) + return 0; + + printk("Having subdevice: %p\n", node); + + isd = devm_kzalloc(dev, sizeof(*isd), GFP_KERNEL); + if (!isd) + return -ENOMEM; + + notifier->subdevs[notifier->num_subdevs] = &isd->asd; + + isd->asd.match.fwnode.fwn = of_fwnode_handle(node); + isd->asd.match_type = V4L2_ASYNC_MATCH_FWNODE; + notifier->num_subdevs++; + } + + return 0; +} + +static int camera_subdevs_parse(struct device *dev, struct v4l2_async_notifier *notifier, + int max) +{ + int res; + + res = camera_subdev_parse(dev, notifier, "flash", max); + if (res) + return res; + + res = camera_subdev_parse(dev, notifier, "lens-focus", max); + if (res) + return res; + + return 0; +} + static int isp_fwnodes_parse(struct device *dev, struct v4l2_async_notifier *notifier) { struct fwnode_handle *fwn = NULL; + int res; notifier->subdevs = devm_kcalloc( dev, ISP_MAX_SUBDEVS, sizeof(*notifier->subdevs), GFP_KERNEL); @@ -2199,6 +2246,15 @@ static int isp_fwnodes_parse(struct device *dev, notifier->num_subdevs++; } + /* FIXME: missing put in the success path? */ + + res = camera_subdevs_parse(dev, notifier, ISP_MAX_SUBDEVS); + if (res) + goto error; + + if (notifier->num_subdevs == ISP_MAX_SUBDEVS) { + printk("isp: Maybe too many devices?\n"); + } return notifier->num_subdevs; error: -- (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