@ -40,29 +40,45 @@
static struct map_desc v2m_io_desc [ ] __initdata = {
{
. virtual = __MMIO_P2V ( V2M_PA_CS7 ) ,
. virtual = V2M_PERIPH ,
. pfn = __phys_to_pfn ( V2M_PA_CS7 ) ,
. length = SZ_128K ,
. type = MT_DEVICE ,
} ,
} ;
static void __init v2m_timer_init ( void )
static void __iomem * v2m_sysreg_base ;
static void __init v2m_sysctl_init ( void __iomem * base )
{
u32 scctrl ;
if ( WARN_ON ( ! base ) )
return ;
/* Select 1MHz TIMCLK as the reference clock for SP804 timers */
scctrl = readl ( MMIO_P2V ( V2M_SYSCTL + SCCTRL ) ) ;
scctrl = readl ( base + SCCTRL ) ;
scctrl | = SCCTRL_TIMEREN0SEL_TIMCLK ;
scctrl | = SCCTRL_TIMEREN1SEL_TIMCLK ;
writel ( scctrl , MMIO_P2V ( V2M_SYSCTL + SCCTRL ) ) ;
writel ( scctrl , base + SCCTRL ) ;
}
writel ( 0 , MMIO_P2V ( V2M_TIMER0 ) + TIMER_CTRL ) ;
writel ( 0 , MMIO_P2V ( V2M_TIMER1 ) + TIMER_CTRL ) ;
static void __init v2m_sp804_init ( void __iomem * base , unsigned int irq )
{
if ( WARN_ON ( ! base | | irq = = NO_IRQ ) )
return ;
writel ( 0 , base + TIMER_1_BASE + TIMER_CTRL ) ;
writel ( 0 , base + TIMER_2_BASE + TIMER_CTRL ) ;
sp804_clocksource_init ( MMIO_P2V ( V2M_TIMER1 ) , " v2m-timer1 " ) ;
sp804_clockevents_init ( MMIO_P2V ( V2M_TIMER0 ) , IRQ_V2M_TIMER0 ,
" v2m-timer0 " ) ;
sp804_clocksource_init ( base + TIMER_2_BASE , " v2m-timer1 " ) ;
sp804_clockevents_init ( base + TIMER_1_BASE , irq , " v2m-timer0 " ) ;
}
static void __init v2m_timer_init ( void )
{
v2m_sysctl_init ( ioremap ( V2M_SYSCTL , SZ_4K ) ) ;
v2m_sp804_init ( ioremap ( V2M_TIMER01 , SZ_4K ) , IRQ_V2M_TIMER0 ) ;
}
static struct sys_timer v2m_timer = {
@ -82,14 +98,14 @@ int v2m_cfg_write(u32 devfn, u32 data)
devfn | = SYS_CFG_START | SYS_CFG_WRITE ;
spin_lock ( & v2m_cfg_lock ) ;
val = readl ( MMIO_P2V ( V2M_SYS_CFGSTAT ) ) ;
writel ( val & ~ SYS_CFG_COMPLETE , MMIO_P2V ( V2M_SYS_CFGSTAT ) ) ;
val = readl ( v2m_sysreg_base + V2M_SYS_CFGSTAT ) ;
writel ( val & ~ SYS_CFG_COMPLETE , v2m_sysreg_base + V2M_SYS_CFGSTAT ) ;
writel ( data , MMIO_P2V ( V2M_SYS_CFGDATA ) ) ;
writel ( devfn , MMIO_P2V ( V2M_SYS_CFGCTRL ) ) ;
writel ( data , v2m_sysreg_base + V2M_SYS_CFGDATA ) ;
writel ( devfn , v2m_sysreg_base + V2M_SYS_CFGCTRL ) ;
do {
val = readl ( MMIO_P2V ( V2M_SYS_CFGSTAT ) ) ;
val = readl ( v2m_sysreg_base + V2M_SYS_CFGSTAT ) ;
} while ( val = = 0 ) ;
spin_unlock ( & v2m_cfg_lock ) ;
@ -103,22 +119,28 @@ int v2m_cfg_read(u32 devfn, u32 *data)
devfn | = SYS_CFG_START ;
spin_lock ( & v2m_cfg_lock ) ;
writel ( 0 , MMIO_P2V ( V2M_SYS_CFGSTAT ) ) ;
writel ( devfn , MMIO_P2V ( V2M_SYS_CFGCTRL ) ) ;
writel ( 0 , v2m_sysreg_base + V2M_SYS_CFGSTAT ) ;
writel ( devfn , v2m_sysreg_base + V2M_SYS_CFGCTRL ) ;
mb ( ) ;
do {
cpu_relax ( ) ;
val = readl ( MMIO_P2V ( V2M_SYS_CFGSTAT ) ) ;
val = readl ( v2m_sysreg_base + V2M_SYS_CFGSTAT ) ;
} while ( val = = 0 ) ;
* data = readl ( MMIO_P2V ( V2M_SYS_CFGDATA ) ) ;
* data = readl ( v2m_sysreg_base + V2M_SYS_CFGDATA ) ;
spin_unlock ( & v2m_cfg_lock ) ;
return ! ! ( val & SYS_CFG_ERR ) ;
}
void __init v2m_flags_set ( u32 data )
{
writel ( ~ 0 , v2m_sysreg_base + V2M_SYS_FLAGSCLR ) ;
writel ( data , v2m_sysreg_base + V2M_SYS_FLAGSSET ) ;
}
static struct resource v2m_pcie_i2c_resource = {
. start = V2M_SERIAL_BUS_PCI ,
@ -204,7 +226,7 @@ static struct platform_device v2m_usb_device = {
static void v2m_flash_set_vpp ( struct platform_device * pdev , int on )
{
writel ( on ! = 0 , MMIO_P2V ( V2M_SYS_FLASH ) ) ;
writel ( on ! = 0 , v2m_sysreg_base + V2M_SYS_FLASH ) ;
}
static struct physmap_flash_data v2m_flash_data = {
@ -258,7 +280,7 @@ static struct platform_device v2m_cf_device = {
static unsigned int v2m_mmci_status ( struct device * dev )
{
return readl ( MMIO_P2V ( V2M_SYS_MCI ) ) & ( 1 < < 0 ) ;
return readl ( v2m_sysreg_base + V2M_SYS_MCI ) & ( 1 < < 0 ) ;
}
static struct mmci_platform_data v2m_mmci_data = {
@ -371,7 +393,7 @@ static void __init v2m_init_early(void)
{
ct_desc - > init_early ( ) ;
clkdev_add_table ( v2m_lookups , ARRAY_SIZE ( v2m_lookups ) ) ;
versatile_sched_clock_init ( MMIO_P2V ( V2M_SYS_24MHZ ) , 24000000 ) ;
versatile_sched_clock_init ( v2m_sysreg_base + V2M_SYS_24MHZ , 24000000 ) ;
}
static void v2m_power_off ( void )
@ -400,7 +422,8 @@ static void __init v2m_populate_ct_desc(void)
u32 current_tile_id ;
ct_desc = NULL ;
current_tile_id = readl ( MMIO_P2V ( V2M_SYS_PROCID0 ) ) & V2M_CT_ID_MASK ;
current_tile_id = readl ( v2m_sysreg_base + V2M_SYS_PROCID0 )
& V2M_CT_ID_MASK ;
for ( i = 0 ; i < ARRAY_SIZE ( ct_descs ) & & ! ct_desc ; + + i )
if ( ct_descs [ i ] - > id = = current_tile_id )
@ -414,6 +437,7 @@ static void __init v2m_populate_ct_desc(void)
static void __init v2m_map_io ( void )
{
iotable_init ( v2m_io_desc , ARRAY_SIZE ( v2m_io_desc ) ) ;
v2m_sysreg_base = ioremap ( V2M_SYSREGS , SZ_4K ) ;
v2m_populate_ct_desc ( ) ;
ct_desc - > map_io ( ) ;
}