Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S934780AbcKNE72 (ORCPT ); Sun, 13 Nov 2016 23:59:28 -0500 Received: from mailout2.samsung.com ([203.254.224.25]:51703 "EHLO mailout2.samsung.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S932189AbcKNE70 (ORCPT ); Sun, 13 Nov 2016 23:59:26 -0500 X-AuditID: cbfee61a-f79916d0000062de-7c-582944a2c2d9 From: Pankaj Dubey To: linux-arm-kernel@lists.infradead.org, linux-kernel@vger.kernel.org Cc: rmk+kernel@armlinux.org.uk, arnd@arndb.de, horms@verge.net.au, magnus.damm@gmail.com, geert+renesas@glider.be, vireshk@kernel.org, shiraz.linux.kernel@gmail.com, krzk@kernel.org, thomas.ab@samsung.com, Pankaj Dubey , Jisheng Zhang , Russell King , Dinh Nguyen , Patrice Chotard , Linus Walleij , Liviu Dudau , Ray Jui , Stephen Warren , Heiko Stuebner , Shawn Guo , Michal Simek , Wei Xu , Andrew Lunn , Jun Nie Subject: [PATCH 01/16] ARM: scu: Provide support for parsing SCU device node to enable SCU Date: Mon, 14 Nov 2016 10:31:56 +0530 Message-id: <1479099731-28108-2-git-send-email-pankaj.dubey@samsung.com> X-Mailer: git-send-email 2.7.4 In-reply-to: <1479099731-28108-1-git-send-email-pankaj.dubey@samsung.com> References: <1479099731-28108-1-git-send-email-pankaj.dubey@samsung.com> X-Brightmail-Tracker: H4sIAAAAAAAAA+NgFmpgleLIzCtJLcpLzFFi42I5/e+xoO4iF80Ig7ff9CzO3z3EbPF30jF2 i1Wf1jBbzJ09idHi/6PXrBbNW78yWrw7vpvFYsmTh+wW589vYLeY8mc5k8Wmx9dYLS7vmsNm cWjqXkaLA0vbWSwerH7LZvHuZYTFoq1f2C3mnLjKaPF05mY2i0v9E5ksXmwRt5j/7SSrxauD bSwWHcsYLTY/OMZm8eToFGYHKY8189Ywely+dpHZ4/evSYwes+6fZfOYeFbXY+esu+wej+du ZPfYtKqTzePOtT1sHpuX1Hvs3PGZyWPyQqD6/muT2D36tqxi9Nh+bR6zx9Mfe5kDRKLcbDJS E1NSixRS85LzUzLz0m2VQkPcdC2UFPISc1NtlSJ0fUOClBTKEnNKgTwjAzTg4BzgHqykb5fg lrHi6BLGgiPSFfMX7GNpYLwt1sXIySEhYCKx9vo1RghbTOLCvfVsXYxcHEICsxgl+r/0Qjk/ GSUmn57MBFLFJqAr8eT9XGYQW0TATeJGYwcTSBGzQBubROOr22wgCWGBGIlT/1pYQWwWAVWJ jau/soPYvAIeEk0v97NDrJOTuHmuE2wQp4CnxJzOM2C9QkA1z29cZ5zAyLuAkWEVo0RqQXJB cVJ6rmFearlecWJucWleul5yfu4mRnDsP5PawXhwl/shRgEORiUe3gNmmhFCrIllxZW5hxgl OJiVRHhdbYBCvCmJlVWpRfnxRaU5qcWHGE2BDpvILCWanA9MS3kl8YYm5ibmxgYW5paWJkZK 4ryNs5+FCwmkJ5akZqemFqQWwfQxcXBKNTCubYtWiL7q+OXsa+1Lc3/6/jwwb7rUxXfZPNGl DrXND+UE5ctVV6cvcpi+Qs/73r7znyNvxlWl9kVdapqTYO8pWiMxW+VwdNCBvysjn6ft3RSS Hptnk1Hb8M56r2xvT5jDw1M9W9OefrAo5PHX3XV5Y+LfeYsXJB8VnxtVf6DRfN9NObHA+ZuV WIozEg21mIuKEwHlg6pIEwMAAA== X-MTR: 20000000000000000@CPGS Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Length: 3403 Lines: 119 Many platforms are duplicating code for enabling SCU, lets add common code to enable SCU by parsing SCU device node so the duplication in each platform can be avoided. CC: Krzysztof Kozlowski CC: Jisheng Zhang CC: Russell King CC: Dinh Nguyen CC: Patrice Chotard CC: Linus Walleij CC: Liviu Dudau CC: Ray Jui CC: Stephen Warren CC: Heiko Stuebner CC: Shawn Guo CC: Michal Simek CC: Wei Xu CC: Andrew Lunn CC: Jun Nie Suggested-by: Arnd Bergmann Signed-off-by: Pankaj Dubey --- arch/arm/include/asm/smp_scu.h | 4 +++ arch/arm/kernel/smp_scu.c | 56 ++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 60 insertions(+) diff --git a/arch/arm/include/asm/smp_scu.h b/arch/arm/include/asm/smp_scu.h index bfe163c..fdeec07 100644 --- a/arch/arm/include/asm/smp_scu.h +++ b/arch/arm/include/asm/smp_scu.h @@ -39,8 +39,12 @@ static inline int scu_power_mode(void __iomem *scu_base, unsigned int mode) #if defined(CONFIG_SMP) && defined(CONFIG_HAVE_ARM_SCU) void scu_enable(void __iomem *scu_base); +void __iomem *of_scu_get_base(void); +int of_scu_enable(void); #else static inline void scu_enable(void __iomem *scu_base) {} +static inline void __iomem *of_scu_get_base(void) {return NULL; } +static inline int of_scu_enable(void) {return 0; } #endif #endif diff --git a/arch/arm/kernel/smp_scu.c b/arch/arm/kernel/smp_scu.c index 72f9241..d0ac3ed 100644 --- a/arch/arm/kernel/smp_scu.c +++ b/arch/arm/kernel/smp_scu.c @@ -10,6 +10,7 @@ */ #include #include +#include #include #include @@ -70,6 +71,61 @@ void scu_enable(void __iomem *scu_base) */ flush_cache_all(); } + +static const struct of_device_id scu_match[] = { + { .compatible = "arm,cortex-a9-scu", }, + { .compatible = "arm,cortex-a5-scu", }, + { } +}; + +/* + * Helper API to get SCU base address + * In case platform DT do not have SCU node, or iomap fails + * this call will fallback and will try to map via call to + * scu_a9_get_base. + * This will return ownership of scu_base to the caller + */ +void __iomem *of_scu_get_base(void) +{ + unsigned long base = 0; + struct device_node *np; + void __iomem *scu_base; + + np = of_find_matching_node(NULL, scu_match); + scu_base = of_iomap(np, 0); + of_node_put(np); + if (!scu_base) { + pr_err("%s failed to map scu_base via DT\n", __func__); + if (scu_a9_has_base()) { + base = scu_a9_get_base(); + scu_base = ioremap(base, SZ_4K); + } + if (!scu_base) { + pr_err("%s failed to map scu_base\n", __func__); + return IOMEM_ERR_PTR(-ENOMEM); + } + } + return scu_base; +} + +/* + * Enable SCU via mapping scu_base DT + * If scu_base mapped successfully scu will be enabled and in case of + * failure if will return non-zero error code + */ +int of_scu_enable(void) +{ + void __iomem *scu_base; + + scu_base = of_scu_get_base(); + if (!IS_ERR(scu_base)) { + scu_enable(scu_base); + iounmap(scu_base); + return 0; + } + return PTR_ERR(scu_base); +} + #endif /* -- 2.7.4