Received: by 2002:a25:7ec1:0:0:0:0:0 with SMTP id z184csp3124556ybc; Thu, 14 Nov 2019 04:26:20 -0800 (PST) X-Google-Smtp-Source: APXvYqy/NDCUJyS0eWZ4ZQJjNWkjAX2sYihBc5TCDOPVsA4C0oVV71Kk3OmOtfpyVHTXGVIznSzE X-Received: by 2002:a17:906:24d4:: with SMTP id f20mr8386910ejb.182.1573734379914; Thu, 14 Nov 2019 04:26:19 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1573734379; cv=none; d=google.com; s=arc-20160816; b=C2SskaLUT25n8pMeFNOMD8vSYvLuW4UM+nuOHuwQqHDcvOjLb78rwRWotlFuQGTCFr 476d3QlQTgD8wePfZPx7FZpcNF6DKAtSPajYYxYqWpQcYSPbXziz2uYATj7SVwUodq63 TCU3RhGZzE8hYlAqaKgPGA8uStvcdlueQdOrdEnsOsUaGBoz1tB6gMZpCOH+NWGvcOsG 7ULMGBKXHR3BhqKahJoRYETc54W9AIQ1DFrbBV4u6DBo5MlVCSI4FY/1LWeikeyHkmHC PuZSin2NxS0/4b028mZtgPz0M61VrsUo5nrLo6+IqBUAqrD9DgXIIW4JmD/JNCVmYb1A 1+7A== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from; bh=Es3x2JM1btli8AT4qdmUfeMcR+uBnLGdluxiK4a41K0=; b=HpWpjgD7GjFTR7yFp44JsV+i83xYlsLSkXnJ+aNg0zM51C0XSunjX8fEdc4NdiTc+o Vpv2pD1u+xY/kH2Pklp3jWW+hdAokon4eCr9b275nFpL/MTj+IOX/tv5GrIP/RHHBi5d yPuaHrlvsU5jOJ8II0nNSg2S9QqlVP0sGTu7t1OnImd6ZqvG2O5JDFvxACiLeZwpTDpV eWxSBD2tG7x295rPZyyR1nAoVCSVIqG5cdq6BIUW37/J1ebpL8bvEi96N5XcTDZRVZag GIh14MjwCOakVMi0QgUcU/IJTUfZzZR2Qp3C39X1uv86e5MpbGG8wJXUTtBT4ljfhxj6 C3Sg== 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 Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id j2si3257574ejx.28.2019.11.14.04.25.54; Thu, 14 Nov 2019 04:26:19 -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 Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1726930AbfKNMXh (ORCPT + 99 others); Thu, 14 Nov 2019 07:23:37 -0500 Received: from sci-ig2.spreadtrum.com ([222.66.158.135]:28211 "EHLO SHSQR01.unisoc.com" rhost-flags-OK-FAIL-OK-FAIL) by vger.kernel.org with ESMTP id S1726057AbfKNMXg (ORCPT ); Thu, 14 Nov 2019 07:23:36 -0500 Received: from SHSQR01.spreadtrum.com (localhost [127.0.0.2] (may be forged)) by SHSQR01.unisoc.com with ESMTP id xAEBnlXD019566; Thu, 14 Nov 2019 19:49:47 +0800 (CST) (envelope-from Orson.Zhai@unisoc.com) Received: from ig2.spreadtrum.com (bjmbx01.spreadtrum.com [10.0.64.7]) by SHSQR01.spreadtrum.com with ESMTPS id xAEBmChD018090 (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO); Thu, 14 Nov 2019 19:48:12 +0800 (CST) (envelope-from Orson.Zhai@unisoc.com) Received: from localhost (10.0.74.112) by BJMBX01.spreadtrum.com (10.0.64.7) with Microsoft SMTP Server (TLS) id 15.0.847.32; Thu, 14 Nov 2019 19:48:15 +0800 From: Orson Zhai To: Lee Jones , Rob Herring , Mark Rutland , Arnd Bergmann CC: , , , Orson Zhai Subject: [PATCH 2/2] mfd: syscon: Add syscon-names and phandle args support Date: Thu, 14 Nov 2019 19:45:25 +0800 Message-ID: <20191114114525.12675-3-orson.zhai@unisoc.com> X-Mailer: git-send-email 2.18.0 In-Reply-To: <20191114114525.12675-1-orson.zhai@unisoc.com> References: <20191114114525.12675-1-orson.zhai@unisoc.com> MIME-Version: 1.0 Content-Type: text/plain X-Originating-IP: [10.0.74.112] X-ClientProxiedBy: SHCAS03.spreadtrum.com (10.0.1.207) To BJMBX01.spreadtrum.com (10.0.64.7) X-MAIL: SHSQR01.spreadtrum.com xAEBmChD018090 Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org There are a lot of global registers used across multiple similar SoCs from Unisoc. It is not easy to manage all of them very well by current syscon device tree interfaces. Add helper functions to get regmap and syscon args by syscon-names all together. This patch does not affect original syscon code and usage. It may help other SoC vendors if they have the same trouble as well. Signed-off-by: Orson Zhai --- drivers/mfd/syscon.c | 65 ++++++++++++++++++++++++++++++++++++++ include/linux/mfd/syscon.h | 22 +++++++++++++ 2 files changed, 87 insertions(+) diff --git a/drivers/mfd/syscon.c b/drivers/mfd/syscon.c index 660723276481..7ed1b2e4dba4 100644 --- a/drivers/mfd/syscon.c +++ b/drivers/mfd/syscon.c @@ -225,6 +225,71 @@ struct regmap *syscon_regmap_lookup_by_phandle(struct device_node *np, } EXPORT_SYMBOL_GPL(syscon_regmap_lookup_by_phandle); +struct regmap *syscon_regmap_lookup_by_name(struct device_node *np, + const char *name) +{ + struct device_node *syscon_np; + struct of_phandle_args args; + struct regmap *regmap; + int index = 0; + int rc; + + if (name) + index = of_property_match_string(np, "syscon-names", name); + + if (index < 0) + return ERR_PTR(-EINVAL); + + rc = of_parse_phandle_with_args(np, "syscons", "#syscon-cells", index, + &args); + if (rc) + return ERR_PTR(rc); + + syscon_np = args.np; + + if (!syscon_np) + return ERR_PTR(-ENODEV); + + regmap = syscon_node_to_regmap(syscon_np); + + of_node_put(syscon_np); + + return regmap; +} +EXPORT_SYMBOL_GPL(syscon_regmap_lookup_by_name); + +int syscon_get_args_by_name(struct device_node *np, + const char *name, + int arg_count, + unsigned int *out_args) +{ + struct of_phandle_args args; + int index = 0; + int rc; + + if (name) + index = of_property_match_string(np, "syscon-names", name); + + if (index < 0) + return -EINVAL; + + rc = of_parse_phandle_with_args(np, "syscons", "#syscon-cells", index, + &args); + if (rc) + return rc; + + if (arg_count > args.args_count) + arg_count = args.args_count; + + for (index = 0; index < arg_count; index++) + out_args[index] = args.args[index]; + + of_node_put(args.np); + + return arg_count; +} +EXPORT_SYMBOL_GPL(syscon_get_args_by_name); + static int syscon_probe(struct platform_device *pdev) { struct device *dev = &pdev->dev; diff --git a/include/linux/mfd/syscon.h b/include/linux/mfd/syscon.h index 112dc66262cc..5584173cd5d4 100644 --- a/include/linux/mfd/syscon.h +++ b/include/linux/mfd/syscon.h @@ -23,6 +23,13 @@ extern struct regmap *syscon_regmap_lookup_by_compatible(const char *s); extern struct regmap *syscon_regmap_lookup_by_phandle( struct device_node *np, const char *property); +extern struct regmap *syscon_regmap_lookup_by_name( + struct device_node *np, + const char *name); +extern int syscon_get_args_by_name(struct device_node *np, + const char *name, + int arg_count, + unsigned int *out_args); #else static inline struct regmap *device_node_to_regmap(struct device_node *np) { @@ -45,6 +52,21 @@ static inline struct regmap *syscon_regmap_lookup_by_phandle( { return ERR_PTR(-ENOTSUPP); } + +static inline struct regmap *syscon_regmap_lookup_by_name( + struct device_node *np, + const char *name) +{ + return ERR_PTR(-ENOTSUPP); +} + +static int syscon_get_args_by_name(struct device_node *np, + const char *name, + int arg_count, + unsigned int *out_args) +{ + return -ENOTSUPP; +} #endif #endif /* __LINUX_MFD_SYSCON_H__ */ -- 2.18.0