All of lore.kernel.org
 help / color / mirror / Atom feed
* [U-Boot] [PATCH v4] ftwdt010_wdt: support faraday ftwdt010 watchdog
@ 2011-01-26 10:46 Macpaul Lin
  2011-04-11 20:48 ` Wolfgang Denk
  0 siblings, 1 reply; 4+ messages in thread
From: Macpaul Lin @ 2011-01-26 10:46 UTC (permalink / raw)
  To: u-boot

Faraday ftwdt010 watchdog is an architecture independant
watchdog. It is usaually used in SoC chip design.

Signed-off-by: Macpaul Lin <macpaul@andestech.com>
---
 Change v2:
   Fix the wrong title of ftwdt010_wdt patch.
 Change v3:
   Patch v2 was encoded in utf-8. Fixed to ASCII.
 Change v4:
   Replace the copyright statement "origin: Linux kernel" because the Linux
   driver haven't commit into kernel yet.

 drivers/watchdog/Makefile       |    1 +
 drivers/watchdog/ftwdt010_wdt.c |  102 ++++++++++++++++++++++++++++++++++++++
 drivers/watchdog/ftwdt010_wdt.h |  103 +++++++++++++++++++++++++++++++++++++++
 3 files changed, 206 insertions(+), 0 deletions(-)
 create mode 100644 drivers/watchdog/ftwdt010_wdt.c
 create mode 100644 drivers/watchdog/ftwdt010_wdt.h

diff --git a/drivers/watchdog/Makefile b/drivers/watchdog/Makefile
index 6ab4d52..5579bf2 100644
--- a/drivers/watchdog/Makefile
+++ b/drivers/watchdog/Makefile
@@ -26,6 +26,7 @@ include $(TOPDIR)/config.mk
 LIB	:= $(obj)libwatchdog.o
 
 COBJS-$(CONFIG_AT91SAM9_WATCHDOG) += at91sam9_wdt.o
+COBJS-$(CONFIG_FTWDT010_WATCHDOG) += ftwdt010_wdt.o
 
 COBJS	:= $(COBJS-y)
 SRCS	:= $(COBJS:.o=.c)
diff --git a/drivers/watchdog/ftwdt010_wdt.c b/drivers/watchdog/ftwdt010_wdt.c
new file mode 100644
index 0000000..6e0617b
--- /dev/null
+++ b/drivers/watchdog/ftwdt010_wdt.c
@@ -0,0 +1,102 @@
+/*
+ * Watchdog driver for the FTWDT010 Watch Dog Driver
+ *
+ * (c) Copyright 2004 Faraday Technology Corp. (www.faraday-tech.com)
+ * Based on sa1100_wdt.c by Oleg Drokin <green@crimea.edu>
+ * Based on SoftDog driver by Alan Cox <alan@redhat.com>
+ *
+ * Copyright (C) 2011 Andes Technology Corporation
+ * Macpaul Lin, Andes Technology Corporation <macpaul@andestech.com>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ *
+ * 27/11/2004 Initial release, Faraday.
+ * 12/01/2011 Port to u-boot, Macpaul Lin.
+ */
+
+#include <common.h>
+#include <watchdog.h>
+#include <asm/io.h>
+#include "ftwdt010_wdt.h"
+
+/*
+ * Set the watchdog time interval.
+ * Counter is 32 bit.
+ */
+static int ftwdt010_wdt_settimeout(unsigned int timeout)
+{
+	unsigned int reg;
+
+	struct ftwdt010_wdt *wd = (struct ftwdt010_wdt *)CONFIG_FTWDT010_BASE;
+
+	debug("Activating WDT..\n");
+
+	/* Check if disabled */
+	if (readl(&wd->wdcr) & ~FTWDT010_WDCR_ENABLE) {
+		printf("sorry, watchdog is disabled\n");
+		return -1;
+	}
+
+	/*
+	 * In a 66MHz system,
+	 * if you set WDLOAD as 0x03EF1480 (66000000)
+	 * the reset timer is 1 second.
+	 */
+	reg = FTWDT010_WDLOAD(timeout * FTWDT010_TIMEOUT_FACTOR);
+
+	writel(reg, &wd->wdload);
+
+	return 0;
+}
+
+void ftwdt010_wdt_reset()
+{
+	struct ftwdt010_wdt *wd = (struct ftwdt010_wdt *)CONFIG_FTWDT010_BASE;
+
+	/* clear control register */
+	writel(0, &wd->wdcr);
+
+	/* Write Magic number */
+	writel(FTWDT010_WDRESTART_MAGIC, &wd->wdrestart);
+
+	/* Enable WDT */
+	writel((FTWDT010_WDCR_RST | FTWDT010_WDCR_ENABLE), &wd->wdcr);
+}
+
+void ftwdt010_wdt_disable()
+{
+	struct ftwdt010_wdt *wd = (struct ftwdt010_wdt *)CONFIG_FTWDT010_BASE;
+
+	debug("Deactivating WDT..\n");
+
+	/*
+	 * It was defined with CONFIG_WATCHDOG_NOWAYOUT in Linux
+	 *
+	 * Shut off the timer.
+	 * Lock it in if it's a module and we defined ...NOWAYOUT
+	 */
+	writel(0, &wd->wdcr);
+}
+
+void hw_watchdog_reset()
+{
+	ftwdt010_wdt_reset();
+}
+
+void hw_watchdog_init(void)
+{
+	/* set timer in ms */
+	ftwdt010_wdt_settimeout(CONFIG_FTWDT010_HW_TIMEOUT * 1000);
+}
diff --git a/drivers/watchdog/ftwdt010_wdt.h b/drivers/watchdog/ftwdt010_wdt.h
new file mode 100644
index 0000000..4f12d47
--- /dev/null
+++ b/drivers/watchdog/ftwdt010_wdt.h
@@ -0,0 +1,103 @@
+/*
+ * Watchdog driver for the FTWDT010 Watch Dog Driver
+ *
+ * (c) Copyright 2004 Faraday Technology Corp. (www.faraday-tech.com)
+ * Based on sa1100_wdt.c by Oleg Drokin <green@crimea.edu>
+ * Based on SoftDog driver by Alan Cox <alan@redhat.com>
+ *
+ * Copyright (C) 2011 Andes Technology Corporation
+ * Macpaul Lin, Andes Technology Corporation <macpaul@andestech.com>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ *
+ * 27/11/2004 Initial release, Faraday.
+ * 12/01/2011 Port to u-boot, Macpaul Lin.
+ */
+
+#ifndef __FTWDT010_H
+#define __FTWDT010_H
+
+struct ftwdt010_wdt {
+	unsigned int	wdcounter;	/* Counter Reg		- 0x00 */
+	unsigned int	wdload;		/* Counter Auto Reload Reg - 0x04 */
+	unsigned int	wdrestart;	/* Counter Restart Reg	- 0x08 */
+	unsigned int	wdcr;		/* Control Reg		- 0x0c */
+	unsigned int	wdstatus;	/* Status Reg		- 0x10 */
+	unsigned int	wdclear;	/* Timer Clear 		- 0x14 */
+	unsigned int	wdintrlen;	/* Interrupt Length	- 0x18 */
+};
+
+/*
+ * WDLOAD - Counter Auto Reload Register
+ *   The Auto Reload Register is set to 0x03EF1480 (66Mhz) by default.
+ *   Which means in a 66MHz system, the period of Watch Dog timer reset is
+ *   one second.
+ */
+#define FTWDT010_WDLOAD(x)		((x) & 0xffffffff)
+
+/*
+ * WDRESTART - Watch Dog Timer Counter Restart Register
+ *   If writing 0x5AB9 to WDRESTART register, Watch Dog timer will
+ *   automatically reload WDLOAD to WDCOUNTER and restart counting.
+ */
+#define FTWDT010_WDRESTART_MAGIC	0x5AB9
+
+/* WDCR - Watch Dog Timer Control Register */
+#define FTWDT010_WDCR_ENABLE		(1 << 0)
+#define FTWDT010_WDCR_RST		(1 << 1)
+#define FTWDT010_WDCR_INTR		(1 << 2)
+/* FTWDT010_WDCR_EXT bit: Watch Dog Timer External Signal Enable */
+#define FTWDT010_WDCR_EXT		(1 << 3)
+/* FTWDT010_WDCR_CLOCK bit: Clock Source: 0: PCLK, 1: EXTCLK.
+ *  The clock source PCLK cannot be gated when system sleeps, even if
+ *  WDCLOCK bit is turned on.
+ *
+ *  Faraday's Watch Dog timer can be driven by an external clock. The
+ *  programmer just needs to write one to WdCR[WdClock] bit.
+ *
+ *  Note: There is a limitation between EXTCLK and PCLK:
+ *  EXTCLK cycle time / PCLK cycle time > 2.
+ *  If the system does not need an external clock,
+ *  just keep WdCR[WdClock] bit in its default value.
+ */
+#define FTWDT010_WDCR_CLOCK		(1 << 4)
+
+/*
+ * WDSTATUS - Watch Dog Timer Status Register
+ *   This bit is set when the counter reaches Zero
+ */
+#define FTWDT010_WDSTATUS(x)		((x) & 0x1)
+
+/*
+ * WDCLEAR - Watch Dog Timer Clear Register
+ *   Writing one to this register will clear WDSTATUS.
+ */
+#define FTWDT010_WDCLEAR		(1 << 0)
+
+/*
+ * WDINTRLEN - Watch Dog Timer Interrupt Length
+ *   This register controls the duration length of wd_rst, wd_intr and wd_ext.
+ *   The default value is 0xFF.
+ */
+#define FTWDT010_WDINTRLEN(x)		((x) & 0xff)
+
+/*
+ * Variable timeout should be set in ms.
+ * (CONFIG_SYS_CLK_FREQ/1000) equals 1 ms.
+ * WDLOAD = timeout * TIMEOUT_FACTOR.
+ */
+#define FTWDT010_TIMEOUT_FACTOR		(CONFIG_SYS_CLK_FREQ / 1000) /* 1 ms */
+
+#endif /* __FTWDT010_H */
-- 
1.7.3.5

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

* [U-Boot] [PATCH v4] ftwdt010_wdt: support faraday ftwdt010 watchdog
  2011-01-26 10:46 [U-Boot] [PATCH v4] ftwdt010_wdt: support faraday ftwdt010 watchdog Macpaul Lin
@ 2011-04-11 20:48 ` Wolfgang Denk
  2011-04-12  4:56   ` Macpaul Lin
  0 siblings, 1 reply; 4+ messages in thread
From: Wolfgang Denk @ 2011-04-11 20:48 UTC (permalink / raw)
  To: u-boot

Dear Macpaul Lin,

In message <1296038788-12702-1-git-send-email-macpaul@andestech.com> you wrote:
> Faraday ftwdt010 watchdog is an architecture independant
> watchdog. It is usaually used in SoC chip design.
> 
> Signed-off-by: Macpaul Lin <macpaul@andestech.com>
> ---
>  Change v2:
>    Fix the wrong title of ftwdt010_wdt patch.
>  Change v3:
>    Patch v2 was encoded in utf-8. Fixed to ASCII.
>  Change v4:
>    Replace the copyright statement "origin: Linux kernel" because the Linux
>    driver haven't commit into kernel yet.
> 
>  drivers/watchdog/Makefile       |    1 +
>  drivers/watchdog/ftwdt010_wdt.c |  102 ++++++++++++++++++++++++++++++++++++++
>  drivers/watchdog/ftwdt010_wdt.h |  103 +++++++++++++++++++++++++++++++++++++++
>  3 files changed, 206 insertions(+), 0 deletions(-)
>  create mode 100644 drivers/watchdog/ftwdt010_wdt.c
>  create mode 100644 drivers/watchdog/ftwdt010_wdt.h

Applied, after fixing the typo "usaually" in the commit message and
cleaning up the checkpatch warning:

WARNING: please, no space before tabs
#224: FILE: drivers/watchdog/ftwdt010_wdt.h:38:
+^Iunsigned int^Iwdclear;^I/* Timer Clear ^I^I- 0x14 */$


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
No one is fit to be trusted with power. ... No one. ... Any  man  who
has lived at all knows the follies and wickedness he's capabel of ...
And  if  he  does  know it, he knows also that neither he nor any man
ought to be allowed to decide a single human fate.
- C. P. Snow,  The Light and the Dark

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

* [U-Boot] [PATCH v4] ftwdt010_wdt: support faraday ftwdt010 watchdog
  2011-04-11 20:48 ` Wolfgang Denk
