2010-07-27 08:42:46 -07:00
/*
* arch / arm / mach - lpc32xx / common . c
*
* Author : Kevin Wells < kevin . wells @ nxp . com >
*
* Copyright ( C ) 2010 NXP Semiconductors
*
* This program is free software ; you can redistribute it and / or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation ; either version 2 of the License , or
* ( at your option ) any later version .
*
* This program is distributed in the hope that it will be useful ,
* but WITHOUT ANY WARRANTY ; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE . See the
* GNU General Public License for more details .
*/
# include <linux/init.h>
# include <asm/mach/map.h>
2012-07-20 14:01:51 +02:00
# include <asm/system_info.h>
2010-07-27 08:42:46 -07:00
# include <mach/hardware.h>
# include <mach/platform.h>
# include "common.h"
/*
* Returns the unique ID for the device
*/
void lpc32xx_get_uid ( u32 devid [ 4 ] )
{
int i ;
for ( i = 0 ; i < 4 ; i + + )
devid [ i ] = __raw_readl ( LPC32XX_CLKPWR_DEVID ( i < < 2 ) ) ;
}
/*
* Detects and returns IRAM size for the device variation
*/
# define LPC32XX_IRAM_BANK_SIZE SZ_128K
static u32 iram_size ;
u32 lpc32xx_return_iram_size ( void )
{
if ( iram_size = = 0 ) {
u32 savedval1 , savedval2 ;
void __iomem * iramptr1 , * iramptr2 ;
iramptr1 = io_p2v ( LPC32XX_IRAM_BASE ) ;
iramptr2 = io_p2v ( LPC32XX_IRAM_BASE + LPC32XX_IRAM_BANK_SIZE ) ;
savedval1 = __raw_readl ( iramptr1 ) ;
savedval2 = __raw_readl ( iramptr2 ) ;
if ( savedval1 = = savedval2 ) {
__raw_writel ( savedval2 + 1 , iramptr2 ) ;
if ( __raw_readl ( iramptr1 ) = = savedval2 + 1 )
iram_size = LPC32XX_IRAM_BANK_SIZE ;
else
iram_size = LPC32XX_IRAM_BANK_SIZE * 2 ;
__raw_writel ( savedval2 , iramptr2 ) ;
} else
iram_size = LPC32XX_IRAM_BANK_SIZE * 2 ;
}
return iram_size ;
}
2014-02-17 20:21:55 +01:00
EXPORT_SYMBOL_GPL ( lpc32xx_return_iram_size ) ;
2010-07-27 08:42:46 -07:00
static struct map_desc lpc32xx_io_desc [ ] __initdata = {
{
2012-09-14 20:20:24 +00:00
. virtual = ( unsigned long ) IO_ADDRESS ( LPC32XX_AHB0_START ) ,
2010-07-27 08:42:46 -07:00
. pfn = __phys_to_pfn ( LPC32XX_AHB0_START ) ,
. length = LPC32XX_AHB0_SIZE ,
. type = MT_DEVICE
} ,
{
2012-09-14 20:20:24 +00:00
. virtual = ( unsigned long ) IO_ADDRESS ( LPC32XX_AHB1_START ) ,
2010-07-27 08:42:46 -07:00
. pfn = __phys_to_pfn ( LPC32XX_AHB1_START ) ,
. length = LPC32XX_AHB1_SIZE ,
. type = MT_DEVICE
} ,
{
2012-09-14 20:20:24 +00:00
. virtual = ( unsigned long ) IO_ADDRESS ( LPC32XX_FABAPB_START ) ,
2010-07-27 08:42:46 -07:00
. pfn = __phys_to_pfn ( LPC32XX_FABAPB_START ) ,
. length = LPC32XX_FABAPB_SIZE ,
. type = MT_DEVICE
} ,
{
2012-09-14 20:20:24 +00:00
. virtual = ( unsigned long ) IO_ADDRESS ( LPC32XX_IRAM_BASE ) ,
2010-07-27 08:42:46 -07:00
. pfn = __phys_to_pfn ( LPC32XX_IRAM_BASE ) ,
. length = ( LPC32XX_IRAM_BANK_SIZE * 2 ) ,
. type = MT_DEVICE
} ,
} ;
void __init lpc32xx_map_io ( void )
{
iotable_init ( lpc32xx_io_desc , ARRAY_SIZE ( lpc32xx_io_desc ) ) ;
}
2011-11-05 12:17:40 +00:00
2012-07-20 14:01:51 +02:00
static int __init lpc32xx_check_uid ( void )
2012-04-22 12:01:19 +02:00
{
u32 uid [ 4 ] ;
lpc32xx_get_uid ( uid ) ;
printk ( KERN_INFO " LPC32XX unique ID: %08x%08x%08x%08x \n " ,
uid [ 3 ] , uid [ 2 ] , uid [ 1 ] , uid [ 0 ] ) ;
2012-07-20 14:01:51 +02:00
if ( ! system_serial_low & & ! system_serial_high ) {
system_serial_low = uid [ 0 ] ;
system_serial_high = uid [ 1 ] ;
}
2012-04-22 12:01:19 +02:00
return 1 ;
}
2012-07-20 14:01:51 +02:00
arch_initcall ( lpc32xx_check_uid ) ;