linux-kernel.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [PATCH 0/2] nvmem: rockchip-efuse: add support for rk3328-efuse
@ 2017-07-06  7:36 Finley Xiao
  2017-07-06  7:36 ` [PATCH 1/2] nvmem: rockchip-efuse: parse 'rockchip,efuse-size' Finley Xiao
  2017-07-06  7:36 ` [PATCH 2/2] nvmem: rockchip-efuse: add support for rk3328-efuse Finley Xiao
  0 siblings, 2 replies; 5+ messages in thread
From: Finley Xiao @ 2017-07-06  7:36 UTC (permalink / raw)
  To: srinivas.kandagatla, robh+dt, mark.rutland, heiko
  Cc: linux-arm-kernel, linux-rockchip, devicetree, linux-kernel,
	jay.xu, huangtao, tony.xie, cl, Finley Xiao

Add a new property to define eFuse size and add the necessary data
for handling eFuse on the rk3328.

Finley Xiao (2):
  nvmem: rockchip-efuse: parse 'rockchip,efuse-size'
  nvmem: rockchip-efuse: add support for rk3328-efuse

 .../devicetree/bindings/nvmem/rockchip-efuse.txt   |  5 ++
 drivers/nvmem/rockchip-efuse.c                     | 70 +++++++++++++++++++++-
 2 files changed, 74 insertions(+), 1 deletion(-)

-- 
2.7.4

^ permalink raw reply	[flat|nested] 5+ messages in thread

* [PATCH 1/2] nvmem: rockchip-efuse: parse 'rockchip,efuse-size'
  2017-07-06  7:36 [PATCH 0/2] nvmem: rockchip-efuse: add support for rk3328-efuse Finley Xiao
@ 2017-07-06  7:36 ` Finley Xiao
  2017-07-10  1:26   ` Rob Herring
  2017-07-06  7:36 ` [PATCH 2/2] nvmem: rockchip-efuse: add support for rk3328-efuse Finley Xiao
  1 sibling, 1 reply; 5+ messages in thread
From: Finley Xiao @ 2017-07-06  7:36 UTC (permalink / raw)
  To: srinivas.kandagatla, robh+dt, mark.rutland, heiko
  Cc: linux-arm-kernel, linux-rockchip, devicetree, linux-kernel,
	jay.xu, huangtao, tony.xie, cl, Finley Xiao

The eFuse size is defined in property <reg> before, but the length
of registers is not equal to the size on some platforms, so we
add a new property to redefine it.

Signed-off-by: Finley Xiao <finley.xiao@rock-chips.com>
---
 Documentation/devicetree/bindings/nvmem/rockchip-efuse.txt | 4 ++++
 drivers/nvmem/rockchip-efuse.c                             | 4 +++-
 2 files changed, 7 insertions(+), 1 deletion(-)

diff --git a/Documentation/devicetree/bindings/nvmem/rockchip-efuse.txt b/Documentation/devicetree/bindings/nvmem/rockchip-efuse.txt
index 194926f..d206aa1 100644
--- a/Documentation/devicetree/bindings/nvmem/rockchip-efuse.txt
+++ b/Documentation/devicetree/bindings/nvmem/rockchip-efuse.txt
@@ -11,6 +11,10 @@ Required properties:
 - clocks: Should be the clock id of eFuse
 - clock-names: Should be "pclk_efuse"
 
+Optional properties:
+- rockchip,efuse-size: Should be exact eFuse size in byte, the eFuse
+  size in property <reg> will be invalid if define this property.
+
 Deprecated properties:
 - compatible: "rockchip,rockchip-efuse"
   Old efuse compatible value compatible to rk3066a, rk3188 and rk3288
diff --git a/drivers/nvmem/rockchip-efuse.c b/drivers/nvmem/rockchip-efuse.c
index a0d4ede..8e3e5d0 100644
--- a/drivers/nvmem/rockchip-efuse.c
+++ b/drivers/nvmem/rockchip-efuse.c
@@ -214,7 +214,9 @@ static int rockchip_efuse_probe(struct platform_device *pdev)
 		return PTR_ERR(efuse->clk);
 
 	efuse->dev = &pdev->dev;
-	econfig.size = resource_size(res);
+	if (of_property_read_u32(dev->of_node, "rockchip,efuse-size",
+				 &econfig.size))
+		econfig.size = resource_size(res);
 	econfig.reg_read = match->data;
 	econfig.priv = efuse;
 	econfig.dev = efuse->dev;
-- 
2.7.4

^ permalink raw reply related	[flat|nested] 5+ messages in thread

* [PATCH 2/2] nvmem: rockchip-efuse: add support for rk3328-efuse
  2017-07-06  7:36 [PATCH 0/2] nvmem: rockchip-efuse: add support for rk3328-efuse Finley Xiao
  2017-07-06  7:36 ` [PATCH 1/2] nvmem: rockchip-efuse: parse 'rockchip,efuse-size' Finley Xiao
