On 10/03/17 11:39, Sakari Ailus wrote:
> Hi Hans,
>
> Thanks! It's very nice to see one more driver converted to stand-alone one!
>
> Speaking of which --- this seems to be the second last one. The only
> remaining one is sh_mobile_ceu_camera.c!
>
> On Mon, Mar 06, 2017 at 03:56:08PM +0100, Hans Verkuil wrote:
>> From: Hans Verkuil <[email protected]>
>>
>> This patch converts the atmel-isi driver from a soc-camera driver to a driver
>> that is stand-alone.
>>
>> Signed-off-by: Hans Verkuil <[email protected]>
>> ---
>> drivers/media/i2c/soc_camera/ov2640.c | 23 +-
>> drivers/media/platform/soc_camera/Kconfig | 3 +-
>> drivers/media/platform/soc_camera/atmel-isi.c | 1223
>> +++++++++++++++----------
>> 3 files changed, 735 insertions(+), 514 deletions(-)
>>
<snip>
>> +static int isi_graph_parse(struct atmel_isi *isi,
>> + struct device_node *node)
>
> Fits on a single line.
>
>> +{
>> + struct device_node *remote;
>> + struct device_node *ep = NULL;
>> + struct device_node *next;
>> + int ret = 0;
>> +
>> + while (1) {
>> + next = of_graph_get_next_endpoint(node, ep);
>> + if (!next)
>> + break;
>
> You could make this a while loop condition.
>
>> +
>> + of_node_put(ep);
>
> ep is put by of_graph_get_next_endpoint(), no need to do it manually here.
>
>> + ep = next;
>> +
>> + remote = of_graph_get_remote_port_parent(ep);
>> + if (!remote) {
>
> of_node_put(ep);
>
>> + ret = -EINVAL;
>> + break;
>> + }
>> +
>> + /* Skip entities that we have already processed. */
>> + if (remote == isi->dev->of_node) {
>> + of_node_put(remote);
>> + continue;
>> + }
>> +
>> + /* Remote node to connect */
>> + if (!isi->entity.node) {
>
> There would have to be something wrong about the DT graph for the two above
> to happen. I guess one could just return an error if something is terribly
> wrong.
>
> I'm thinking this from the point of view of making this function generic,
> and moving it to the framework as most drivers to something very similar,
> but I'd prefer to get the fwnode patches in first.
>
>> + isi->entity.node = remote;
>
> You could use entity.asd.match.of.node instead, and drop the node field.
Slight problem with this. If I make this change, then the of_node_put below
changes as well:
@@ -1193,7 +1176,7 @@ static int isi_graph_init(struct atmel_isi *isi)
done:
if (ret < 0) {
v4l2_async_notifier_unregister(&isi->notifier);
- of_node_put(isi->entity.node);
+ of_node_put(isi->entity.asd.match.of.node);
}
And I get this compiler warning:
CC [M] drivers/media/platform/atmel/atmel-isi.o
drivers/media/platform/atmel/atmel-isi.c: In function ‘isi_graph_init’:
drivers/media/platform/atmel/atmel-isi.c:1179:15: warning: passing argument 1
of ‘of_node_put’ discards ‘const’ qualifier from pointer target type
[-Wdiscarded-qualifiers]
of_node_put(isi->entity.asd.match.of.node);
^~~
In file included from drivers/media/platform/atmel/atmel-isi.c:25:0:
./include/linux/of.h:130:20: note: expected ‘struct device_node *’ but argument
is of type ‘const struct device_node *’
static inline void of_node_put(struct device_node *node) { }
^~~~~~~~~~~
Any suggestions? Just keep the entity.node after all?
Regards,
Hans
>
>> + isi->entity.asd.match_type = V4L2_ASYNC_MATCH_OF;
>> + isi->entity.asd.match.of.node = remote;
>> + ret++;
>> + }
>> + }
>> +
>> + of_node_put(ep);
>> +
>> + return ret;
>> +}