2006-11-28 00:16:28 +03:00
/*
* Freescale Lite5200 board support
*
* Written by : Grant Likely < grant . likely @ secretlab . ca >
*
* Copyright ( C ) Secret Lab Technologies Ltd . 2006. All rights reserved .
* Copyright ( C ) Freescale Semicondutor , Inc . 2006. All rights reserved .
*
* Description :
* 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 .
*/
# undef DEBUG
# include <linux/stddef.h>
# include <linux/kernel.h>
# include <linux/init.h>
# include <linux/errno.h>
# include <linux/reboot.h>
# include <linux/pci.h>
# include <linux/kdev_t.h>
# include <linux/major.h>
# include <linux/console.h>
# include <linux/delay.h>
# include <linux/seq_file.h>
# include <linux/root_dev.h>
# include <linux/initrd.h>
# include <asm/system.h>
# include <asm/atomic.h>
# include <asm/time.h>
# include <asm/io.h>
# include <asm/machdep.h>
# include <asm/ipic.h>
# include <asm/irq.h>
# include <asm/prom.h>
# include <asm/udbg.h>
# include <sysdev/fsl_soc.h>
# include <asm/of_platform.h>
# include <asm/mpc52xx.h>
/* ************************************************************************
*
* Setup the architecture
*
*/
static void __init
2007-02-12 23:36:55 +03:00
lite5200_setup_cpu ( void )
2006-11-28 00:16:28 +03:00
{
struct mpc52xx_gpio __iomem * gpio ;
u32 port_config ;
/* Map zones */
2007-02-12 23:36:55 +03:00
gpio = mpc52xx_find_and_map ( " mpc5200-gpio " ) ;
2006-11-28 00:16:28 +03:00
if ( ! gpio ) {
printk ( KERN_ERR __FILE__ " : "
" Error while mapping GPIO register for port config. "
" Expect some abnormal behavior \n " ) ;
goto error ;
}
/* Set port config */
port_config = in_be32 ( & gpio - > port_config ) ;
port_config & = ~ 0x00800000 ; /* 48Mhz internal, pin is GPIO */
port_config & = ~ 0x00007000 ; /* USB port : Differential mode */
port_config | = 0x00001000 ; /* USB 1 only */
port_config & = ~ 0x03000000 ; /* ATA CS is on csb_4/5 */
port_config | = 0x01000000 ;
pr_debug ( " port_config: old:%x new:%x \n " ,
in_be32 ( & gpio - > port_config ) , port_config ) ;
out_be32 ( & gpio - > port_config , port_config ) ;
/* Unmap zone */
error :
iounmap ( gpio ) ;
}
2007-05-06 19:38:52 +04:00
# ifdef CONFIG_PM
static u32 descr_a ;
static void lite5200_suspend_prepare ( void __iomem * mbar )
{
u8 pin = 1 ; /* GPIO_WKUP_1 (GPIO_PSC2_4) */
u8 level = 0 ; /* wakeup on low level */
mpc52xx_set_wakeup_gpio ( pin , level ) ;
/*
* power down usb port
* this needs to be called before of - ohci suspend code
*/
descr_a = in_be32 ( mbar + 0x1048 ) ;
out_be32 ( mbar + 0x1048 , ( descr_a & ~ 0x200 ) | 0x100 ) ;
}
static void lite5200_resume_finish ( void __iomem * mbar )
{
out_be32 ( mbar + 0x1048 , descr_a ) ;
}
# endif
2007-02-12 23:36:55 +03:00
static void __init lite5200_setup_arch ( void )
2006-11-28 00:16:28 +03:00
{
2007-07-27 22:24:52 +04:00
# ifdef CONFIG_PCI
2006-11-28 00:16:28 +03:00
struct device_node * np ;
2007-07-27 22:24:52 +04:00
# endif
2006-11-28 00:16:28 +03:00
if ( ppc_md . progress )
2007-02-12 23:36:55 +03:00
ppc_md . progress ( " lite5200_setup_arch() " , 0 ) ;
2006-11-28 00:16:28 +03:00
/* CPU & Port mux setup */
mpc52xx_setup_cpu ( ) ; /* Generic */
2007-02-12 23:36:55 +03:00
lite5200_setup_cpu ( ) ; /* Platorm specific */
2006-11-28 00:16:28 +03:00
2007-05-06 19:38:52 +04:00
# ifdef CONFIG_PM
mpc52xx_suspend . board_suspend_prepare = lite5200_suspend_prepare ;
mpc52xx_suspend . board_resume_finish = lite5200_resume_finish ;
mpc52xx_pm_init ( ) ;
# endif
2006-12-13 01:13:19 +03:00
# ifdef CONFIG_PCI
2007-04-07 02:57:37 +04:00
np = of_find_node_by_type ( NULL , " pci " ) ;
if ( np ) {
2006-12-13 01:13:19 +03:00
mpc52xx_add_bridge ( np ) ;
2007-04-07 02:57:37 +04:00
of_node_put ( np ) ;
}
2006-12-13 01:13:19 +03:00
# endif
2006-11-28 00:16:28 +03:00
# ifdef CONFIG_BLK_DEV_INITRD
if ( initrd_start )
ROOT_DEV = Root_RAM0 ;
else
# endif
# ifdef CONFIG_ROOT_NFS
ROOT_DEV = Root_NFS ;
# else
ROOT_DEV = Root_HDA1 ;
# endif
}
2007-07-09 11:52:03 +04:00
static void lite5200_show_cpuinfo ( struct seq_file * m )
2006-11-28 00:16:28 +03:00
{
struct device_node * np = of_find_all_nodes ( NULL ) ;
const char * model = NULL ;
if ( np )
2007-04-03 16:26:41 +04:00
model = of_get_property ( np , " model " , NULL ) ;
2006-11-28 00:16:28 +03:00
seq_printf ( m , " vendor \t \t : Freescale Semiconductor \n " ) ;
seq_printf ( m , " machine \t \t : %s \n " , model ? model : " unknown " ) ;
of_node_put ( np ) ;
}
/*
* Called very early , MMU is off , device - tree isn ' t unflattened
*/
2007-02-12 23:36:55 +03:00
static int __init lite5200_probe ( void )
2006-11-28 00:16:28 +03:00
{
unsigned long node = of_get_flat_dt_root ( ) ;
const char * model = of_get_flat_dt_prop ( node , " model " , NULL ) ;
2007-02-12 23:36:55 +03:00
if ( ! of_flat_dt_is_compatible ( node , " fsl,lite5200 " ) & &
! of_flat_dt_is_compatible ( node , " fsl,lite5200b " ) )
2006-11-28 00:16:28 +03:00
return 0 ;
2007-02-12 23:36:55 +03:00
pr_debug ( " %s board found \n " , model ? model : " unknown " ) ;
2006-11-28 00:16:28 +03:00
return 1 ;
}
2007-02-12 23:36:55 +03:00
define_machine ( lite5200 ) {
. name = " lite5200 " ,
. probe = lite5200_probe ,
. setup_arch = lite5200_setup_arch ,
2007-01-03 01:29:53 +03:00
. init = mpc52xx_declare_of_platform_devices ,
2006-11-28 00:16:28 +03:00
. init_IRQ = mpc52xx_init_irq ,
. get_irq = mpc52xx_get_irq ,
2007-02-12 23:36:55 +03:00
. show_cpuinfo = lite5200_show_cpuinfo ,
2006-11-28 00:16:28 +03:00
. calibrate_decr = generic_calibrate_decr ,
} ;