@ 2017-07-06  7:36 ` Finley Xiao
  2017-07-10  1:26   ` Rob Herring
  1 sibling, 1 reply; 5+ messages in thread
From: Finley Xiao @ 2017-07-06  7:36 UTC (permalink / raw)
  To: srinivas.kandagatla, robh+dt, mark.rutland, heiko
  Cc: linux-arm-kernel, linux-rockchip, devicetree, linux-kernel,
	jay.xu, huangtao, tony.xie, cl, Finley Xiao

This adds the necessary data for handling eFuse on the rk3328.

Signed-off-by: Finley Xiao <finley.xiao@rock-chips.com>
---
 .../devicetree/bindings/nvmem/rockchip-efuse.txt   |  1 +
 drivers/nvmem/rockchip-efuse.c                     | 66 ++++++++++++++++++++++
 2 files changed, 67 insertions(+)

diff --git a/Documentation/devicetree/bindings/nvmem/rockchip-efuse.txt b/Documentation/devicetree/bindings/nvmem/rockchip-efuse.txt
index d206aa1..7a817c5 100644
--- a/Documentation/devicetree/bindings/nvmem/rockchip-efuse.txt
+++ b/Documentation/devicetree/bindings/nvmem/rockchip-efuse.txt
@@ -6,6 +6,7 @@ Required properties:
   - "rockchip,rk3188-efuse" - for RK3188 SoCs.
   - "rockchip,rk322x-efuse" - for RK322x SoCs.
   - "rockchip,rk3288-efuse" - for RK3288 SoCs.
+  - "rockchip,rk3328-efuse" - for RK3328 SoCs.
   - "rockchip,rk3399-efuse" - for RK3399 SoCs.
 - reg: Should contain the registers location and exact eFuse size
 - clocks: Should be the clock id of eFuse
diff --git a/drivers/nvmem/rockchip-efuse.c b/drivers/nvmem/rockchip-efuse.c
index 8e3e5d0..70c2d64 100644
--- a/drivers/nvmem/rockchip-efuse.c
+++ b/drivers/nvmem/rockchip-efuse.c
@@ -32,6 +32,14 @@
 #define RK3288_STROBE		BIT(1)
 #define RK3288_CSB		BIT(0)
 
+#define RK3328_SECURE_SIZES	96
+#define RK3328_INT_STATUS	0x0018
+#define RK3328_DOUT		0x0020
+#define RK3328_AUTO_CTRL	0x0024
+#define RK3328_INT_FINISH	BIT(0)
+#define RK3328_AUTO_ENB		BIT(0)
+#define RK3328_AUTO_RD		BIT(1)
+
 #define RK3399_A_SHIFT		16
 #define RK3399_A_MASK		0x3ff
 #define RK3399_NBYTES		4
@@ -92,6 +100,60 @@ static int rockchip_rk3288_efuse_read(void *context, unsigned int offset,
 	return 0;
 }
 
