diff mbox

[U-Boot,2/3] mxs_ocotp: check for errors from the OTP controller after writing

Message ID 1416588884-21701-2-git-send-email-hector.palacios@digi.com
State Awaiting Upstream
Delegated to: Stefano Babic
Headers show

Commit Message

Hector Palacios Nov. 21, 2014, 4:54 p.m. UTC
The write operation may fail when trying to write to a locked area. In
this case the ERROR bit is set in the CTRL register. Check for that
condition and return an error.

Signed-off-by: Hector Palacios <hector.palacios@digi.com>
---
 drivers/misc/mxs_ocotp.c | 7 +++++++
 1 file changed, 7 insertions(+)

Comments

Fabio Estevam Nov. 21, 2014, 5:10 p.m. UTC | #1
Hi Hector,

On Fri, Nov 21, 2014 at 2:54 PM, Hector Palacios
<hector.palacios@digi.com> wrote:
> The write operation may fail when trying to write to a locked area. In
> this case the ERROR bit is set in the CTRL register. Check for that
> condition and return an error.
>
> Signed-off-by: Hector Palacios <hector.palacios@digi.com>
> ---
>  drivers/misc/mxs_ocotp.c | 7 +++++++
>  1 file changed, 7 insertions(+)
>
> diff --git a/drivers/misc/mxs_ocotp.c b/drivers/misc/mxs_ocotp.c
> index 09002814f2f0..1659ee6a5eec 100644
> --- a/drivers/misc/mxs_ocotp.c
> +++ b/drivers/misc/mxs_ocotp.c
> @@ -221,6 +221,13 @@ static int mxs_ocotp_write_fuse(uint32_t addr, uint32_t mask)
>                 goto fail;
>         }
>
> +       /* Check for errors */
> +       if (readl(&ocotp_regs->hw_ocotp_ctrl) & OCOTP_CTRL_ERROR) {
> +               puts("Failed writing fuses!\n");
> +               ret = -EPERM;
> +               goto fail;
> +       }
> +
>  fail:

What about doing this instead?

       /* Check for errors */
       ret = readl(&ocotp_regs->hw_ocotp_ctrl) & OCOTP_CTRL_ERROR);
       if (ret) {
               printfs("Failed writing the fuses: %d\n", ret);
               goto fail;
       }
Hector Palacios Nov. 21, 2014, 6:04 p.m. UTC | #2
Hi Fabio,

On 11/21/2014 06:10 PM, Fabio Estevam wrote:
> Hi Hector,
> 
> On Fri, Nov 21, 2014 at 2:54 PM, Hector Palacios
> <hector.palacios@digi.com> wrote:
>> The write operation may fail when trying to write to a locked area. In
>> this case the ERROR bit is set in the CTRL register. Check for that
>> condition and return an error.
>>
>> Signed-off-by: Hector Palacios <hector.palacios@digi.com>
>> ---
>>  drivers/misc/mxs_ocotp.c | 7 +++++++
>>  1 file changed, 7 insertions(+)
>>
>> diff --git a/drivers/misc/mxs_ocotp.c b/drivers/misc/mxs_ocotp.c
>> index 09002814f2f0..1659ee6a5eec 100644
>> --- a/drivers/misc/mxs_ocotp.c
>> +++ b/drivers/misc/mxs_ocotp.c
>> @@ -221,6 +221,13 @@ static int mxs_ocotp_write_fuse(uint32_t addr, uint32_t mask)
>>                 goto fail;
>>         }
>>
>> +       /* Check for errors */
>> +       if (readl(&ocotp_regs->hw_ocotp_ctrl) & OCOTP_CTRL_ERROR) {
>> +               puts("Failed writing fuses!\n");
>> +               ret = -EPERM;
>> +               goto fail;
>> +       }
>> +
>>  fail:
> 
> What about doing this instead?
> 
>        /* Check for errors */
>        ret = readl(&ocotp_regs->hw_ocotp_ctrl) & OCOTP_CTRL_ERROR);
>        if (ret) {
>                printfs("Failed writing the fuses: %d\n", ret);
>                goto fail;
>        }
> 

Although the code looks nicer you are not returning a meaningful error code, just a
mask value (and yes, I know the error code does not get anywhere, but still).
--
Hector Palacios

PS. Sorry about the resending of the message but the mailing list server kept
rejecting it.
Fabio Estevam Nov. 22, 2014, 7:29 p.m. UTC | #3
On Fri, Nov 21, 2014 at 4:04 PM, Hector Palacios
<hector.palacios@digi.com> wrote:

