linux-kernel.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [PATCH 0/3] Optimize the Spreadtrum eFuse controller
@ 2020-03-13  4:07 Baolin Wang
  2020-03-13  4:07 ` [PATCH 1/3] nvmem: sprd: Fix the block lock operation Baolin Wang
                   ` (2 more replies)
  0 siblings, 3 replies; 5+ messages in thread
From: Baolin Wang @ 2020-03-13  4:07 UTC (permalink / raw)
  To: srinivas.kandagatla
  Cc: orsonzhai, zhang.lyra, freeman.liu, baolin.wang7, linux-kernel

This patch set optimizes the block lock operation and set the double
data flag from device data.

Baolin Wang (1):
  nvmem: sprd: Determine double data programming from device data

Freeman Liu (2):
  nvmem: sprd: Fix the block lock operation
  nvmem: sprd: Optimize the block lock operation

 drivers/nvmem/sprd-efuse.c | 27 ++++++++++++++++++++++-----
 1 file changed, 22 insertions(+), 5 deletions(-)

-- 
1.9.1


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

* [PATCH 1/3] nvmem: sprd: Fix the block lock operation
  2020-03-13  4:07 [PATCH 0/3] Optimize the Spreadtrum eFuse controller Baolin Wang
@ 2020-03-13  4:07 ` Baolin Wang
  2020-03-18 13:40   ` Srinivas Kandagatla
  2020-03-13  4:07 ` [PATCH 2/3] nvmem: sprd: Optimize " Baolin Wang
  2020-03-13  4:07 ` [PATCH 3/3] nvmem: sprd: Determine double data programming from device data Baolin Wang
  2 siblings, 1 reply; 5+ messages in thread
From: Baolin Wang @ 2020-03-13  4:07 UTC (permalink / raw)
  To: srinivas.kandagatla
  Cc: orsonzhai, zhang.lyra, freeman.liu, baolin.wang7, linux-kernel

From: Freeman Liu <freeman.liu@unisoc.com>

According to the Spreadtrum eFuse specification, we should write 0 to
the block to trigger the lock operation.

Fixes: 096030e7f449 ("nvmem: sprd: Add Spreadtrum SoCs eFuse support")
Signed-off-by: Freeman Liu <freeman.liu@unisoc.com>
Signed-off-by: Baolin Wang <baolin.wang7@gmail.com>
---
 drivers/nvmem/sprd-efuse.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/drivers/nvmem/sprd-efuse.c b/drivers/nvmem/sprd-efuse.c
index 2f1e0fb..7a189ef 100644
--- a/drivers/nvmem/sprd-efuse.c
+++ b/drivers/nvmem/sprd-efuse.c
@@ -239,7 +239,7 @@ static int sprd_efuse_raw_prog(struct sprd_efuse *efuse, u32 blk, bool doub,
 		ret = -EBUSY;
 	} else {
 		sprd_efuse_set_prog_lock(efuse, lock);
-		writel(*data, efuse->base + SPRD_EFUSE_MEM(blk));
+		writel(0, efuse->base + SPRD_EFUSE_MEM(blk));
 		sprd_efuse_set_prog_lock(efuse, false);
 	}
 
-- 
1.9.1


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

* [PATCH 2/3] nvmem: sprd: Optimize the block lock operation
  2020-03-13  4:07 [PATCH 0/3] Optimize the Spreadtrum eFuse controller Baolin Wang
  2020-03-13  4:07 ` [PATCH 1/3] nvmem: sprd: Fix the block lock operation Baolin Wang
@ 2020-03-13  4:07 ` Baolin Wang
  2020-03-13  4:07 ` [PATCH 3/3] nvmem: sprd: Determine double data programming from device data Baolin Wang
  2 siblings, 0 replies; 5+ messages in thread
From: Baolin Wang @ 2020-03-13  4:07 UTC (permalink / raw)
  To: srinivas.kandagatla
  Cc: orsonzhai, zhang.lyra, freeman.liu, baolin.wang7, linux-kernel

From: Freeman Liu <freeman.liu@unisoc.com>

We have some cases that will programme the eFuse block partially multiple
times, so we should allow the block to be programmed again if it was
programmed partially. But we should lock the block if the whole block
was programmed. Thus add a condition to validate if we need lock the
block or not.

Moreover we only enable the auto-check function when locking the block.

Signed-off-by: Freeman Liu <freeman.liu@unisoc.com>
Signed-off-by: Baolin Wang <baolin.wang7@gmail.com>
---
 drivers/nvmem/sprd-efuse.c | 24 ++++++++++++++++++++----
 1 file changed, 20 insertions(+), 4 deletions(-)

diff --git a/drivers/nvmem/sprd-efuse.c b/drivers/nvmem/sprd-efuse.c
index 7a189ef..43b3f6e 100644
--- a/drivers/nvmem/sprd-efuse.c
+++ b/drivers/nvmem/sprd-efuse.c
@@ -217,12 +217,14 @@ static int sprd_efuse_raw_prog(struct sprd_efuse *efuse, u32 blk, bool doub,
 	 * Enable the auto-check function to validate if the programming is
 	 * successful.
 	 */
-	sprd_efuse_set_auto_check(efuse, true);
+	if (lock)
+		sprd_efuse_set_auto_check(efuse, true);
 
 	writel(*data, efuse->base + SPRD_EFUSE_MEM(blk));
 
 	/* Disable auto-check and data double after programming */
-	sprd_efuse_set_auto_check(efuse, false);
+	if (lock)
+		sprd_efuse_set_auto_check(efuse, false);
 	sprd_efuse_set_data_double(efuse, false);
 
 	/*
@@ -237,7 +239,7 @@ static int sprd_efuse_raw_prog(struct sprd_efuse *efuse, u32 blk, bool doub,
 		writel(SPRD_EFUSE_ERR_CLR_MASK,
 		       efuse->base + SPRD_EFUSE_ERR_CLR);
 		ret = -EBUSY;
-	} else {
+	} else if (lock) {
 		sprd_efuse_set_prog_lock(efuse, lock);
 		writel(0, efuse->base + SPRD_EFUSE_MEM(blk));
 		sprd_efuse_set_prog_lock(efuse, false);
@@ -322,6 +324,7 @@ static int sprd_efuse_read(void *context, u32 offset, void *val, size_t bytes)
 static int sprd_efuse_write(void *context, u32 offset, void *val, size_t bytes)
 {
 	struct sprd_efuse *efuse = context;
+	bool lock;
 	int ret;
 
 	ret = sprd_efuse_lock(efuse);
@@ -332,7 +335,20 @@ static int sprd_efuse_write(void *context, u32 offset, void *val, size_t bytes)
 	if (ret)
 		goto unlock;
 
-	ret = sprd_efuse_raw_prog(efuse, offset, false, false, val);
+	/*
+	 * If the writing bytes are equal with the block width, which means the
+	 * whole block will be programmed. For this case, we should not allow
+	 * this block to be programmed again by locking this block.
+	 *
+	 * If the block was programmed partially, we should allow this block to
+	 * be programmed again.
+	 */
+	if (bytes < SPRD_EFUSE_BLOCK_WIDTH)
+		lock = false;
+	else
+		lock = true;
+
+	ret = sprd_efuse_raw_prog(efuse, offset, false, lock, val);
 
 	clk_disable_unprepare(efuse->clk);
 
-- 
1.9.1


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

* [PATCH 3/3] nvmem: sprd: Determine double data programming from device data
  2020-03-13  4:07 [PATCH 0/3] Optimize the Spreadtrum eFuse controller Baolin Wang
  2020-03-13  4:07 ` [PATCH 1/3] nvmem: sprd: Fix the block lock operation Baolin Wang
  2020-03-13  4:07 ` [PATCH 2/3] nvmem: sprd: Optimize " Baolin Wang
@ 2020-03-13  4:07 ` Baolin Wang
  2 siblings, 0 replies; 5+ messages in thread
