From patchwork Mon Feb 8 22:21:52 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "Enrico Weigelt, metux IT consult" X-Patchwork-Id: 1437970 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: ozlabs.org; spf=pass (sender SPF authorized) smtp.mailfrom=vger.kernel.org (client-ip=23.128.96.18; helo=vger.kernel.org; envelope-from=linux-gpio-owner@vger.kernel.org; receiver=) Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by ozlabs.org (Postfix) with ESMTP id 4DZLF53sqJz9sVX for ; Tue, 9 Feb 2021 09:25:13 +1100 (AEDT) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S231434AbhBHWY6 (ORCPT ); Mon, 8 Feb 2021 17:24:58 -0500 Received: from mout.kundenserver.de ([217.72.192.75]:46091 "EHLO mout.kundenserver.de" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S231194AbhBHWYy (ORCPT ); Mon, 8 Feb 2021 17:24:54 -0500 Received: from orion.localdomain ([95.115.15.83]) by mrelayeu.kundenserver.de (mreue107 [212.227.15.183]) with ESMTPSA (Nemesis) id 1MFslN-1l8MNn1nEV-00HQRS; Mon, 08 Feb 2021 23:22:12 +0100 From: "Enrico Weigelt, metux IT consult" To: linux-kernel@vger.kernel.org Cc: rafael@kernel.org, info@metux.net, linus.walleij@linaro.org, bgolaszewski@baylibre.com, robh+dt@kernel.org, frowand.list@gmail.com, pantelis.antoniou@konsulko.com, linux-gpio@vger.kernel.org, devicetree@vger.kernel.org Subject: [RFC PATCH 01/12] of: base: improve error message in of_phandle_iterator_next() Date: Mon, 8 Feb 2021 23:21:52 +0100 Message-Id: <20210208222203.22335-2-info@metux.net> X-Mailer: git-send-email 2.11.0 In-Reply-To: <20210208222203.22335-1-info@metux.net> References: <20210208222203.22335-1-info@metux.net> X-Provags-ID: V03:K1:StHwu6XV//m6RRcLywFyUHvKNrRov/gvJTl5SbpmNL78cQ82VgA gMBLVnnSz5vwUqWv7NIq021AIJYvyIawbNpv7OqnBSUTIZT8gWhEw/xY1C2HX0fp1+Zjkpq bKUXCHBTco8CJ6YBRO2kXsvzdxfpXRwGP21FM+5Q+95/rd0x1FLyr2jWzp7QTshBM+rjaKs CKv88AY48zy3drrYg8bBA== X-Spam-Flag: NO X-UI-Out-Filterresults: notjunk:1;V03:K0:I6bLjPej9cM=:SHPhq4kKOgXVRSliHDROYW BlaL5EeJ9U9u/fv45try5TZqLZCeEtnA/f2SgNO37cn53FF0xdIArwoV87YwzazAL7Z3mj8M+ RaK1YkDhXJF2BYN6byjojTbwslnT+9LtkbU+30dZSd7NHmqPq5K6XhRa5B5Ol2wbvsrDGXXhB 5C2cija0WXQl8EoGrGksCTqzUTUz0aPjNuPPHUSc27TmOSaoSmZBBKNLTdDk9Jixvj/ASAQZL hGKpJaWhFbW8/r1tLcG/31jzyDG5Wrnl+30DeTkMjdt2YNmJUoLrrg/egVblWK8VY2uxl+nvD XWPlsI5PZt1UNw/4Z0AXBLKzWdt5c1/fnMZE599zoyczQ8GeV0uy+3H/eoBU1TcxU6LD+UdZX GI2INH6/d3E8Ytny5QT7L7snp2/UUGvgY5+jg28tPrhqV/W+3xbgkxF8jOy6U Precedence: bulk List-ID: X-Mailing-List: linux-gpio@vger.kernel.org Also print out the phandle ID on error message, as a debug aid. Signed-off-by: Enrico Weigelt, metux IT consult --- drivers/of/base.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/drivers/of/base.c b/drivers/of/base.c index 161a23631472..8a348f0d3c5e 100644 --- a/drivers/of/base.c +++ b/drivers/of/base.c @@ -1297,8 +1297,8 @@ int of_phandle_iterator_next(struct of_phandle_iterator *it) if (it->cells_name) { if (!it->node) { - pr_err("%pOF: could not find phandle\n", - it->parent); + pr_err("%pOF: could not find phandle %d\n", + it->parent, it->phandle); goto err; } From patchwork Mon Feb 8 22:21:53 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "Enrico Weigelt, metux IT consult" X-Patchwork-Id: 1437961 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: ozlabs.org; spf=pass (sender SPF authorized) smtp.mailfrom=vger.kernel.org (client-ip=23.128.96.18; helo=vger.kernel.org; envelope-from=linux-gpio-owner@vger.kernel.org; receiver=) Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by ozlabs.org (Postfix) with ESMTP id 4DZLDz2B6Qz9sS8 for ; Tue, 9 Feb 2021 09:25:07 +1100 (AEDT) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S230055AbhBHWYt (ORCPT ); Mon, 8 Feb 2021 17:24:49 -0500 Received: from mout.kundenserver.de ([212.227.17.10]:47129 "EHLO mout.kundenserver.de" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S229698AbhBHWYs (ORCPT ); Mon, 8 Feb 2021 17:24:48 -0500 Received: from orion.localdomain ([95.115.15.83]) by mrelayeu.kundenserver.de (mreue107 [212.227.15.183]) with ESMTPSA (Nemesis) id 1MvrRB-1m1Lbn43eh-00stt0; Mon, 08 Feb 2021 23:22:13 +0100 From: "Enrico Weigelt, metux IT consult" To: linux-kernel@vger.kernel.org Cc: rafael@kernel.org, info@metux.net, linus.walleij@linaro.org, bgolaszewski@baylibre.com, robh+dt@kernel.org, frowand.list@gmail.com, pantelis.antoniou@konsulko.com, linux-gpio@vger.kernel.org, devicetree@vger.kernel.org Subject: [RFC PATCH 02/12] of: base: introduce of_find_node_by_phandle_from() Date: Mon, 8 Feb 2021 23:21:53 +0100 Message-Id: <20210208222203.22335-3-info@metux.net> X-Mailer: git-send-email 2.11.0 In-Reply-To: <20210208222203.22335-1-info@metux.net> References: <20210208222203.22335-1-info@metux.net> X-Provags-ID: V03:K1:ry3tr0lI+PQkmkLr//2b6GfCbmACQuG1weOU8C7zi3OIOShrzAX KZYIZMNxk3imLFpt9WqyuTLIA4/Ey5/kHs/aTl8qdF3B1o20hMytkQmBXZQOhazzuVlkS1/ Y/R+KBhHdefL0pWd4ccpIOulWiGptaTq2vQmwAPWqUAQlTat+HghNL0OSEnIoiCCz5xJYYr WbPmFyeerXQvua2JyBLxQ== X-Spam-Flag: NO X-UI-Out-Filterresults: notjunk:1;V03:K0:QSIQk1vZ/A4=:TeQE94IkBOZ6Cy8OV1zn0O F4cui0rWYvrwlktcamo9z/hu7liVWTzMVAZGfNTm+4pAs38ftxLvXDtEPSDYPriYD4L+MU6Y6 Ug5zyUMkY76puEo64wVEL+BvTPG/rv4aN8tL3JT/SBoLsxISNo7wcZ7GEh8o03K2y267eiRsj V47jPzxl775feQHYz3QDNUKQYxAPvIZJcjITmTI0ySqslyQLduWH9u82gvTAvkr9Cwk19ly7x NS2b5gMzBzs5W6f2LlUJ+LE5jJvPsN9vdFDruS5OMj+0OHK9blm8iS66/hpiTDJQyTNYkmXfC BesErPh6htPBtv3JCQCPbyJ7Zl5Yl9N7tV0Vc0G4PcPsOD+CLhw0WV+FT/kCqVrnCp0fEcna3 EoLE7XnNGvboBMTEzb44WlOox51fDL+jraqK/0ZtKF4W2MW7U+EEQjR79GeRQ Precedence: bulk List-ID: X-Mailing-List: linux-gpio@vger.kernel.org Introducing a variant of of_find_node_by_phandle() that starts off a different root node. This root can also point to an detached oftree, which has no relations to primary oftree, even on platforms that natively don't have oftree at all (eg. ACPI platforms). Note that this has nothing to do with oftree overlays. Signed-off-by: Enrico Weigelt, metux IT consult --- drivers/of/base.c | 14 +++++++++----- include/linux/of.h | 7 ++++++- 2 files changed, 15 insertions(+), 6 deletions(-) diff --git a/drivers/of/base.c b/drivers/of/base.c index 8a348f0d3c5e..6b3d1e817808 100644 --- a/drivers/of/base.c +++ b/drivers/of/base.c @@ -1187,13 +1187,15 @@ int of_modalias_node(struct device_node *node, char *modalias, int len) EXPORT_SYMBOL_GPL(of_modalias_node); /** - * of_find_node_by_phandle - Find a node given a phandle + * of_find_node_by_phandle_from - Find a node given a phandle + * @root: root of the tree (on NULL default to of_root) * @handle: phandle of the node to find * * Returns a node pointer with refcount incremented, use * of_node_put() on it when done. */ -struct device_node *of_find_node_by_phandle(phandle handle) +struct device_node *of_find_node_by_phandle_from(struct device_node *root, + phandle handle) { struct device_node *np = NULL; unsigned long flags; @@ -1211,19 +1213,21 @@ struct device_node *of_find_node_by_phandle(phandle handle) np = phandle_cache[handle_hash]; if (!np) { - for_each_of_allnodes(np) + for_each_of_allnodes_from(root, np) { if (np->phandle == handle && !of_node_check_flag(np, OF_DETACHED)) { - phandle_cache[handle_hash] = np; + if (!root) + phandle_cache[handle_hash] = np; break; } + } } of_node_get(np); raw_spin_unlock_irqrestore(&devtree_lock, flags); return np; } -EXPORT_SYMBOL(of_find_node_by_phandle); +EXPORT_SYMBOL(of_find_node_by_phandle_from); void of_print_phandle_args(const char *msg, const struct of_phandle_args *args) { diff --git a/include/linux/of.h b/include/linux/of.h index 4b27c9a27df3..c285141653e5 100644 --- a/include/linux/of.h +++ b/include/linux/of.h @@ -282,7 +282,12 @@ static inline struct device_node *of_find_node_by_path(const char *path) return of_find_node_opts_by_path(path, NULL); } -extern struct device_node *of_find_node_by_phandle(phandle handle); +extern struct device_node *of_find_node_by_phandle_from( + struct device_node* root, phandle handle); +static inline struct device_node *of_find_node_by_phandle(phandle handle) +{ + return of_find_node_by_phandle_from(NULL, handle); +} extern struct device_node *of_get_parent(const struct device_node *node); extern struct device_node *of_get_next_parent(struct device_node *node); extern struct device_node *of_get_next_child(const struct device_node *node, From patchwork Mon Feb 8 22:21:54 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "Enrico Weigelt, metux IT consult" X-Patchwork-Id: 1437965 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: ozlabs.org; spf=pass (sender SPF authorized) smtp.mailfrom=vger.kernel.org (client-ip=23.128.96.18; helo=vger.kernel.org; envelope-from=linux-gpio-owner@vger.kernel.org; receiver=) Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by ozlabs.org (Postfix) with ESMTP id 4DZLF21bvsz9sCq for ; Tue, 9 Feb 2021 09:25:10 +1100 (AEDT) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S231256AbhBHWYx (ORCPT ); Mon, 8 Feb 2021 17:24:53 -0500 Received: from mout.kundenserver.de ([217.72.192.73]:53483 "EHLO mout.kundenserver.de" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S229760AbhBHWYt (ORCPT ); Mon, 8 Feb 2021 17:24:49 -0500 Received: from orion.localdomain ([95.115.15.83]) by mrelayeu.kundenserver.de (mreue107 [212.227.15.183]) with ESMTPSA (Nemesis) id 1MmD2M-1lZSw122Zk-00iCcL; Mon, 08 Feb 2021 23:22:13 +0100 From: "Enrico Weigelt, metux IT consult" To: linux-kernel@vger.kernel.org Cc: rafael@kernel.org, info@metux.net, linus.walleij@linaro.org, bgolaszewski@baylibre.com, robh+dt@kernel.org, frowand.list@gmail.com, pantelis.antoniou@konsulko.com, linux-gpio@vger.kernel.org, devicetree@vger.kernel.org Subject: [RFC PATCH 03/12] of: base: record root node in interator and use it for phandle lookup Date: Mon, 8 Feb 2021 23:21:54 +0100 Message-Id: <20210208222203.22335-4-info@metux.net> X-Mailer: git-send-email 2.11.0 In-Reply-To: <20210208222203.22335-1-info@metux.net> References: <20210208222203.22335-1-info@metux.net> X-Provags-ID: V03:K1:L07WfYEKaUHFQXWge6SNQV7uWaSzApb9DBlUnN7eDKenKnVc9cR wReeAdO0XeeuDjURl89qC/QDWRLaPENdF+n1sDQVpo59lDEM1dNCE5i9CVo/W9irbkivn3M U9JZI099qVXl3Nji6F8vE0xyLS9fRj77i6N+b5JmiLhvG2PReQUZYeF6B2j8IxDWHe0+SeW EVCW878DP7MXUa/3HgaSA== X-Spam-Flag: NO X-UI-Out-Filterresults: notjunk:1;V03:K0:3sXEFVMRuSo=:oizTkM24xt/Gez0Dn9xwqo 7zUxaRlqh3OeBp8Jjdj06fXRypKJp9Z2gz3RDogbgfNUe6A66ucDw5DD458kDsbKX3eEiZrnf MgAPqiDuLpgytc9GXNdlf1QMaVGRJ+FqSf1ev+EBU9/W3VYqdgkdC28D7FHt7dKrvmJKS0Qgm T256AyPwTPxAGRk3yhsglxBZ6Po/XBpMvC3gEPcqmH0k8trAHOOkCXzeXTuxx5shLtdd2VvA1 v29px/uzWeqPZkKqS/id45qb0JzSWHekMjNBPSHYOTolmwCmzPO/hs6S7dnur5leVDB3ESNDY 5eZT47aNvvvjTkOLhTwXkrAT4S/rbWD6zTfr95T1koqx1oQ7sEXWUREX6RgKYC7B3xhcKFvrR +C8GmSmufHgHJJXV6pWMSjCPmBj47UZVS2cGTKSDWkf6uvCtu45wDs4aAmbdS Precedence: bulk List-ID: X-Mailing-List: linux-gpio@vger.kernel.org For detached oftree support, find the root node and record it, on iterator creation. If we find the root of the global oftree, record NULL, in order to have a clear distinction between detached and non-detached cases. The recorded root node is then used for resolving phandles. Note that in the detached case, phandle cache can't be used, so we have a little performance penalty on repeated phandle lookups. Signed-off-by: Enrico Weigelt, metux IT consult --- drivers/of/base.c | 13 ++++++++++++- include/linux/of.h | 1 + 2 files changed, 13 insertions(+), 1 deletion(-) diff --git a/drivers/of/base.c b/drivers/of/base.c index 6b3d1e817808..e5ef611ed233 100644 --- a/drivers/of/base.c +++ b/drivers/of/base.c @@ -1249,6 +1249,7 @@ int of_phandle_iterator_init(struct of_phandle_iterator *it, { const __be32 *list; int size; + struct device_node *walk; memset(it, 0, sizeof(*it)); @@ -1270,6 +1271,16 @@ int of_phandle_iterator_init(struct of_phandle_iterator *it, it->phandle_end = list; it->cur = list; + /* + * find the root of our tree and record it, if we're dealing with an + * detached oftree - in non-detached case, we record NULL, for clear + * distinction between these two cases. + */ + for (walk=(struct device_node*)np; + walk->parent; + walk=(struct device_node*)walk->parent); + it->root = ((walk == of_root) ? NULL : walk); + return 0; } EXPORT_SYMBOL_GPL(of_phandle_iterator_init); @@ -1297,7 +1308,7 @@ int of_phandle_iterator_next(struct of_phandle_iterator *it) * Find the provider node and parse the #*-cells property to * determine the argument length. */ - it->node = of_find_node_by_phandle(it->phandle); + it->node = of_find_node_by_phandle_from(it->root, it->phandle); if (it->cells_name) { if (!it->node) { diff --git a/include/linux/of.h b/include/linux/of.h index c285141653e5..dbf2c7442389 100644 --- a/include/linux/of.h +++ b/include/linux/of.h @@ -82,6 +82,7 @@ struct of_phandle_iterator { const char *cells_name; int cell_count; const struct device_node *parent; + struct device_node *root; /* List size information */ const __be32 *list_end; From patchwork Mon Feb 8 22:21:55 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "Enrico Weigelt, metux IT consult" X-Patchwork-Id: 1437963 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: ozlabs.org; spf=pass (sender SPF authorized) smtp.mailfrom=vger.kernel.org (client-ip=23.128.96.18; helo=vger.kernel.org; envelope-from=linux-gpio-owner@vger.kernel.org; receiver=) Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by ozlabs.org (Postfix) with ESMTP id 4DZLF133xnz9sS8 for ; Tue, 9 Feb 2021 09:25:09 +1100 (AEDT) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S231167AbhBHWYu (ORCPT ); Mon, 8 Feb 2021 17:24:50 -0500 Received: from mout.kundenserver.de ([212.227.17.10]:49989 "EHLO mout.kundenserver.de" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S229894AbhBHWYt (ORCPT ); Mon, 8 Feb 2021 17:24:49 -0500 Received: from orion.localdomain ([95.115.15.83]) by mrelayeu.kundenserver.de (mreue107 [212.227.15.183]) with ESMTPSA (Nemesis) id 1M734j-1lHC4P0AKV-008f14; Mon, 08 Feb 2021 23:22:14 +0100 From: "Enrico Weigelt, metux IT consult" To: linux-kernel@vger.kernel.org Cc: rafael@kernel.org, info@metux.net, linus.walleij@linaro.org, bgolaszewski@baylibre.com, robh+dt@kernel.org, frowand.list@gmail.com, pantelis.antoniou@konsulko.com, linux-gpio@vger.kernel.org, devicetree@vger.kernel.org Subject: [RFC PATCH 04/12] of: base: introduce of_match_string() Date: Mon, 8 Feb 2021 23:21:55 +0100 Message-Id: <20210208222203.22335-5-info@metux.net> X-Mailer: git-send-email 2.11.0 In-Reply-To: <20210208222203.22335-1-info@metux.net> References: <20210208222203.22335-1-info@metux.net> X-Provags-ID: V03:K1:+rmg5D19d+Ip9CTiWXfPmk4J3BzxCGSQxH0xzlf9U9ohHk3kzUE AoiRnIHtt9yPEcSBC1+mSLXnuBPsSiFOP1cC1GriljwvSx0uiM+570LyYcQ6gkgJ+ET0xsp Z7yMlfIGGkRC9+fHFbGWwBRD6iwxSugsKTEI4rBmvr0s20NN0xgpuz/B/DgtRnsJB6wXQuT zkaAyIRcgOL3SsJB9keBg== X-Spam-Flag: NO X-UI-Out-Filterresults: notjunk:1;V03:K0:M5TiMKqNSGs=:Axv0bH84KLPJLgXBidEf4l ZH5uLsI0oA78oPCP+lXvTqFdU/txTz5lhKzBc5xqSEUoQDqY2I6eIPnVvfcFHw1Kz8FtKSKk8 8HhutFhiSgR0VEGxbgSrYj9WvuH9mPs5FPOLIVeb5F+b3zcChd9qviZykxhXFnx4I37AkVeg7 qinqrf5HY0oFlx+g1kaHFqAftyghljP5s/3ewIGjRapC/E4U2VE9LCZYqq3BZszMLcbMVx+9/ c391TGqmQ2uBg7V5fWagykWoapsSKo+mur0u0U6D2j6b/cv16bm94WrXutqimk4YCG43WS2Qw zrx9v7Z+j8e52O65Z2DvqCm8EY1SmGMX1aCpws+TB52emxWLXX5kcHN985m+zb7VUPBWO/7JF Ep0vq6rlJVYNY/ckiA3Hxv+LVs+2jiN5SfVDWdo7SHxpg/L1cghuc3MemqLLa Precedence: bulk List-ID: X-Mailing-List: linux-gpio@vger.kernel.org Introduce a new helper function that looks up a given propery and matches all string elements against a given string. This is useful if we want to check wether one string element of some property matches a given string. Signed-off-by: Enrico Weigelt, metux IT consult --- drivers/of/base.c | 32 ++++++++++++++++++++++++++++++++ include/linux/of.h | 2 ++ 2 files changed, 34 insertions(+) diff --git a/drivers/of/base.c b/drivers/of/base.c index e5ef611ed233..649c2a32bb48 100644 --- a/drivers/of/base.c +++ b/drivers/of/base.c @@ -287,6 +287,38 @@ const void *of_get_property(const struct device_node *np, const char *name, EXPORT_SYMBOL(of_get_property); /* + * of_match_string - match a propery against given string + * @node: device_node to look up at + * @name: name of the property + * @value: value to match against + * + * Look for property by name and match all string elements against value. + * Returns true if the property exists and any one of the string elements + * matches the given value. + */ +bool of_match_string(const struct device_node *node, const char* name, + const char* value) +{ + struct property *prop; + const char *walk; + + if (!name || !value) + return false; + + prop = of_find_property(node, name, NULL); + if (!prop) + return false; + + for (walk=of_prop_next_string(prop, NULL); walk; + walk=of_prop_next_string(prop, walk)) { + if (strcmp(walk, value)==0) + return true; + } + return true; +} +EXPORT_SYMBOL_GPL(of_match_string); + +/* * arch_match_cpu_phys_id - Match the given logical CPU and physical id * * @cpu: logical cpu index of a core/thread diff --git a/include/linux/of.h b/include/linux/of.h index dbf2c7442389..3612429632f4 100644 --- a/include/linux/of.h +++ b/include/linux/of.h @@ -355,6 +355,8 @@ extern bool of_device_is_big_endian(const struct device_node *device); extern const void *of_get_property(const struct device_node *node, const char *name, int *lenp); +extern bool of_match_string(const struct device_node *node, const char* name, + const char* value); extern struct device_node *of_get_cpu_node(int cpu, unsigned int *thread); extern struct device_node *of_get_next_cpu_node(struct device_node *prev); extern struct device_node *of_get_cpu_state_node(struct device_node *cpu_node, From patchwork Mon Feb 8 22:21:56 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "Enrico Weigelt, metux IT consult" X-Patchwork-Id: 1437977 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: ozlabs.org; spf=pass (sender SPF authorized) smtp.mailfrom=vger.kernel.org (client-ip=23.128.96.18; helo=vger.kernel.org; envelope-from=linux-gpio-owner@vger.kernel.org; receiver=) Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by ozlabs.org (Postfix) with ESMTP id 4DZLFl343Lz9sVX for ; Tue, 9 Feb 2021 09:25:47 +1100 (AEDT) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S231627AbhBHWZZ (ORCPT ); Mon, 8 Feb 2021 17:25:25 -0500 Received: from mout.kundenserver.de ([217.72.192.75]:50717 "EHLO mout.kundenserver.de" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S231549AbhBHWZE (ORCPT ); Mon, 8 Feb 2021 17:25:04 -0500 Received: from orion.localdomain ([95.115.15.83]) by mrelayeu.kundenserver.de (mreue107 [212.227.15.183]) with ESMTPSA (Nemesis) id 1MKKlN-1lUTlZ2RrT-00Lm3a; Mon, 08 Feb 2021 23:22:14 +0100 From: "Enrico Weigelt, metux IT consult" To: linux-kernel@vger.kernel.org Cc: rafael@kernel.org, info@metux.net, linus.walleij@linaro.org, bgolaszewski@baylibre.com, robh+dt@kernel.org, frowand.list@gmail.com, pantelis.antoniou@konsulko.com, linux-gpio@vger.kernel.org, devicetree@vger.kernel.org Subject: [RFC PATCH 05/12] of: kobj: __of_attach_node_sysfs(): add optional basename parameter Date: Mon, 8 Feb 2021 23:21:56 +0100 Message-Id: <20210208222203.22335-6-info@metux.net> X-Mailer: git-send-email 2.11.0 In-Reply-To: <20210208222203.22335-1-info@metux.net> References: <20210208222203.22335-1-info@metux.net> X-Provags-ID: V03:K1:npTHoKrL2oZbIv5cy3FmU1KTINiQbH4qQhD55Xayo4OIGdDxoev gbzaBfDm82BI+WL0Q5XXfcw2bf1mhzCP5EfsMEH22W+YrQEoWvpFapetR8aW4a4Mn1BHh31 Pm01SE0jNYzBPFs79nvITLiY849a6/f12ji880iUonxJzqoj9k+3PirBtebr4pjkU1/KWJ6 kwWQTazNy00Vr3t1i8Sfg== X-Spam-Flag: NO X-UI-Out-Filterresults: notjunk:1;V03:K0:8z86mJ3AC+k=:6VyNFzdPV/KSorHycOvmKI 5+mYc3CjznHOHfVs9RqH3PCNXVGIpSxUI9D+ViGXZNfZsZfe0TWmFDHPRI+NUnLnqq/y39poV M+L575DO+CQ79T2eODO2/7m92kauR41BCOyik0it83xhr/t4A2tKO+VyIoZ8bC5jsnKZxUzIK 2rz7fIDerNi3zIaY8d7u8BPJm2YXgaF+W8zNFYo7t/4e4pWC5AUFYk4IEeKpWJUjLB6LRtPYI TIe4V5y2mz7+h9eVfE34zXk8Hwtec2comFPyuCJ6F360VrgfAw6kOfUGC4zP/mtUnvP3ia2U4 y4efzNucwczV+sryhyHUjKNumVF8H39Yk5wcuLIbuos8JJwu6Ic1eVMinOH5wmNNZ46rHiOV6 5Rx95sodEKfSXBQPIJjsPaZfsuThBd+efbCtI0KgSaeBgm0WPUNNFFIfkvIzF Precedence: bulk List-ID: X-Mailing-List: linux-gpio@vger.kernel.org Introduce additional parameter for specifying the name of the base directory underneath /sys/firmware/devicetree. This is for scenarios where we want entirely separate oftree instances. Passing NULL falls back to the existing base name 'base'. Signed-off-by: Enrico Weigelt, metux IT consult --- drivers/of/base.c | 2 +- drivers/of/dynamic.c | 4 ++-- drivers/of/kobj.c | 7 +++++-- drivers/of/of_private.h | 6 +++--- drivers/of/unittest.c | 6 +++--- 5 files changed, 14 insertions(+), 11 deletions(-) diff --git a/drivers/of/base.c b/drivers/of/base.c index 649c2a32bb48..be63493bd232 100644 --- a/drivers/of/base.c +++ b/drivers/of/base.c @@ -177,7 +177,7 @@ void __init of_core_init(void) return; } for_each_of_allnodes(np) { - __of_attach_node_sysfs(np); + __of_attach_node_sysfs(np, NULL); if (np->phandle && !phandle_cache[of_phandle_cache_hash(np->phandle)]) phandle_cache[of_phandle_cache_hash(np->phandle)] = np; } diff --git a/drivers/of/dynamic.c b/drivers/of/dynamic.c index 9a824decf61f..63768f0dc60e 100644 --- a/drivers/of/dynamic.c +++ b/drivers/of/dynamic.c @@ -243,7 +243,7 @@ int of_attach_node(struct device_node *np) __of_attach_node(np); raw_spin_unlock_irqrestore(&devtree_lock, flags); - __of_attach_node_sysfs(np); + __of_attach_node_sysfs(np, NULL); mutex_unlock(&of_mutex); of_reconfig_notify(OF_RECONFIG_ATTACH_NODE, &rd); @@ -635,7 +635,7 @@ static int __of_changeset_entry_apply(struct of_changeset_entry *ce) switch (ce->action) { case OF_RECONFIG_ATTACH_NODE: - __of_attach_node_sysfs(ce->np); + __of_attach_node_sysfs(ce->np, NULL); break; case OF_RECONFIG_DETACH_NODE: __of_detach_node_sysfs(ce->np); diff --git a/drivers/of/kobj.c b/drivers/of/kobj.c index a32e60b024b8..511d7e8b9068 100644 --- a/drivers/of/kobj.c +++ b/drivers/of/kobj.c @@ -112,20 +112,23 @@ void __of_update_property_sysfs(struct device_node *np, struct property *newprop __of_add_property_sysfs(np, newprop); } -int __of_attach_node_sysfs(struct device_node *np) +int __of_attach_node_sysfs(struct device_node *np, const char *basename) { const char *name; struct kobject *parent; struct property *pp; int rc; + if (!basename) + basename = "base"; + if (!of_kset) return 0; np->kobj.kset = of_kset; if (!np->parent) { /* Nodes without parents are new top level trees */ - name = safe_name(&of_kset->kobj, "base"); + name = safe_name(&of_kset->kobj, basename); parent = NULL; } else { name = safe_name(&np->parent->kobj, kbasename(np->full_name)); diff --git a/drivers/of/of_private.h b/drivers/of/of_private.h index d9e6a324de0a..371f4da77161 100644 --- a/drivers/of/of_private.h +++ b/drivers/of/of_private.h @@ -63,7 +63,7 @@ int __of_add_property_sysfs(struct device_node *np, struct property *pp); void __of_remove_property_sysfs(struct device_node *np, struct property *prop); void __of_update_property_sysfs(struct device_node *np, struct property *newprop, struct property *oldprop); -int __of_attach_node_sysfs(struct device_node *np); +int __of_attach_node_sysfs(struct device_node *np, const char *basename); void __of_detach_node_sysfs(struct device_node *np); #else static inline int __of_add_property_sysfs(struct device_node *np, struct property *pp) @@ -73,7 +73,7 @@ static inline int __of_add_property_sysfs(struct device_node *np, struct propert static inline void __of_remove_property_sysfs(struct device_node *np, struct property *prop) {} static inline void __of_update_property_sysfs(struct device_node *np, struct property *newprop, struct property *oldprop) {} -static inline int __of_attach_node_sysfs(struct device_node *np) +static inline int __of_attach_node_sysfs(struct device_node *np, const char *basename) { return 0; } @@ -135,7 +135,7 @@ extern int __of_update_property(struct device_node *np, extern void __of_update_property_sysfs(struct device_node *np, struct property *newprop, struct property *oldprop); -extern int __of_attach_node_sysfs(struct device_node *np); +extern int __of_attach_node_sysfs(struct device_node *np, const char *basename); extern void __of_detach_node(struct device_node *np); extern void __of_detach_node_sysfs(struct device_node *np); diff --git a/drivers/of/unittest.c b/drivers/of/unittest.c index eb51bc147440..caf4ade8b141 100644 --- a/drivers/of/unittest.c +++ b/drivers/of/unittest.c @@ -1391,7 +1391,7 @@ static void attach_node_and_children(struct device_node *np) of_node_clear_flag(np, OF_DETACHED); raw_spin_unlock_irqrestore(&devtree_lock, flags); - __of_attach_node_sysfs(np); + __of_attach_node_sysfs(np, NULL); mutex_unlock(&of_mutex); while (child) { @@ -1451,7 +1451,7 @@ static int __init unittest_data_add(void) if (!of_root) { of_root = unittest_data_node; for_each_of_allnodes(np) - __of_attach_node_sysfs(np); + __of_attach_node_sysfs(np, NULL); of_aliases = of_find_node_by_path("/aliases"); of_chosen = of_find_node_by_path("/chosen"); of_overlay_mutex_unlock(); @@ -3115,7 +3115,7 @@ static __init void of_unittest_overlay_high_level(void) of_root->child = overlay_base_root->child; for_each_of_allnodes_from(overlay_base_root, np) - __of_attach_node_sysfs(np); + __of_attach_node_sysfs(np, NULL); if (of_symbols) { struct property *new_prop; From patchwork Mon Feb 8 22:21:57 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "Enrico Weigelt, metux IT consult" X-Patchwork-Id: 1437974 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: ozlabs.org; spf=pass (sender SPF authorized) smtp.mailfrom=vger.kernel.org (client-ip=23.128.96.18; helo=vger.kernel.org; envelope-from=linux-gpio-owner@vger.kernel.org; receiver=) Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by ozlabs.org (Postfix) with ESMTP id 4DZLFh5Vswz9sS8 for ; Tue, 9 Feb 2021 09:25:44 +1100 (AEDT) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S231576AbhBHWZU (ORCPT ); Mon, 8 Feb 2021 17:25:20 -0500 Received: from mout.kundenserver.de ([212.227.17.24]:45149 "EHLO mout.kundenserver.de" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S231473AbhBHWZD (ORCPT ); Mon, 8 Feb 2021 17:25:03 -0500 Received: from orion.localdomain ([95.115.15.83]) by mrelayeu.kundenserver.de (mreue107 [212.227.15.183]) with ESMTPSA (Nemesis) id 1MYe6H-1lMjTA0aKB-00VdwQ; Mon, 08 Feb 2021 23:22:15 +0100 From: "Enrico Weigelt, metux IT consult" To: linux-kernel@vger.kernel.org Cc: rafael@kernel.org, info@metux.net, linus.walleij@linaro.org, bgolaszewski@baylibre.com, robh+dt@kernel.org, frowand.list@gmail.com, pantelis.antoniou@konsulko.com, linux-gpio@vger.kernel.org, devicetree@vger.kernel.org Subject: [RFC PATCH 06/12] of: kobj: introduce of_attach_tree_sysfs() Date: Mon, 8 Feb 2021 23:21:57 +0100 Message-Id: <20210208222203.22335-7-info@metux.net> X-Mailer: git-send-email 2.11.0 In-Reply-To: <20210208222203.22335-1-info@metux.net> References: <20210208222203.22335-1-info@metux.net> X-Provags-ID: V03:K1:ZtGzokklzdJEAZwPGATmrH1/M0zLFv6KzHuwBPz7+oXxl4Nxg1b T2WWlO6QkPZXpRM1Fek92mrgiTDDi1HM4UyPU3mKz4QBO9Pec9Z03+jXoat9A4OWPnc+qTZ GQpY0FB294LDM9mM68UB1WcUCHpIcSU5rAjnAwx6EpgOFzSD7ZA882En9rcIIDkIyV1dY9P ZiFJ84GVJGUmb+x3Lzg9w== X-Spam-Flag: NO X-UI-Out-Filterresults: notjunk:1;V03:K0:nx2Q60Qwd9I=:b8Ucwi6B5pI52GcH8caQh8 L+DLzZZ6WY7Cu3cRAtHCxlhyENquB3BP1CIlxK9wyXd9Nf4VDBAPh4PwWKGzi+f3sZETCWcCZ LqjFZbz4XF2mUhd08TojxNMy2qS2pjezRtcn4hTEz6uAlKATI1c5/4K+bD3qZ8MclX+2EnQSG ki69/8FFFb/IZnyYP+2Ke1opL6gBtGV9wXHifv+eob+31L/66TAVVl1ORHtQFFArNoToPfFV4 DuB1bSWhI/keD7yDi/wv6SYWhNjWYzU+uQPehAnq86ALhihBIs0Nmu738nu2KXpjVGF5PczLf kHq75BLEfUNsZ2iPTHrItQBAqh8flYDq6bRX/NgYtQbGdlCK0LCQw9HBHkVyfnCr30w4A3Sjv vWY6d0iwGvCr0kXEuSxvN0sEAOVRco5IpDWW4YN3wmKz37QevT9uy/rP3r5To Precedence: bulk List-ID: X-Mailing-List: linux-gpio@vger.kernel.org Introduce helper for attaching an (separate) oftree into sysfs. This is useful, when drivers use their own internal device trees, separate from the platform's global one, and wanna make it visible to userspace via sysfs. Signed-off-by: Enrico Weigelt, metux IT consult --- drivers/of/kobj.c | 17 +++++++++++++++++ include/linux/of.h | 7 +++++++ 2 files changed, 24 insertions(+) diff --git a/drivers/of/kobj.c b/drivers/of/kobj.c index 511d7e8b9068..96dc5a2753f4 100644 --- a/drivers/of/kobj.c +++ b/drivers/of/kobj.c @@ -166,3 +166,20 @@ void __of_detach_node_sysfs(struct device_node *np) of_node_put(np); } + +void of_attach_tree_sysfs(struct device_node *root, const char* base) +{ + struct device_node *np; + + if (!root) + return; + + /* need to from our parent, so we don't traverse above our root, + * if it's actually a subtree */ + root->parent = NULL; + + __of_attach_node_sysfs(root, base); + for_each_of_allnodes_from(root, np) + __of_attach_node_sysfs(np, base); +} +EXPORT_SYMBOL_GPL(of_attach_tree_sysfs); diff --git a/include/linux/of.h b/include/linux/of.h index 3612429632f4..c2fb12ce07f9 100644 --- a/include/linux/of.h +++ b/include/linux/of.h @@ -421,6 +421,8 @@ extern int of_update_property(struct device_node *np, struct property *newprop); extern int of_attach_node(struct device_node *); extern int of_detach_node(struct device_node *); +extern void of_attach_tree_sysfs(struct device_node *root, const char* base); + #define of_match_ptr(_ptr) (_ptr) /** @@ -1010,6 +1012,11 @@ static inline phys_addr_t of_dma_get_max_cpu_address(struct device_node *np) return PHYS_ADDR_MAX; } +static inline void of_attach_tree_sysfs(struct device_node *root, + const char* base) +{ +} + #define of_match_ptr(_ptr) NULL #define of_match_node(_matches, _node) NULL #endif /* CONFIG_OF */ From patchwork Mon Feb 8 22:21:58 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "Enrico Weigelt, metux IT consult" X-Patchwork-Id: 1437968 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: ozlabs.org; spf=pass (sender SPF authorized) smtp.mailfrom=vger.kernel.org (client-ip=23.128.96.18; helo=vger.kernel.org; envelope-from=linux-gpio-owner@vger.kernel.org; receiver=) Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by ozlabs.org (Postfix) with ESMTP id 4DZLF44wHvz9sVb for ; Tue, 9 Feb 2021 09:25:12 +1100 (AEDT) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S231404AbhBHWY5 (ORCPT ); Mon, 8 Feb 2021 17:24:57 -0500 Received: from mout.kundenserver.de ([212.227.17.10]:49701 "EHLO mout.kundenserver.de" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S230244AbhBHWYw (ORCPT ); Mon, 8 Feb 2021 17:24:52 -0500 Received: from orion.localdomain ([95.115.15.83]) by mrelayeu.kundenserver.de (mreue107 [212.227.15.183]) with ESMTPSA (Nemesis) id 1M58SY-1lALNj34rs-001Cu5; Mon, 08 Feb 2021 23:22:15 +0100 From: "Enrico Weigelt, metux IT consult" To: linux-kernel@vger.kernel.org Cc: rafael@kernel.org, info@metux.net, linus.walleij@linaro.org, bgolaszewski@baylibre.com, robh+dt@kernel.org, frowand.list@gmail.com, pantelis.antoniou@konsulko.com, linux-gpio@vger.kernel.org, devicetree@vger.kernel.org Subject: [RFC PATCH 07/12] gpio: amd-fch: add oftree probing support Date: Mon, 8 Feb 2021 23:21:58 +0100 Message-Id: <20210208222203.22335-8-info@metux.net> X-Mailer: git-send-email 2.11.0 In-Reply-To: <20210208222203.22335-1-info@metux.net> References: <20210208222203.22335-1-info@metux.net> X-Provags-ID: V03:K1:yTfMa/Q6JJwUZY+PPtP27G34rsIXtNT7w2QEAriQh7lzWzb8EOn r445EViP6HeIxHFmne2s3OKQ+BXq6kE05vthvyALzNGkxWM89QE1qNZykBBgx027Fldx4Bq bBO50iRiQDUndKYhtYoETSw84zA9vXFAQxkEV2C1R1pZT2nr/cQWY9X/6K8flGh7u9h8tZZ kV5OgQGBKuUlli3FqlWfg== X-Spam-Flag: NO X-UI-Out-Filterresults: notjunk:1;V03:K0:LxJTd96Aqis=:J6IRJlk1Ktory7oriGNIDR Vyrp6CCMyaLU+9AhEMngBAlqyVZ/sZ6X8CnU4/hm0Muoijcxq0qjV9UYDmpP4a6KnzA6bu/Zn HZUe+Cvek6z7XHHBoKJ9uI1M7eht2QwCMztDvnD7u3pRBOzf2rw4y6TjncP/E9fpgm8aZcftm EfN22T1ukRfsvQhd4h6NB0pse6ukxyYkJF8Ec83deiSe50zM6Jx0Ai0XyuodgxhQdG1YuYAg1 tBLyDc9VmvXjCC93iEL7WIYbBti0Gi83PmAqnvfO3JZGSfetznUJ0hJJpewxOHD1xioKS7kxt P4WlH3ztd3KD5tZCgQ6snXTUXvDrY5o3a2y4LPUiJ/oFb1vamHyENr49sDd+6BMjKpokc0Jfd zfBlTT5HEH7wVAufkeWM2smg/7UYr2CB/beLNcjpbnY3yO56Xn/MTmyTOGTgJ Precedence: bulk List-ID: X-Mailing-List: linux-gpio@vger.kernel.org Add support for probing via device tree. --- drivers/gpio/gpio-amd-fch.c | 58 +++++++++++++++++++++++++ include/dt-bindings/gpio/amd-fch-gpio.h | 36 +++++++++++++++ include/linux/platform_data/gpio/gpio-amd-fch.h | 24 ++-------- 3 files changed, 98 insertions(+), 20 deletions(-) create mode 100644 include/dt-bindings/gpio/amd-fch-gpio.h diff --git a/drivers/gpio/gpio-amd-fch.c b/drivers/gpio/gpio-amd-fch.c index 2a21354ed6a0..32024f99dae5 100644 --- a/drivers/gpio/gpio-amd-fch.c +++ b/drivers/gpio/gpio-amd-fch.c @@ -136,12 +136,61 @@ static int amd_fch_gpio_request(struct gpio_chip *chip, return 0; } +static struct amd_fch_gpio_pdata *load_pdata(struct device *dev) +{ + struct amd_fch_gpio_pdata *pdata; + int ret; + + pdata = devm_kzalloc(dev, sizeof(struct amd_fch_gpio_pdata), + GFP_KERNEL); + if (!pdata) + goto nomem; + + pdata->gpio_num = of_property_count_elems_of_size(dev->of_node, + "gpio-regs", + sizeof(u32)); + pdata->gpio_reg = devm_kzalloc(dev, sizeof(int)*pdata->gpio_num, + GFP_KERNEL); + if (!pdata->gpio_reg) + goto nomem; + + pdata->gpio_names = devm_kzalloc(dev, sizeof(char*)*pdata->gpio_num, + GFP_KERNEL); + if (!pdata->gpio_names) + goto nomem; + + ret = of_property_read_variable_u32_array(dev->of_node, "gpio-regs", + pdata->gpio_reg, + pdata->gpio_num, + pdata->gpio_num); + if (ret != pdata->gpio_num) { + dev_err(dev, "failed reading gpio-regs from DT: %d\n", ret); + return NULL; + } + + ret = of_property_read_string_array(dev->of_node, "gpio-line-names", + pdata->gpio_names, pdata->gpio_num); + if (ret != pdata->gpio_num) { + dev_err(dev, "failed reading gpio-names from DT: %d\n", ret); + return NULL; + } + + return pdata; + +nomem: + dev_err(dev, "load_pdata: failed allocating memory\n"); + return NULL; +} + static int amd_fch_gpio_probe(struct platform_device *pdev) { struct amd_fch_gpio_priv *priv; struct amd_fch_gpio_pdata *pdata; pdata = dev_get_platdata(&pdev->dev); + if (!pdata) + pdata = load_pdata(&pdev->dev); + if (!pdata) { dev_err(&pdev->dev, "no platform_data\n"); return -ENOENT; @@ -165,6 +214,9 @@ static int amd_fch_gpio_probe(struct platform_device *pdev) priv->gc.get_direction = amd_fch_gpio_get_direction; priv->gc.get = amd_fch_gpio_get; priv->gc.set = amd_fch_gpio_set; +#ifdef CONFIG_OF_GPIO + priv->gc.of_node = pdev->dev.of_node; +#endif spin_lock_init(&priv->lock); @@ -177,9 +229,15 @@ static int amd_fch_gpio_probe(struct platform_device *pdev) return devm_gpiochip_add_data(&pdev->dev, &priv->gc, priv); } +static const struct of_device_id amd_fch_gpio_of_match[] = { + { .compatible = "amd,fch-gpio" }, + {} +}; + static struct platform_driver amd_fch_gpio_driver = { .driver = { .name = AMD_FCH_GPIO_DRIVER_NAME, + .of_match_table = amd_fch_gpio_of_match, }, .probe = amd_fch_gpio_probe, }; diff --git a/include/dt-bindings/gpio/amd-fch-gpio.h b/include/dt-bindings/gpio/amd-fch-gpio.h new file mode 100644 index 000000000000..7a47e6debcdb --- /dev/null +++ b/include/dt-bindings/gpio/amd-fch-gpio.h @@ -0,0 +1,36 @@ +/* SPDX-License-Identifier: GPL-2.0+ */ + +/* + * AMD FCH gpio platform data definitions + * + * Copyright (C) 2020 metux IT consult + * Author: Enrico Weigelt + * + */ + +#ifndef __DT_BINDINGS_GPIO_AMD_FCH_REGS_H +#define __DT_BINDINGS_GPIO_AMD_FCH_REGS_H + +/* + * gpio registers addresses + * + * these regs need to be assigned by board setup, since they're wired + * in very board specifici was, rarely documented, this should not be + * available to users. + */ +#define AMD_FCH_GPIO_REG_GPIO49 0x40 +#define AMD_FCH_GPIO_REG_GPIO50 0x41 +#define AMD_FCH_GPIO_REG_GPIO51 0x42 +#define AMD_FCH_GPIO_REG_GPIO55_DEVSLP0 0x43 +#define AMD_FCH_GPIO_REG_GPIO57 0x44 +#define AMD_FCH_GPIO_REG_GPIO58 0x45 +#define AMD_FCH_GPIO_REG_GPIO59_DEVSLP1 0x46 +#define AMD_FCH_GPIO_REG_GPIO64 0x47 +#define AMD_FCH_GPIO_REG_GPIO68 0x48 +#define AMD_FCH_GPIO_REG_GPIO66_SPKR 0x5B +#define AMD_FCH_GPIO_REG_GPIO71 0x4D +#define AMD_FCH_GPIO_REG_GPIO32_GE1 0x59 +#define AMD_FCH_GPIO_REG_GPIO33_GE2 0x5A +#define AMT_FCH_GPIO_REG_GEVT22 0x09 + +#endif /* __DT_BINDINGS_GPIO_AMD_FCH_REGS_H */ diff --git a/include/linux/platform_data/gpio/gpio-amd-fch.h b/include/linux/platform_data/gpio/gpio-amd-fch.h index 255d51c9d36d..336f7387e82c 100644 --- a/include/linux/platform_data/gpio/gpio-amd-fch.h +++ b/include/linux/platform_data/gpio/gpio-amd-fch.h @@ -11,25 +11,9 @@ #ifndef __LINUX_PLATFORM_DATA_GPIO_AMD_FCH_H #define __LINUX_PLATFORM_DATA_GPIO_AMD_FCH_H -#define AMD_FCH_GPIO_DRIVER_NAME "gpio_amd_fch" +#include -/* - * gpio register index definitions - */ -#define AMD_FCH_GPIO_REG_GPIO49 0x40 -#define AMD_FCH_GPIO_REG_GPIO50 0x41 -#define AMD_FCH_GPIO_REG_GPIO51 0x42 -#define AMD_FCH_GPIO_REG_GPIO55_DEVSLP0 0x43 -#define AMD_FCH_GPIO_REG_GPIO57 0x44 -#define AMD_FCH_GPIO_REG_GPIO58 0x45 -#define AMD_FCH_GPIO_REG_GPIO59_DEVSLP1 0x46 -#define AMD_FCH_GPIO_REG_GPIO64 0x47 -#define AMD_FCH_GPIO_REG_GPIO68 0x48 -#define AMD_FCH_GPIO_REG_GPIO66_SPKR 0x5B -#define AMD_FCH_GPIO_REG_GPIO71 0x4D -#define AMD_FCH_GPIO_REG_GPIO32_GE1 0x59 -#define AMD_FCH_GPIO_REG_GPIO33_GE2 0x5A -#define AMT_FCH_GPIO_REG_GEVT22 0x09 +#define AMD_FCH_GPIO_DRIVER_NAME "gpio_amd_fch" /* * struct amd_fch_gpio_pdata - GPIO chip platform data @@ -39,8 +23,8 @@ */ struct amd_fch_gpio_pdata { int gpio_num; - int *gpio_reg; - const char * const *gpio_names; + u32 *gpio_reg; + const char * *gpio_names; }; #endif /* __LINUX_PLATFORM_DATA_GPIO_AMD_FCH_H */ From patchwork Mon Feb 8 22:21:59 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "Enrico Weigelt, metux IT consult" X-Patchwork-Id: 1437966 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: ozlabs.org; spf=pass (sender SPF authorized) smtp.mailfrom=vger.kernel.org (client-ip=23.128.96.18; helo=vger.kernel.org; envelope-from=linux-gpio-owner@vger.kernel.org; receiver=) Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by ozlabs.org (Postfix) with ESMTP id 4DZLF24Djsz9sRf for ; Tue, 9 Feb 2021 09:25:10 +1100 (AEDT) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S231320AbhBHWYz (ORCPT ); Mon, 8 Feb 2021 17:24:55 -0500 Received: from mout.kundenserver.de ([217.72.192.73]:53771 "EHLO mout.kundenserver.de" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S230515AbhBHWYv (ORCPT ); Mon, 8 Feb 2021 17:24:51 -0500 Received: from orion.localdomain ([95.115.15.83]) by mrelayeu.kundenserver.de (mreue107 [212.227.15.183]) with ESMTPSA (Nemesis) id 1MXYAj-1lQ1n51B5b-00YxKI; Mon, 08 Feb 2021 23:22:16 +0100 From: "Enrico Weigelt, metux IT consult" To: linux-kernel@vger.kernel.org Cc: rafael@kernel.org, info@metux.net, linus.walleij@linaro.org, bgolaszewski@baylibre.com, robh+dt@kernel.org, frowand.list@gmail.com, pantelis.antoniou@konsulko.com, linux-gpio@vger.kernel.org, devicetree@vger.kernel.org Subject: [RFC PATCH 08/12] drivers: base: introduce bus_remove_device_by_name() Date: Mon, 8 Feb 2021 23:21:59 +0100 Message-Id: <20210208222203.22335-9-info@metux.net> X-Mailer: git-send-email 2.11.0 In-Reply-To: <20210208222203.22335-1-info@metux.net> References: <20210208222203.22335-1-info@metux.net> X-Provags-ID: V03:K1:0n2fIG2Rpu9ZJwXMl4tBwZ/3tnXlDtOxKiwWjJGncmHiDEu2Ots MuE3bpBi/A7oy19oFifjuPlJ6PNuFqxEZlQ/OaPdyABbvLmebIgN3ERFOzOA6iFdymsd52C 1/TbShxjwoGJfc3mL3HyEkwSdtnG8/xXUt3AxYt/GCiULEReqjGbTGBW1rVF6omosnLrzVx EHcfI++g4pju0RSD5/vjQ== X-Spam-Flag: NO X-UI-Out-Filterresults: notjunk:1;V03:K0:umiqnbUS6cI=:6mZcagxU2YcHIT1ZeFWN0x ITMc0hS8D155f0MQv+OVwVUKXQT61SVKLu4HN3Z07T+lLzrKDunN87SkmokuFQFlu63oYqhhz kbQ28pJ5cvmCwOsgQvOXdmfZbmPgJcoXnVD5YytCPpf6SsYXovqatWtFv3hTLVOez2HBuV9Pk Tl2YeWF3q8QJ96tjYPJu0YMSVoUx3CzLOeBI0jpaHJPf9xYeAvB8sTJ4NbPBC2W/qO0vTcPBd ybhArh6Zlr5poXM1V1P6AKCYi2aeUFuC8su6oiHrYC39wkIOhwRATcJbzsITWPksn/k1ZYZdg kWZMVMi6QPKWy6qs83fwEm4V7NEBa0fSdNB/4+kq0xRSCcutLLZ0rJGNnx1HU/XCvsLf187WQ kjCnQUfA/kA5RbPqyL3Km1K3SJQ6Wyz/qEJ6oMttNvI1knDnRrTC8l8blHtD8 Precedence: bulk List-ID: X-Mailing-List: linux-gpio@vger.kernel.org Introduce a helper for detaching a named device from bus and unregistering it. This is helpful eg. if some board specific driver needs to remove an unwanted device that had been probed via firmware, but should be handled differently. Signed-off-by: Enrico Weigelt, metux IT consult --- drivers/base/bus.c | 16 ++++++++++++++++ include/linux/device/bus.h | 9 +++++++++ 2 files changed, 25 insertions(+) diff --git a/drivers/base/bus.c b/drivers/base/bus.c index a9c23ecebc7c..450d3ed6cf1f 100644 --- a/drivers/base/bus.c +++ b/drivers/base/bus.c @@ -178,6 +178,22 @@ static const struct kset_uevent_ops bus_uevent_ops = { static struct kset *bus_kset; +int bus_unregister_device_by_name(struct bus_type *bus, const char *name) +{ + struct device *dev; + + dev = bus_find_device_by_name(bus, NULL, name); + if (!dev) + return -ENOENT; + + device_driver_detach(dev); + device_unregister(dev); + put_device(dev); + + return 0; +} +EXPORT_SYMBOL_GPL(bus_unregister_device_by_name); + /* Manually detach a device from its associated driver. */ static ssize_t unbind_store(struct device_driver *drv, const char *buf, size_t count) diff --git a/include/linux/device/bus.h b/include/linux/device/bus.h index 1ea5e1d1545b..36a1dae26c95 100644 --- a/include/linux/device/bus.h +++ b/include/linux/device/bus.h @@ -253,6 +253,15 @@ int bus_for_each_drv(struct bus_type *bus, struct device_driver *start, void bus_sort_breadthfirst(struct bus_type *bus, int (*compare)(const struct device *a, const struct device *b)); + +/** + * bus_unregister_device_by_name - remove device by bus id from specific bus + * and unregister it from device core + * @bus: bus type + * @name: name of the device to remove + */ +int bus_unregister_device_by_name(struct bus_type *bus, const char *name); + /* * Bus notifiers: Get notified of addition/removal of devices * and binding/unbinding of drivers to devices. From patchwork Mon Feb 8 22:22:00 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "Enrico Weigelt, metux IT consult" X-Patchwork-Id: 1437973 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: ozlabs.org; spf=pass (sender SPF authorized) smtp.mailfrom=vger.kernel.org (client-ip=23.128.96.18; helo=vger.kernel.org; envelope-from=linux-gpio-owner@vger.kernel.org; receiver=) Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by ozlabs.org (Postfix) with ESMTP id 4DZLF75nlZz9sRf for ; Tue, 9 Feb 2021 09:25:15 +1100 (AEDT) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S231478AbhBHWZA (ORCPT ); Mon, 8 Feb 2021 17:25:00 -0500 Received: from mout.kundenserver.de ([217.72.192.74]:52711 "EHLO mout.kundenserver.de" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S231271AbhBHWYz (ORCPT ); Mon, 8 Feb 2021 17:24:55 -0500 Received: from orion.localdomain ([95.115.15.83]) by mrelayeu.kundenserver.de (mreue107 [212.227.15.183]) with ESMTPSA (Nemesis) id 1N2VGj-1luhmR3RJ1-013sEY; Mon, 08 Feb 2021 23:22:16 +0100 From: "Enrico Weigelt, metux IT consult" To: linux-kernel@vger.kernel.org Cc: rafael@kernel.org, info@metux.net, linus.walleij@linaro.org, bgolaszewski@baylibre.com, robh+dt@kernel.org, frowand.list@gmail.com, pantelis.antoniou@konsulko.com, linux-gpio@vger.kernel.org, devicetree@vger.kernel.org Subject: [RFC PATCH 09/12] drivers: base: reintroduce find_bus() Date: Mon, 8 Feb 2021 23:22:00 +0100 Message-Id: <20210208222203.22335-10-info@metux.net> X-Mailer: git-send-email 2.11.0 In-Reply-To: <20210208222203.22335-1-info@metux.net> References: <20210208222203.22335-1-info@metux.net> X-Provags-ID: V03:K1:rzHVi5GoHivXWlnfqQmxW9ROEO3dTvvCGJjkmHY1rYU58qOtQdB BWExFeO+Lo7FQnJw4FivMBV8vVs5qdqC8Daz5Q4ov4Da0LJhOvhFlR2siSolW392MDgY9cH 8XXxJ+Jsbc1T1eAY/QQvG6JTPj2JQU031dT6WF7IOT1GkP5PSJ/eJ5zfvyp2hkFU/FXNikO 2tQpzN1WMr8i6gawh2pSQ== X-Spam-Flag: NO X-UI-Out-Filterresults: notjunk:1;V03:K0:3jDwSQW1sfw=:S+k5ohg/fvN1L6nK+an5kA +R/OSvwPagPSZlWc9jBeQRyCOsKSYmcnZ6bF0GFMGDOmdX8fJtZJp1GS3sOshQtcqou/bjxDV qdNYObRRD4gTkYQOGao7jMJzlMiH/Ac2uM4LBRda23m8yqNhnCPEk5/Loq96ANivz4m8CCcbj /s+VFTolH9CbObyDG2qp+fF8tJrl/H0GwmVkxxV8NyVFHHHDHVXoyoDVsLqZVovSt7T1tTS6t BMJQmQBWcjVricSiOzaFEpI+OgXkx1n4vG78rHYOe1xEXcm7gr85UmUGQloXjulge/oKPFkKj vPAE5uZex4dZ9T+qQ6PLsHnt2nL01nQp67LXPvksmkPXP5n8/xzMIPYQFdcW2HereIzUKBRru jjB4jWNWlZrcXptDCJjplCphEmEPyr9eMjg9IMJVdaFFGJ9xGkFyjo0GKfVOB Precedence: bulk List-ID: X-Mailing-List: linux-gpio@vger.kernel.org --- drivers/base/bus.c | 14 ++++++++++---- include/linux/device/bus.h | 2 ++ 2 files changed, 12 insertions(+), 4 deletions(-) diff --git a/drivers/base/bus.c b/drivers/base/bus.c index 450d3ed6cf1f..a06ae2786092 100644 --- a/drivers/base/bus.c +++ b/drivers/base/bus.c @@ -754,13 +754,19 @@ EXPORT_SYMBOL_GPL(device_reprobe); * * Note that kset_find_obj increments bus' reference count. */ -#if 0 -struct bus_type *find_bus(char *name) +struct bus_type *find_bus(const char *name) { struct kobject *k = kset_find_obj(bus_kset, name); - return k ? to_bus(k) : NULL; + struct subsys_private *subsys_priv; + + if (!k) + return NULL; + + subsys_priv = container_of(to_kset(k), struct subsys_private, subsys); + + return subsys_priv->bus; } -#endif /* 0 */ +EXPORT_SYMBOL_GPL(find_bus); static int bus_add_groups(struct bus_type *bus, const struct attribute_group **groups) diff --git a/include/linux/device/bus.h b/include/linux/device/bus.h index 36a1dae26c95..b4cbcfe176c5 100644 --- a/include/linux/device/bus.h +++ b/include/linux/device/bus.h @@ -254,6 +254,8 @@ void bus_sort_breadthfirst(struct bus_type *bus, int (*compare)(const struct device *a, const struct device *b)); +struct bus_type *find_bus(const char *name); + /** * bus_unregister_device_by_name - remove device by bus id from specific bus * and unregister it from device core From patchwork Mon Feb 8 22:22:01 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "Enrico Weigelt, metux IT consult" X-Patchwork-Id: 1437967 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: ozlabs.org; spf=pass (sender SPF authorized) smtp.mailfrom=vger.kernel.org (client-ip=23.128.96.18; helo=vger.kernel.org; envelope-from=linux-gpio-owner@vger.kernel.org; receiver=) Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by ozlabs.org (Postfix) with ESMTP id 4DZLF36sLxz9sRf for ; Tue, 9 Feb 2021 09:25:11 +1100 (AEDT) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S231330AbhBHWY4 (ORCPT ); Mon, 8 Feb 2021 17:24:56 -0500 Received: from mout.kundenserver.de ([212.227.17.13]:33945 "EHLO mout.kundenserver.de" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S231230AbhBHWYy (ORCPT ); Mon, 8 Feb 2021 17:24:54 -0500 Received: from orion.localdomain ([95.115.15.83]) by mrelayeu.kundenserver.de (mreue107 [212.227.15.183]) with ESMTPSA (Nemesis) id 1M8QFi-1lDcdN1Uhs-004WHh; Mon, 08 Feb 2021 23:22:17 +0100 From: "Enrico Weigelt, metux IT consult" To: linux-kernel@vger.kernel.org Cc: rafael@kernel.org, info@metux.net, linus.walleij@linaro.org, bgolaszewski@baylibre.com, robh+dt@kernel.org, frowand.list@gmail.com, pantelis.antoniou@konsulko.com, linux-gpio@vger.kernel.org, devicetree@vger.kernel.org Subject: [RFC PATCH 10/12] export bus_get() / bus_put() Date: Mon, 8 Feb 2021 23:22:01 +0100 Message-Id: <20210208222203.22335-11-info@metux.net> X-Mailer: git-send-email 2.11.0 In-Reply-To: <20210208222203.22335-1-info@metux.net> References: <20210208222203.22335-1-info@metux.net> X-Provags-ID: V03:K1:kDRmEzIQ/F5sQbE196NAs1VlxNWRXpNXbH/MXduf2nSFEhfshKh Pho+/pjgZO0/8botPezg8A8IsqGKMi4GXn5N7nGB5CjPbdQUuG+mNHjXaZs4/KUm6Tg0ACu d1hAzte3az5tvT8GsFsfwWicGAftGJo45kCNRkBjy1G2hE5omPD8bD9Rau5wP6IOhm+I0Jr IShaMZT+84jKYiXPQa00g== X-Spam-Flag: NO X-UI-Out-Filterresults: notjunk:1;V03:K0:pxUWDFfYvE4=:glNHz9gYCeZb+E7U3fAb5c xJ0nCG21DGUYAjCD2bD0dAOOk4zbmeCuHKpmGHsEUpa6fNeTF2tqf1RETA5TR+ybt0GSpN9Dt 7Xy3fcXl4u/HX02GUU6ZcytLsqs0Htc5/Vc0vchfsxaQPUGPN36UBmXNO4Q20paDFxhSf33tF CzKe03kY2wfMyU6ElkDVybFUBkWjlpL7Kraz1Lh4GY0amWO6n2VoOLKNziuG3Tv/e8VDdwRLI wJ8vIKpqu/Mkig89QwWt2nRqSeyDcrMqWvcU2YxK6D0mqyWm4hc+bIpGEySwpiv3IZbBd3Vd0 Lrdh6F4mXODb8DDDNYM6A+xecFnCRfMFpAHcjE9FYjrW4XG0EPNF4KNfimUCTfcr73rNIgY2w XbW7WcHYv3sk0+W7JyHf82Q4Rt0iuG4dFRL7LP8H6f4CpImdWY8dDH6HwflUA Precedence: bulk List-ID: X-Mailing-List: linux-gpio@vger.kernel.org --- drivers/base/bus.c | 6 ++++-- include/linux/device/bus.h | 3 +++ 2 files changed, 7 insertions(+), 2 deletions(-) diff --git a/drivers/base/bus.c b/drivers/base/bus.c index a06ae2786092..2ef92a3c5d7b 100644 --- a/drivers/base/bus.c +++ b/drivers/base/bus.c @@ -39,7 +39,7 @@ static struct kset *system_kset; static int __must_check bus_rescan_devices_helper(struct device *dev, void *data); -static struct bus_type *bus_get(struct bus_type *bus) +struct bus_type *bus_get(struct bus_type *bus) { if (bus) { kset_get(&bus->p->subsys); @@ -47,12 +47,14 @@ static struct bus_type *bus_get(struct bus_type *bus) } return NULL; } +EXPORT_SYMBOL_GPL(bus_get); -static void bus_put(struct bus_type *bus) +void bus_put(struct bus_type *bus) { if (bus) kset_put(&bus->p->subsys); } +EXPORT_SYMBOL_GPL(bus_put); static ssize_t drv_attr_show(struct kobject *kobj, struct attribute *attr, char *buf) diff --git a/include/linux/device/bus.h b/include/linux/device/bus.h index b4cbcfe176c5..8d6b45df0a82 100644 --- a/include/linux/device/bus.h +++ b/include/linux/device/bus.h @@ -120,6 +120,9 @@ extern void bus_unregister(struct bus_type *bus); extern int __must_check bus_rescan_devices(struct bus_type *bus); +struct bus_type *bus_get(struct bus_type *bus); +void bus_put(struct bus_type *bus); + struct bus_attribute { struct attribute attr; ssize_t (*show)(struct bus_type *bus, char *buf); From patchwork Mon Feb 8 22:22:02 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "Enrico Weigelt, metux IT consult" X-Patchwork-Id: 1437976 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: ozlabs.org; spf=pass (sender SPF authorized) smtp.mailfrom=vger.kernel.org (client-ip=23.128.96.18; helo=vger.kernel.org; envelope-from=linux-gpio-owner@vger.kernel.org; receiver=) Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by ozlabs.org (Postfix) with ESMTP id 4DZLFk60Nrz9sS8 for ; Tue, 9 Feb 2021 09:25:46 +1100 (AEDT) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S231618AbhBHWZW (ORCPT ); Mon, 8 Feb 2021 17:25:22 -0500 Received: from mout.kundenserver.de ([217.72.192.75]:41129 "EHLO mout.kundenserver.de" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S231518AbhBHWZE (ORCPT ); Mon, 8 Feb 2021 17:25:04 -0500 Received: from orion.localdomain ([95.115.15.83]) by mrelayeu.kundenserver.de (mreue107 [212.227.15.183]) with ESMTPSA (Nemesis) id 1Mf0yy-1lpQQN3nSc-00gcBn; Mon, 08 Feb 2021 23:22:18 +0100 From: "Enrico Weigelt, metux IT consult" To: linux-kernel@vger.kernel.org Cc: rafael@kernel.org, info@metux.net, linus.walleij@linaro.org, bgolaszewski@baylibre.com, robh+dt@kernel.org, frowand.list@gmail.com, pantelis.antoniou@konsulko.com, linux-gpio@vger.kernel.org, devicetree@vger.kernel.org Subject: [RFC PATCH 11/12] platform/x86: skeleton for oftree based board device initialization Date: Mon, 8 Feb 2021 23:22:02 +0100 Message-Id: <20210208222203.22335-12-info@metux.net> X-Mailer: git-send-email 2.11.0 In-Reply-To: <20210208222203.22335-1-info@metux.net> References: <20210208222203.22335-1-info@metux.net> X-Provags-ID: V03:K1:5KSHO+mZyjEhDezzvwlTZtaq1BeKWhLjf5NtiYXIs+OFGBPy7EN l1EpRKIOv8DC5JQZYZ4QQHdDC3f8UR4I2F/jkZ0aERqtQ8Mp/InvotLjkTmqi0pVp1hXlAr Sy46hIhNUb8Yp+E/wqhUaaP21HkYGk8Ig6/PwmgoVHaZAxFlXFPBppI/z3bY9Dj0w063RFN g49/Zgi270Mr1SU2U0oEw== X-Spam-Flag: NO X-UI-Out-Filterresults: notjunk:1;V03:K0:vPnCi//+1uw=:oDvmtkqLFE+8f70CNahU/3 j+u1BKblgDLihU5g8YskOzPKg03rnnW+X0AIqPunJelZ8nlgiI7s09vkC49kK5yplL/mJ82dG iwGK9QBVDGO6hSST2DYzqAEMVtdXiNw4JOPmFriVN29OExEJserhEVv7kPe+laPSmbAgJoqCj i5jxkx30VqHNXaYOrPxE/2D75P7Rtb508bbe1P4WSP6vJxPKnGqkFwbnU9pAjEV6z6nVPHIBV xXaRWaZZvflWs2UIiM6ymBvDzOYEv3/5xh2AjRxWjFSbZYCCWH17wSo2lVhQSwqYOWMkfM+CD VrWLeqqzpKEXdfB9QbAxSYLjyV4s2lYTdNLg2tZbq/uA99Ld/wwnvdwr6/upbiJwFMOO53kBK 4uUYtD4EPz97t7uap3JkPo26X48GrXbePqMkDm4kVuHnxDxZvuHmpm64VbE84 Precedence: bulk List-ID: X-Mailing-List: linux-gpio@vger.kernel.org Lots of boards have extra devices that can't be fully probed via bus'es (like PCI) or generic firmware mechanisms like ACPI. Often those capabilities are just partial or even highly depend on firmware version. Instead of hand-writing board specific drivers merely for the correct initialization / parameterization of generic drivers, hereby introducing a generic mechanism, using the already well supported oftree. These oftrees are compiled into the driver, which first tries to match machine identifications (eg. DMI strings) against rules defined in the individual oftrees, and on success, probes the devices that are defined by them. For the time being, we just support matching on DMI_BOARD_NAME and DMI_SYS_VENDOR - other criteria, even bus- or ACPI-id's can be added later, when needed. Signed-off-by: Enrico Weigelt, metux IT consult --- drivers/platform/Kconfig | 2 + drivers/platform/Makefile | 1 + drivers/platform/of/Kconfig | 41 ++++++++++++++ drivers/platform/of/Makefile | 5 ++ drivers/platform/of/drv.c | 123 +++++++++++++++++++++++++++++++++++++++++ drivers/platform/of/init.c | 126 ++++++++++++++++++++++++++++++++++++++++++ drivers/platform/of/ofboard.h | 8 +++ 7 files changed, 306 insertions(+) create mode 100644 drivers/platform/of/Kconfig create mode 100644 drivers/platform/of/Makefile create mode 100644 drivers/platform/of/drv.c create mode 100644 drivers/platform/of/init.c create mode 100644 drivers/platform/of/ofboard.h diff --git a/drivers/platform/Kconfig b/drivers/platform/Kconfig index 18fc6a08569e..9ac6d4e2a762 100644 --- a/drivers/platform/Kconfig +++ b/drivers/platform/Kconfig @@ -15,3 +15,5 @@ source "drivers/platform/mellanox/Kconfig" source "drivers/platform/olpc/Kconfig" source "drivers/platform/surface/Kconfig" + +source "drivers/platform/of/Kconfig" diff --git a/drivers/platform/Makefile b/drivers/platform/Makefile index 4de08ef4ec9d..ca4d74701fd7 100644 --- a/drivers/platform/Makefile +++ b/drivers/platform/Makefile @@ -10,3 +10,4 @@ obj-$(CONFIG_OLPC_EC) += olpc/ obj-$(CONFIG_GOLDFISH) += goldfish/ obj-$(CONFIG_CHROME_PLATFORMS) += chrome/ obj-$(CONFIG_SURFACE_PLATFORMS) += surface/ +obj-$(CONFIG_PLATFORM_OF_DRV) += of/ diff --git a/drivers/platform/of/Kconfig b/drivers/platform/of/Kconfig new file mode 100644 index 000000000000..a0b5a641a7c6 --- /dev/null +++ b/drivers/platform/of/Kconfig @@ -0,0 +1,41 @@ +# SPDX-License-Identifier: GPL-2.0-only +# +# X86 Platform Specific Drivers +# + +menuconfig PLATFORM_OF_DRV + tristate "Platform support via device tree" + select OF + select OF_FLATTREE + help + Say Y here to get to see options for board support that's initialized + via compiled-in flattened device trees. + + This is entirely independent from traditional DT-based booting (or DT + overlays) and meant for additional devices on non-OF-based (eg. APCI) + boards or composite devices behind probing-capable busses (eg. PCI). + + Instead of writing individual drivers for just the initialization of + subdevices, this option provides a generic mechanism for describing + these devices via device tree. + + If you say N, all options in this submenu will be skipped and disabled. + +if PLATFORM_OF_DRV + +config PLATFORM_OF_DRV_SYSFS_DTB + bool "Expose device tree binaries in sysfs" + default y + depends on SYSFS + help + Say Y here to enable exposing device tree binaries at /sys/firmware. + +config PLATFORM_OF_DRV_SYSFS_DT + bool "Expose parsed device tree in sysfs" + default y + depends on SYSFS + help + Say Y here to enable exposing device tree nodes at + /sys/firmware/devicetree. + +endif # PLATFORM_OF_DRV diff --git a/drivers/platform/of/Makefile b/drivers/platform/of/Makefile new file mode 100644 index 000000000000..84cf3003c500 --- /dev/null +++ b/drivers/platform/of/Makefile @@ -0,0 +1,5 @@ +# SPDX-License-Identifier: GPL-2.0 + +ofboard-y := init.o drv.o + +obj-$(CONFIG_PLATFORM_OF_DRV) += ofboard.o diff --git a/drivers/platform/of/drv.c b/drivers/platform/of/drv.c new file mode 100644 index 000000000000..ff7006c24cf7 --- /dev/null +++ b/drivers/platform/of/drv.c @@ -0,0 +1,123 @@ +// SPDX-License-Identifier: GPL-2.0+ + +/* + * Copyright (C) 2021 metux IT consult + * Author: Enrico Weigelt + */ + +#include +#include +#include +#include +#include +#include + +#include "ofboard.h" + +static bool __init ofboard_match_dmi(struct device *dev) +{ +#ifdef CONFIG_DMI + const char *board = dmi_get_system_info(DMI_BOARD_NAME); + const char *vendor = dmi_get_system_info(DMI_SYS_VENDOR); + const struct device_node *node = dev->of_node; + + if (!of_match_string(node, "dmi-sys-vendor", vendor)) + return false; + + if (!of_match_string(node, "dmi-board-name", board)) + return false; + + dev_info(dev, "matched dmi: vendor=\"%s\" board=\"%s\"\n", vendor, + board); + + return true; +#else + return false; +#endif +} + +static void __init ofboard_kick_devs(struct device *dev, + struct device_node *np, + const char *bus_name) +{ + struct property *prop; + const char *walk; + struct bus_type *bus; + int ret; + + if (strcmp(bus_name, "name")==0) + return; + + bus = find_bus(bus_name); + if (!bus) { + dev_warn(dev, "cant find bus \"%s\"\n", bus_name); + return; + } + + of_property_for_each_string(np, bus_name, prop, walk) { + ret = bus_unregister_device_by_name(bus, walk); + if (ret) + dev_warn(dev, "failed removing device \"%s\" on bus " + "\"%s\": %d\n", walk, bus_name, ret); + else + dev_info(dev, "removed device \"%s\" from bus " + "\"%s\"\n", walk, bus_name); + } + + bus_put(bus); +} + +static void __init ofboard_unbind(struct device *dev) +{ + struct property *pr; + struct device_node *np = of_get_child_by_name(dev->of_node, "unbind"); + + if (!IS_ERR_OR_NULL(np)) + for_each_property_of_node(np, pr) + ofboard_kick_devs(dev, np, pr->name); +} + +static int ofboard_populate(struct device *dev) +{ + int ret; + struct device_node *of_node = dev->of_node; + struct device_node *np = of_get_child_by_name(of_node, "devices"); + + if (IS_ERR_OR_NULL(np)) { + dev_info(dev, "board oftree has no devices\n"); + return -ENOENT; + } + + ret = of_platform_populate(np, NULL, NULL, dev); + if (ret) { + dev_err(dev, "failed probing of childs: %d\n", ret); + return ret; + } + + return 0; +} + +static int ofboard_probe(struct platform_device *pdev) +{ + struct device *dev = &pdev->dev; + + if (!ofboard_match_dmi(dev)) + return -EINVAL; + + ofboard_unbind(&pdev->dev); + + return ofboard_populate(dev); +} + +static const struct of_device_id ofboard_of_match[] = { + { .compatible = "virtual,dmi-board" }, + {} +}; + +struct platform_driver ofboard_driver = { + .driver = { + .name = "ofboard", + .of_match_table = ofboard_of_match, + }, + .probe = ofboard_probe, +}; diff --git a/drivers/platform/of/init.c b/drivers/platform/of/init.c new file mode 100644 index 000000000000..3b8373cda77a --- /dev/null +++ b/drivers/platform/of/init.c @@ -0,0 +1,126 @@ +// SPDX-License-Identifier: GPL-2.0+ + +/* + * Copyright (C) 2021 metux IT consult + * Author: Enrico Weigelt + */ + +#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt + +#include +#include +#include +#include +#include +#include +#include +#include "ofboard.h" + +#define DECLARE_FDT_EXTERN(n) \ + extern char __dtb_##n##_begin[]; \ + static struct bin_attribute __dtb_##n##_attr = { \ + .attr = { .name = "fdt-" #n, .mode = S_IRUSR }, \ + .private = __dtb_##n##_begin, \ + .read = fdt_image_raw_read, \ + }; + +struct fdt_image { + char *begin; + size_t size; + char *basename; + struct bin_attribute *bin_attr; + struct device_node *root; +}; + +#define FDT_IMAGE_ENT(n) \ + { \ + .begin = __dtb_##n##_begin, \ + .bin_attr = &__dtb_##n##_attr, \ + .basename = "ofboard-" #n \ + } + +static ssize_t fdt_image_raw_read(struct file *filep, struct kobject *kobj, + struct bin_attribute *bin_attr, char *buf, + loff_t off, size_t count) +{ + memcpy(buf, bin_attr->private + off, count); + return count; +} + +static struct fdt_image fdt[] = { +}; + +static int __init ofdrv_init_sysfs(struct fdt_image *image) +{ + image->bin_attr->size = image->size; + image->bin_attr->private = image->begin; + + if (sysfs_create_bin_file(firmware_kobj, image->bin_attr)) + pr_warn("failed creating sysfs bin_file\n"); + + of_attach_tree_sysfs(image->root, image->basename); + + return 0; +} + +static int __init ofdrv_parse_image(struct fdt_image *image) +{ + struct device_node* root; + void *new_fdt; + + image->size = fdt_totalsize(image->begin); + new_fdt = kmemdup(image->begin, image->size, GFP_KERNEL); + if (!new_fdt) + return -ENOMEM; + + image->begin = new_fdt; + of_fdt_unflatten_tree(new_fdt, NULL, &root); + + if (IS_ERR_OR_NULL(root)) + return PTR_ERR(root); + + image->root = root; + + return 0; +} + +static int __init ofdrv_init_image(struct fdt_image *image) +{ + struct device_node *np; + int ret; + + ret = ofdrv_parse_image(image); + if (ret) + return ret; + + ofdrv_init_sysfs(image); + + for_each_child_of_node(image->root, np) { + struct platform_device_info pdevinfo = { + .name = np->name, + .fwnode = &np->fwnode, + .id = PLATFORM_DEVID_NONE, + }; + platform_device_register_full(&pdevinfo); + } + + return 0; +} + +static int __init ofdrv_init(void) +{ + int x; + + platform_driver_register(&ofboard_driver); + + for (x=0; x"); +MODULE_DESCRIPTION("Generic oftree based initialization of custom board devices"); +MODULE_LICENSE("GPL"); diff --git a/drivers/platform/of/ofboard.h b/drivers/platform/of/ofboard.h new file mode 100644 index 000000000000..7516e5df4f18 --- /dev/null +++ b/drivers/platform/of/ofboard.h @@ -0,0 +1,8 @@ +#ifndef __DRIVERS_PLATFORM_OFBOARD_H +#define __DRIVERS_PLATFORM_OFBOARD_H + +#include + +extern struct platform_driver ofboard_driver; + +#endif From patchwork Mon Feb 8 22:22:03 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "Enrico Weigelt, metux IT consult" X-Patchwork-Id: 1437972 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: ozlabs.org; spf=pass (sender SPF authorized) smtp.mailfrom=vger.kernel.org (client-ip=23.128.96.18; helo=vger.kernel.org; envelope-from=linux-gpio-owner@vger.kernel.org; receiver=) Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by ozlabs.org (Postfix) with ESMTP id 4DZLF641HSz9sRf for ; Tue, 9 Feb 2021 09:25:14 +1100 (AEDT) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S231439AbhBHWY7 (ORCPT ); Mon, 8 Feb 2021 17:24:59 -0500 Received: from mout.kundenserver.de ([217.72.192.75]:40847 "EHLO mout.kundenserver.de" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S231243AbhBHWYy (ORCPT ); Mon, 8 Feb 2021 17:24:54 -0500 Received: from orion.localdomain ([95.115.15.83]) by mrelayeu.kundenserver.de (mreue107 [212.227.15.183]) with ESMTPSA (Nemesis) id 1MHWvH-1l4Vpb1y9R-00DYpE; Mon, 08 Feb 2021 23:22:18 +0100 From: "Enrico Weigelt, metux IT consult" To: linux-kernel@vger.kernel.org Cc: rafael@kernel.org, info@metux.net, linus.walleij@linaro.org, bgolaszewski@baylibre.com, robh+dt@kernel.org, frowand.list@gmail.com, pantelis.antoniou@konsulko.com, linux-gpio@vger.kernel.org, devicetree@vger.kernel.org Subject: [RFC PATCH 12/12] platform/x86/of: add support for PC Engines APU v2/3/4 boards Date: Mon, 8 Feb 2021 23:22:03 +0100 Message-Id: <20210208222203.22335-13-info@metux.net> X-Mailer: git-send-email 2.11.0 In-Reply-To: <20210208222203.22335-1-info@metux.net> References: <20210208222203.22335-1-info@metux.net> X-Provags-ID: V03:K1:8voYo/lO6B6/0O0ejkXg6WyIxjmfqfu0KrstP1wAK9IPrXfjknO e8xQ2QnJZfpS+53a2DqZQ3/cE/M/5VU63xtsmnXjG+0xkueiICrRltIszgqUcBgVRrfsQTP S/irinwdJhe8tkv+7teK9hxZidhn4e1w8p0HV+uCY0cJdkpvrx2JwyDCwjpiuapnFJcu43Z 2iDZMb+BitooMtEtBDQIQ== X-Spam-Flag: NO X-UI-Out-Filterresults: notjunk:1;V03:K0:K+1rOvTtpI8=:nDO2tq0z1i4Ki499omWlw0 2Di3wGsWFLe40rSklPL8terWi4QNYf9/CWVYtJD5xTSoT4HBUYYWaFZjkLL5/s9GLqqEQrwoQ p0V3JHgFHC1vWl+XLgIP/9ct4uWQFLpU1uVd5vR5bRiUeLQyol/S4gaogSrl7h0xVT6AG7btF z2ztsmZHyXoEh2sC1p9zR14kLGD4WvyjBpLL9yRFtK9pRfUMnXDDIc0uZqAT3KrsZDJPYMY1a J3iYXDCPxveGEv0w3JA8xveybwsQZffKg+qdQra5VyoIqehW2I05kkPlT2BgPa8Szhe0gOovG 5pMpLr4oiHlxcgkfj2fUi1+oEOdiB76jiLNc4UD2tn7/4D6nL1wBR78CPZeuh7QjRfxqdb/gx 3iUTXLpZAP2js0LHBilJV4LWBmxbXsMy0L4vvNtvLYGjBNiH5ErrqThZ72+Cl Precedence: bulk List-ID: X-Mailing-List: linux-gpio@vger.kernel.org Add oftree based support for PC Engines APUv2/3/4 board family. This is entirely separate from the existing pcengines-apuv2 driver. Signed-off-by: Enrico Weigelt, metux IT consult --- drivers/platform/of/Kconfig | 15 ++++++++ drivers/platform/of/Makefile | 2 + drivers/platform/of/apu2x.dts | 86 +++++++++++++++++++++++++++++++++++++++++++ drivers/platform/of/init.c | 7 ++++ 4 files changed, 110 insertions(+) create mode 100644 drivers/platform/of/apu2x.dts diff --git a/drivers/platform/of/Kconfig b/drivers/platform/of/Kconfig index a0b5a641a7c6..e13b6ee8c316 100644 --- a/drivers/platform/of/Kconfig +++ b/drivers/platform/of/Kconfig @@ -38,4 +38,19 @@ config PLATFORM_OF_DRV_SYSFS_DT Say Y here to enable exposing device tree nodes at /sys/firmware/devicetree. +config PLATFORM_OF_DRV_PCENGINES_APU2 + bool "Support PC Engines APU2/3/4 mainboards" + depends on INPUT + depends on GPIOLIB + depends on X86 + select GPIO_AMD_FCH + select KEYBOARD_GPIO_POLLED + select LEDS_GPIO + select INPUT_KEYBOARD + help + Say Y to enable devicetree based support for PC Engines APU2/3/4 + mainboards. This supersedes the older pcengines-apu2 driver. + + Supports Gpios, front panel LEDs and front button. + endif # PLATFORM_OF_DRV diff --git a/drivers/platform/of/Makefile b/drivers/platform/of/Makefile index 84cf3003c500..dd4a13c18f16 100644 --- a/drivers/platform/of/Makefile +++ b/drivers/platform/of/Makefile @@ -2,4 +2,6 @@ ofboard-y := init.o drv.o +ofboard-$(CONFIG_PLATFORM_OF_DRV_PCENGINES_APU2) += apu2x.dtb.o + obj-$(CONFIG_PLATFORM_OF_DRV) += ofboard.o diff --git a/drivers/platform/of/apu2x.dts b/drivers/platform/of/apu2x.dts new file mode 100644 index 000000000000..c16a59eb2a0e --- /dev/null +++ b/drivers/platform/of/apu2x.dts @@ -0,0 +1,86 @@ +/dts-v1/; + +#include +#include +#include +#include + +/ { + apu2x { + compatible = "virtual,dmi-board"; + dmi-sys-vendor = "PC engines"; + dmi-board-name = + "APU2", + "apu2", + "PC engines apu2", + "APU3", + "apu3", + "PC engines apu3", + "APU4", + "apu4", + "PC engines apu4"; + unbind { + acpi = "PNP0076:00", "PNP0B00:00"; + platform = "platform-framebuffer.0", "PNP0103:00"; + }; + devices { + gpio1: gpio1 { + compatible = "amd,fch-gpio"; + gpio-controller; + status = "okay"; + ngpios=<7>; + #gpio-cells=<2>; + gpio-regs = < + AMD_FCH_GPIO_REG_GPIO57 // led1 + AMD_FCH_GPIO_REG_GPIO58 // led2 + AMD_FCH_GPIO_REG_GPIO59_DEVSLP1 // led3 + AMD_FCH_GPIO_REG_GPIO32_GE1 // modesw + AMD_FCH_GPIO_REG_GPIO33_GE2 // simawap + AMD_FCH_GPIO_REG_GPIO55_DEVSLP0 // mpcie2 + AMD_FCH_GPIO_REG_GPIO51 // mpcie3 + >; + gpio-line-names = + "front-led1", + "front-led2", + "front-led3", + "front-button", + "simswap", + "mpcie2_reset", + "mpcie3_reset"; + }; + front-leds { + compatible = "gpio-leds"; + led@0 { + gpios = <&gpio1 0 GPIO_ACTIVE_HIGH>; + color = ; + default-state = "keep"; + label = "apu:green:1"; + }; + led@1 { + gpios = <&gpio1 1 GPIO_ACTIVE_HIGH>; + color = ; + default-state = "keep"; + label = "apu:green:2"; + }; + led@2 { + gpios = <&gpio1 2 GPIO_ACTIVE_HIGH>; + color = ; + default-state = "keep"; + label = "apu:green:3"; + }; + }; + front-keys { + compatible = "gpio-keys-polled"; + address-cells = <1>; + size-cells = <0>; + poll-interval = <100>; + button@1 { + linux,code = ; + label = "front button"; + debounce-interval = <10>; + gpios = <&gpio1 3 GPIO_ACTIVE_HIGH>; + }; + }; + }; + }; +}; diff --git a/drivers/platform/of/init.c b/drivers/platform/of/init.c index 3b8373cda77a..195120dad26d 100644 --- a/drivers/platform/of/init.c +++ b/drivers/platform/of/init.c @@ -47,7 +47,14 @@ static ssize_t fdt_image_raw_read(struct file *filep, struct kobject *kobj, return count; } +#ifdef CONFIG_PLATFORM_OF_DRV_PCENGINES_APU2 +DECLARE_FDT_EXTERN(apu2x); +#endif + static struct fdt_image fdt[] = { +#ifdef CONFIG_PLATFORM_OF_DRV_PCENGINES_APU2 + FDT_IMAGE_ENT(apu2x) +#endif }; static int __init ofdrv_init_sysfs(struct fdt_image *image)