public inbox for u-boot@lists.denx.de
 help / color / mirror / Atom feed
From: Sinan Akman <sinan@writeme.com>
To: u-boot@lists.denx.de
Subject: [U-Boot] ls1021atwr reset issue (was [ANN] U-Boot v2015.10-rc4 released)
Date: Thu, 1 Oct 2015 11:19:33 -0400	[thread overview]
Message-ID: <560D4F05.5030901@writeme.com> (raw)
In-Reply-To: <CAOMZO5DrXwXc4KBUKTu-Yqgo4SKGi2vUy4S_tSbuYpVOCL1gLQ@mail.gmail.com>


   Hi Fabio

On 30/09/15 03:03 PM, Fabio Estevam wrote:
>> [...]
>> Ok, the issue is due to endianness: on LS1021 the watchdog is
>> big-endian, so that's why we can't use clrsetbits_le16().
>>
>> Please check:
>> http://git.freescale.com/git/cgit.cgi/layerscape/ls1021a/linux.git/commit/?id=b53a344d20f6ffdc383d990a9636efb53ce272a9
>>
>> What about this?
>>
>> --- a/drivers/watchdog/imx_watchdog.c
>> +++ b/drivers/watchdog/imx_watchdog.c
>> @@ -54,8 +54,11 @@ void hw_watchdog_init(void)
>>   void reset_cpu(ulong addr)
>>   {
>>          struct watchdog_regs *wdog = (struct watchdog_regs *)WDOG1_BASE_ADDR;
>> +       int reg;
> ops, this should be u16 instead.
>
>> -       clrsetbits_le16(&wdog->wcr, 0, WCR_WDE);
>> +       reg = readw(&wdog->wcr);
>> +       reg |= WCR_WDE;
>> +       writew(reg, &wdog->wcr);
>>
>>          writew(0x5555, &wdog->wsr);
>>          writew(0xaaaa, &wdog->wsr);     /* load minimum 1/2 second timeout */

   I took a further look at this. I believe this won't work as readw
will now return the data in the wrong endianness. I think Wolfgang
also already pointed out at this. We would need to use the macro with
correct endianness for different platforms (ls1021atwr would need
big endian) and control this based on the watchdog endian setting in dts.

   However, there seems to be other problems here. The original
fix was intending to preserve the current set bits in wcr and
enable DTE. But in the case of ls1021atwr, the watcdog is not
initialized and out of reset we have SRS bit is set. This would
disable wdog_rst and prevent reset from working. Before the
fix it was actually the accidental setting of SRS to zero made
the reset working because a writew(WCR_WDE, &wdog->wcr)
would clear that bit, setting WDE alone would not generate wdog_rst.

   So I believe a proper fix would have the following steps :
   - move watchdog driver to DM so that we can make use of endian type
   - use macros with the endian type for accessing the registers
   - enable hw_watchdog for the board so that it gets initialized to
a known value
   - reset SRS to enable generation of wdog_rst, this will reset immediately
with 0x00 default WT value.
   - or program the timeout and enable WDE so the board
resets after a longer timeout value if desired

   Does this make sense to everyone ?

   Regards
   Sinan Akman

  parent reply	other threads:[~2015-10-01 15:19 UTC|newest]

Thread overview: 23+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2015-09-28 21:09 [U-Boot] [ANN] U-Boot v2015.10-rc4 released Tom Rini
2015-09-29  6:41 ` Wolfgang Denk
2015-09-29 15:35 ` Lukasz Majewski
2015-09-30 16:47 ` Sinan Akman
2015-09-30 17:16   ` York Sun
2015-09-30 17:22     ` Sinan Akman
2015-09-30 18:02       ` Sinan Akman
2015-09-30 18:16         ` Fabio Estevam
2015-09-30 18:33           ` Sinan Akman
2015-09-30 18:56             ` Fabio Estevam
2015-09-30 19:03               ` Fabio Estevam
2015-09-30 19:09                 ` Sinan Akman
2015-09-30 19:13                   ` Fabio Estevam
2015-10-01 15:19                 ` Sinan Akman [this message]
2015-10-01 19:09                   ` [U-Boot] ls1021atwr reset issue (was [ANN] U-Boot v2015.10-rc4 released) Fabio Estevam
2015-10-01 19:14                     ` Tom Rini
2015-10-01 19:17                       ` Otavio Salvador
2015-10-01 19:33                         ` Sinan Akman
2015-10-01 19:38                           ` Fabio Estevam
2015-10-01 19:41                             ` Sinan Akman
2015-10-01 19:28                       ` Sinan Akman
2015-10-01 19:36                         ` Fabio Estevam
2015-10-01 14:22               ` [U-Boot] [ANN] U-Boot v2015.10-rc4 released Wolfgang Denk

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=560D4F05.5030901@writeme.com \
    --to=sinan@writeme.com \
    --cc=u-boot@lists.denx.de \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox