From patchwork Tue May 23 23:19:56 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Kieran Bingham X-Patchwork-Id: 9744403 X-Patchwork-Delegate: geert@linux-m68k.org Return-Path: Received: from mail.wl.linuxfoundation.org (pdx-wl-mail.web.codeaurora.org [172.30.200.125]) by pdx-korg-patchwork.web.codeaurora.org (Postfix) with ESMTP id B8A1A6032B for ; Tue, 23 May 2017 23:20:17 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id A98F928856 for ; Tue, 23 May 2017 23:20:17 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id 9AF3D28445; Tue, 23 May 2017 23:20:17 +0000 (UTC) X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on pdx-wl-mail.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-6.9 required=2.0 tests=BAYES_00,RCVD_IN_DNSWL_HI autolearn=ham version=3.3.1 Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 4852D28445 for ; Tue, 23 May 2017 23:20:04 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1031012AbdEWXUC (ORCPT ); Tue, 23 May 2017 19:20:02 -0400 Received: from mail.kernel.org ([198.145.29.99]:51488 "EHLO mail.kernel.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1030848AbdEWXUC (ORCPT ); Tue, 23 May 2017 19:20:02 -0400 Received: from CookieMonster.cookiemonster.local (cpc89242-aztw30-2-0-cust488.18-1.cable.virginm.net [86.31.129.233]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-SHA256 (128/128 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPSA id 292A523961; Tue, 23 May 2017 23:20:00 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org 292A523961 Authentication-Results: mail.kernel.org; dmarc=none (p=none dis=none) header.from=kernel.org Authentication-Results: mail.kernel.org; spf=none smtp.mailfrom=kbingham@kernel.org From: Kieran Bingham To: sakari.ailus@iki.fi, linux-media@vger.kernel.org Cc: laurent.pinchart@ideasonboard.com, linux-renesas-soc@vger.kernel.org, Kieran Bingham Subject: [PATCH v4] v4l: async: Match parent devices Date: Wed, 24 May 2017 00:19:56 +0100 Message-Id: <1495581596-1097-1-git-send-email-kbingham@kernel.org> X-Mailer: git-send-email 2.7.4 Sender: linux-renesas-soc-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-renesas-soc@vger.kernel.org X-Virus-Scanned: ClamAV using ClamSMTP From: Kieran Bingham Devices supporting multiple endpoints on a single device node must set their subdevice fwnode to the endpoint to allow distinct comparisons. Adapt the match_fwnode call to compare against the provided fwnodes first, but to also perform a cross reference comparison against the parent fwnodes of each other. This allows notifiers to pass the endpoint for comparison and still support existing subdevices which store their default parent device node. Signed-off-by: Kieran Bingham --- Hi Sakari, I've respun, rebased, and retested this patch. Hopefully it's good for moving forwards now. If you have any concerns about the comments as I've changed them, feel free to adjust as you see fit if you are planning to take this patch on one of your existing series v2: - Added documentation comments - simplified the OF match by adding match_fwnode_of() v3: - Fix comments - Fix sd_parent, and asd_parent usage v4: - Clean up and simplify match_fwnode and comparisons drivers/media/v4l2-core/v4l2-async.c | 30 +++++++++++++++++++++++++----- 1 file changed, 25 insertions(+), 5 deletions(-) diff --git a/drivers/media/v4l2-core/v4l2-async.c b/drivers/media/v4l2-core/v4l2-async.c index cbd919d4edd2..dbc6adb1347d 100644 --- a/drivers/media/v4l2-core/v4l2-async.c +++ b/drivers/media/v4l2-core/v4l2-async.c @@ -41,14 +41,34 @@ static bool match_devname(struct v4l2_subdev *sd, return !strcmp(asd->match.device_name.name, dev_name(sd->dev)); } +/* + * As a measure to support drivers which have not been converted to use + * endpoint matching, we also find the parent devices for cross-matching. + * + * This also allows continued support for matching subdevices which will not + * have an endpoint themselves. + */ + +static bool __match_fwnode(struct fwnode_handle *a, struct fwnode_handle *b) +{ + if (is_of_node(a) && is_of_node(b)) + return !of_node_cmp(of_node_full_name(to_of_node(a)), + of_node_full_name(to_of_node(b))); + else + return a == b; +} + static bool match_fwnode(struct v4l2_subdev *sd, struct v4l2_async_subdev *asd) { - if (!is_of_node(sd->fwnode) || !is_of_node(asd->match.fwnode.fwnode)) - return sd->fwnode == asd->match.fwnode.fwnode; + struct fwnode_handle *asd_fwnode = asd->match.fwnode.fwnode; + struct fwnode_handle *sd_parent, *asd_parent; + + sd_parent = fwnode_graph_get_port_parent(sd->fwnode); + asd_parent = fwnode_graph_get_port_parent(asd_fwnode); - return !of_node_cmp(of_node_full_name(to_of_node(sd->fwnode)), - of_node_full_name( - to_of_node(asd->match.fwnode.fwnode))); + return __match_fwnode(sd->fwnode, asd_fwnode) || + __match_fwnode(sd->fwnode, asd_parent) || + __match_fwnode(sd_parent, asd_fwnode); } static bool match_custom(struct v4l2_subdev *sd, struct v4l2_async_subdev *asd)