Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1753142AbcDSIRd (ORCPT ); Tue, 19 Apr 2016 04:17:33 -0400 Received: from mail-pf0-f196.google.com ([209.85.192.196]:36848 "EHLO mail-pf0-f196.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751740AbcDSIR2 (ORCPT ); Tue, 19 Apr 2016 04:17:28 -0400 From: Peng Fan To: shawnguo@kernel.org, srinivas.kandagatla@linaro.org, maxime.ripard@free-electrons.com Cc: linux-arm-kernel@lists.infradead.org, devicetree@vger.kernel.org, linux-kernel@vger.kernel.org, van.freenix@gmail.com Subject: [PATCH 3/3] nvmem: imx-ocotp: handling clock Date: Tue, 19 Apr 2016 16:33:08 +0800 Message-Id: <1461054788-339-3-git-send-email-van.freenix@gmail.com> X-Mailer: git-send-email 1.8.4.5 In-Reply-To: <1461054788-339-1-git-send-email-van.freenix@gmail.com> References: <1461054788-339-1-git-send-email-van.freenix@gmail.com> Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Length: 1726 Lines: 65 Before access ocotp nvmem area, the clock should be enabled. Or, `hexdump nvmem` will hang the system. So, use such flow: " 1. clock_enable_prepare 2. read nvmem ocotp area 3. clock_disable_unprepare " Signed-off-by: Peng Fan Cc: Srinivas Kandagatla Cc: Maxime Ripard Cc: Shawn Guo --- drivers/nvmem/imx-ocotp.c | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/drivers/nvmem/imx-ocotp.c b/drivers/nvmem/imx-ocotp.c index d7796eb..55095c0 100644 --- a/drivers/nvmem/imx-ocotp.c +++ b/drivers/nvmem/imx-ocotp.c @@ -15,6 +15,7 @@ * http://www.gnu.org/copyleft/gpl.html */ +#include #include #include #include @@ -27,6 +28,7 @@ struct ocotp_priv { struct device *dev; + struct clk *clk; void __iomem *base; unsigned int nregs; }; @@ -46,11 +48,15 @@ static int imx_ocotp_read(void *context, const void *reg, size_t reg_size, if (count > (priv->nregs - index)) count = priv->nregs - index; + clk_prepare_enable(priv->clk); + for (i = index; i < (index + count); i++) { *(u32 *)val = readl(priv->base + 0x400 + i * 0x10); val += 4; } + clk_disable_unprepare(priv->clk); + return 0; } @@ -112,6 +118,10 @@ static int imx_ocotp_probe(struct platform_device *pdev) if (IS_ERR(priv->base)) return PTR_ERR(priv->base); + priv->clk = devm_clk_get(&pdev->dev, NULL); + if (IS_ERR(priv->clk)) + return PTR_ERR(priv->clk); + of_id = of_match_device(imx_ocotp_dt_ids, dev); priv->nregs = (unsigned int)of_id->data; imx_ocotp_regmap_config.max_register = 4 * priv->nregs - 4; -- 1.8.4.5