>> What about doing this instead?
>>
>>        /* Check for errors */
>>        ret = readl(&ocotp_regs->hw_ocotp_ctrl) & OCOTP_CTRL_ERROR);
>>        if (ret) {
>>                printfs("Failed writing the fuses: %d\n", ret);
>>                goto fail;
>>        }
>>
>
> Although the code looks nicer you are not returning a meaningful error code, just a
> mask value (and yes, I know the error code does not get anywhere, but still).

I am just returning the real error code, not a 'fake' one :-)
Fabio Estevam Nov. 22, 2014, 7:31 p.m. UTC | #4
On Sat, Nov 22, 2014 at 5:29 PM, Fabio Estevam <festevam@gmail.com> wrote:
> On Fri, Nov 21, 2014 at 4:04 PM, Hector Palacios
> <hector.palacios@digi.com> wrote:
>
>>> What about doing this instead?
>>>
>>>        /* Check for errors */
>>>        ret = readl(&ocotp_regs->hw_ocotp_ctrl) & OCOTP_CTRL_ERROR);
>>>        if (ret) {
>>>                printfs("Failed writing the fuses: %d\n", ret);
>>>                goto fail;
>>>        }
>>>
>>
>> Although the code looks nicer you are not returning a meaningful error code, just a
>> mask value (and yes, I know the error code does not get anywhere, but still).
>
> I am just returning the real error code, not a 'fake' one :-)

Actually your code is correct and I misread it. Sorry about that.
Fabio Estevam Nov. 22, 2014, 7:31 p.m. UTC | #5
On Fri, Nov 21, 2014 at 2:54 PM, Hector Palacios
<hector.palacios@digi.com> wrote:
> The write operation may fail when trying to write to a locked area. In
> this case the ERROR bit is set in the CTRL register. Check for that
> condition and return an error.
>
> Signed-off-by: Hector Palacios <hector.palacios@digi.com>

Reviewed-by: Fabio Estevam <fabio.estevam@freescale.com>
Stefano Babic Dec. 1, 2014, 9:35 a.m. UTC | #6
On 21/11/2014 17:54, Hector Palacios wrote:
> The write operation may fail when trying to write to a locked area. In
> this case the ERROR bit is set in the CTRL register. Check for that
> condition and return an error.
> 
> Signed-off-by: Hector Palacios <hector.palacios@digi.com>
> ---
>  drivers/misc/mxs_ocotp.c | 7 +++++++
>  1 file changed, 7 insertions(+)
> 
> diff --git a/drivers/misc/mxs_ocotp.c b/drivers/misc/mxs_ocotp.c
> index 09002814f2f0..1659ee6a5eec 100644
> --- a/drivers/misc/mxs_ocotp.c
> +++ b/drivers/misc/mxs_ocotp.c
> @@ -221,6 +221,13 @@ static int mxs_ocotp_write_fuse(uint32_t addr, uint32_t mask)
>  		goto fail;
>  	}
>  
> +	/* Check for errors */
> +	if (readl(&ocotp_regs->hw_ocotp_ctrl) & OCOTP_CTRL_ERROR) {
> +		puts("Failed writing fuses!\n");
> +		ret = -EPERM;
> +		goto fail;
> +	}
> +
>  fail:
>  	mxs_ocotp_scale_vddio(0, &vddio_val);
>  	if (mxs_ocotp_scale_hclk(0, &hclk_val))
> 

Applied to u-boot-imx, thanks !

Best regards,
Stefano Babic
diff mbox

Patch

diff --git a/drivers/misc/mxs_ocotp.c b/drivers/misc/mxs_ocotp.c
index 09002814f2f0..1659ee6a5eec 100644
--- a/drivers/misc/mxs_ocotp.c
+++ b/drivers/misc/mxs_ocotp.c
@@ -221,6 +221,13 @@  static int mxs_ocotp_write_fuse(uint32_t addr, uint32_t mask)
 		goto fail;
 	}
 
+	/* Check for errors */
+	if (readl(&ocotp_regs->hw_ocotp_ctrl) & OCOTP_CTRL_ERROR) {
+		puts("Failed writing fuses!\n");
+		ret = -EPERM;
+		goto fail;
+	}
+
 fail:
 	mxs_ocotp_scale_vddio(0, &vddio_val);
 	if (mxs_ocotp_scale_hclk(0, &hclk_val))