Hi Mauro, Here are drivers for Sony imx319 and imx355 sensors and an unlocked version of v4l2_ctrl_grab() which is used by the driver. Since v1, I've rebased this on the current master --- with the fwnode patches. Please pull. The diff is here and effectively the same for both drivers: diff --git a/drivers/media/i2c/imx319.c b/drivers/media/i2c/imx319.c index 37c31d17ecf0..329049f7e64d 100644 --- a/drivers/media/i2c/imx319.c +++ b/drivers/media/i2c/imx319.c @@ -2356,7 +2356,9 @@ static int imx319_init_controls(struct imx319 *imx319) static struct imx319_hwcfg *imx319_get_hwcfg(struct device *dev) { struct imx319_hwcfg *cfg; - struct v4l2_fwnode_endpoint *bus_cfg; + struct v4l2_fwnode_endpoint bus_cfg = { + .bus_type = V4L2_MBUS_CSI2_DPHY + }; struct fwnode_handle *ep; struct fwnode_handle *fwnode = dev_fwnode(dev); unsigned int i; @@ -2369,8 +2371,8 @@ static struct imx319_hwcfg *imx319_get_hwcfg(struct device *dev) if (!ep) return NULL; - bus_cfg = v4l2_fwnode_endpoint_alloc_parse(ep); - if (IS_ERR(bus_cfg)) + ret = v4l2_fwnode_endpoint_alloc_parse(ep, &bus_cfg); + if (ret) goto out_err; cfg = devm_kzalloc(dev, sizeof(*cfg), GFP_KERNEL); @@ -2391,30 +2393,30 @@ static struct imx319_hwcfg *imx319_get_hwcfg(struct device *dev) goto out_err; } - dev_dbg(dev, "num of link freqs: %d", bus_cfg->nr_of_link_frequencies); - if (!bus_cfg->nr_of_link_frequencies) { + dev_dbg(dev, "num of link freqs: %d", bus_cfg.nr_of_link_frequencies); + if (!bus_cfg.nr_of_link_frequencies) { dev_warn(dev, "no link frequencies defined"); goto out_err; } - cfg->nr_of_link_freqs = bus_cfg->nr_of_link_frequencies; + cfg->nr_of_link_freqs = bus_cfg.nr_of_link_frequencies; cfg->link_freqs = devm_kcalloc( - dev, bus_cfg->nr_of_link_frequencies + 1, + dev, bus_cfg.nr_of_link_frequencies + 1, sizeof(*cfg->link_freqs), GFP_KERNEL); if (!cfg->link_freqs) goto out_err; - for (i = 0; i < bus_cfg->nr_of_link_frequencies; i++) { - cfg->link_freqs[i] = bus_cfg->link_frequencies[i]; + for (i = 0; i < bus_cfg.nr_of_link_frequencies; i++) { + cfg->link_freqs[i] = bus_cfg.link_frequencies[i]; dev_dbg(dev, "link_freq[%d] = %lld", i, cfg->link_freqs[i]); } - v4l2_fwnode_endpoint_free(bus_cfg); + v4l2_fwnode_endpoint_free(&bus_cfg); fwnode_handle_put(ep); return cfg; out_err: - v4l2_fwnode_endpoint_free(bus_cfg); + v4l2_fwnode_endpoint_free(&bus_cfg); fwnode_handle_put(ep); return NULL; } diff --git a/drivers/media/i2c/imx355.c b/drivers/media/i2c/imx355.c index 3baa0edc57a9..803df2a014bb 100644 --- a/drivers/media/i2c/imx355.c +++ b/drivers/media/i2c/imx355.c @@ -1656,7 +1656,9 @@ static int imx355_init_controls(struct imx355 *imx355) static struct imx355_hwcfg *imx355_get_hwcfg(struct device *dev) { struct imx355_hwcfg *cfg; - struct v4l2_fwnode_endpoint *bus_cfg; + struct v4l2_fwnode_endpoint bus_cfg = { + .bus_type = V4L2_MBUS_CSI2_DPHY + }; struct fwnode_handle *ep; struct fwnode_handle *fwnode = dev_fwnode(dev); unsigned int i; @@ -1669,8 +1671,8 @@ static struct imx355_hwcfg *imx355_get_hwcfg(struct device *dev) if (!ep) return NULL; - bus_cfg = v4l2_fwnode_endpoint_alloc_parse(ep); - if (IS_ERR(bus_cfg)) + ret = v4l2_fwnode_endpoint_alloc_parse(ep, &bus_cfg); + if (ret) goto out_err; cfg = devm_kzalloc(dev, sizeof(*cfg), GFP_KERNEL); @@ -1691,30 +1693,30 @@ static struct imx355_hwcfg *imx355_get_hwcfg(struct device *dev) goto out_err; } - dev_dbg(dev, "num of link freqs: %d", bus_cfg->nr_of_link_frequencies); - if (!bus_cfg->nr_of_link_frequencies) { + dev_dbg(dev, "num of link freqs: %d", bus_cfg.nr_of_link_frequencies); + if (!bus_cfg.nr_of_link_frequencies) { dev_warn(dev, "no link frequencies defined"); goto out_err; } - cfg->nr_of_link_freqs = bus_cfg->nr_of_link_frequencies; + cfg->nr_of_link_freqs = bus_cfg.nr_of_link_frequencies; cfg->link_freqs = devm_kcalloc( - dev, bus_cfg->nr_of_link_frequencies + 1, + dev, bus_cfg.nr_of_link_frequencies + 1, sizeof(*cfg->link_freqs), GFP_KERNEL); if (!cfg->link_freqs) goto out_err; - for (i = 0; i < bus_cfg->nr_of_link_frequencies; i++) { - cfg->link_freqs[i] = bus_cfg->link_frequencies[i]; + for (i = 0; i < bus_cfg.nr_of_link_frequencies; i++) { + cfg->link_freqs[i] = bus_cfg.link_frequencies[i]; dev_dbg(dev, "link_freq[%d] = %lld", i, cfg->link_freqs[i]); } - v4l2_fwnode_endpoint_free(bus_cfg); + v4l2_fwnode_endpoint_free(&bus_cfg); fwnode_handle_put(ep); return cfg; out_err: - v4l2_fwnode_endpoint_free(bus_cfg); + v4l2_fwnode_endpoint_free(&bus_cfg); fwnode_handle_put(ep); return NULL; } The following changes since commit 158bc148a31ea22a2ef8cbaf4d968476bddefbc0: media: rc: mce_kbd: input events via rc-core's input device (2018-10-05 06:56:24 -0400) are available in the git repository at: ssh://linuxtv.org/git/sailus/media_tree.git tags/for-4.20-10-sign-2 for you to fetch changes up to 83da403a4a89dc1990b9d0f99ba16bc6d230eb02: media: add imx355 camera sensor driver (2018-10-05 14:46:35 +0300) ---------------------------------------------------------------- unlocked V4L2 ctrl grab; imx319 and imx355 drivers ---------------------------------------------------------------- Bingbu Cao (2): media: add imx319 camera sensor driver media: add imx355 camera sensor driver Sakari Ailus (2): v4l: ctrl: Remove old documentation from v4l2_ctrl_grab v4l: ctrl: Provide unlocked variant of v4l2_ctrl_grab MAINTAINERS | 14 + drivers/media/i2c/Kconfig | 22 + drivers/media/i2c/Makefile | 2 + drivers/media/i2c/imx319.c | 2560 ++++++++++++++++++++++++++++++++++ drivers/media/i2c/imx355.c | 1860 ++++++++++++++++++++++++ drivers/media/v4l2-core/v4l2-ctrls.c | 14 +- include/media/v4l2-ctrls.h | 26 +- 7 files changed, 4487 insertions(+), 11 deletions(-) create mode 100644 drivers/media/i2c/imx319.c create mode 100644 drivers/media/i2c/imx355.c -- Regards, Sakari Ailus e-mail: sakari.ailus@xxxxxx