2017-07-06 07:38:13

by Finley Xiao

[permalink] [raw]
Subject: [PATCH 0/2] nvmem: rockchip-efuse: add support for rk3328-efuse

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



2017-07-06 07:38:19

by Finley Xiao

[permalink] [raw]
Subject: [PATCH 1/2] nvmem: rockchip-efuse: parse 'rockchip,efuse-size'

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 <[email protected]>
---
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


2017-07-06 07:38:31

by Finley Xiao

[permalink] [raw]
Subject: [PATCH 2/2] nvmem: rockchip-efuse: add support for rk3328-efuse

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

Signed-off-by: Finley Xiao <[email protected]>
---
.../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


2017-07-10 01:26:07

by Rob Herring

[permalink] [raw]
Subject: Re: [PATCH 1/2] nvmem: rockchip-efuse: parse 'rockchip,efuse-size'

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 <[email protected]>
> ---
> 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 <[email protected]>

2017-07-10 01:26:45

by Rob Herring

[permalink] [raw]
Subject: Re: [PATCH 2/2] nvmem: rockchip-efuse: add support for rk3328-efuse

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 <[email protected]>
> ---
> .../devicetree/bindings/nvmem/rockchip-efuse.txt | 1 +

Acked-by: Rob Herring <[email protected]>

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