From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S932171AbcJUHfQ (ORCPT ); Fri, 21 Oct 2016 03:35:16 -0400 Received: from mail-bn3nam01on0046.outbound.protection.outlook.com ([104.47.33.46]:2265 "EHLO NAM01-BN3-obe.outbound.protection.outlook.com" rhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP id S1754032AbcJUHfL (ORCPT ); Fri, 21 Oct 2016 03:35:11 -0400 X-Greylist: delayed 849 seconds by postgrey-1.27 at vger.kernel.org; Fri, 21 Oct 2016 03:35:11 EDT Authentication-Results: spf=fail (sender IP is 192.88.168.50) smtp.mailfrom=nxp.com; nxp.com; dkim=none (message not signed) header.d=none;nxp.com; dmarc=fail action=none header.from=nxp.com;nxp.com; dkim=none (message not signed) header.d=none; From: Octavian Purdila To: CC: Shawn Guo , Sascha Hauer , Fabio Estevam , , Octavian Purdila Subject: [PATCH 1/2] ARM: imx: add ocotp support in machine code Date: Fri, 21 Oct 2016 10:18:20 +0300 Message-ID: <1477034301-26579-2-git-send-email-octavian.purdila@nxp.com> X-Mailer: git-send-email 2.7.4 In-Reply-To: <1477034301-26579-1-git-send-email-octavian.purdila@nxp.com> References: <1477034301-26579-1-git-send-email-octavian.purdila@nxp.com> X-EOPAttributedMessage: 0 X-Matching-Connectors: 131215080636635352;(91ab9b29-cfa4-454e-5278-08d120cd25b8);() X-Forefront-Antispam-Report: CIP:192.88.168.50;IPV:NLI;CTRY:US;EFV:NLI;SFV:NSPM;SFS:(10009020)(6009001)(7916002)(2980300002)(1110001)(1109001)(339900001)(199003)(189002)(105606002)(11100500001)(586003)(85426001)(305945005)(2950100002)(8666005)(50466002)(6666003)(626004)(356003)(7846002)(8936002)(33646002)(50226002)(92566002)(87936001)(48376002)(106466001)(5660300001)(81156014)(86362001)(575784001)(97736004)(2906002)(5003940100001)(15975445007)(8676002)(19580395003)(50986999)(76176999)(68736007)(6916009)(2351001)(110136003)(47776003)(81166006)(19580405001)(229853001)(77096005)(104016004)(36756003)(189998001)(4326007)(7059030)(473944003);DIR:OUT;SFP:1101;SCL:1;SRVR:CY1PR0301MB1625;H:tx30smr01.am.freescale.net;FPR:;SPF:Fail;PTR:InfoDomainNonexistent;A:1;MX:1;LANG:en; X-Microsoft-Exchange-Diagnostics: 1;BY2FFO11FD019;1:toAZMaXGRMTSy/GhOuqDpsEN92dUwGsBoFPnIqcbe6xOcCNhpVpKsQm3zWYE5Mtv/LH1QqWsglNEqw/I25f9XfZaOZvCxZ9Z/R4FTJAqBG1FR2b0LSVlrgSJfKzwex6yGZJMmqTcio6Lbo0gN1La0hLxdxfKWlWuvUM3vcUafw4DxaBfFkrDUgIMsgOTbky1aXoEp5Qn5oz6e0DVeEW8WjJ6TUev1edydMf67LxedaartazG5Kb1IO04bP7ytqZEK7WFXZumWt5hev9uCj177N2n4IAsdDgGZiMblriBgiqc1qjuGbf/E7pXAswpjDwUPcLqJXeErZHsTHeXzMx//TRIMKattO7Yhsss8rUitWLoNpGh8hVYZoCmxqHsn6a4+ric7dTD2SnMF9CtUoKTuB6V988GPlF7uZ4HqHkFp6yOeyzIG+lu2AyGVI6NEmV7ov+kJE7xGesZq+Ph71FtzuhqlDWugtTQHb9EGM2xrcmDweKROWZIuK+3FdUK0llm0bm/vtNXMY64xNGGIn6+tKcXgDM/ucYicP6KU3S+vvzLdEF626EhZJebm1DrkRbUeEwywf6bOqOmcjXD7p2IljI1zwpjXz7jTqMu/kJsHkclGkvYwC4DiDZ81HEc0HvPoKfwkqqF6y2z+5MrRht5rwiMMu3kGahapYI2Hd5JTnq+bN7NpLKNtVDS8Ugkq2MjIRqALXPz4GW4sjBxuqCE5Cnkeb0IANPs2VE3UgzW36g= MIME-Version: 1.0 Content-Type: text/plain X-MS-Office365-Filtering-Correlation-Id: ecaaa2e4-761e-42c9-ec81-08d3f982d0e6 X-Microsoft-Exchange-Diagnostics: 1;CY1PR0301MB1625;2:7O+8c4vPOAAbQtb/MJtzzeFcgtG7ii2reffMfYuZjR4iU9mP9RmXqfiA7KOrlJe+nOtdFBfcMQ5NS5ImLzQXlso+QuxG8f2g+31zFwRBvA/3uP6HWQuvMB4rtvucc9ac2uyCZMFLFi3u0EkjkmE1ZVU6kkEyz9JxytW/sNqrZ20aNgtToyAu0yy2MCwiGok0Xca/H3dLbm32FJFnV2zDDg==;3:tztkDTKdo3DsdLRykYLs/YV5sXFk+AKuzJr1x6Si/jaEpbYZG9U2alSwqe1NzXR0DdrT7+uQ+oNHZIkn3R/lpERUdlaG0kIeSiDiG1XGZaSR2/s9IsNrOSSOht4NFJge3yrb5qR29H0oc33h99rTYJxNQdClnrh3yFz4TQbbvXhx3dSNufQolCbboTGrlijW9iTlMqWsoyp/on/YYHKY6LbsfMWZWv6/p9lGBq4N9p4Zah7HUyrY/A2MSANS4QRe X-Microsoft-Antispam: UriScan:;BCL:0;PCL:0;RULEID:;SRVR:CY1PR0301MB1625; X-Microsoft-Exchange-Diagnostics: 1;CY1PR0301MB1625;25:91YtPfW10+wo+zzOR7Te6H3mL6SdKlvsi7YWFFcXyjzmxk0NBfi08GsEpTsoimIoRp35HKLRUZ3SsLWUpotE4aEj6fU6CnVcHKBGXegHxrX0U+/2c8T1kBeopCOMq5hiUCxsqMlQmJamQtVOJsk25d6uQoM2sffpWiRbrbPhMOV/lYMc0ouXAk3CuQXuo7F4XQznJ3thoSQTi0bR0zY+DzholL97O+kpl7u6AQ0p6mM28ikeTvBdIZ3vnTX6pdf/IUz7rBseTfrjUgJo3mJ1AtXqIloMAQC4zDtBCVWPR9VTh+uA0Ap6YUt0oHzzeWqtQi0WE91pY/wou89hfOS+wC1nXgBgnV5PPj2vWMhatOQhNadgEOQMonUaKIcPxhoeewX2Ghkz0SqPI7Hy4RBb/LDK+fzLLNawZz8zpF1UGIpp8yBVHMtnpy9EJpZBGLPhhVW4Mq5LfHrsLXgbdXKqMoQJ+VAnabkyiXilYpC36I6QSjo+rRm1at/aephLOrfvFG0R7S2f0TNRCd/X6TMNAoBjdlUSXToD/c0wVzWHN3EkLu5wztS/b9q5HvnJH5PVgpnuaPF3Lo8+UDj1DVrW01YfTHZCAYjJGnhFoUEnanOsGE2K2WZxWJiiWpdskBBwq+BzGF+41h4rG6XOVhpK7YtHEdWxNXFj13jknvKld2qTATLBXrgnE2+tzrJLRzPoMeJJ4lud95tcO7UDlw/B0cgc9U5DPP5SI4yMIhQ28houCXTYeAl8qXCjCru/2LoSKqxukGGXCqA7MOTiwLoTX4Y4SLhExrnWVLHQZFGbNR88JOvjc1n8+LA0XjYjL3q91zJRam/ASEIm3O0KYM+UHIn5vXtKfpm6BW1Uic6NjkWmpENM0gxiHv7kq+CDzKS+ X-Microsoft-Exchange-Diagnostics: 1;CY1PR0301MB1625;31:+sgSsFxIBO+mthJ+GyvhknmIRPxemFn6pGbeMgVW70etns8kCFaiMeZGfyyRzJ0qlmG2bMv5ghZNTt2dBhgEd6UjA/s2vIYCzVjFP0f5tEmbnWaLXjQlcKLratvEAdsG1xcM/I++SVxsGvTU94eMN9/GaTsxdFA20RdRr8WJ81kioEpxF7CK9t8S27gbYCgkSo0MeIObx6gyxvOAUYoqavBqSR++2X+HFiS481iCTEkaYIxAkHxOAy1OQAF5XNNBEy3iFjxyAZhj/SKmYhFYm4L7i50JZ7u8s1xURmSX9e8=;4:pXENdByUzTHC0MuhLRSWQ3/c7IXKr32dErRSmy88Axl3pDg0BfX3ZiqU3g04X0woYGctK5bgs5uOGRzuW9cXpq+5kxfbwmIK8PToTuT9ZpN04DBC5xbH1qZUKf+p+IjZ0YKBnn+R3S8wFnFqsZ8C9SHS3xAmkIES/XSE+j/SLUkRk58U+1HNlRqVD6tciyYPvgy9p7aEb+ahyf1W+FJxmHrUqBQFvOaKXj2GzWE7arXCgUrlU3iNozuFgIlTgyCr04flcRMP9uhQUvzcq5skGmmrfvj7HqCaBQ8HuDvMTQ9sconW3kYxxvxWwmpB4HA+CVXQCrHKpX+kbM5Q1BPIvY/w4fxu7O3BuukIXxzYTa7L6vtvqQKkCT+mcrvtIfTz9vzUMGLaPeqgBjKmhXv9X6yVtpdpxa7r93pR9QElG1/ZrBWSbBziFYtFHd+PSr3eXyzYGePFnKam10lpXMhqtLzX89zVC0U1kuBs5pyZhWZe7L/rJoiD8yQ72HK0ZusBTVOLjEXN4SgeIxet0UEe2YajjMCKxKeTrqq5s4Mp/mzPr7Zb40jv0I26Q2NdtUaNJslc6OCgt5+LrSgXGTtSaAx/aCIiBdQTjQZ3u031/JutJ+AldQIbef3D8wfmX+rJ X-Microsoft-Antispam-PRVS: X-Exchange-Antispam-Report-Test: UriScan:(250305191791016)(22074186197030)(185117386973197); X-Exchange-Antispam-Report-CFA-Test: BCL:0;PCL:0;RULEID:(6040176)(601004)(2401047)(8121501046)(13023025)(5005006)(13015025)(13024025)(13017025)(13018025)(3002001)(10201501046)(6055026);SRVR:CY1PR0301MB1625;BCL:0;PCL:0;RULEID:(400006);SRVR:CY1PR0301MB1625; X-Forefront-PRVS: 01026E1310 X-Microsoft-Exchange-Diagnostics: =?us-ascii?Q?1;CY1PR0301MB1625;23:FKDU9PbvWwY0NXKCVQOTzFZ9S3aUi1Xq3Es1rqz?= =?us-ascii?Q?IporpW6P2GgfsOfVP4QQJOtsQPHHVOCZh5KcMw6zCzDskzm4uxh466T7+1d1?= =?us-ascii?Q?FSfFGm9JULYeF+RjWXrOrBk5zqDvagmNeLCHvs805pgks80fF6gTjXUEDWha?= =?us-ascii?Q?QTDePoVzgK8FXrCRpl3NHTrGlquUrjjsWCH5OuiK2P9zIgXQm8n92Z2OYQ3V?= =?us-ascii?Q?2pZyRvjPy7fJyABkQbBhZMe5ZRhKKNGm1AvlCWuQpyX/XdBOqPBw+0m+STT+?= =?us-ascii?Q?Sk/Mh6/db15H/y7syT49mzCr2QSRmp9Lw+dA1uWCYoxgmVIkpMDyhP+27P5V?= =?us-ascii?Q?71qwtXZrxODaOhOsAf69cg1sY8Y6qnLa3UUwFAGIzaVh4R3nJGGMa6pRNyHo?= =?us-ascii?Q?nhPGIQ6NTBRc/vFcVYC3Ge5eNRF5rLmN3mc0Iv3gsbl076C+/scxMISMvz2g?= =?us-ascii?Q?Wh0u3OuzPKM1tBJXF7Z6O+owwAxOopZXZ3vTPK3Qfb4TrTWuviyn+yzXapQN?= =?us-ascii?Q?E8AgqBagk6OPaPnYNGoe5W2Adx2GGpK57fm6KDOf+zBEqCOE32syZsQumYpp?= =?us-ascii?Q?Sv0zsIg/bL5TCNf8ZOc1MvVfHRSs/Wnx2VALSdDOcDPPXXBQ679INvMVE9qL?= =?us-ascii?Q?OruihW+Eqy8lKuZ4lv9Mq0jfvkiw653JeogWRuCJ4ez6gznt5Pp6/lpTQsDf?= =?us-ascii?Q?/10ZvxXYRGY+3zkFiG09EhlM6INMmmVdrqKnK0OElVXcTUykYwoeA0Hn18H5?= =?us-ascii?Q?8tTQ3gDev+j8z9SMpVJlYL9ZMm0eedI4vWsYz1Oljtr6F2ORm0VPe3WpgRDH?= =?us-ascii?Q?RnF3b72vBslZz6/ZisbVdQBQvkc0EIPJ4PFa6ousX7+QtbtP6m45me5A31oG?= =?us-ascii?Q?ZNok8R9y67XGxOnif6OrdzQrS3smmyCBJkHnlBPCwwv849n6mcm9o7zTBkA0?= =?us-ascii?Q?shDSz7GzxJbTMlnXXUM41+XqTWvAG7fuR9L20ix5tvvSijcOC6PlndqTeq5F?= =?us-ascii?Q?viIrNTOrXyg+W8I1eq1sQL7jL6MYeDqoABVwe7TB0Hmmq4IeEouTag3beqmu?= =?us-ascii?Q?U+WBMakFxyk+VcnSZQuO+kDAMIALG49HJBX/kTN1qUTjMpwbwqp43tCMSPoZ?= =?us-ascii?Q?+ILtp9MhhsLiMjdnrCcboJm48kQh+CWhl5NIWnJ4rdzBStdpWRp5/d2Fa92J?= =?us-ascii?Q?TVcLvR2w2BjeSmg5MHwKwFChgh0wsQGU4zDEZ5tiDaDvk6EZDpYHsS0ieZEM?= =?us-ascii?Q?/YFK4AF4dW3v5xe51eYhmnXUybP209xN8wKx4okbmB3ojR+XJNpBrWkrw5g/?= =?us-ascii?Q?PQA=3D=3D?= X-Microsoft-Exchange-Diagnostics: 1;CY1PR0301MB1625;6:/T/pGVWwj6+qWI4I8A/YcJhjFueegJJ2P/NTyJ+pNiVzPTWfmUFmrNcLLoq9alQFFGd69x3RrWcaO9HLr5wZEBNn1yc7xvzh4sON4PGXrOwEXS3/np7CYE9HS9fwB8HOIB4Geu1w7sV7kK8HQJ7T5nsoX+eSNQmgw115J24+5SOu9qgw0by7xFi7zBkKwGgWWJBxWTWZbCOCHnu31Soz1VjHulhtwYsdT9xksLNgnmHnm/IYHwM9rTze3tNm4kRR9iitnSTEHuh7Vtdf0JxBr1UhgeoxtDfyty+zo2XrmCr6fxL5Z8Ddlx2Y9DspIWeH;5:eF5VPxla3nhRcgmNi+GDOHL/i8+bUMwqJkHTWTVjDZDh/qxjSz87a28SoCszG8JreM07uRj7hEztlws+cpjASEYyYB2058vwrl+Lo7HWPmWV8I9WtM9SXDWf2xZUvbxEJ/xztrQflPcEHQzJHPQibV7KrU3peqWAzUVKP4JWn66JOqU42jtS3D/3e5HQFnZX;24:FEt69Kh8d5h8PJk9osyD7p3ZqCZCHds/yt7Ct2LKubStow2+qYUCsguWmfPnBlJ5PN6U152Dhi/QJZNXdVqjHld/v+ZZXR1da2OT2ZIvvlM= SpamDiagnosticOutput: 1:99 SpamDiagnosticMetadata: NSPM X-Microsoft-Exchange-Diagnostics: 1;CY1PR0301MB1625;7:ZnwDf/ROOZU9LCUxqbH6E5BLntgMlX1ilSMWqkv4eJmZFlZBPtfiTJAA1dNy6WKixQucGmfZpPVLAPpAcmHUpUt6DBbKQ2NGnvOKvcEuhNEQc6ZIiMpm2g/4gUd2yw99ZM7N3lxzrNschdhOGZYGqsWNgi4wTV1IJiZatr+8sVxp1bp7ZYvH0ANtQ/c+Qj4hnEnVr14UN7XTbZOkv4AkqJVAUhuFseVKSgoB/Lm/ooSzAgXq6Je8tQN5jQS0JH+CQzWpyJzG9cjW+c95B+wCil0EOB8HrKadKEarW9ei72RUNQlhXwBeFeLsFR8zmZp9g29OWhPUhEIAZOlnncjrrjnxM5QBw8AqWLv/t7+Z+Kc= X-MS-Exchange-CrossTenant-OriginalArrivalTime: 21 Oct 2016 07:21:03.3359 (UTC) X-MS-Exchange-CrossTenant-Id: 5afe0b00-7697-4969-b663-5eab37d5f47e X-MS-Exchange-CrossTenant-OriginalAttributedTenantConnectingIp: TenantId=5afe0b00-7697-4969-b663-5eab37d5f47e;Ip=[192.88.168.50];Helo=[tx30smr01.am.freescale.net] X-MS-Exchange-CrossTenant-FromEntityHeader: HybridOnPrem X-MS-Exchange-Transport-CrossTenantHeadersStamped: CY1PR0301MB1625 Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Since we will have the need to access OCOTP fuse registers from multiple places move the ocotp initialization and register access code to a new file and provide interfaces for it. Signed-off-by: Octavian Purdila --- arch/arm/mach-imx/Kconfig | 5 +++++ arch/arm/mach-imx/Makefile | 1 + arch/arm/mach-imx/common.h | 2 ++ arch/arm/mach-imx/mach-imx6q.c | 20 ++------------------ arch/arm/mach-imx/mach-imx6sl.c | 1 + arch/arm/mach-imx/mach-imx6sx.c | 1 + arch/arm/mach-imx/mach-imx7d.c | 1 + arch/arm/mach-imx/ocotp.c | 40 ++++++++++++++++++++++++++++++++++++++++ 8 files changed, 53 insertions(+), 18 deletions(-) create mode 100644 arch/arm/mach-imx/ocotp.c diff --git a/arch/arm/mach-imx/Kconfig b/arch/arm/mach-imx/Kconfig index 0ac05a0..1fb36ee 100644 --- a/arch/arm/mach-imx/Kconfig +++ b/arch/arm/mach-imx/Kconfig @@ -58,6 +58,9 @@ config HAVE_IMX_SRC def_bool y if SMP select ARCH_HAS_RESET_CONTROLLER +config HAVE_IMX_OCOTP + bool + config IMX_HAVE_IOMUX_V1 bool @@ -492,6 +495,7 @@ config SOC_IMX6 select HAVE_IMX_SRC select MFD_SYSCON select PL310_ERRATA_769419 if CACHE_L2X0 + select HAVE_IMX_OCOTP config SOC_IMX6Q bool "i.MX6 Quad/DualLite support" @@ -537,6 +541,7 @@ config SOC_IMX7D select HAVE_IMX_ANATOP select HAVE_IMX_MMDC select HAVE_IMX_SRC + select HAVE_IMX_OCOTP help This enables support for Freescale i.MX7 Dual processor. diff --git a/arch/arm/mach-imx/Makefile b/arch/arm/mach-imx/Makefile index cab1289..feef1cf 100644 --- a/arch/arm/mach-imx/Makefile +++ b/arch/arm/mach-imx/Makefile @@ -70,6 +70,7 @@ obj-$(CONFIG_HAVE_IMX_ANATOP) += anatop.o obj-$(CONFIG_HAVE_IMX_GPC) += gpc.o obj-$(CONFIG_HAVE_IMX_MMDC) += mmdc.o obj-$(CONFIG_HAVE_IMX_SRC) += src.o +obj-$(CONFIG_HAVE_IMX_OCOTP) += ocotp.o ifneq ($(CONFIG_SOC_IMX6)$(CONFIG_SOC_LS1021A),) AFLAGS_headsmp.o :=-Wa,-march=armv7-a obj-$(CONFIG_SMP) += headsmp.o platsmp.o diff --git a/arch/arm/mach-imx/common.h b/arch/arm/mach-imx/common.h index c4436d9..fc78d4d0 100644 --- a/arch/arm/mach-imx/common.h +++ b/arch/arm/mach-imx/common.h @@ -103,6 +103,8 @@ void imx_gpc_hwirq_unmask(unsigned int hwirq); void imx_anatop_init(void); void imx_anatop_pre_suspend(void); void imx_anatop_post_resume(void); +void imx_ocotp_init(const char *ocotp_compat); +u32 imx_ocotp_read(u32 offset); int imx6_set_lpm(enum mxc_cpu_pwr_mode mode); void imx6_set_int_mem_clk_lpm(bool enable); void imx6sl_set_wait_clk(bool enter); diff --git a/arch/arm/mach-imx/mach-imx6q.c b/arch/arm/mach-imx/mach-imx6q.c index 97fd251..51f6c19 100644 --- a/arch/arm/mach-imx/mach-imx6q.c +++ b/arch/arm/mach-imx/mach-imx6q.c @@ -280,6 +280,7 @@ static void __init imx6q_init_machine(void) of_platform_default_populate(NULL, NULL, parent); + imx_ocotp_init("fsl,imx6q-ocotp"); imx_anatop_init(); cpu_is_imx6q() ? imx6q_pm_init() : imx6dl_pm_init(); imx6q_1588_init(); @@ -294,22 +295,8 @@ static void __init imx6q_init_machine(void) static void __init imx6q_opp_check_speed_grading(struct device *cpu_dev) { - struct device_node *np; - void __iomem *base; u32 val; - np = of_find_compatible_node(NULL, NULL, "fsl,imx6q-ocotp"); - if (!np) { - pr_warn("failed to find ocotp node\n"); - return; - } - - base = of_iomap(np, 0); - if (!base) { - pr_warn("failed to map ocotp\n"); - goto put_node; - } - /* * SPEED_GRADING[1:0] defines the max speed of ARM: * 2b'11: 1200000000Hz; @@ -318,7 +305,7 @@ static void __init imx6q_opp_check_speed_grading(struct device *cpu_dev) * 2b'00: 792000000Hz; * We need to set the max speed of ARM according to fuse map. */ - val = readl_relaxed(base + OCOTP_CFG3); + val = imx_ocotp_read(OCOTP_CFG3); val >>= OCOTP_CFG3_SPEED_SHIFT; val &= 0x3; @@ -333,9 +320,6 @@ static void __init imx6q_opp_check_speed_grading(struct device *cpu_dev) if (dev_pm_opp_disable(cpu_dev, 852000000)) pr_warn("failed to disable 852 MHz OPP\n"); } - iounmap(base); -put_node: - of_node_put(np); } static void __init imx6q_opp_init(void) diff --git a/arch/arm/mach-imx/mach-imx6sl.c b/arch/arm/mach-imx/mach-imx6sl.c index 0408490..01558df 100644 --- a/arch/arm/mach-imx/mach-imx6sl.c +++ b/arch/arm/mach-imx/mach-imx6sl.c @@ -54,6 +54,7 @@ static void __init imx6sl_init_machine(void) of_platform_default_populate(NULL, NULL, parent); + imx_ocotp_init("fsl,imx6sl-ocotp"); imx6sl_fec_init(); imx_anatop_init(); imx6sl_pm_init(); diff --git a/arch/arm/mach-imx/mach-imx6sx.c b/arch/arm/mach-imx/mach-imx6sx.c index 7f52d9b..acb73c1 100644 --- a/arch/arm/mach-imx/mach-imx6sx.c +++ b/arch/arm/mach-imx/mach-imx6sx.c @@ -74,6 +74,7 @@ static void __init imx6sx_init_machine(void) of_platform_default_populate(NULL, NULL, parent); + imx_ocotp_init("fsl,imx6sx-ocotp"); imx6sx_enet_init(); imx_anatop_init(); imx6sx_pm_init(); diff --git a/arch/arm/mach-imx/mach-imx7d.c b/arch/arm/mach-imx/mach-imx7d.c index 26ca744..c29c771 100644 --- a/arch/arm/mach-imx/mach-imx7d.c +++ b/arch/arm/mach-imx/mach-imx7d.c @@ -93,6 +93,7 @@ static void __init imx7d_init_machine(void) if (parent == NULL) pr_warn("failed to initialize soc device\n"); + imx_ocotp_init("fsl,imx7d-ocotp"); imx_anatop_init(); imx7d_enet_init(); } diff --git a/arch/arm/mach-imx/ocotp.c b/arch/arm/mach-imx/ocotp.c new file mode 100644 index 0000000..e73f0e8 --- /dev/null +++ b/arch/arm/mach-imx/ocotp.c @@ -0,0 +1,40 @@ +/* + * Copyright (C) 2016 Freescale Semiconductor, Inc. + * + * The code contained herein is licensed under the GNU General Public + * License. You may obtain a copy of the GNU General Public License + * Version 2 or later at the following locations: + * + * http://www.opensource.org/licenses/gpl-license.html + * http://www.gnu.org/copyleft/gpl.html + */ +#include +#include +#include + +static void __iomem *ocotp_base; + +void __init imx_ocotp_init(const char *compat) +{ + struct device_node *ocotp_np; + + ocotp_np = of_find_compatible_node(NULL, NULL, compat); + if (!ocotp_np) { + pr_warn("failed to find ocotp node\n"); + return; + } + + ocotp_base = of_iomap(ocotp_np, 0); + if (!ocotp_base) + pr_warn("failed to map ocotp\n"); + + of_node_put(ocotp_np); +} + +u32 imx_ocotp_read(u32 offset) +{ + if (WARN_ON(!ocotp_base)) + return 0; + + return readl_relaxed(ocotp_base + offset); +} -- 2.7.4 From mboxrd@z Thu Jan 1 00:00:00 1970 From: octavian.purdila@nxp.com (Octavian Purdila) Date: Fri, 21 Oct 2016 10:18:20 +0300 Subject: [PATCH 1/2] ARM: imx: add ocotp support in machine code In-Reply-To: <1477034301-26579-1-git-send-email-octavian.purdila@nxp.com> References: <1477034301-26579-1-git-send-email-octavian.purdila@nxp.com> Message-ID: <1477034301-26579-2-git-send-email-octavian.purdila@nxp.com> To: linux-arm-kernel@lists.infradead.org List-Id: linux-arm-kernel.lists.infradead.org Since we will have the need to access OCOTP fuse registers from multiple places move the ocotp initialization and register access code to a new file and provide interfaces for it. Signed-off-by: Octavian Purdila --- arch/arm/mach-imx/Kconfig | 5 +++++ arch/arm/mach-imx/Makefile | 1 + arch/arm/mach-imx/common.h | 2 ++ arch/arm/mach-imx/mach-imx6q.c | 20 ++------------------ arch/arm/mach-imx/mach-imx6sl.c | 1 + arch/arm/mach-imx/mach-imx6sx.c | 1 + arch/arm/mach-imx/mach-imx7d.c | 1 + arch/arm/mach-imx/ocotp.c | 40 ++++++++++++++++++++++++++++++++++++++++ 8 files changed, 53 insertions(+), 18 deletions(-) create mode 100644 arch/arm/mach-imx/ocotp.c diff --git a/arch/arm/mach-imx/Kconfig b/arch/arm/mach-imx/Kconfig index 0ac05a0..1fb36ee 100644 --- a/arch/arm/mach-imx/Kconfig +++ b/arch/arm/mach-imx/Kconfig @@ -58,6 +58,9 @@ config HAVE_IMX_SRC def_bool y if SMP select ARCH_HAS_RESET_CONTROLLER +config HAVE_IMX_OCOTP + bool + config IMX_HAVE_IOMUX_V1 bool @@ -492,6 +495,7 @@ config SOC_IMX6 select HAVE_IMX_SRC select MFD_SYSCON select PL310_ERRATA_769419 if CACHE_L2X0 + select HAVE_IMX_OCOTP config SOC_IMX6Q bool "i.MX6 Quad/DualLite support" @@ -537,6 +541,7 @@ config SOC_IMX7D select HAVE_IMX_ANATOP select HAVE_IMX_MMDC select HAVE_IMX_SRC + select HAVE_IMX_OCOTP help This enables support for Freescale i.MX7 Dual processor. diff --git a/arch/arm/mach-imx/Makefile b/arch/arm/mach-imx/Makefile index cab1289..feef1cf 100644 --- a/arch/arm/mach-imx/Makefile +++ b/arch/arm/mach-imx/Makefile @@ -70,6 +70,7 @@ obj-$(CONFIG_HAVE_IMX_ANATOP) += anatop.o obj-$(CONFIG_HAVE_IMX_GPC) += gpc.o obj-$(CONFIG_HAVE_IMX_MMDC) += mmdc.o obj-$(CONFIG_HAVE_IMX_SRC) += src.o +obj-$(CONFIG_HAVE_IMX_OCOTP) += ocotp.o ifneq ($(CONFIG_SOC_IMX6)$(CONFIG_SOC_LS1021A),) AFLAGS_headsmp.o :=-Wa,-march=armv7-a obj-$(CONFIG_SMP) += headsmp.o platsmp.o diff --git a/arch/arm/mach-imx/common.h b/arch/arm/mach-imx/common.h index c4436d9..fc78d4d0 100644 --- a/arch/arm/mach-imx/common.h +++ b/arch/arm/mach-imx/common.h @@ -103,6 +103,8 @@ void imx_gpc_hwirq_unmask(unsigned int hwirq); void imx_anatop_init(void); void imx_anatop_pre_suspend(void); void imx_anatop_post_resume(void); +void imx_ocotp_init(const char *ocotp_compat); +u32 imx_ocotp_read(u32 offset); int imx6_set_lpm(enum mxc_cpu_pwr_mode mode); void imx6_set_int_mem_clk_lpm(bool enable); void imx6sl_set_wait_clk(bool enter); diff --git a/arch/arm/mach-imx/mach-imx6q.c b/arch/arm/mach-imx/mach-imx6q.c index 97fd251..51f6c19 100644 --- a/arch/arm/mach-imx/mach-imx6q.c +++ b/arch/arm/mach-imx/mach-imx6q.c @@ -280,6 +280,7 @@ static void __init imx6q_init_machine(void) of_platform_default_populate(NULL, NULL, parent); + imx_ocotp_init("fsl,imx6q-ocotp"); imx_anatop_init(); cpu_is_imx6q() ? imx6q_pm_init() : imx6dl_pm_init(); imx6q_1588_init(); @@ -294,22 +295,8 @@ static void __init imx6q_init_machine(void) static void __init imx6q_opp_check_speed_grading(struct device *cpu_dev) { - struct device_node *np; - void __iomem *base; u32 val; - np = of_find_compatible_node(NULL, NULL, "fsl,imx6q-ocotp"); - if (!np) { - pr_warn("failed to find ocotp node\n"); - return; - } - - base = of_iomap(np, 0); - if (!base) { - pr_warn("failed to map ocotp\n"); - goto put_node; - } - /* * SPEED_GRADING[1:0] defines the max speed of ARM: * 2b'11: 1200000000Hz; @@ -318,7 +305,7 @@ static void __init imx6q_opp_check_speed_grading(struct device *cpu_dev) * 2b'00: 792000000Hz; * We need to set the max speed of ARM according to fuse map. */ - val = readl_relaxed(base + OCOTP_CFG3); + val = imx_ocotp_read(OCOTP_CFG3); val >>= OCOTP_CFG3_SPEED_SHIFT; val &= 0x3; @@ -333,9 +320,6 @@ static void __init imx6q_opp_check_speed_grading(struct device *cpu_dev) if (dev_pm_opp_disable(cpu_dev, 852000000)) pr_warn("failed to disable 852 MHz OPP\n"); } - iounmap(base); -put_node: - of_node_put(np); } static void __init imx6q_opp_init(void) diff --git a/arch/arm/mach-imx/mach-imx6sl.c b/arch/arm/mach-imx/mach-imx6sl.c index 0408490..01558df 100644 --- a/arch/arm/mach-imx/mach-imx6sl.c +++ b/arch/arm/mach-imx/mach-imx6sl.c @@ -54,6 +54,7 @@ static void __init imx6sl_init_machine(void) of_platform_default_populate(NULL, NULL, parent); + imx_ocotp_init("fsl,imx6sl-ocotp"); imx6sl_fec_init(); imx_anatop_init(); imx6sl_pm_init(); diff --git a/arch/arm/mach-imx/mach-imx6sx.c b/arch/arm/mach-imx/mach-imx6sx.c index 7f52d9b..acb73c1 100644 --- a/arch/arm/mach-imx/mach-imx6sx.c +++ b/arch/arm/mach-imx/mach-imx6sx.c @@ -74,6 +74,7 @@ static void __init imx6sx_init_machine(void) of_platform_default_populate(NULL, NULL, parent); + imx_ocotp_init("fsl,imx6sx-ocotp"); imx6sx_enet_init(); imx_anatop_init(); imx6sx_pm_init(); diff --git a/arch/arm/mach-imx/mach-imx7d.c b/arch/arm/mach-imx/mach-imx7d.c index 26ca744..c29c771 100644 --- a/arch/arm/mach-imx/mach-imx7d.c +++ b/arch/arm/mach-imx/mach-imx7d.c @@ -93,6 +93,7 @@ static void __init imx7d_init_machine(void) if (parent == NULL) pr_warn("failed to initialize soc device\n"); + imx_ocotp_init("fsl,imx7d-ocotp"); imx_anatop_init(); imx7d_enet_init(); } diff --git a/arch/arm/mach-imx/ocotp.c b/arch/arm/mach-imx/ocotp.c new file mode 100644 index 0000000..e73f0e8 --- /dev/null +++ b/arch/arm/mach-imx/ocotp.c @@ -0,0 +1,40 @@ +/* + * Copyright (C) 2016 Freescale Semiconductor, Inc. + * + * The code contained herein is licensed under the GNU General Public + * License. You may obtain a copy of the GNU General Public License + * Version 2 or later at the following locations: + * + * http://www.opensource.org/licenses/gpl-license.html + * http://www.gnu.org/copyleft/gpl.html + */ +#include +#include +#include + +static void __iomem *ocotp_base; + +void __init imx_ocotp_init(const char *compat) +{ + struct device_node *ocotp_np; + + ocotp_np = of_find_compatible_node(NULL, NULL, compat); + if (!ocotp_np) { + pr_warn("failed to find ocotp node\n"); + return; + } + + ocotp_base = of_iomap(ocotp_np, 0); + if (!ocotp_base) + pr_warn("failed to map ocotp\n"); + + of_node_put(ocotp_np); +} + +u32 imx_ocotp_read(u32 offset) +{ + if (WARN_ON(!ocotp_base)) + return 0; + + return readl_relaxed(ocotp_base + offset); +} -- 2.7.4