@ 2011-04-12  4:56   ` Macpaul Lin
  2011-04-12 19:53     ` Wolfgang Denk
  0 siblings, 1 reply; 4+ messages in thread
From: Macpaul Lin @ 2011-04-12  4:56 UTC (permalink / raw)
  To: u-boot

Hi Wolfgang

2011/4/12 Wolfgang Denk <wd@denx.de>:
> Dear Macpaul Lin,
>
> In message <1296038788-12702-1-git-send-email-macpaul@andestech.com> you wrote:
>> Faraday ftwdt010 watchdog is an architecture independant
>> watchdog. It is usaually used in SoC chip design.
>>
>> Signed-off-by: Macpaul Lin <macpaul@andestech.com>
>> ---
>> ?Change v2:
>> ? ?Fix the wrong title of ftwdt010_wdt patch.
>> ?Change v3:
>> ? ?Patch v2 was encoded in utf-8. Fixed to ASCII.
>> ?Change v4:
>> ? ?Replace the copyright statement "origin: Linux kernel" because the Linux
>> ? ?driver haven't commit into kernel yet.

Thanks for your patience for reviewing and fixing up the code.

However, the latest version of this watchdog ftwdt010_wdt is v6.
http://patchwork.ozlabs.org/patch/88164/

Since you have already applied and fix patch v4, I'll mark patch v6 as
superseded and
send the diff between patch v4 and patch v6 as an "enhancement" patch
of ftwdt010_wdt.c later.

