2008-07-05 10:02:56 +02:00
/*
* Copyright ( C ) 1999 ARM Limited
* Copyright ( C ) 2000 Deep Blue Solutions Ltd
* Copyright 2006 - 2007 Freescale Semiconductor , Inc . All Rights Reserved .
* Copyright 2008 Juergen Beisert , kernel @ pengutronix . de
2009-03-03 02:49:23 +03:00
* Copyright 2009 Ilya Yanok , Emcraft Systems Ltd , yanok @ emcraft . com
2008-07-05 10:02:56 +02:00
*
* 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 .
*/
# include <linux/kernel.h>
# include <linux/clk.h>
# include <linux/io.h>
2009-03-03 02:49:23 +03:00
# include <linux/err.h>
# include <linux/delay.h>
2011-10-08 17:16:49 +02:00
# include <linux/module.h>
2008-07-05 10:02:56 +02:00
2008-08-05 16:14:15 +01:00
# include <mach/hardware.h>
2009-07-31 20:29:22 +09:00
# include <mach/common.h>
2012-03-28 18:30:01 +01:00
# include <asm/system_misc.h>
2008-07-05 10:02:56 +02:00
# include <asm/proc-fns.h>
2010-10-27 14:40:55 +02:00
# include <asm/mach-types.h>
2008-07-05 10:02:56 +02:00
2011-09-28 17:16:07 +08:00
void __iomem * ( * imx_ioremap ) ( unsigned long , size_t , unsigned int ) = NULL ;
2011-10-08 17:16:49 +02:00
EXPORT_SYMBOL_GPL ( imx_ioremap ) ;
2011-09-28 17:16:06 +08:00
2009-06-04 12:19:02 +02:00
static void __iomem * wdog_base ;
2008-07-05 10:02:56 +02:00
/*
* Reset the system . It is called by machine_restart ( ) .
*/
2011-11-06 17:12:08 +00:00
void mxc_restart ( char mode , const char * cmd )
2008-07-05 10:02:56 +02:00
{
2009-06-04 12:19:02 +02:00
unsigned int wcr_enable ;
if ( cpu_is_mx1 ( ) ) {
wcr_enable = ( 1 < < 0 ) ;
} else {
2009-03-03 02:49:23 +03:00
struct clk * clk ;
2008-07-05 10:02:56 +02:00
2010-12-07 14:16:04 -02:00
clk = clk_get_sys ( " imx2-wdt.0 " , NULL ) ;
2009-03-03 02:49:23 +03:00
if ( ! IS_ERR ( clk ) )
2011-11-15 14:48:01 +08:00
clk_prepare_enable ( clk ) ;
2009-06-04 12:19:02 +02:00
wcr_enable = ( 1 < < 2 ) ;
2008-07-05 10:02:56 +02:00
}
/* Assert SRS signal */
2009-06-04 12:19:02 +02:00
__raw_writew ( wcr_enable , wdog_base ) ;
2009-03-03 02:49:23 +03:00
/* wait for reset to assert... */
mdelay ( 500 ) ;
printk ( KERN_ERR " Watchdog reset failed to assert reset \n " ) ;
/* delay to allow the serial port to show the message */
mdelay ( 50 ) ;
/* we'll take a jump through zero as a poor second */
2011-11-01 13:16:26 +00:00
soft_restart ( 0 ) ;
2008-07-05 10:02:56 +02:00
}
2009-06-04 12:19:02 +02:00
void mxc_arch_reset_init ( void __iomem * base )
{
wdog_base = base ;
}