From patchwork Wed May 17 15:03:39 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Kieran Bingham X-Patchwork-Id: 9731399 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 75D3260363 for ; Wed, 17 May 2017 15:04:06 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 68E96287A9 for ; Wed, 17 May 2017 15:04:06 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id 5D87E287B2; Wed, 17 May 2017 15:04:06 +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 0D14E287A9 for ; Wed, 17 May 2017 15:04:06 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1754561AbdEQPEE (ORCPT ); Wed, 17 May 2017 11:04:04 -0400 Received: from mail.kernel.org ([198.145.29.99]:58060 "EHLO mail.kernel.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1754479AbdEQPEA (ORCPT ); Wed, 17 May 2017 11:04:00 -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 C49FC23983; Wed, 17 May 2017 15:03:52 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org C49FC23983 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: linux-renesas-soc@vger.kernel.org, linux-media@vger.kernel.org, sakari.ailus@iki.fi, niklas.soderlund@ragnatech.se, laurent.pinchart@ideasonboard.com Cc: Kieran Bingham , Mauro Carvalho Chehab , Sakari Ailus , Javier Martinez Canillas , =?UTF-8?q?Niklas=20S=C3=B6derlund?= , Tuukka Toivonen , Javi Merino , linux-kernel@vger.kernel.org (open list) Subject: [PATCH v1 3/3] v4l: async: Match parent devices Date: Wed, 17 May 2017 16:03:39 +0100 Message-Id: <4db2a777a71b51a864caae16385b60b4b7e9f992.1495032810.git-series.kieran.bingham+renesas@ideasonboard.com> X-Mailer: git-send-email 2.7.4 In-Reply-To: References: In-Reply-To: References: 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 also to search for a comparison against the parent fwnode. 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 --- drivers/media/v4l2-core/v4l2-async.c | 20 ++++++++++++++++---- 1 file changed, 16 insertions(+), 4 deletions(-) diff --git a/drivers/media/v4l2-core/v4l2-async.c b/drivers/media/v4l2-core/v4l2-async.c index e1e181db90f7..65735a5c4350 100644 --- a/drivers/media/v4l2-core/v4l2-async.c +++ b/drivers/media/v4l2-core/v4l2-async.c @@ -41,14 +41,26 @@ static bool match_devname(struct v4l2_subdev *sd, return !strcmp(asd->match.device_name.name, dev_name(sd->dev)); } +static bool match_of(struct device_node *a, struct device_node *b) +{ + return !of_node_cmp(of_node_full_name(a), of_node_full_name(b)); +} + static bool match_fwnode(struct v4l2_subdev *sd, struct v4l2_async_subdev *asd) { + struct device_node *sdnode; + struct fwnode_handle *async_device; + + async_device = fwnode_graph_get_port_parent(asd->match.fwnode.fwnode); + if (!is_of_node(sd->fwnode) || !is_of_node(asd->match.fwnode.fwnode)) - return sd->fwnode == asd->match.fwnode.fwnode; + return sd->fwnode == asd->match.fwnode.fwnode || + sd->fwnode == async_device; + + sdnode = to_of_node(sd->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_of(sdnode, to_of_node(asd->match.fwnode.fwnode)) || + match_of(sdnode, to_of_node(async_device)); } static bool match_custom(struct v4l2_subdev *sd, struct v4l2_async_subdev *asd)