The differ between v4 and v6 are
    1. Move header to include/faraday
    2. Fix include path in ftwdt010_wdt.c
    3. Fix function prototype and declaration to
      - ftwdt010_wdt_settimeout
      - ftwdt010_wdt_reset
      - ftwdt010_wdt_disable
    4. Add "#if definde (CONFIG_HW_WATCHDOG)" let user have flexibilty
      to choose which better to his product.

Sorry for the bothering.

Thanks.


-- 
Best regards,
Macpaul Lin

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

* [U-Boot] [PATCH v4] ftwdt010_wdt: support faraday ftwdt010 watchdog
  2011-04-12  4:56   ` Macpaul Lin
@ 2011-04-12 19:53     ` Wolfgang Denk
  0 siblings, 0 replies; 4+ messages in thread
From: Wolfgang Denk @ 2011-04-12 19:53 UTC (permalink / raw)
  To: u-boot

Dear Macpaul Lin,

In message <BANLkTikBWMH5JF1Osn9DvS+CSFE834vQFQ@mail.gmail.com> you wrote:
> 
> Thanks for your patience for reviewing and fixing up the code.
> 
> However, the latest version of this watchdog ftwdt010_wdt is v6.
> http://patchwork.ozlabs.org/patch/88164/

Sorry for missing this - note that it would have helped a lot of you
hat kept proper thread information in your followup patches (see
bullet # 3 in
http://www.denx.de/wiki/view/U-Boot/Patches#Sending_updated_patch_versions)

> Since you have already applied and fix patch v4, I'll mark patch v6 as
> superseded and
> send the diff between patch v4 and patch v6 as an "enhancement" patch
> of ftwdt010_wdt.c later.

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
Death. Destruction. Disease. Horror. That's what war  is  all  about.
That's what makes it a thing to be avoided.
	-- Kirk, "A Taste of Armageddon", stardate 3193.0

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

end of thread, other threads:[~2011-04-12 19:53 UTC | newest]

Thread overview: 4+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2011-01-26 10:46 [U-Boot] [PATCH v4] ftwdt010_wdt: support faraday ftwdt010 watchdog Macpaul Lin
2011-04-11 20:48 ` Wolfgang Denk
2011-04-12  4:56   ` Macpaul Lin
2011-04-12 19:53     ` Wolfgang Denk

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.