[U-Boot] [PATCH v2][repost] arm: Kirkwood: add SYSRSTn Duration Counter Support
Wolfgang Denk
wd at denx.de
Wed Aug 19 09:20:07 CEST 2009
Dear Prafulla Wadaskar,
In message <1250679240-17557-1-git-send-email-prafulla at marvell.com> you wrote:
> I am sorry for previous post v2, pls ignore it, this is the right patch for the same
This comment does not belong to the commit message. Please move below
the "---" line.
> This feature can be used to trigger special command "sysrstcmd" using
> reset key long press event and environment variable "sysrstdelay" is set
> (useful for reset to factory or manufacturing mode execution)
>
> Kirkwood SoC implements a hardware-based SYSRSTn duration counter.
> When SYSRSTn is asserted low, a SYSRSTn duration counter is running.
> The counter value is stored in the SYSRSTn Length Counter Register
> The counter is based on the 25-MHz reference clock (40ns)
> It is a 29-bit counter, yielding a maximum counting duration of
> 2^29/25 MHz (21.4 seconds). When the counter reach its maximum value,
> it remains at this value until counter reset is triggered by setting
> bit 31 of KW_REG_SYSRST_CNT
>
> Implementation:
> Upon long reset assertion (> ${sysrstdleay} in secs) sysrstcmd will be
That's a typo, it's "sysrstdelay", right? Please fix while we are at
it.
> +static void kw_sysrst_action(void)
> +{
> + int ret;
> + char *s = getenv("sysrstcmd");
> +
> + if (!s) {
> + printf("Error.. %s failed, check sysrstcmd\n",
> + __FUNCTION__);
> + return;
Why is this considered an error? I think it is perfectly legal to not
define this environment variable. For example, it is also no error to
set "bootdelay" and not define "bootcmd". I think we should implement
consistent behaviour.
> + }
> +
> + printf("Starting %s process...\n", __FUNCTION__);
This should be a debug(), I think. Don't produce too much output.
> + if (ret < 0)
> + printf("Error.. %s failed\n", __FUNCTION__);
> + else
> + printf("%s process finished\n", __FUNCTION__);
Ditto - please turn into debug().
> +
> +static void kw_sysrst_check(void)
> +{
> + u32 sysrst_cnt, sysrst_dly;
> + char *s;
> +
> + /*
> + * no action if sysrstdelay environment variable is not defined
> + */
> + s = getenv("sysrstdelay");
> + if (s == NULL)
> + return;
> +
> + /* read sysrstdelay value */
> + sysrst_dly = (u32) simple_strtoul(s, NULL, 10);
> +
> + /* read SysRst Length counter register (bits 28:0) */
> + sysrst_cnt = (0x1fffffff & readl(KW_REG_SYSRST_CNT));
> + printf("H/w Rst hold time: %d.%d secs\n",
> + sysrst_cnt / SYSRST_CNT_1SEC_VAL,
> + sysrst_cnt % SYSRST_CNT_1SEC_VAL);
This should be debvug(), too ?
Thanks.
Best regards,
Wolfgang Denk
--
DENX Software Engineering GmbH, MD: Wolfgang Denk & Detlev Zundel
HRB 165235 Munich, Office: Kirchenstr.5, D-82194 Groebenzell, Germany
Phone: (+49)-8142-66989-10 Fax: (+49)-8142-66989-80 Email: wd at denx.de
If a person (a) is poorly, (b) receives treatment intended to make
him better, and (c) gets better, then no power of reasoning known to
medical science can convince him that it may not have been the
treatment that restored his health.
- Sir Peter Medawar, The Art of the Soluble
More information about the U-Boot
mailing list