From patchwork Wed Mar 18 00:25:04 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Laurent Pinchart X-Patchwork-Id: 11444291 Return-Path: Received: from mail.kernel.org (pdx-korg-mail-1.web.codeaurora.org [172.30.200.123]) by pdx-korg-patchwork-2.web.codeaurora.org (Postfix) with ESMTP id 3C01C90 for ; Wed, 18 Mar 2020 00:25:24 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.kernel.org (Postfix) with ESMTP id 1C90A2073E for ; Wed, 18 Mar 2020 00:25:24 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=pass (1024-bit key) header.d=ideasonboard.com header.i=@ideasonboard.com header.b="oQPUa8ni" Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1727166AbgCRAZX (ORCPT ); Tue, 17 Mar 2020 20:25:23 -0400 Received: from perceval.ideasonboard.com ([213.167.242.64]:59880 "EHLO perceval.ideasonboard.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1727148AbgCRAZX (ORCPT ); Tue, 17 Mar 2020 20:25:23 -0400 Received: from pendragon.bb.dnainternet.fi (81-175-216-236.bb.dnainternet.fi [81.175.216.236]) by perceval.ideasonboard.com (Postfix) with ESMTPSA id 37F9D504; Wed, 18 Mar 2020 01:25:21 +0100 (CET) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com; s=mail; t=1584491121; bh=skEXzsL2tu5WrqhmZAQxofau2ZISmajSMYp+88epHKw=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=oQPUa8niciD1Dkjg12LTGoVyVPJKhBC8j11BU4wJthnmQdyOalA4ZS28Ihv6VH8Mk w2FG7LIcnEWN5tSXtYJTqcAHiCa4wEJQJhbe7zMCr+nCTqTGMJYapN/N2Md56OSSLy 6zCE3Zh1Y5isYg2ZZmr+A4+0nq5PPj8hV2ZwHK10= From: Laurent Pinchart To: linux-media@vger.kernel.org Cc: Sakari Ailus , Jacopo Mondi , =?utf-8?q?Niklas_S=C3=B6derlund?= , Kieran Bingham , Lad Prabhakar , linux-renesas-soc@vger.kernel.org Subject: [PATCH v2 1/4] media: v4l2-async: Accept endpoints and devices for fwnode matching Date: Wed, 18 Mar 2020 02:25:04 +0200 Message-Id: <20200318002507.30336-2-laurent.pinchart+renesas@ideasonboard.com> X-Mailer: git-send-email 2.24.1 In-Reply-To: <20200318002507.30336-1-laurent.pinchart+renesas@ideasonboard.com> References: <20200318002507.30336-1-laurent.pinchart+renesas@ideasonboard.com> MIME-Version: 1.0 Sender: linux-media-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-media@vger.kernel.org fwnode matching was designed to match on nodes corresponding to a device. Some drivers, however, needed to match on endpoints, and have passed endpoint fwnodes to v4l2-async. This works when both the subdev and the notifier use the same fwnode types (endpoint or device), but makes drivers that use different types incompatible. Fix this by extending the fwnode match to handle fwnodes of different types. When the types (deduced from the node name) are different, retrieve the device fwnode for the side that provides an endpoint fwnode, and compare it with the device fwnode provided by the other side. This allows interoperability between all drivers, regardless of which type of fwnode they use for matching. Signed-off-by: Laurent Pinchart Tested-by: Lad Prabhakar Reviewed-by: Kieran Bingham --- drivers/media/v4l2-core/v4l2-async.c | 42 +++++++++++++++++++++++++++- 1 file changed, 41 insertions(+), 1 deletion(-) diff --git a/drivers/media/v4l2-core/v4l2-async.c b/drivers/media/v4l2-core/v4l2-async.c index 8bde33c21ce4..995e5464cba7 100644 --- a/drivers/media/v4l2-core/v4l2-async.c +++ b/drivers/media/v4l2-core/v4l2-async.c @@ -71,7 +71,47 @@ static bool match_devname(struct v4l2_subdev *sd, static bool match_fwnode(struct v4l2_subdev *sd, struct v4l2_async_subdev *asd) { - return sd->fwnode == asd->match.fwnode; + struct fwnode_handle *other_fwnode; + struct fwnode_handle *dev_fwnode; + bool asd_fwnode_is_ep; + bool sd_fwnode_is_ep; + const char *name; + + /* + * Both the subdev and the async subdev can provide either an endpoint + * fwnode or a device fwnode. Start with the simple case of direct + * fwnode matching. + */ + if (sd->fwnode == asd->match.fwnode) + return true; + + /* + * Otherwise, check if the sd fwnode and the asd fwnode refer to an + * endpoint or a device. If they're of the same type, there's no match. + */ + name = fwnode_get_name(sd->fwnode); + sd_fwnode_is_ep = name && strstarts(name, "endpoint"); + name = fwnode_get_name(asd->match.fwnode); + asd_fwnode_is_ep = name && strstarts(name, "endpoint"); + + if (sd_fwnode_is_ep == asd_fwnode_is_ep) + return false; + + /* + * The sd and asd fwnodes are of different types. Get the device fwnode + * parent of the endpoint fwnode, and compare it with the other fwnode. + */ + if (sd_fwnode_is_ep) { + dev_fwnode = fwnode_graph_get_port_parent(sd->fwnode); + other_fwnode = asd->match.fwnode; + } else { + dev_fwnode = fwnode_graph_get_port_parent(asd->match.fwnode); + other_fwnode = sd->fwnode; + } + + fwnode_handle_put(dev_fwnode); + + return dev_fwnode == other_fwnode; } static bool match_custom(struct v4l2_subdev *sd, struct v4l2_async_subdev *asd) From patchwork Wed Mar 18 00:25:05 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Laurent Pinchart X-Patchwork-Id: 11444301 Return-Path: Received: from mail.kernel.org (pdx-korg-mail-1.web.codeaurora.org [172.30.200.123]) by pdx-korg-patchwork-2.web.codeaurora.org (Postfix) with ESMTP id 7ACFE1890 for ; Wed, 18 Mar 2020 00:25:26 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.kernel.org (Postfix) with ESMTP id 5AD7B20757 for ; Wed, 18 Mar 2020 00:25:26 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=pass (1024-bit key) header.d=ideasonboard.com header.i=@ideasonboard.com header.b="cJKrazMR" Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1727179AbgCRAZY (ORCPT ); Tue, 17 Mar 2020 20:25:24 -0400 Received: from perceval.ideasonboard.com ([213.167.242.64]:59890 "EHLO perceval.ideasonboard.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1727041AbgCRAZY (ORCPT ); Tue, 17 Mar 2020 20:25:24 -0400 Received: from pendragon.bb.dnainternet.fi (81-175-216-236.bb.dnainternet.fi [81.175.216.236]) by perceval.ideasonboard.com (Postfix) with ESMTPSA id DA15DD9B; Wed, 18 Mar 2020 01:25:21 +0100 (CET) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com; s=mail; t=1584491122; bh=AsZOXmDiLbgJ/+2+f7+NZq7I0JLo+kXl55wBUTjt9KA=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=cJKrazMRm9ZUkdvhwBkjY5LXNQOTni+shhTGKPPrLfldDIP7mMzxap8G0qxidqgG7 eLrr5x5OK4PPk965PenoycxUNERV2fKyvvvpjwoRH2pO0SLMxyY8kw8aoFGYBgEybj p74FT9xdb+jBJ2oG2uFwj9d56w6m3JNLasPyGe1A= From: Laurent Pinchart To: linux-media@vger.kernel.org Cc: Sakari Ailus , Jacopo Mondi , =?utf-8?q?Niklas_S=C3=B6derlund?= , Kieran Bingham , Lad Prabhakar , linux-renesas-soc@vger.kernel.org Subject: [PATCH v2 2/4] media: v4l2-async: Pass notifier pointer to match functions Date: Wed, 18 Mar 2020 02:25:05 +0200 Message-Id: <20200318002507.30336-3-laurent.pinchart+renesas@ideasonboard.com> X-Mailer: git-send-email 2.24.1 In-Reply-To: <20200318002507.30336-1-laurent.pinchart+renesas@ideasonboard.com> References: <20200318002507.30336-1-laurent.pinchart+renesas@ideasonboard.com> MIME-Version: 1.0 Sender: linux-media-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-media@vger.kernel.org The notifier is useful to match functions to access information about the device matching a subdev. This will be used to print messages using the correct struct device and driver name. Signed-off-by: Laurent Pinchart Acked-by: Sakari Ailus Reviewed-by: Kieran Bingham --- drivers/media/v4l2-core/v4l2-async.c | 18 +++++++++++------- 1 file changed, 11 insertions(+), 7 deletions(-) diff --git a/drivers/media/v4l2-core/v4l2-async.c b/drivers/media/v4l2-core/v4l2-async.c index 995e5464cba7..224b39a7aeb1 100644 --- a/drivers/media/v4l2-core/v4l2-async.c +++ b/drivers/media/v4l2-core/v4l2-async.c @@ -50,7 +50,8 @@ static int v4l2_async_notifier_call_complete(struct v4l2_async_notifier *n) return n->ops->complete(n); } -static bool match_i2c(struct v4l2_subdev *sd, struct v4l2_async_subdev *asd) +static bool match_i2c(struct v4l2_async_notifier *notifier, + struct v4l2_subdev *sd, struct v4l2_async_subdev *asd) { #if IS_ENABLED(CONFIG_I2C) struct i2c_client *client = i2c_verify_client(sd->dev); @@ -63,13 +64,14 @@ static bool match_i2c(struct v4l2_subdev *sd, struct v4l2_async_subdev *asd) #endif } -static bool match_devname(struct v4l2_subdev *sd, - struct v4l2_async_subdev *asd) +static bool match_devname(struct v4l2_async_notifier *notifier, + struct v4l2_subdev *sd, struct v4l2_async_subdev *asd) { return !strcmp(asd->match.device_name, dev_name(sd->dev)); } -static bool match_fwnode(struct v4l2_subdev *sd, struct v4l2_async_subdev *asd) +static bool match_fwnode(struct v4l2_async_notifier *notifier, + struct v4l2_subdev *sd, struct v4l2_async_subdev *asd) { struct fwnode_handle *other_fwnode; struct fwnode_handle *dev_fwnode; @@ -114,7 +116,8 @@ static bool match_fwnode(struct v4l2_subdev *sd, struct v4l2_async_subdev *asd) return dev_fwnode == other_fwnode; } -static bool match_custom(struct v4l2_subdev *sd, struct v4l2_async_subdev *asd) +static bool match_custom(struct v4l2_async_notifier *notifier, + struct v4l2_subdev *sd, struct v4l2_async_subdev *asd) { if (!asd->match.custom.match) /* Match always */ @@ -131,7 +134,8 @@ static struct v4l2_async_subdev * v4l2_async_find_match(struct v4l2_async_notifier *notifier, struct v4l2_subdev *sd) { - bool (*match)(struct v4l2_subdev *sd, struct v4l2_async_subdev *asd); + bool (*match)(struct v4l2_async_notifier *notifier, + struct v4l2_subdev *sd, struct v4l2_async_subdev *asd); struct v4l2_async_subdev *asd; list_for_each_entry(asd, ¬ifier->waiting, list) { @@ -156,7 +160,7 @@ v4l2_async_find_match(struct v4l2_async_notifier *notifier, } /* match cannot be NULL here */ - if (match(sd, asd)) + if (match(notifier, sd, asd)) return asd; } From patchwork Wed Mar 18 00:25:06 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Laurent Pinchart X-Patchwork-Id: 11444297 Return-Path: Received: from mail.kernel.org (pdx-korg-mail-1.web.codeaurora.org [172.30.200.123]) by pdx-korg-patchwork-2.web.codeaurora.org (Postfix) with ESMTP id 023CE90 for ; Wed, 18 Mar 2020 00:25:26 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.kernel.org (Postfix) with ESMTP id D664F2073E for ; Wed, 18 Mar 2020 00:25:25 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=pass (1024-bit key) header.d=ideasonboard.com header.i=@ideasonboard.com header.b="K7mqSZQJ" Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1727193AbgCRAZZ (ORCPT ); Tue, 17 Mar 2020 20:25:25 -0400 Received: from perceval.ideasonboard.com ([213.167.242.64]:59906 "EHLO perceval.ideasonboard.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1727148AbgCRAZY (ORCPT ); Tue, 17 Mar 2020 20:25:24 -0400 Received: from pendragon.bb.dnainternet.fi (81-175-216-236.bb.dnainternet.fi [81.175.216.236]) by perceval.ideasonboard.com (Postfix) with ESMTPSA id 89787130D; Wed, 18 Mar 2020 01:25:22 +0100 (CET) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com; s=mail; t=1584491123; bh=r6drN6vvFeLxBEjgbV7lLPzr3gKiF6W/cjDjK8JfyMk=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=K7mqSZQJpen1CANrSIXWe9XcswldTfhkKVYj9oQeHV4k+nvZ8ysjgm6F8E16r0IbY YlugKF95R0uE91V1gQ5xyOX6IbS6ixsfQ8y64LCrtzorWO//2+mgcbDQuVLu/WDPFu wbvqPheXlSuGFRV+KcDhDAN5x5CZ2M3jkxpSvX7g= From: Laurent Pinchart To: linux-media@vger.kernel.org Cc: Sakari Ailus , Jacopo Mondi , =?utf-8?q?Niklas_S=C3=B6derlund?= , Kieran Bingham , Lad Prabhakar , linux-renesas-soc@vger.kernel.org Subject: [PATCH v2 3/4] media: v4l2-async: Log message in case of heterogenous fwnode match Date: Wed, 18 Mar 2020 02:25:06 +0200 Message-Id: <20200318002507.30336-4-laurent.pinchart+renesas@ideasonboard.com> X-Mailer: git-send-email 2.24.1 In-Reply-To: <20200318002507.30336-1-laurent.pinchart+renesas@ideasonboard.com> References: <20200318002507.30336-1-laurent.pinchart+renesas@ideasonboard.com> MIME-Version: 1.0 Sender: linux-media-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-media@vger.kernel.org When a notifier supplies a device fwnode and a subdev supplies an endpoint fwnode, incorrect matches may occur if multiple subdevs correspond to the same device fwnode. This can't be handled transparently in the framework, and requires the notifier to switch to endpoint fwnodes. Log a message to notify of this problem. A second message is added to help accelerating the transition to endpoint matching. Signed-off-by: Laurent Pinchart Reviewed-by: Kieran Bingham Reviewed-by: Jacopo Mondi --- drivers/media/v4l2-core/v4l2-async.c | 24 +++++++++++++++++++++++- 1 file changed, 23 insertions(+), 1 deletion(-) diff --git a/drivers/media/v4l2-core/v4l2-async.c b/drivers/media/v4l2-core/v4l2-async.c index 224b39a7aeb1..9f393a7be455 100644 --- a/drivers/media/v4l2-core/v4l2-async.c +++ b/drivers/media/v4l2-core/v4l2-async.c @@ -77,6 +77,7 @@ static bool match_fwnode(struct v4l2_async_notifier *notifier, struct fwnode_handle *dev_fwnode; bool asd_fwnode_is_ep; bool sd_fwnode_is_ep; + struct device *dev; const char *name; /* @@ -113,7 +114,28 @@ static bool match_fwnode(struct v4l2_async_notifier *notifier, fwnode_handle_put(dev_fwnode); - return dev_fwnode == other_fwnode; + if (dev_fwnode != other_fwnode) + return false; + + /* + * We have an heterogenous match. Retrieve the struct device of the + * side that matched on a device fwnode to print its driver name. + */ + if (sd_fwnode_is_ep) + dev = notifier->v4l2_dev ? notifier->v4l2_dev->dev + : notifier->sd->dev; + else + dev = sd->dev; + + if (dev && dev->driver) { + if (sd_fwnode_is_ep) + dev_info(dev, "Driver %s uses device fwnode, incorrect match may occur\n", + dev->driver->name); + dev_info(dev, "Consider updating driver %s to match on endpoints\n", + dev->driver->name); + } + + return true; } static bool match_custom(struct v4l2_async_notifier *notifier, From patchwork Wed Mar 18 00:25:07 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Laurent Pinchart X-Patchwork-Id: 11444303 Return-Path: Received: from mail.kernel.org (pdx-korg-mail-1.web.codeaurora.org [172.30.200.123]) by pdx-korg-patchwork-2.web.codeaurora.org (Postfix) with ESMTP id 163F690 for ; Wed, 18 Mar 2020 00:25:27 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.kernel.org (Postfix) with ESMTP id E1C8A2073E for ; Wed, 18 Mar 2020 00:25:26 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=pass (1024-bit key) header.d=ideasonboard.com header.i=@ideasonboard.com header.b="ZjKxqJdP" Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1727210AbgCRAZZ (ORCPT ); Tue, 17 Mar 2020 20:25:25 -0400 Received: from perceval.ideasonboard.com ([213.167.242.64]:59906 "EHLO perceval.ideasonboard.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1727190AbgCRAZZ (ORCPT ); Tue, 17 Mar 2020 20:25:25 -0400 Received: from pendragon.bb.dnainternet.fi (81-175-216-236.bb.dnainternet.fi [81.175.216.236]) by perceval.ideasonboard.com (Postfix) with ESMTPSA id 3A7F51AF4; Wed, 18 Mar 2020 01:25:23 +0100 (CET) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com; s=mail; t=1584491123; bh=F9fnX25PXHg69eh7lpuMOqNiq3h0+N0RLw+RaLbWWnw=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=ZjKxqJdPkq8HYXxvfCedlI4EVGRfUM0pNK/oLY9bpqhsdnWKTDcfk6hB9zVEgZ1yq WBjjXrTiqN/Mjo+ciEGFFFu/vHmqw1j9sFF33pI9IEBMgTyYKfqfG1f8eYBg1kJt5b BSsEOio4FAaJ29iKT7r1+yomyRZocADmoOSXCR7o= From: Laurent Pinchart To: linux-media@vger.kernel.org Cc: Sakari Ailus , Jacopo Mondi , =?utf-8?q?Niklas_S=C3=B6derlund?= , Kieran Bingham , Lad Prabhakar , linux-renesas-soc@vger.kernel.org Subject: [PATCH v2 4/4] media: v4l2-async: Don't check fwnode name to detect endpoint Date: Wed, 18 Mar 2020 02:25:07 +0200 Message-Id: <20200318002507.30336-5-laurent.pinchart+renesas@ideasonboard.com> X-Mailer: git-send-email 2.24.1 In-Reply-To: <20200318002507.30336-1-laurent.pinchart+renesas@ideasonboard.com> References: <20200318002507.30336-1-laurent.pinchart+renesas@ideasonboard.com> MIME-Version: 1.0 Sender: linux-media-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-media@vger.kernel.org Use the presence of a "remote-endpoint" property to detect if a fwnode is an endpoint node, as checking the node name won't work on ACPI-based implementations. Signed-off-by: Laurent Pinchart --- drivers/media/v4l2-core/v4l2-async.c | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/drivers/media/v4l2-core/v4l2-async.c b/drivers/media/v4l2-core/v4l2-async.c index 9f393a7be455..a5f83ba502df 100644 --- a/drivers/media/v4l2-core/v4l2-async.c +++ b/drivers/media/v4l2-core/v4l2-async.c @@ -78,7 +78,6 @@ static bool match_fwnode(struct v4l2_async_notifier *notifier, bool asd_fwnode_is_ep; bool sd_fwnode_is_ep; struct device *dev; - const char *name; /* * Both the subdev and the async subdev can provide either an endpoint @@ -92,10 +91,10 @@ static bool match_fwnode(struct v4l2_async_notifier *notifier, * Otherwise, check if the sd fwnode and the asd fwnode refer to an * endpoint or a device. If they're of the same type, there's no match. */ - name = fwnode_get_name(sd->fwnode); - sd_fwnode_is_ep = name && strstarts(name, "endpoint"); - name = fwnode_get_name(asd->match.fwnode); - asd_fwnode_is_ep = name && strstarts(name, "endpoint"); + sd_fwnode_is_ep = fwnode_property_present(sd->fwnode, + "remote-endpoint"); + asd_fwnode_is_ep = fwnode_property_present(asd->match.fwnode, + "remote-endpoint"); if (sd_fwnode_is_ep == asd_fwnode_is_ep) return false;