2009-08-06 15:12:43 +03:00
/*
* arch / arm / mach - dove / common . c
*
* Core functions for Marvell Dove 88 AP510 System On Chip
*
* This file is licensed under the terms of the GNU General Public
* License version 2. This program is licensed " as is " without any
* warranty of any kind , whether express or implied .
*/
# include <linux/kernel.h>
# include <linux/delay.h>
# include <linux/init.h>
# include <linux/platform_device.h>
# include <linux/pci.h>
2011-12-15 08:15:07 +01:00
# include <linux/clk-provider.h>
2009-08-06 15:12:43 +03:00
# include <linux/ata_platform.h>
# include <linux/gpio.h>
# include <asm/page.h>
# include <asm/setup.h>
# include <asm/timex.h>
2009-11-24 19:33:52 +02:00
# include <asm/hardware/cache-tauros2.h>
2009-08-06 15:12:43 +03:00
# include <asm/mach/map.h>
# include <asm/mach/time.h>
# include <asm/mach/pci.h>
# include <mach/dove.h>
# include <mach/bridge-regs.h>
# include <asm/mach/arch.h>
# include <linux/irq.h>
# include <plat/time.h>
2012-02-08 15:52:47 +01:00
# include <plat/ehci-orion.h>
2011-05-15 13:32:41 +02:00
# include <plat/common.h>
2011-12-07 21:48:06 +01:00
# include <plat/addr-map.h>
2009-08-06 15:12:43 +03:00
# include "common.h"
2011-05-15 13:32:41 +02:00
static int get_tclk ( void ) ;
2009-08-06 15:12:43 +03:00
/*****************************************************************************
* I / O Address Mapping
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
static struct map_desc dove_io_desc [ ] __initdata = {
{
. virtual = DOVE_SB_REGS_VIRT_BASE ,
. pfn = __phys_to_pfn ( DOVE_SB_REGS_PHYS_BASE ) ,
. length = DOVE_SB_REGS_SIZE ,
. type = MT_DEVICE ,
} , {
. virtual = DOVE_NB_REGS_VIRT_BASE ,
. pfn = __phys_to_pfn ( DOVE_NB_REGS_PHYS_BASE ) ,
. length = DOVE_NB_REGS_SIZE ,
. type = MT_DEVICE ,
} , {
. virtual = DOVE_PCIE0_IO_VIRT_BASE ,
. pfn = __phys_to_pfn ( DOVE_PCIE0_IO_PHYS_BASE ) ,
. length = DOVE_PCIE0_IO_SIZE ,
. type = MT_DEVICE ,
} , {
. virtual = DOVE_PCIE1_IO_VIRT_BASE ,
. pfn = __phys_to_pfn ( DOVE_PCIE1_IO_PHYS_BASE ) ,
. length = DOVE_PCIE1_IO_SIZE ,
. type = MT_DEVICE ,
} ,
} ;
void __init dove_map_io ( void )
{
iotable_init ( dove_io_desc , ARRAY_SIZE ( dove_io_desc ) ) ;
}
2011-12-15 08:15:07 +01:00
/*****************************************************************************
* CLK tree
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
static struct clk * tclk ;
static void __init clk_init ( void )
{
tclk = clk_register_fixed_rate ( NULL , " tclk " , NULL , CLK_IS_ROOT ,
get_tclk ( ) ) ;
2012-04-06 17:17:26 +02:00
orion_clkdev_init ( tclk ) ;
2011-12-15 08:15:07 +01:00
}
2009-08-06 15:12:43 +03:00
/*****************************************************************************
* EHCI0
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
void __init dove_ehci0_init ( void )
{
2012-02-08 15:52:47 +01:00
orion_ehci_init ( DOVE_USB0_PHYS_BASE , IRQ_DOVE_USB0 , EHCI_PHY_NA ) ;
2009-08-06 15:12:43 +03:00
}
/*****************************************************************************
* EHCI1
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
void __init dove_ehci1_init ( void )
{
2011-12-07 21:48:08 +01:00
orion_ehci_1_init ( DOVE_USB1_PHYS_BASE , IRQ_DOVE_USB1 ) ;
2009-08-06 15:12:43 +03:00
}
/*****************************************************************************
* GE00
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
void __init dove_ge00_init ( struct mv643xx_eth_platform_data * eth_data )
{
2012-06-12 15:59:45 +02:00
orion_ge00_init ( eth_data , DOVE_GE00_PHYS_BASE ,
IRQ_DOVE_GE00_SUM , IRQ_DOVE_GE00_ERR ) ;
2009-08-06 15:12:43 +03:00
}
/*****************************************************************************
* SoC RTC
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
void __init dove_rtc_init ( void )
{
2011-05-15 13:32:42 +02:00
orion_rtc_init ( DOVE_RTC_PHYS_BASE , IRQ_DOVE_RTC ) ;
2009-08-06 15:12:43 +03:00
}
/*****************************************************************************
* SATA
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
void __init dove_sata_init ( struct mv_sata_platform_data * sata_data )
{
2011-12-07 21:48:08 +01:00
orion_sata_init ( sata_data , DOVE_SATA_PHYS_BASE , IRQ_DOVE_SATA ) ;
2011-05-15 13:32:50 +02:00
2009-08-06 15:12:43 +03:00
}
/*****************************************************************************
* UART0
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
void __init dove_uart0_init ( void )
{
2011-05-15 13:32:41 +02:00
orion_uart0_init ( DOVE_UART0_VIRT_BASE , DOVE_UART0_PHYS_BASE ,
2011-12-24 03:06:34 +01:00
IRQ_DOVE_UART_0 , tclk ) ;
2009-08-06 15:12:43 +03:00
}
/*****************************************************************************
* UART1
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
void __init dove_uart1_init ( void )
{
2011-05-15 13:32:41 +02:00
orion_uart1_init ( DOVE_UART1_VIRT_BASE , DOVE_UART1_PHYS_BASE ,
2011-12-24 03:06:34 +01:00
IRQ_DOVE_UART_1 , tclk ) ;
2009-08-06 15:12:43 +03:00
}
/*****************************************************************************
* UART2
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
void __init dove_uart2_init ( void )
{
2011-05-15 13:32:41 +02:00
orion_uart2_init ( DOVE_UART2_VIRT_BASE , DOVE_UART2_PHYS_BASE ,
2011-12-24 03:06:34 +01:00
IRQ_DOVE_UART_2 , tclk ) ;
2009-08-06 15:12:43 +03:00
}
/*****************************************************************************
* UART3
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
void __init dove_uart3_init ( void )
{
2011-05-15 13:32:41 +02:00
orion_uart3_init ( DOVE_UART3_VIRT_BASE , DOVE_UART3_PHYS_BASE ,
2011-12-24 03:06:34 +01:00
IRQ_DOVE_UART_3 , tclk ) ;
2009-08-06 15:12:43 +03:00
}
/*****************************************************************************
2011-05-15 13:32:46 +02:00
* SPI
2009-08-06 15:12:43 +03:00
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
void __init dove_spi0_init ( void )
{
2012-04-06 17:17:26 +02:00
orion_spi_init ( DOVE_SPI0_PHYS_BASE ) ;
2009-08-06 15:12:43 +03:00
}
void __init dove_spi1_init ( void )
{
2012-04-06 17:17:26 +02:00
orion_spi_1_init ( DOVE_SPI1_PHYS_BASE ) ;
2009-08-06 15:12:43 +03:00
}
/*****************************************************************************
* I2C
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
void __init dove_i2c_init ( void )
{
2011-05-15 13:32:45 +02:00
orion_i2c_init ( DOVE_I2C_PHYS_BASE , IRQ_DOVE_I2C , 10 ) ;
2009-08-06 15:12:43 +03:00
}
/*****************************************************************************
* Time handling
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
2010-10-15 16:50:26 +02:00
void __init dove_init_early ( void )
{
orion_time_set_base ( TIMER_VIRT_BASE ) ;
}
2009-08-06 15:12:43 +03:00
static int get_tclk ( void )
{
/* use DOVE_RESET_SAMPLE_HI/LO to detect tclk */
return 166666667 ;
}
2012-05-14 11:28:43 +02:00
static void __init dove_timer_init ( void )
2009-08-06 15:12:43 +03:00
{
2010-10-15 16:50:26 +02:00
orion_time_init ( BRIDGE_VIRT_BASE , BRIDGE_INT_TIMER1_CLR ,
IRQ_DOVE_BRIDGE , get_tclk ( ) ) ;
2009-08-06 15:12:43 +03:00
}
struct sys_timer dove_timer = {
. init = dove_timer_init ,
} ;
/*****************************************************************************
* XOR 0
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
void __init dove_xor0_init ( void )
{
2011-12-07 21:48:08 +01:00
orion_xor0_init ( DOVE_XOR0_PHYS_BASE , DOVE_XOR0_HIGH_PHYS_BASE ,
2011-05-15 13:32:48 +02:00
IRQ_DOVE_XOR_00 , IRQ_DOVE_XOR_01 ) ;
2009-08-06 15:12:43 +03:00
}
/*****************************************************************************
* XOR 1
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
void __init dove_xor1_init ( void )
{
2011-05-15 13:32:48 +02:00
orion_xor1_init ( DOVE_XOR1_PHYS_BASE , DOVE_XOR1_HIGH_PHYS_BASE ,
IRQ_DOVE_XOR_10 , IRQ_DOVE_XOR_11 ) ;
2009-08-06 15:12:43 +03:00
}
2010-05-06 16:12:06 +03:00
/*****************************************************************************
* SDIO
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
static u64 sdio_dmamask = DMA_BIT_MASK ( 32 ) ;
static struct resource dove_sdio0_resources [ ] = {
{
. start = DOVE_SDIO0_PHYS_BASE ,
. end = DOVE_SDIO0_PHYS_BASE + 0xff ,
. flags = IORESOURCE_MEM ,
} , {
. start = IRQ_DOVE_SDIO0 ,
. end = IRQ_DOVE_SDIO0 ,
. flags = IORESOURCE_IRQ ,
} ,
} ;
static struct platform_device dove_sdio0 = {
2010-10-28 21:23:53 +02:00
. name = " sdhci-dove " ,
2010-05-06 16:12:06 +03:00
. id = 0 ,
. dev = {
. dma_mask = & sdio_dmamask ,
. coherent_dma_mask = DMA_BIT_MASK ( 32 ) ,
} ,
. resource = dove_sdio0_resources ,
. num_resources = ARRAY_SIZE ( dove_sdio0_resources ) ,
} ;
void __init dove_sdio0_init ( void )
{
platform_device_register ( & dove_sdio0 ) ;
}
static struct resource dove_sdio1_resources [ ] = {
{
. start = DOVE_SDIO1_PHYS_BASE ,
. end = DOVE_SDIO1_PHYS_BASE + 0xff ,
. flags = IORESOURCE_MEM ,
} , {
. start = IRQ_DOVE_SDIO1 ,
. end = IRQ_DOVE_SDIO1 ,
. flags = IORESOURCE_IRQ ,
} ,
} ;
static struct platform_device dove_sdio1 = {
2010-10-28 21:23:53 +02:00
. name = " sdhci-dove " ,
2010-05-06 16:12:06 +03:00
. id = 1 ,
. dev = {
. dma_mask = & sdio_dmamask ,
. coherent_dma_mask = DMA_BIT_MASK ( 32 ) ,
} ,
. resource = dove_sdio1_resources ,
. num_resources = ARRAY_SIZE ( dove_sdio1_resources ) ,
} ;
void __init dove_sdio1_init ( void )
{
platform_device_register ( & dove_sdio1 ) ;
}
2009-08-06 15:12:43 +03:00
void __init dove_init ( void )
{
printk ( KERN_INFO " Dove 88AP510 SoC, " ) ;
2011-12-15 08:15:07 +01:00
printk ( KERN_INFO " TCLK = %dMHz \n " , ( get_tclk ( ) + 499999 ) / 1000000 ) ;
2009-08-06 15:12:43 +03:00
2009-11-24 19:33:52 +02:00
# ifdef CONFIG_CACHE_TAUROS2
tauros2_init ( ) ;
# endif
2009-08-06 15:12:43 +03:00
dove_setup_cpu_mbus ( ) ;
2011-12-15 08:15:07 +01:00
/* Setup root of clk tree */
clk_init ( ) ;
2009-08-06 15:12:43 +03:00
/* internal devices that every board has */
dove_rtc_init ( ) ;
dove_xor0_init ( ) ;
dove_xor1_init ( ) ;
}
2011-11-05 09:48:52 +00:00
void dove_restart ( char mode , const char * cmd )
{
/*
* Enable soft reset to assert RSTOUTn .
*/
writel ( SOFT_RESET_OUT_EN , RSTOUTn_MASK ) ;
/*
* Assert soft reset .
*/
writel ( SOFT_RESET , SYSTEM_SOFT_RESET ) ;
while ( 1 )
;
}