linux-sh.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
From: Josh Wu <josh.wu@atmel.com>
To: Guennadi Liakhovetski <g.liakhovetski@gmx.de>,
	Ben Dooks <ben.dooks@codethink.co.uk>
Cc: linux-media@vger.kernel.org, linux-sh@vger.kernel.org,
	magnus.damm@opensource.se, horms@verge.net.au,
	linux-kernel@lists.codethink.co.uk
Subject: Re: [PATCH v6 4/6] soc_camera: add support for dt binding soc_camera drivers
Date: Fri, 25 Jul 2014 03:23:22 +0000	[thread overview]
Message-ID: <53D1CDAA.4000509@atmel.com> (raw)
In-Reply-To: <Pine.LNX.4.64.1407232000410.1526@axis700.grange>

Hi, Guennadi

On 7/24/2014 2:01 AM, Guennadi Liakhovetski wrote:
> Add initial support for OF based soc-camera devices that may be used
> by any of the soc-camera drivers. The driver itself will need converting
> to use OF.
>
> These changes allow the soc-camera driver to do the connecting of any
> async capable v4l2 device to the soc-camera driver. This has currently
> been tested on the Renesas Lager board.
>
> It currently only supports one input device per driver as this seems
> to be the standard connection for these devices.
>
> Signed-off-by: Ben Dooks <ben.dooks@codethink.co.uk>
> [g.liakhovetski@gmx.de add check for multiple subdevices]
> Signed-off-by: Guennadi Liakhovetski <g.liakhovetski@gmx.de>
I tested in sama5d3xek board with Atmel-isi dt and ov2640 dt. It works fine.
Tested-by: Josh Wu <josh.wu@atmel.com>