From: Baolin Wang @ 2020-03-13  4:07 UTC (permalink / raw)
  To: srinivas.kandagatla
  Cc: orsonzhai, zhang.lyra, freeman.liu, baolin.wang7, linux-kernel

We've saved the double data flag in the device data, so we should
use it when programming a block.

Signed-off-by: Baolin Wang <baolin.wang7@gmail.com>
---
 drivers/nvmem/sprd-efuse.c | 3 ++-
 1 file changed, 2 insertions(+), 1 deletion(-)

diff --git a/drivers/nvmem/sprd-efuse.c b/drivers/nvmem/sprd-efuse.c
index 43b3f6e..925feb2 100644
--- a/drivers/nvmem/sprd-efuse.c
+++ b/drivers/nvmem/sprd-efuse.c
@@ -324,6 +324,7 @@ static int sprd_efuse_read(void *context, u32 offset, void *val, size_t bytes)
 static int sprd_efuse_write(void *context, u32 offset, void *val, size_t bytes)
 {
 	struct sprd_efuse *efuse = context;
+	bool blk_double = efuse->data->blk_double;
 	bool lock;
 	int ret;
 
@@ -348,7 +349,7 @@ static int sprd_efuse_write(void *context, u32 offset, void *val, size_t bytes)
 	else
 		lock = true;
 
-	ret = sprd_efuse_raw_prog(efuse, offset, false, lock, val);
+	ret = sprd_efuse_raw_prog(efuse, offset, blk_double, lock, val);
 
 	clk_disable_unprepare(efuse->clk);
 
-- 
1.9.1


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

* Re: [PATCH 1/3] nvmem: sprd: Fix the block lock operation
  2020-03-13  4:07 ` [PATCH 1/3] nvmem: sprd: Fix the block lock operation Baolin Wang
@ 2020-03-18 13:40   ` Srinivas Kandagatla
  0 siblings, 0 replies; 5+ messages in thread
From: Srinivas Kandagatla @ 2020-03-18 13:40 UTC (permalink / raw)
  To: Baolin Wang; +Cc: orsonzhai, zhang.lyra, freeman.liu, linux-kernel



On 13/03/2020 04:07, Baolin Wang wrote:
> From: Freeman Liu <freeman.liu@unisoc.com>
> 
> According to the Spreadtrum eFuse specification, we should write 0 to
> the block to trigger the lock operation.
> 
> Fixes: 096030e7f449 ("nvmem: sprd: Add Spreadtrum SoCs eFuse support")
> Signed-off-by: Freeman Liu <freeman.liu@unisoc.com>
> Signed-off-by: Baolin Wang <baolin.wang7@gmail.com>
> ---
>   drivers/nvmem/sprd-efuse.c | 2 +-
>   1 file changed, 1 insertion(+), 1 deletion(-)



Applied all thanks,
srini

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

end of thread, other threads:[~2020-03-18 13:41 UTC | newest]

Thread overview: 5+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2020-03-13  4:07 [PATCH 0/3] Optimize the Spreadtrum eFuse controller Baolin Wang
2020-03-13  4:07 ` [PATCH 1/3] nvmem: sprd: Fix the block lock operation Baolin Wang
2020-03-18 13:40   ` Srinivas Kandagatla
2020-03-13  4:07 ` [PATCH 2/3] nvmem: sprd: Optimize " Baolin Wang
2020-03-13  4:07 ` [PATCH 3/3] nvmem: sprd: Determine double data programming from device data Baolin Wang

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).