Received: by 2002:ad5:474a:0:0:0:0:0 with SMTP id i10csp6055213imu; Wed, 30 Jan 2019 08:04:26 -0800 (PST) X-Google-Smtp-Source: ALg8bN74NwDzqRoBl3zCAwZFvZ3yBJd4m1+Ysd+deWduCHPyu+0rwMuxORv2WWtCOkdi4Kcapody X-Received: by 2002:a63:fc05:: with SMTP id j5mr28493413pgi.434.1548864266566; Wed, 30 Jan 2019 08:04:26 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1548864266; cv=none; d=google.com; s=arc-20160816; b=Alf3ZlTbHPJoI79NNrNPhMn2olWjiwxdxL8bMC6Kiy8RWf9g7eI5Y3aVlfEKK3hvxP DD+JiYYZMYqjDG7RhcNQqr4TW2n/yTFL6RC6syFMt67yFAn1WQN5Vgw7ZMXApnG30qsI 0Hr+aMNWuaue1FADBiNaZwXT3A1H9xrbjLgjjMgJB8jzG3CANK0rzBJ2Giob6ZHvfHzs zDU+dL9TCAEpbQ6L5IxTU084uF4mdfU5LAfkHTarQYL94tG/AcssF7MinIlzfkWCQVyV YIlO/YVIX27vib+YBvGwqOK2wc+bMxQWxZtxZlquNJAa5tZdqnYk7a4FAL7dDLJlA5RN j/+g== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:content-transfer-encoding:mime-version :references:in-reply-to:message-id:date:subject:cc:to:from; bh=tV8tv/z547IJMrADpP1rh9GkNtKRCKMyspn4nbIsxGU=; b=sg3ohB3Zi8t+r2wJuHrDPnBUgb0Bf/m/dwAhb8o2eyxI3V/jaF88vdjfEHq3GAoKrz kFYAnt4St4Ef8yc3xjyHR1gHNTN3AhuDyr1EgXo79gwUyhW5zJgpFGzZbM6f2Rkm54Th +Pdh8IXKcJtpL3eNjrhgwsy12qcdAHEP5sS0Z8WZjdX+PUTnPQPct2xhrR33Uw95oTcN RMVUTz7zcZJBH1ZSZWqCKdxBq/2iKGOH0rAKZ7OScN+uz9ONK0LVNuEBnmp6pPzG4fyq 0ASyEXYVCS8UFeAZZUTTpXr1kgdoP8AfGphPj+EiGje1A+Vz/mweVjGBgaH6T8cywDSk 6vkg== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=intel.com Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id 73si2099540pfm.50.2019.01.30.08.04.00; Wed, 30 Jan 2019 08:04:26 -0800 (PST) Received-SPF: pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) client-ip=209.132.180.67; Authentication-Results: mx.google.com; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=intel.com Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1731967AbfA3QD1 (ORCPT + 99 others); Wed, 30 Jan 2019 11:03:27 -0500 Received: from mga02.intel.com ([134.134.136.20]:60152 "EHLO mga02.intel.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1731643AbfA3QDX (ORCPT ); Wed, 30 Jan 2019 11:03:23 -0500 X-Amp-Result: SKIPPED(no attachment in message) X-Amp-File-Uploaded: False Received: from fmsmga001.fm.intel.com ([10.253.24.23]) by orsmga101.jf.intel.com with ESMTP/TLS/DHE-RSA-AES256-GCM-SHA384; 30 Jan 2019 08:03:23 -0800 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.56,541,1539673200"; d="scan'208";a="142760969" Received: from black.fi.intel.com (HELO black.fi.intel.com.) ([10.237.72.28]) by fmsmga001.fm.intel.com with ESMTP; 30 Jan 2019 08:03:21 -0800 From: Heikki Krogerus To: Greg Kroah-Hartman Cc: Andy Shevchenko , Chen Yu , Jun Li , Hans de Goede , linux-usb@vger.kernel.org, linux-kernel@vger.kernel.org Subject: [PATCH v2 9/9] device connection: Find device connections also from device graphs Date: Wed, 30 Jan 2019 19:02:59 +0300 Message-Id: <20190130160259.46919-10-heikki.krogerus@linux.intel.com> X-Mailer: git-send-email 2.20.1 In-Reply-To: <20190130160259.46919-1-heikki.krogerus@linux.intel.com> References: <20190130160259.46919-1-heikki.krogerus@linux.intel.com> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org If connections between devices are described in OF graph or ACPI device graph, we can find them by using the fwnode_graph_*() functions. Signed-off-by: Heikki Krogerus --- drivers/base/devcon.c | 38 +++++++++++++++++++++++++++++++++++--- 1 file changed, 35 insertions(+), 3 deletions(-) diff --git a/drivers/base/devcon.c b/drivers/base/devcon.c index 858b8d2f6ef8..04db9ae235e4 100644 --- a/drivers/base/devcon.c +++ b/drivers/base/devcon.c @@ -7,10 +7,37 @@ */ #include +#include static DEFINE_MUTEX(devcon_lock); static LIST_HEAD(devcon_list); +typedef void *(*devcon_match_fn_t)(struct device_connection *con, int ep, + void *data); + +static void * +fwnode_graph_devcon_match(struct fwnode_handle *fwnode, const char *con_id, + void *data, devcon_match_fn_t match) +{ + struct device_connection con = { .id = con_id }; + struct fwnode_handle *ep; + void *ret; + + fwnode_graph_for_each_endpoint(fwnode, ep) { + con.fwnode = fwnode_graph_get_remote_port_parent(ep); + if (!fwnode_device_is_available(con.fwnode)) + continue; + + ret = match(&con, -1, data); + fwnode_handle_put(con.fwnode); + if (ret) { + fwnode_handle_put(ep); + return ret; + } + } + return NULL; +} + /** * device_connection_find_match - Find physical connection to a device * @dev: Device with the connection @@ -23,10 +50,9 @@ static LIST_HEAD(devcon_list); * caller is expecting to be returned. */ void *device_connection_find_match(struct device *dev, const char *con_id, - void *data, - void *(*match)(struct device_connection *con, - int ep, void *data)) + void *data, devcon_match_fn_t match) { + struct fwnode_handle *fwnode = dev_fwnode(dev); const char *devname = dev_name(dev); struct device_connection *con; void *ret = NULL; @@ -35,6 +61,12 @@ void *device_connection_find_match(struct device *dev, const char *con_id, if (!match) return NULL; + if (fwnode) { + ret = fwnode_graph_devcon_match(fwnode, con_id, data, match); + if (ret) + return ret; + } + mutex_lock(&devcon_lock); list_for_each_entry(con, &devcon_list, list) { -- 2.20.1