Best Regards,
Josh Wu
> ---
>
> Hi Ben,
>
> How about this version? Could you review and test?
>
> Thanks
> Guennadi
>
>   drivers/media/platform/soc_camera/soc_camera.c | 129 ++++++++++++++++++++++++-
>   1 file changed, 128 insertions(+), 1 deletion(-)
>
> diff --git a/drivers/media/platform/soc_camera/soc_camera.c b/drivers/media/platform/soc_camera/soc_camera.c
> index dc626b9..f4308fe 100644
> --- a/drivers/media/platform/soc_camera/soc_camera.c
> +++ b/drivers/media/platform/soc_camera/soc_camera.c
> @@ -36,6 +36,7 @@
>   #include <media/v4l2-common.h>
>   #include <media/v4l2-ioctl.h>
>   #include <media/v4l2-dev.h>
> +#include <media/v4l2-of.h>
>   #include <media/videobuf-core.h>
>   #include <media/videobuf2-core.h>
>   
> @@ -1585,6 +1586,130 @@ static void scan_async_host(struct soc_camera_host *ici)
>   #define scan_async_host(ici)		do {} while (0)
>   #endif
>   
> +#ifdef CONFIG_OF
> +
> +struct soc_of_info {
> +	struct soc_camera_async_subdev	sasd;
> +	struct soc_camera_async_client	sasc;
> +	struct v4l2_async_subdev	*subdev;
> +};
> +
> +static int soc_of_bind(struct soc_camera_host *ici,
> +		       struct device_node *ep,
> +		       struct device_node *remote)
> +{
> +	struct soc_camera_device *icd;
> +	struct soc_camera_desc sdesc = {.host_desc.bus_id = ici->nr,};
> +	struct soc_camera_async_client *sasc;
> +	struct soc_of_info *info;
> +	struct i2c_client *client;
> +	char clk_name[V4L2_SUBDEV_NAME_SIZE];
> +	int ret;
> +
> +	/* allocate a new subdev and add match info to it */
> +	info = devm_kzalloc(ici->v4l2_dev.dev, sizeof(struct soc_of_info),
> +			    GFP_KERNEL);
> +	if (!info)
> +		return -ENOMEM;
> +
> +	info->sasd.asd.match.of.node = remote;
> +	info->sasd.asd.match_type = V4L2_ASYNC_MATCH_OF;
> +	info->subdev = &info->sasd.asd;
> +
> +	/* Or shall this be managed by the soc-camera device? */
> +	sasc = &info->sasc;
> +
> +	/* HACK: just need a != NULL */
> +	sdesc.host_desc.board_info = ERR_PTR(-ENODATA);
> +
> +	ret = soc_camera_dyn_pdev(&sdesc, sasc);
> +	if (ret < 0)
> +		goto eallocpdev;
> +
> +	sasc->sensor = &info->sasd.asd;
> +
> +	icd = soc_camera_add_pdev(sasc);
> +	if (!icd) {
> +		ret = -ENOMEM;
> +		goto eaddpdev;
> +	}
> +
> +	sasc->notifier.subdevs = &info->subdev;
> +	sasc->notifier.num_subdevs = 1;
> +	sasc->notifier.bound = soc_camera_async_bound;
> +	sasc->notifier.unbind = soc_camera_async_unbind;
> +	sasc->notifier.complete = soc_camera_async_complete;
> +
> +	icd->sasc = sasc;
> +	icd->parent = ici->v4l2_dev.dev;
> +
> +	client = of_find_i2c_device_by_node(remote);
> +
> +	if (client)
> +		snprintf(clk_name, sizeof(clk_name), "%d-%04x",
> +			 client->adapter->nr, client->addr);
> +	else
> +		snprintf(clk_name, sizeof(clk_name), "of-%s",
> +			 of_node_full_name(remote));
> +
> +	icd->clk = v4l2_clk_register(&soc_camera_clk_ops, clk_name, "mclk", icd);
> +	if (IS_ERR(icd->clk)) {
> +		ret = PTR_ERR(icd->clk);
> +		goto eclkreg;
> +	}
> +
> +	ret = v4l2_async_notifier_register(&ici->v4l2_dev, &sasc->notifier);
> +	if (!ret)
> +		return 0;
> +eclkreg:
> +	icd->clk = NULL;
> +	platform_device_del(sasc->pdev);
> +eaddpdev:
> +	platform_device_put(sasc->pdev);
> +eallocpdev:
> +	devm_kfree(ici->v4l2_dev.dev, sasc);
> +	dev_err(ici->v4l2_dev.dev, "group probe failed: %d\n", ret);
> +
> +	return ret;
> +}
> +
> +static void scan_of_host(struct soc_camera_host *ici)
> +{
> +	struct device *dev = ici->v4l2_dev.dev;
> +	struct device_node *np = dev->of_node;
> +	struct device_node *epn = NULL, *ren;
> +	unsigned int i;
> +
> +	for (i = 0; ; i++) {
> +		epn = of_graph_get_next_endpoint(np, epn);
> +		if (!epn)
> +			break;
> +
> +		ren = of_graph_get_remote_port(epn);
> +		if (!ren) {
> +			dev_notice(dev, "no remote for %s\n",
> +				   of_node_full_name(epn));
> +			continue;
> +		}
> +
> +		/* so we now have a remote node to connect */
> +		if (!i)
> +			soc_of_bind(ici, epn, ren->parent);
> +
> +		of_node_put(epn);
> +		of_node_put(ren);
> +
> +		if (i) {
> +			dev_err(dev, "multiple subdevices aren't supported yet!\n");
> +			break;
> +		}
> +	}
> +}
> +
> +#else
> +static inline void scan_of_host(struct soc_camera_host *ici) { }
> +#endif
> +
>   /* Called during host-driver probe */
>   static int soc_camera_probe(struct soc_camera_host *ici,
>   			    struct soc_camera_device *icd)
> @@ -1836,7 +1961,9 @@ int soc_camera_host_register(struct soc_camera_host *ici)
>   	mutex_init(&ici->host_lock);
>   	mutex_init(&ici->clk_lock);
>   
> -	if (ici->asd_sizes)
> +	if (ici->v4l2_dev.dev->of_node)
> +		scan_of_host(ici);
> +	else if (ici->asd_sizes)
>   		/*
>   		 * No OF, host with a list of subdevices. Don't try to mix
>   		 * modes by initialising some groups statically and some


  reply	other threads:[~2014-07-25  3:23 UTC|newest]

Thread overview: 17+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2014-07-05 22:26 rcar-vin & soc-camera device tree updates Ben Dooks
2014-07-05 22:26 ` [PATCH 1/6] adv7180: Remove duplicate unregister call Ben Dooks
2014-07-17  7:37   ` Hans Verkuil
2014-07-05 22:26 ` [PATCH 2/6] rcar_vin: copy flags from pdata Ben Dooks
2014-07-05 22:26 ` [PATCH 3/6] rcar_vin: add devicetree support Ben Dooks
2014-07-23 10:20   ` Guennadi Liakhovetski
2014-07-23 18:23     ` [PATCH v6 " Guennadi Liakhovetski
2014-07-25  7:30       ` Ben Dooks
2014-07-05 22:26 ` [PATCH 4/6] [V3] soc_camera: add support for dt binding soc_camera drivers Ben Dooks
2014-07-23 18:00   ` Guennadi Liakhovetski
2014-07-23 18:01     ` [PATCH v6 4/6] " Guennadi Liakhovetski
2014-07-25  3:23       ` Josh Wu [this message]
2014-07-05 22:26 ` [PATCH 5/6] r8a7790.dtsi: add vin[0-3] nodes Ben Dooks
2014-07-23  8:09   ` Guennadi Liakhovetski
2014-07-23  8:40     ` Simon Horman
2014-07-05 22:26 ` [PATCH 6/6] [PATCH v2] ARM: lager: add vin1 node Ben Dooks
2014-07-23  8:11   ` Guennadi Liakhovetski

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=53D1CDAA.4000509@atmel.com \
    --to=josh.wu@atmel.com \
    --cc=ben.dooks@codethink.co.uk \
    --cc=g.liakhovetski@gmx.de \
    --cc=horms@verge.net.au \
    --cc=linux-kernel@lists.codethink.co.uk \
    --cc=linux-media@vger.kernel.org \
    --cc=linux-sh@vger.kernel.org \
    --cc=magnus.damm@opensource.se \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).