2005-04-16 15:20:36 -07:00
/*
* linux / arch / arm / mach - pxa / generic . c
*
* Author : Nicolas Pitre
* Created : Jun 15 , 2001
* Copyright : MontaVista Software Inc .
*
* Code common to all PXA machines .
*
* This program is free software ; you can redistribute it and / or modify
* it under the terms of the GNU General Public License version 2 as
* published by the Free Software Foundation .
*
* Since this file should be linked before any other machine specific file ,
* the __initcall ( ) here will be executed first . This serves as default
* initialization stuff for PXA machines which can be overridden later if
* need be .
*/
# include <linux/module.h>
# include <linux/kernel.h>
# include <linux/init.h>
2008-08-05 16:14:15 +01:00
# include <mach/hardware.h>
2005-04-16 15:20:36 -07:00
# include <asm/system.h>
# include <asm/pgtable.h>
# include <asm/mach/map.h>
2008-12-18 11:10:32 +08:00
# include <asm/mach-types.h>
2005-04-16 15:20:36 -07:00
2008-08-07 11:05:25 +01:00
# include <mach/reset.h>
2009-01-06 18:29:01 +08:00
# include <mach/gpio.h>
2009-01-06 18:06:25 +08:00
# include <mach/pxa2xx-gpio.h>
2005-04-16 15:20:36 -07:00
# include "generic.h"
2008-07-29 14:26:00 +08:00
void clear_reset_status ( unsigned int mask )
{
if ( cpu_is_pxa2xx ( ) )
pxa2xx_clear_reset_status ( mask ) ;
if ( cpu_is_pxa3xx ( ) )
pxa3xx_clear_reset_status ( mask ) ;
}
2008-12-18 11:10:32 +08:00
unsigned long get_clock_tick_rate ( void )
{
unsigned long clock_tick_rate ;
if ( cpu_is_pxa25x ( ) )
clock_tick_rate = 3686400 ;
else if ( machine_is_mainstone ( ) )
clock_tick_rate = 3249600 ;
else
clock_tick_rate = 3250000 ;
return clock_tick_rate ;
}
EXPORT_SYMBOL ( get_clock_tick_rate ) ;
2007-08-20 10:07:44 +01:00
/*
* Get the clock frequency as reflected by CCCR and the turbo flag .
* We assume these values have been applied via a fcs .
* If info is not 0 we also display the current settings .
*/
unsigned int get_clk_frequency_khz ( int info )
{
2008-09-11 10:27:30 +08:00
if ( cpu_is_pxa25x ( ) )
2007-08-20 10:07:44 +01:00
return pxa25x_get_clk_frequency_khz ( info ) ;
2007-09-11 19:13:17 -07:00
else if ( cpu_is_pxa27x ( ) )
2007-08-20 10:07:44 +01:00
return pxa27x_get_clk_frequency_khz ( info ) ;
2007-09-11 19:13:17 -07:00
else
return pxa3xx_get_clk_frequency_khz ( info ) ;
2007-08-20 10:07:44 +01:00
}
EXPORT_SYMBOL ( get_clk_frequency_khz ) ;
/*
* Return the current memory clock frequency in units of 10 kHz
*/
unsigned int get_memclk_frequency_10khz ( void )
{
2008-09-11 10:27:30 +08:00
if ( cpu_is_pxa25x ( ) )
2007-08-20 10:07:44 +01:00
return pxa25x_get_memclk_frequency_10khz ( ) ;
2007-09-11 19:13:17 -07:00
else if ( cpu_is_pxa27x ( ) )
2007-08-20 10:07:44 +01:00
return pxa27x_get_memclk_frequency_10khz ( ) ;
2007-09-11 19:13:17 -07:00
else
return pxa3xx_get_memclk_frequency_10khz ( ) ;
2007-08-20 10:07:44 +01:00
}
EXPORT_SYMBOL ( get_memclk_frequency_10khz ) ;
2005-04-16 15:20:36 -07:00
/*
* Intel PXA2xx internal register mapping .
*
* Note 1 : not all PXA2xx variants implement all those addresses .
*
* Note 2 : virtual 0xfffe0000 - 0xffffffff is reserved for the vector table
* and cache flush area .
*/
static struct map_desc standard_io_desc [ ] __initdata = {
2005-10-28 15:19:01 +01:00
{ /* Devs */
. virtual = 0xf2000000 ,
. pfn = __phys_to_pfn ( 0x40000000 ) ,
. length = 0x02000000 ,
. type = MT_DEVICE
} , { /* Mem Ctl */
. virtual = 0xf6000000 ,
. pfn = __phys_to_pfn ( 0x48000000 ) ,
2008-01-04 22:41:09 +00:00
. length = 0x00200000 ,
2005-10-28 15:19:01 +01:00
. type = MT_DEVICE
} , { /* Camera */
. virtual = 0xfa000000 ,
. pfn = __phys_to_pfn ( 0x50000000 ) ,
. length = 0x00100000 ,
. type = MT_DEVICE
} , { /* IMem ctl */
. virtual = 0xfe000000 ,
. pfn = __phys_to_pfn ( 0x58000000 ) ,
. length = 0x00100000 ,
. type = MT_DEVICE
} , { /* UNCACHED_PHYS_0 */
. virtual = 0xff000000 ,
. pfn = __phys_to_pfn ( 0x00000000 ) ,
. length = 0x00100000 ,
. type = MT_DEVICE
}
2005-04-16 15:20:36 -07:00
} ;
void __init pxa_map_io ( void )
{
iotable_init ( standard_io_desc , ARRAY_SIZE ( standard_io_desc ) ) ;
get_clk_frequency_khz ( 1 ) ;
}
2009-01-06 18:06:25 +08:00
/*
* Configure pins for GPIO or other functions
*/
int pxa_gpio_mode ( int gpio_mode )
{
unsigned long flags ;
int gpio = gpio_mode & GPIO_MD_MASK_NR ;
int fn = ( gpio_mode & GPIO_MD_MASK_FN ) > > 8 ;
int gafr ;
if ( gpio > pxa_last_gpio )
return - EINVAL ;
local_irq_save ( flags ) ;
if ( gpio_mode & GPIO_DFLT_LOW )
GPCR ( gpio ) = GPIO_bit ( gpio ) ;
else if ( gpio_mode & GPIO_DFLT_HIGH )
GPSR ( gpio ) = GPIO_bit ( gpio ) ;
if ( gpio_mode & GPIO_MD_MASK_DIR )
GPDR ( gpio ) | = GPIO_bit ( gpio ) ;
else
GPDR ( gpio ) & = ~ GPIO_bit ( gpio ) ;
gafr = GAFR ( gpio ) & ~ ( 0x3 < < ( ( ( gpio ) & 0xf ) * 2 ) ) ;
GAFR ( gpio ) = gafr | ( fn < < ( ( ( gpio ) & 0xf ) * 2 ) ) ;
local_irq_restore ( flags ) ;
return 0 ;
}
EXPORT_SYMBOL ( pxa_gpio_mode ) ;