+static int rockchip_rk3328_efuse_read(void *context, unsigned int offset,
+				      void *val, size_t bytes)
+{
+	struct rockchip_efuse_chip *efuse = context;
+	unsigned int addr_start, addr_end, addr_offset, addr_len;
+	u32 out_value, status;
+	u8 *buf;
+	int ret, i = 0;
+
+	ret = clk_prepare_enable(efuse->clk);
+	if (ret < 0) {
+		dev_err(efuse->dev, "failed to prepare/enable efuse clk\n");
+		return ret;
+	}
+
+	/* 128 Byte efuse, 96 Byte for secure, 32 Byte for non-secure */
+	offset += RK3328_SECURE_SIZES;
+	addr_start = rounddown(offset, RK3399_NBYTES) / RK3399_NBYTES;
+	addr_end = roundup(offset + bytes, RK3399_NBYTES) / RK3399_NBYTES;
+	addr_offset = offset % RK3399_NBYTES;
+	addr_len = addr_end - addr_start;
+
+	buf = kzalloc(sizeof(*buf) * addr_len * RK3399_NBYTES, GFP_KERNEL);
+	if (!buf) {
+		ret = -ENOMEM;
+		goto nomem;
+	}
+
+	while (addr_len--) {
+		writel(RK3328_AUTO_RD | RK3328_AUTO_ENB |
+		       ((addr_start++ & RK3399_A_MASK) << RK3399_A_SHIFT),
+		       efuse->base + RK3328_AUTO_CTRL);
+		udelay(2);
+		status = readl(efuse->base + RK3328_INT_STATUS);
+		if (!(status & RK3328_INT_FINISH)) {
+			ret = -EIO;
+			goto err;
+		}
+		out_value = readl(efuse->base + RK3328_DOUT);
+		writel(RK3328_INT_FINISH, efuse->base + RK3328_INT_STATUS);
+
+		memcpy(&buf[i], &out_value, RK3399_NBYTES);
+		i += RK3399_NBYTES;
+	}
+
+	memcpy(val, buf + addr_offset, bytes);
+err:
+	kfree(buf);
+nomem:
+	clk_disable_unprepare(efuse->clk);
+
+	return ret;
+}
+
 static int rockchip_rk3399_efuse_read(void *context, unsigned int offset,
 				      void *val, size_t bytes)
 {
@@ -178,6 +240,10 @@ static const struct of_device_id rockchip_efuse_match[] = {
 		.data = (void *)&rockchip_rk3288_efuse_read,
 	},
 	{
+		.compatible = "rockchip,rk3328-efuse",
+		.data = (void *)&rockchip_rk3328_efuse_read,
+	},
+	{
 		.compatible = "rockchip,rk3399-efuse",
 		.data = (void *)&rockchip_rk3399_efuse_read,
 	},
-- 
2.7.4

^ permalink raw reply related	[flat|nested] 5+ messages in thread

* Re: [PATCH 1/2] nvmem: rockchip-efuse: parse 'rockchip,efuse-size'
  2017-07-06  7:36 ` [PATCH 1/2] nvmem: rockchip-efuse: parse 'rockchip,efuse-size' Finley Xiao
@ 2017-07-10  1:26   ` Rob Herring
  0 siblings, 0 replies; 5+ messages in thread
From: Rob Herring @ 2017-07-10  1:26 UTC (permalink / raw)
  To: Finley Xiao
  Cc: srinivas.kandagatla, mark.rutland, heiko, linux-arm-kernel,
	linux-rockchip, devicetree, linux-kernel, jay.xu, huangtao,
	tony.xie, cl

On Thu, Jul 06, 2017 at 03:36:36PM +0800, Finley Xiao wrote:
> The eFuse size is defined in property <reg> before, but the length
> of registers is not equal to the size on some platforms, so we
> add a new property to redefine it.
> 
> Signed-off-by: Finley Xiao <finley.xiao@rock-chips.com>
> ---
>  Documentation/devicetree/bindings/nvmem/rockchip-efuse.txt | 4 ++++
>  drivers/nvmem/rockchip-efuse.c                             | 4 +++-
>  2 files changed, 7 insertions(+), 1 deletion(-)

Acked-by: Rob Herring <robh@kernel.org>

^ permalink raw reply	[flat|nested] 5+ messages in thread

* Re: [PATCH 2/2] nvmem: rockchip-efuse: add support for rk3328-efuse
  2017-07-06  7:36 ` [PATCH 2/2] nvmem: rockchip-efuse: add support for rk3328-efuse Finley Xiao
@ 2017-07-10  1:26   ` Rob Herring
  0 siblings, 0 replies; 5+ messages in thread
From: Rob Herring @ 2017-07-10  1:26 UTC (permalink / raw)
  To: Finley Xiao
  Cc: srinivas.kandagatla, mark.rutland, heiko, linux-arm-kernel,
	linux-rockchip, devicetree, linux-kernel, jay.xu, huangtao,
	tony.xie, cl

On Thu, Jul 06, 2017 at 03:36:37PM +0800, Finley Xiao wrote:
> This adds the necessary data for handling eFuse on the rk3328.
> 
> Signed-off-by: Finley Xiao <finley.xiao@rock-chips.com>
> ---
>  .../devicetree/bindings/nvmem/rockchip-efuse.txt   |  1 +

Acked-by: Rob Herring <robh@kernel.org>

>  drivers/nvmem/rockchip-efuse.c                     | 66 ++++++++++++++++++++++
>  2 files changed, 67 insertions(+)

^ permalink raw reply	[flat|nested] 5+ messages in thread

end of thread, other threads:[~2017-07-10  1:26 UTC | newest]

Thread overview: 5+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2017-07-06  7:36 [PATCH 0/2] nvmem: rockchip-efuse: add support for rk3328-efuse Finley Xiao
2017-07-06  7:36 ` [PATCH 1/2] nvmem: rockchip-efuse: parse 'rockchip,efuse-size' Finley Xiao
2017-07-10  1:26   ` Rob Herring
2017-07-06  7:36 ` [PATCH 2/2] nvmem: rockchip-efuse: add support for rk3328-efuse Finley Xiao
2017-07-10  1:26   ` Rob Herring

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).