From: u.kleine-koenig@pengutronix.de (Uwe Kleine-König)
To: linux-arm-kernel@lists.infradead.org
Subject: [PATCH 03/11] ARM: imx: Add reset routine for i.MX28
Date: Mon, 15 Nov 2010 17:36:46 +0100 [thread overview]
Message-ID: <20101115163646.GK8942@pengutronix.de> (raw)
In-Reply-To: <1289831795-4373-4-git-send-email-shawn.guo@freescale.com>
On Mon, Nov 15, 2010 at 10:36:27PM +0800, Shawn Guo wrote:
> 1. The wdog reset is implemented in RTC block on MX28.
> 2. Implement the common reset routine for most blocks on MX28,
> so that the blocks can call it to get a software reset.
>
> Signed-off-by: Shawn Guo <shawn.guo@freescale.com>
> ---
> arch/arm/plat-mxc/system.c | 104 ++++++++++++++++++++++++++++++++++++++++++-
> 1 files changed, 101 insertions(+), 3 deletions(-)
>
> diff --git a/arch/arm/plat-mxc/system.c b/arch/arm/plat-mxc/system.c
> index c3972c5..257b426 100644
> --- a/arch/arm/plat-mxc/system.c
> +++ b/arch/arm/plat-mxc/system.c
> @@ -1,7 +1,7 @@
> /*
> * Copyright (C) 1999 ARM Limited
> * Copyright (C) 2000 Deep Blue Solutions Ltd
> - * Copyright 2006-2007 Freescale Semiconductor, Inc. All Rights Reserved.
> + * Copyright 2006-2010 Freescale Semiconductor, Inc. All Rights Reserved.
> * Copyright 2008 Juergen Beisert, kernel at pengutronix.de
> * Copyright 2009 Ilya Yanok, Emcraft Systems Ltd, yanok at emcraft.com
> *
> @@ -36,6 +36,7 @@ static void __iomem *wdog_base;
> void arch_reset(char mode, const char *cmd)
> {
> unsigned int wcr_enable;
> + struct clk *clk;
>
> #ifdef CONFIG_ARCH_MXC91231
> if (cpu_is_mxc91231()) {
> @@ -52,9 +53,18 @@ void arch_reset(char mode, const char *cmd)
>
> if (cpu_is_mx1()) {
> wcr_enable = (1 << 0);
> - } else {
> - struct clk *clk;
> + } else if (cpu_is_mx28()) {
> + clk = clk_get_sys("rtc", NULL);
> + if (!IS_ERR(clk))
> + clk_enable(clk);
>
> + /* set wdog count */
> + __raw_writel(1, wdog_base + 0x50);
> + /* wdog enbable bit */
s/enbable/enable/
> + wcr_enable = (1 << 4);
> + /* shift to SET address */
> + wdog_base += 0x4;
> + } else {
> clk = clk_get_sys("imx-wdt.0", NULL);
> if (!IS_ERR(clk))
> clk_enable(clk);
> @@ -80,3 +90,91 @@ void mxc_arch_reset_init(void __iomem *base)
> {
> wdog_base = base;
> }
> +
> +#ifdef CONFIG_ARCH_MX28
> +int mxc_reset_block(void __iomem *reg_addr)
> +{
> + u32 reg;
> + int timeout;
> +
> + /*
> + * The process of software reset of IP block is done
> + * in several steps:
> + *
> + * 1) clear SFTRST and wait it cleared;
> + * 2) clear CLKGATE, set SFTRST, wait CLKGATE set;
> + * 3) clear SFTRST and wait it cleared;
> + * 4) clear CLKGATE and wait it cleared.
> + */
> +
> + /* Clear SFTRST */
> + reg = __raw_readl(reg_addr);
> + reg &= ~(1 << 31);
> + __raw_writel(reg, reg_addr);
> + /* Wait SFTRST cleared */
> + timeout = 1000;
> + do {
> + mdelay(1);
> + if ((__raw_readl(reg_addr) & (1 << 31)) == 0)
> + break;
> + } while (--timeout > 0);
Does the mdelay make sence here?
> + if (timeout <= 0) {
> + pr_err("%s(%p): clear SFTRST timeout\n", __func__, reg_addr);
> + return -ETIMEDOUT;
> + }
> +
> + /* Clear CLKGATE */
> + reg = __raw_readl(reg_addr);
> + reg &= ~(1 << 30);
> + __raw_writel(reg, reg_addr);
> + /* Set SFTRST to reset the block */
> + reg = __raw_readl(reg_addr);
> + reg |= (1 << 31);
Can we have #defines here instead of constants?
> + __raw_writel(reg, reg_addr);
> + /* Poll CLKGATE set */
> + timeout = 1000;
> + do {
> + mdelay(1);
> + if (__raw_readl(reg_addr) & (1 << 30))
> + break;
> + } while (--timeout > 0);
> + if (timeout <= 0) {
> + pr_err("%s(%p): poll CLKGATE timeout\n", __func__, reg_addr);
> + return -ETIMEDOUT;
> + }
> +
> + /* Clear SFTRST */
> + reg = __raw_readl(reg_addr);
> + reg &= ~(1 << 31);
> + __raw_writel(reg, reg_addr);
> + /* Wait SFTRST cleared */
> + timeout = 1000;
> + do {
> + mdelay(1);
> + if ((__raw_readl(reg_addr) & (1 << 31)) == 0)
> + break;
> + } while (--timeout > 0);
> + if (timeout <= 0) {
> + pr_err("%s(%p): clear SFTRST timeout\n", __func__, reg_addr);
> + return -ETIMEDOUT;
> + }
> +
> + /* Clear CLKGATE */
> + reg = __raw_readl(reg_addr);
> + reg &= ~(1 << 30);
> + __raw_writel(reg, reg_addr);
> + /* Wait CLKGATE cleared */
> + timeout = 1000;
> + do {
> + mdelay(1);
> + if ((__raw_readl(reg_addr) & (1 << 30)) == 0)
> + break;
> + } while (--timeout > 0);
> + if (timeout <= 0) {
> + pr_err("%s(%p): clear CLKGATE timeout\n", __func__, reg_addr);
> + return -ETIMEDOUT;
> + }
> +
> + return 0;
> +}
> +#endif
> --
> 1.7.1
>
>
>
--
Pengutronix e.K. | Uwe Kleine-K?nig |
Industrial Linux Solutions | http://www.pengutronix.de/ |
next prev parent reply other threads:[~2010-11-15 16:36 UTC|newest]
Thread overview: 28+ messages / expand[flat|nested] mbox.gz Atom feed top
2010-11-15 14:36 [RFC][PATCH 00/11] ARM: imx: Add initial i.MX28 support Shawn Guo
2010-11-15 14:36 ` [PATCH 01/11] ARM: imx: Add basic definitions for i.MX28 Shawn Guo
2010-11-15 16:25 ` Uwe Kleine-König
2010-11-15 14:36 ` [PATCH 02/11] ARM: imx: Add support of interrupt controller ICOLL Shawn Guo
2010-11-15 16:33 ` Uwe Kleine-König
2010-11-15 14:36 ` [PATCH 03/11] ARM: imx: Add reset routine for i.MX28 Shawn Guo
2010-11-15 16:36 ` Uwe Kleine-König [this message]
2010-11-17 11:17 ` Shawn Guo
2010-11-17 13:44 ` Uwe Kleine-König
2010-11-15 14:36 ` [PATCH 04/11] ARM: imx: Add timer support " Shawn Guo
2010-11-15 16:40 ` Uwe Kleine-König
2010-11-15 14:36 ` [PATCH 05/11] ARM: imx: Add GPIO " Shawn Guo
2010-11-15 16:43 ` Uwe Kleine-König
2010-11-15 14:36 ` [PATCH 06/11] ARM: imx: Add IOMUX " Shawn Guo
2010-11-15 16:46 ` Uwe Kleine-König
2010-11-15 14:36 ` [PATCH 07/11] ARM: imx: Add support of uncompress print " Shawn Guo
2010-11-15 16:47 ` Uwe Kleine-König
2010-11-15 14:36 ` [PATCH 08/11] ARM: imx: Add clock support " Shawn Guo
2010-11-15 14:36 ` [PATCH 09/11] ARM: imx: Add memory map " Shawn Guo
2010-11-15 14:36 ` [PATCH 10/11] ARM: imx: Add initial support of machine mx28evk Shawn Guo
2010-11-15 16:54 ` Uwe Kleine-König
2010-11-15 14:36 ` [PATCH 11/11] ARM: imx: Add i.MX28 support into Kconfig and Makefile Shawn Guo
2010-11-15 17:01 ` Uwe Kleine-König
2010-11-16 10:15 ` [RFC][PATCH 00/11] ARM: imx: Add initial i.MX28 support Sascha Hauer
2010-11-16 12:42 ` Shawn Guo
2010-11-16 17:24 ` Uwe Kleine-König
2010-11-17 1:28 ` Shawn Guo
2010-11-17 6:06 ` Uwe Kleine-König
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=20101115163646.GK8942@pengutronix.de \
--to=u.kleine-koenig@pengutronix.de \
--cc=linux-arm-kernel@lists.infradead.org \
/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 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.