From patchwork Fri Mar 31 12:44:54 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Srinivas Kandagatla X-Patchwork-Id: 96402 Delivered-To: patch@linaro.org Received: by 10.140.89.233 with SMTP id v96csp711233qgd; Fri, 31 Mar 2017 05:47:33 -0700 (PDT) X-Received: by 10.98.57.26 with SMTP id g26mr2217319pfa.38.1490964453779; Fri, 31 Mar 2017 05:47:33 -0700 (PDT) Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id w2si5148638pfk.350.2017.03.31.05.47.33; Fri, 31 Mar 2017 05:47:33 -0700 (PDT) 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; dkim=pass header.i=@linaro.org; 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; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=linaro.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S933384AbdCaMrC (ORCPT + 21 others); Fri, 31 Mar 2017 08:47:02 -0400 Received: from mail-wr0-f179.google.com ([209.85.128.179]:35971 "EHLO mail-wr0-f179.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S933270AbdCaMpX (ORCPT ); Fri, 31 Mar 2017 08:45:23 -0400 Received: by mail-wr0-f179.google.com with SMTP id w11so103536930wrc.3 for ; Fri, 31 Mar 2017 05:45:21 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=QEyMP1OU79SIj1oUAMoooyhs0cXCgc4tHdVVxZjFR0E=; b=SFLEaQSFuMDpHBt4UDd8WIycO1HDsAv1W41OBvFSk38Db48L/13KmeoKuxxkE8hqaW T9tAL4VvzKs4kyp5t0JIxQPnXngRI7WPFGsejTs1w0s9LltHxu4VieZghDruQ2mexr/9 KvawmY3PgZ+GaSrQmvoL4rEftT+aJOF+4aL4Y= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=QEyMP1OU79SIj1oUAMoooyhs0cXCgc4tHdVVxZjFR0E=; b=fEXhDbj0mUlASofyJ6ioUVfRGwbPuy5PGgDNktvNx0EidAoDZ7pPGA5/rEPYqPAG2h yBEDwXeX5k85+RveqNMEhxrfRzjZgYK7f+C835eylTycWctK3lDwAN4ERpk7WMgSOgZt vtUdHOJR2VsVSsuEgHt2aQau1qPBe9KqXVqfkisfnKmASr5TyNJ+0wlhd5q3JOb6FNfp TpWIAZkREA9rOcN7Ya8Vad6Pq0E3LqatYAIV4ESsPqhjWjUD1W7Mu2rzJOnwqd1Iegd9 USs0cBOpvSL5cElYh9GSmbLr96rPjhvCL+06+4Y4OGiaNQa1IkqUni1BYydC0OZHiyQ/ a6Og== X-Gm-Message-State: AFeK/H1KGe+eA5xO3sqBogUvQGQt4X6ntJpotmdmiGgeESvzsaXasaiiFIeKfin5LaXutAFG X-Received: by 10.223.171.22 with SMTP id q22mr2723547wrc.163.1490964320991; Fri, 31 Mar 2017 05:45:20 -0700 (PDT) Received: from localhost.localdomain (cpc90716-aztw32-2-0-cust92.18-1.cable.virginm.net. [86.26.100.93]) by smtp.gmail.com with ESMTPSA id n80sm6615514wrb.24.2017.03.31.05.45.20 (version=TLS1_2 cipher=ECDHE-RSA-AES128-SHA bits=128/128); Fri, 31 Mar 2017 05:45:20 -0700 (PDT) From: Srinivas Kandagatla To: gregkh@linuxfoundation.org Cc: linux-kernel@vger.kernel.org, maxime.ripard@free-electrons.com, Richard Leitner , Srinivas Kandagatla Subject: [PATCH 10/11] nvmem: imx-ocotp: clear error bit after reading locked values Date: Fri, 31 Mar 2017 13:44:54 +0100 Message-Id: <1490964295-9647-11-git-send-email-srinivas.kandagatla@linaro.org> X-Mailer: git-send-email 2.7.4 In-Reply-To: <1490964295-9647-1-git-send-email-srinivas.kandagatla@linaro.org> References: <1490964295-9647-1-git-send-email-srinivas.kandagatla@linaro.org> Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org From: Richard Leitner When reading a "read locked" value from the OCOTP controller on i.MX6 SoC's an error bit is set. This bit has to be cleared by software before any new write, read or reload access can be issued. Therefore clear it after we detect such an "locked read". Signed-off-by: Richard Leitner Signed-off-by: Srinivas Kandagatla --- drivers/nvmem/imx-ocotp.c | 41 ++++++++++++++++++++++++++++++++++++++--- 1 file changed, 38 insertions(+), 3 deletions(-) -- 2.7.4 diff --git a/drivers/nvmem/imx-ocotp.c b/drivers/nvmem/imx-ocotp.c index 0d33705..0bb8d0d 100644 --- a/drivers/nvmem/imx-ocotp.c +++ b/drivers/nvmem/imx-ocotp.c @@ -25,6 +25,19 @@ #include #include +#define IMX_OCOTP_OFFSET_B0W0 0x400 /* Offset from base address of the + * OTP Bank0 Word0 + */ +#define IMX_OCOTP_OFFSET_PER_WORD 0x10 /* Offset between the start addr + * of two consecutive OTP words. + */ +#define IMX_OCOTP_ADDR_CTRL 0x0000 +#define IMX_OCOTP_ADDR_CTRL_CLR 0x0008 + +#define IMX_OCOTP_BM_CTRL_ERROR 0x00000200 + +#define IMX_OCOTP_READ_LOCKED_VAL 0xBADABADA + struct ocotp_priv { struct device *dev; struct clk *clk; @@ -32,6 +45,17 @@ struct ocotp_priv { unsigned int nregs; }; +static void imx_ocotp_clr_err_if_set(void __iomem *base) +{ + u32 c; + + c = readl(base + IMX_OCOTP_ADDR_CTRL); + if (!(c & IMX_OCOTP_BM_CTRL_ERROR)) + return; + + writel(IMX_OCOTP_BM_CTRL_ERROR, base + IMX_OCOTP_ADDR_CTRL_CLR); +} + static int imx_ocotp_read(void *context, unsigned int offset, void *val, size_t bytes) { @@ -52,11 +76,22 @@ static int imx_ocotp_read(void *context, unsigned int offset, dev_err(priv->dev, "failed to prepare/enable ocotp clk\n"); return ret; } - for (i = index; i < (index + count); i++) - *buf++ = readl(priv->base + 0x400 + i * 0x10); - clk_disable_unprepare(priv->clk); + for (i = index; i < (index + count); i++) { + *buf++ = readl(priv->base + IMX_OCOTP_OFFSET_B0W0 + + i * IMX_OCOTP_OFFSET_PER_WORD); + + /* 47.3.1.2 + * For "read locked" registers 0xBADABADA will be returned and + * HW_OCOTP_CTRL[ERROR] will be set. It must be cleared by + * software before any new write, read or reload access can be + * issued + */ + if (*(buf - 1) == IMX_OCOTP_READ_LOCKED_VAL) + imx_ocotp_clr_err_if_set(priv->base); + } + clk_disable_unprepare(priv->clk); return 0; }