From: Josh Wu <josh.wu@atmel.com>
To: linux-sh@vger.kernel.org
Subject: Re: [PATCH v3 7/7] soc_camera: initial of code
Date: Mon, 28 Apr 2014 02:57:47 +0000 [thread overview]
Message-ID: <535DC3AB.7040703@atmel.com> (raw)
In-Reply-To: <1397471802-27216-8-git-send-email-ben.dooks@codethink.co.uk>
Hi, Guennadi
On 4/27/2014 1:07 AM, Guennadi Liakhovetski wrote:
> Hi Josh,
>
> On Wed, 16 Apr 2014, Josh Wu wrote:
>
>> Hi, Ben
>>
>> On 4/14/2014 6:36 PM, Ben Dooks 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.
>>>
>>> Signed-off-by: Ben Dooks <ben.dooks@codethink.co.uk>
>> Tested-by: Josh Wu <josh.wu@atmel.com>
>> Thanks for your patch. I tested with atmel-isi DT and ov2640. It works
>> perfectly.
> Thanks for testing. Do I understand correctly, that v2 of your patch set
> "atmel-isi: Add DT support for Atmel ISI driver" sent on 25 March works on
> top of these patches from Ben and I can review them together for 3.16?
Yes, I tested this Ben's Soc_camera DT patch with my v2 atmel-isi DT
patches.
That would be great if you can review them together. Thanks.
Best Regards,
Josh Wu
>
> Thanks
> Guennadi
>
>> Best Regards,
>> Josh Wu
>>
>>> ---
>>> Changes since v1:
>>>
>>> - Updated to make the i2c mclk name compatible with other
>>> drivers. The issue of having mclk which is not part of
>>> the drivers/clk interface is something that can be dealt
>>> with separately.
>>> ---
>>> drivers/media/platform/soc_camera/soc_camera.c | 117
>>> ++++++++++++++++++++++++-
>>> 1 file changed, 116 insertions(+), 1 deletion(-)
>>>
>>> diff --git a/drivers/media/platform/soc_camera/soc_camera.c
>>> b/drivers/media/platform/soc_camera/soc_camera.c
>>> index 4b8c024..c50ec5c 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>
>>> @@ -1579,6 +1580,118 @@ static void scan_async_host(struct soc_camera_host
>>> *ici)
>>> #define scan_async_host(ici) do {} while (0)
>>> #endif
>>> +#ifdef CONFIG_OF
>>> +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_camera_async_subdev *sasd;
>>> + struct v4l2_async_subdev **asd_array;
>>> + struct i2c_client *client;
>>> + char clk_name[V4L2_SUBDEV_NAME_SIZE];
>>> + int ret;
>>> +
>>> + /* alloacte a new subdev and add match info to it */
>>> + sasd = devm_kzalloc(ici->v4l2_dev.dev, sizeof(*sasd), GFP_KERNEL);
>>> + if (!sasd)
>>> + return -ENOMEM;
>>> +
>>> + asd_array = devm_kzalloc(ici->v4l2_dev.dev,
>>> + sizeof(struct v4l2_async_subdev **),
>>> + GFP_KERNEL);
>>> + if (!asd_array)
>>> + return -ENOMEM;
>>> +
>>> + sasd->asd.match.of.node = remote;
>>> + sasd->asd.match_type = V4L2_ASYNC_MATCH_OF;
>>> + asd_array[0] = &sasd->asd;
>>> +
>>> + /* Or shall this be managed by the soc-camera device? */
>>> + sasc = devm_kzalloc(ici->v4l2_dev.dev, sizeof(*sasc), GFP_KERNEL);
>>> + if (!sasc)
>>> + return -ENOMEM;
>>> +
>>> + /* HACK: just need a != NULL */
>>> + sdesc.host_desc.board_info = ERR_PTR(-ENODATA);
>>> +
>>> + ret = soc_camera_dyn_pdev(&sdesc, sasc);
>>> + if (ret < 0)
>>> + return ret;
>>> +
>>> + sasc->sensor = &sasd->asd;
>>> +
>>> + icd = soc_camera_add_pdev(sasc);
>>> + if (!icd) {
>>> + platform_device_put(sasc->pdev);
>>> + return -ENOMEM;
>>> + }
>>> +
>>> + sasc->notifier.subdevs = asd_array;
>>> + 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_unregister(sasc->pdev);
>>> + dev_err(ici->v4l2_dev.dev, "group probe failed: %d\n", ret);
>>> +
>>> + return ret;
>>> +}
>>> +
>>> +static inline void scan_of_host(struct soc_camera_host *ici)
>>> +{
>>> + struct device_node *np = ici->v4l2_dev.dev->of_node;
>>> + struct device_node *epn = NULL;
>>> + struct device_node *ren;
>>> +
>>> + while (true) {
>>> + epn = v4l2_of_get_next_endpoint(np, epn);
>>> + if (!epn)
>>> + break;
>>> +
>>> + ren = v4l2_of_get_remote_port(epn);
>>> + if (!ren) {
>>> + pr_info("%s: no remote for %s\n",
>>> + __func__, of_node_full_name(epn));
>>> + continue;
>>> + }
>>> +
>>> + /* so we now have a remote node to connect */
>>> + soc_of_bind(ici, epn, ren->parent);
>>> + }
>>> +}
>>> +
>>> +#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)
>>> @@ -1830,7 +1943,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
> ---
> Guennadi Liakhovetski, Ph.D.
> Freelance Open-Source Software Developer
> http://www.open-technology.de/
next prev parent reply other threads:[~2014-04-28 2:57 UTC|newest]
Thread overview: 10+ messages / expand[flat|nested] mbox.gz Atom feed top
2014-04-14 10:36 [PATCH v3 7/7] soc_camera: initial of code Ben Dooks
2014-04-16 10:38 ` Josh Wu
2014-04-16 11:09 ` Ben Dooks
2014-04-16 11:28 ` Guennadi Liakhovetski
2014-04-26 17:07 ` Guennadi Liakhovetski
2014-04-28 2:57 ` Josh Wu [this message]
2014-05-03 16:44 ` Guennadi Liakhovetski
2014-05-15 21:01 ` Ben Dooks
2014-05-18 21:31 ` Guennadi Liakhovetski
2014-06-06 17:27 ` Sergei Shtylyov
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=535DC3AB.7040703@atmel.com \
--to=josh.wu@atmel.com \
--cc=linux-sh@vger.kernel.org \
/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).