2010-04-01 15:30:58 +04:00
/*
* arch / arm / mach - spear3xx / spear3xx . c
*
* SPEAr3XX machines common source file
*
2012-03-22 22:47:43 +04:00
* Copyright ( C ) 2009 - 2012 ST Microelectronics
2012-06-20 23:53:02 +04:00
* Viresh Kumar < viresh . linux @ gmail . com >
2010-04-01 15:30:58 +04:00
*
* 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 .
*/
2012-03-26 09:09:43 +04:00
# define pr_fmt(fmt) "SPEAr3xx: " fmt
2012-03-22 22:47:43 +04:00
# include <linux/amba/pl022.h>
2013-03-12 20:00:03 +04:00
# include <linux/amba/pl080.h>
# include <linux/clk.h>
2010-04-01 15:30:58 +04:00
# include <linux/io.h>
2013-03-12 20:00:03 +04:00
# include <asm/mach/map.h>
2012-12-02 18:49:04 +04:00
# include "pl080.h"
# include "generic.h"
2012-04-11 21:30:11 +04:00
# include <mach/spear.h>
2012-12-02 20:59:57 +04:00
# include <mach/misc_regs.h>
2010-04-01 15:30:58 +04:00
2012-03-22 22:47:43 +04:00
/* ssp device registration */
struct pl022_ssp_controller pl022_plat_data = {
. bus_id = 0 ,
. enable_dma = 1 ,
. dma_filter = pl08x_filter_id ,
. dma_tx_param = " ssp0_tx " ,
. dma_rx_param = " ssp0_rx " ,
/*
* This is number of spi devices that can be connected to spi . There are
* two type of chipselects on which slave devices can work . One is chip
* select provided by spi masters other is controlled through external
* gpio ' s . We can ' t use chipselect provided from spi master ( because as
* soon as FIFO becomes empty , CS is disabled and transfer ends ) . So
* this number now depends on number of gpios available for spi . each
* slave on each master requires a separate gpio pin .
*/
. num_chipselect = 2 ,
} ;
2012-03-26 08:59:23 +04:00
/* dmac device registration */
struct pl08x_platform_data pl080_plat_data = {
. memcpy_channel = {
. bus_id = " memcpy " ,
2012-05-16 15:20:55 +04:00
. cctl_memcpy =
( PL080_BSIZE_16 < < PL080_CONTROL_SB_SIZE_SHIFT | \
2012-03-26 08:59:23 +04:00
PL080_BSIZE_16 < < PL080_CONTROL_DB_SIZE_SHIFT | \
PL080_WIDTH_32BIT < < PL080_CONTROL_SWIDTH_SHIFT | \
PL080_WIDTH_32BIT < < PL080_CONTROL_DWIDTH_SHIFT | \
PL080_CONTROL_PROT_BUFF | PL080_CONTROL_PROT_CACHE | \
PL080_CONTROL_PROT_SYS ) ,
} ,
. lli_buses = PL08X_AHB1 ,
. mem_buses = PL08X_AHB1 ,
2013-06-19 23:38:28 +04:00
. get_xfer_signal = pl080_get_signal ,
. put_xfer_signal = pl080_put_signal ,
2010-04-01 15:30:58 +04:00
} ;
2012-03-22 22:47:43 +04:00
/*
* Following will create 16 MB static virtual / physical mappings
* PHYSICAL VIRTUAL
* 0xD0000000 0xFD000000
* 0xFC000000 0xFC000000
*/
2010-04-01 15:30:58 +04:00
struct map_desc spear3xx_io_desc [ ] __initdata = {
{
2012-12-02 20:59:57 +04:00
. virtual = ( unsigned long ) VA_SPEAR_ICM1_2_BASE ,
2012-12-02 17:45:27 +04:00
. pfn = __phys_to_pfn ( SPEAR_ICM1_2_BASE ) ,
2012-03-22 22:47:43 +04:00
. length = SZ_16M ,
2010-04-01 15:30:58 +04:00
. type = MT_DEVICE
} , {
2012-12-02 20:59:57 +04:00
. virtual = ( unsigned long ) VA_SPEAR_ICM3_SMI_CTRL_BASE ,
2012-12-02 17:45:27 +04:00
. pfn = __phys_to_pfn ( SPEAR_ICM3_SMI_CTRL_BASE ) ,
2012-03-22 22:47:43 +04:00
. length = SZ_16M ,
2010-04-01 15:30:58 +04:00
. type = MT_DEVICE
} ,
} ;
/* This will create static memory mapping for selected devices */
void __init spear3xx_map_io ( void )
{
iotable_init ( spear3xx_io_desc , ARRAY_SIZE ( spear3xx_io_desc ) ) ;
}
2010-04-01 15:31:29 +04:00
2012-11-08 23:40:59 +04:00
void __init spear3xx_timer_init ( void )
2011-02-16 09:40:32 +03:00
{
2012-07-10 15:42:45 +04:00
char pclk_name [ ] = " pll3_clk " ;
2011-02-16 09:40:32 +03:00
struct clk * gpt_clk , * pclk ;
2012-12-02 20:59:57 +04:00
spear3xx_clk_init ( MISC_BASE , VA_SPEAR320_SOC_CONFIG_BASE ) ;
2012-04-10 07:32:35 +04:00
2011-02-16 09:40:32 +03:00
/* get the system timer clock */
gpt_clk = clk_get_sys ( " gpt0 " , NULL ) ;
if ( IS_ERR ( gpt_clk ) ) {
pr_err ( " %s:couldn't get clk for gpt \n " , __func__ ) ;
BUG ( ) ;
}
/* get the suitable parent clock for timer*/
pclk = clk_get ( NULL , pclk_name ) ;
if ( IS_ERR ( pclk ) ) {
pr_err ( " %s:couldn't get %s as parent for gpt \n " ,
__func__ , pclk_name ) ;
BUG ( ) ;
}
clk_set_parent ( gpt_clk , pclk ) ;
clk_put ( gpt_clk ) ;
clk_put ( pclk ) ;
2012-04-21 11:45:37 +04:00
spear_setup_of_timer ( ) ;
2011-02-16 09:40:32 +03:00
}