2010-09-20 15:11:11 +04:00
/***************************************************************************/
/*
2014-08-19 05:55:24 +04:00
* m54xx . c - - platform support for ColdFire 54 xx based boards
2010-09-20 15:11:11 +04:00
*
* Copyright ( C ) 2010 , Philippe De Muyter < phdm @ macqel . be >
*/
/***************************************************************************/
# include <linux/kernel.h>
# include <linux/param.h>
# include <linux/init.h>
# include <linux/interrupt.h>
# include <linux/io.h>
2011-10-14 09:06:22 +04:00
# include <linux/mm.h>
2012-07-13 10:07:15 +04:00
# include <linux/clk.h>
2011-10-14 09:06:22 +04:00
# include <linux/bootmem.h>
# include <asm/pgalloc.h>
2010-09-20 15:11:11 +04:00
# include <asm/machdep.h>
# include <asm/coldfire.h>
2010-11-02 05:05:29 +03:00
# include <asm/m54xxsim.h>
2010-09-20 15:11:11 +04:00
# include <asm/mcfuart.h>
2012-07-13 10:07:15 +04:00
# include <asm/mcfclk.h>
2010-11-02 05:05:29 +03:00
# include <asm/m54xxgpt.h>
2012-07-13 10:07:15 +04:00
# include <asm/mcfclk.h>
2011-10-14 09:06:22 +04:00
# ifdef CONFIG_MMU
# include <asm/mmu_context.h>
# endif
2010-09-20 15:11:11 +04:00
/***************************************************************************/
2012-07-13 10:07:15 +04:00
DEFINE_CLK ( pll , " pll.0 " , MCF_CLK ) ;
DEFINE_CLK ( sys , " sys.0 " , MCF_BUSCLK ) ;
DEFINE_CLK ( mcfslt0 , " mcfslt.0 " , MCF_BUSCLK ) ;
DEFINE_CLK ( mcfslt1 , " mcfslt.1 " , MCF_BUSCLK ) ;
DEFINE_CLK ( mcfuart0 , " mcfuart.0 " , MCF_BUSCLK ) ;
DEFINE_CLK ( mcfuart1 , " mcfuart.1 " , MCF_BUSCLK ) ;
DEFINE_CLK ( mcfuart2 , " mcfuart.2 " , MCF_BUSCLK ) ;
DEFINE_CLK ( mcfuart3 , " mcfuart.3 " , MCF_BUSCLK ) ;
struct clk * mcf_clks [ ] = {
& clk_pll ,
& clk_sys ,
& clk_mcfslt0 ,
& clk_mcfslt1 ,
& clk_mcfuart0 ,
& clk_mcfuart1 ,
& clk_mcfuart2 ,
& clk_mcfuart3 ,
NULL
} ;
/***************************************************************************/
2010-11-02 05:05:29 +03:00
static void __init m54xx_uarts_init ( void )
2010-09-20 15:11:11 +04:00
{
2011-12-23 19:08:47 +04:00
/* enable io pins */
2012-09-18 08:34:04 +04:00
__raw_writeb ( MCF_PAR_PSC_TXD | MCF_PAR_PSC_RXD , MCFGPIO_PAR_PSC0 ) ;
2011-12-23 19:08:47 +04:00
__raw_writeb ( MCF_PAR_PSC_TXD | MCF_PAR_PSC_RXD | MCF_PAR_PSC_RTS_RTS ,
2012-09-18 08:34:04 +04:00
MCFGPIO_PAR_PSC1 ) ;
2011-12-23 19:08:47 +04:00
__raw_writeb ( MCF_PAR_PSC_TXD | MCF_PAR_PSC_RXD | MCF_PAR_PSC_RTS_RTS |
2012-09-18 08:34:04 +04:00
MCF_PAR_PSC_CTS_CTS , MCFGPIO_PAR_PSC2 ) ;
__raw_writeb ( MCF_PAR_PSC_TXD | MCF_PAR_PSC_RXD , MCFGPIO_PAR_PSC3 ) ;
2010-09-20 15:11:11 +04:00
}
/***************************************************************************/
2010-11-02 05:05:29 +03:00
static void mcf54xx_reset ( void )
2010-09-20 15:11:11 +04:00
{
/* disable interrupts and enable the watchdog */
asm ( " movew #0x2700, %sr \n " ) ;
2012-09-18 08:51:46 +04:00
__raw_writel ( 0 , MCF_GPT_GMS0 ) ;
__raw_writel ( MCF_GPT_GCIR_CNT ( 1 ) , MCF_GPT_GCIR0 ) ;
2010-09-20 15:11:11 +04:00
__raw_writel ( MCF_GPT_GMS_WDEN | MCF_GPT_GMS_CE | MCF_GPT_GMS_TMS ( 4 ) ,
2012-09-18 08:51:46 +04:00
MCF_GPT_GMS0 ) ;
2010-09-20 15:11:11 +04:00
}
/***************************************************************************/
2011-10-14 09:06:22 +04:00
# ifdef CONFIG_MMU
unsigned long num_pages ;
static void __init mcf54xx_bootmem_alloc ( void )
{
unsigned long start_pfn ;
unsigned long memstart ;
/* _rambase and _ramend will be naturally page aligned */
m68k_memory [ 0 ] . addr = _rambase ;
m68k_memory [ 0 ] . size = _ramend - _rambase ;
/* compute total pages in system */
num_pages = ( _ramend - _rambase ) > > PAGE_SHIFT ;
/* page numbers */
memstart = PAGE_ALIGN ( _ramstart ) ;
min_low_pfn = _rambase > > PAGE_SHIFT ;
start_pfn = memstart > > PAGE_SHIFT ;
max_low_pfn = _ramend > > PAGE_SHIFT ;
high_memory = ( void * ) _ramend ;
m68k_virt_to_node_shift = fls ( _ramend - _rambase - 1 ) - 6 ;
module_fixup ( NULL , __start_fixup , __stop_fixup ) ;
/* setup bootmem data */
m68k_setup_node ( 0 ) ;
memstart + = init_bootmem_node ( NODE_DATA ( 0 ) , start_pfn ,
min_low_pfn , max_low_pfn ) ;
free_bootmem_node ( NODE_DATA ( 0 ) , memstart , _ramend - memstart ) ;
}
# endif /* CONFIG_MMU */
/***************************************************************************/
2010-09-20 15:11:11 +04:00
void __init config_BSP ( char * commandp , int size )
{
2011-10-14 09:06:22 +04:00
# ifdef CONFIG_MMU
mcf54xx_bootmem_alloc ( ) ;
mmu_context_init ( ) ;
# endif
2010-11-02 05:05:29 +03:00
mach_reset = mcf54xx_reset ;
2012-01-23 09:34:58 +04:00
mach_sched_init = hw_timer_init ;
2010-11-02 05:05:29 +03:00
m54xx_uarts_init ( ) ;
2010-09-20 15:11:11 +04:00
}
/***************************************************************************/