From patchwork Tue Jul 19 15:49:04 2016 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Lee Jones X-Patchwork-Id: 72340 Delivered-To: patch@linaro.org Received: by 10.140.29.52 with SMTP id a49csp151254qga; Tue, 19 Jul 2016 08:50:29 -0700 (PDT) X-Received: by 10.98.208.1 with SMTP id p1mr40440928pfg.10.1468943428895; Tue, 19 Jul 2016 08:50:28 -0700 (PDT) Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id w7si10043689pfw.171.2016.07.19.08.50.28; Tue, 19 Jul 2016 08:50:28 -0700 (PDT) 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; dkim=pass header.i=@linaro.org; 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=pass (p=NONE dis=NONE) header.from=linaro.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1754059AbcGSPuL (ORCPT + 29 others); Tue, 19 Jul 2016 11:50:11 -0400 Received: from mail-wm0-f51.google.com ([74.125.82.51]:38181 "EHLO mail-wm0-f51.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1753843AbcGSPuE (ORCPT ); Tue, 19 Jul 2016 11:50:04 -0400 Received: by mail-wm0-f51.google.com with SMTP id o80so31813792wme.1 for ; Tue, 19 Jul 2016 08:50:04 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; h=from:to:cc:subject:date:message-id; bh=UE48wIuq0Cc5c1LBAs/ku5dQPt7/Xw/yJgnz+cKhr8M=; b=OuRxKC+bMM/fMjkeLZzA1ZoSBY/dxopkOPnKM0ZPKzECBuzLGHSB+K0z2FA/qMYXuC ugqMeX7SJTaBpDoOE5MPQAKfR00h033tOOqSB1yzbdEFhFlYhOpyX4jzTg/Bi9hXmR4p RnzlhAhyZhW/vMnB9bf+5dMcbwQtiskDsMIgk= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:from:to:cc:subject:date:message-id; bh=UE48wIuq0Cc5c1LBAs/ku5dQPt7/Xw/yJgnz+cKhr8M=; b=Og7yXJA8hKPTMwt7NYimGLb8B5wPtuE4slSbDkVeJsRLUHgfvD+FrUh59ydYgmmcGy frdGGUN/RkiC5NPFAFFiUvEOQR+IqiAAAdoJD+yso118P2uhGXLoOQabxu+0nngXRGGW CFn5lR2qxgoj0l04DoR4Nd4Y0Y7VQgWQdTuX9558HZe98bRZIRDGevCRlhaM2hT7zQGj OxiRY2QnujN26garT56a5g1F97PzS7QWxB+KX9WlOFKdbmRB461RUguuoQv/BTmTZ8p4 leHDfiUi/kONFm/xbEmkeAzU6FkTrFlTIE27r8KzpYBMb0aKcV4D7p0+YhVftdmkPIVj l/Bw== X-Gm-Message-State: ALyK8tK2ID/q3vYwPdT8GPpSSOOihBjU2XQtu+v/SfE6q/x01VTf/BK+bu0oOXslZz6IXnUn X-Received: by 10.28.107.144 with SMTP id a16mr5430932wmi.75.1468943402464; Tue, 19 Jul 2016 08:50:02 -0700 (PDT) Received: from localhost.localdomain (host81-129-170-195.range81-129.btcentralplus.com. [81.129.170.195]) by smtp.gmail.com with ESMTPSA id g184sm23904164wme.15.2016.07.19.08.50.01 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Tue, 19 Jul 2016 08:50:01 -0700 (PDT) From: Lee Jones To: linux-arm-kernel@lists.infradead.org, linux-kernel@vger.kernel.org Cc: kernel@stlinux.com, patrice.chotard@st.com, ohad@wizery.com, bjorn.andersson@linaro.org, ssantosh@kernel.org, linux-remoteproc@vger.kernel.org, ludovic.barre@st.com, Lee Jones Subject: [PATCH 1/2] remoteproc: core: Add rproc OF look-up functions Date: Tue, 19 Jul 2016 16:49:04 +0100 Message-Id: <20160719154905.23344-1-lee.jones@linaro.org> X-Mailer: git-send-email 2.9.0 Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org - of_rproc_by_index(): look-up and obtain a reference to a rproc using the DT phandle "rprocs" and a index. - of_rproc_by_name(): lookup and obtain a reference to a rproc using the DT phandle "rprocs" and "rproc-names". Signed-off-by: Ludovic Barre Signed-off-by: Lee Jones --- drivers/remoteproc/remoteproc_core.c | 78 +++++++++++++++++++++++++++++++++++- include/linux/remoteproc.h | 25 +++++++++++- 2 files changed, 101 insertions(+), 2 deletions(-) -- 2.9.0 diff --git a/drivers/remoteproc/remoteproc_core.c b/drivers/remoteproc/remoteproc_core.c index db3958b..6a0d158 100644 --- a/drivers/remoteproc/remoteproc_core.c +++ b/drivers/remoteproc/remoteproc_core.c @@ -41,6 +41,8 @@ #include #include #include +#include +#include #include "remoteproc_internal.h" @@ -1191,6 +1193,81 @@ out: } EXPORT_SYMBOL(rproc_shutdown); +#ifdef CONFIG_OF +/** + * of_get_rproc_by_index() - lookup and obtain a reference to an rproc + * @np: node to search for rproc phandle + * @index: index into the phandle list + * + * This function increments the remote processor's refcount, so always + * use rproc_put() to decrement it back once rproc isn't needed anymore. + * + * Returns a pointer to the rproc struct on success or an appropriate error + * code otherwise. + */ +struct rproc *of_get_rproc_by_index(struct device_node *np, int index) +{ + struct rproc *rproc = NULL, *r; + struct device_node *rproc_np; + + if (index < 0) { + pr_err("Invalid index: %d\n", index); + return ERR_PTR(-EINVAL); + } + + rproc_np = of_parse_phandle(np, "rprocs", index); + if (!rproc_np) { + /* Unfortunately we have to support this, at least for now */ + rproc_np = of_parse_phandle(np, "ti,rprocs", index); + if (!rproc_np) { + pr_err("Failed to obtain phandle\n"); + return ERR_PTR(-ENODEV); + } + } + + mutex_lock(&rproc_list_mutex); + list_for_each_entry(r, &rproc_list, node) { + if (r->dev.parent && r->dev.parent->of_node == rproc_np) { + get_device(&r->dev); + rproc = r; + break; + } + } + mutex_unlock(&rproc_list_mutex); + + of_node_put(rproc_np); + + if (!rproc) + pr_err("Could not find rproc, deferring\n"); + + return rproc ?: ERR_PTR(-EPROBE_DEFER); +} +EXPORT_SYMBOL(of_get_rproc_by_index); + +/** + * of_get_rproc_by_name() - lookup and obtain a reference to an rproc + * @np: node to search for rproc + * @name: name of the remoteproc from device's point of view + * + * This function increments the remote processor's refcount, so always + * use rproc_put() to decrement it back once rproc isn't needed anymore. + * + * Returns a pointer to the rproc struct on success or an appropriate error + * code otherwise. + */ +struct rproc *of_get_rproc_by_name(struct device_node *np, const char *name) +{ + int index; + + if (unlikely(!name)) + return ERR_PTR(-EINVAL); + + index = of_property_match_string(np, "rproc-names", name); + + return of_get_rproc_by_index(np, index); +} +EXPORT_SYMBOL(of_get_rproc_by_name); + /** * rproc_get_by_phandle() - find a remote processor by phandle * @phandle: phandle to the rproc @@ -1203,7 +1280,6 @@ EXPORT_SYMBOL(rproc_shutdown); * * Returns the rproc handle on success, and NULL on failure. */ -#ifdef CONFIG_OF struct rproc *rproc_get_by_phandle(phandle phandle) { struct rproc *rproc = NULL, *r; diff --git a/include/linux/remoteproc.h b/include/linux/remoteproc.h index 1c457a8..f130938 100644 --- a/include/linux/remoteproc.h +++ b/include/linux/remoteproc.h @@ -487,7 +487,6 @@ struct rproc_vdev { u32 rsc_offset; }; -struct rproc *rproc_get_by_phandle(phandle phandle); struct rproc *rproc_alloc(struct device *dev, const char *name, const struct rproc_ops *ops, const char *firmware, int len); @@ -511,4 +510,28 @@ static inline struct rproc *vdev_to_rproc(struct virtio_device *vdev) return rvdev->rproc; } +#ifdef CONFIG_OF +extern struct rproc *of_get_rproc_by_index(struct device_node *np, + int index); +extern struct rproc *of_get_rproc_by_name(struct device_node *np, + const char *name); +extern struct rproc *rproc_get_by_phandle(phandle phandle); +#else +static inline +struct rproc *of_get_rproc_by_index(struct device_node *np, int index) +{ + return NULL; +} +static inline +struct rproc *of_get_rproc_by_name(struct device_node *np, const char *name) +{ + return NULL; +} +static inline +struct rproc *rproc_get_by_phandle(phandle phandle) +{ + return NULL; +} +#endif /* CONFIG_OF */ + #endif /* REMOTEPROC_H */