2007-07-10 01:06:53 +04:00
/*
2008-07-05 12:02:43 +04:00
* Copyright 2004 - 2007 Freescale Semiconductor , Inc . All Rights Reserved .
* Copyright 2008 Juergen Beisert , kernel @ pengutronix . de
*
* 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 .
*
* You should have received a copy of the GNU General Public License
* along with this program ; if not , write to the Free Software
* Foundation , Inc . , 51 Franklin Street , Fifth Floor , Boston ,
* MA 02110 - 1301 , USA .
2007-07-10 01:06:53 +04:00
*/
# ifndef __ASM_ARCH_MXC_HARDWARE_H__
# define __ASM_ARCH_MXC_HARDWARE_H__
# include <asm/sizes.h>
2012-02-13 23:24:15 +04:00
# define addr_in_module(addr, mod) \
( ( unsigned long ) ( addr ) - mod # # _BASE_ADDR < mod # # _SIZE )
2010-10-25 13:40:30 +04:00
# define IMX_IO_P2V_MODULE(addr, module) \
( ( ( addr ) - module # # _BASE_ADDR ) < module # # _SIZE ? \
( addr ) - ( module # # _BASE_ADDR ) + ( module # # _BASE_ADDR_VIRT ) : 0 )
2009-12-16 21:05:04 +03:00
2010-10-25 17:44:25 +04:00
/*
* This is rather complicated for humans and ugly to verify , but for a machine
* it ' s OK . Still more as it is usually only applied to constants . The upsides
* on using this approach are :
*
* - same mapping on all i . MX machines
* - works for assembler , too
* - no need to nurture # defines for virtual addresses
*
* The downside it , it ' s hard to verify ( but I have a script for that ) .
*
* Obviously this needs to be injective for each SoC . In general it maps the
* whole address space to [ 0xf4000000 , 0xf5ffffff ] . So [ 0xf6000000 , 0xfeffffff ]
* is free for per - machine use ( e . g . KZM_ARM11_01 uses 64 MiB there ) .
*
* It applies the following mappings for the different SoCs :
*
* mx1 :
* IO 0x00200000 + 0x100000 - > 0xf4000000 + 0x100000
* mx21 :
* AIPI 0x10000000 + 0x100000 - > 0xf4400000 + 0x100000
2012-05-22 02:50:24 +04:00
* SAHB1 0x80000000 + 0x100000 - > 0xf5000000 + 0x100000
2010-10-25 17:44:25 +04:00
* X_MEMC 0xdf000000 + 0x004000 - > 0xf5f00000 + 0x004000
* mx25 :
* AIPS1 0x43f00000 + 0x100000 - > 0xf5300000 + 0x100000
* AIPS2 0x53f00000 + 0x100000 - > 0xf5700000 + 0x100000
* AVIC 0x68000000 + 0x100000 - > 0xf5800000 + 0x100000
* mx27 :
* AIPI 0x10000000 + 0x100000 - > 0xf4400000 + 0x100000
2012-05-22 02:50:24 +04:00
* SAHB1 0x80000000 + 0x100000 - > 0xf5000000 + 0x100000
2010-10-25 17:44:25 +04:00
* X_MEMC 0xd8000000 + 0x100000 - > 0xf5c00000 + 0x100000
* mx31 :
* AIPS1 0x43f00000 + 0x100000 - > 0xf5300000 + 0x100000
* AIPS2 0x53f00000 + 0x100000 - > 0xf5700000 + 0x100000
* AVIC 0x68000000 + 0x100000 - > 0xf5800000 + 0x100000
2012-05-22 02:50:24 +04:00
* X_MEMC 0xb8000000 + 0x010000 - > 0xf5c00000 + 0x010000
2010-10-25 17:44:25 +04:00
* SPBA0 0x50000000 + 0x100000 - > 0xf5400000 + 0x100000
* mx35 :
* AIPS1 0x43f00000 + 0x100000 - > 0xf5300000 + 0x100000
* AIPS2 0x53f00000 + 0x100000 - > 0xf5700000 + 0x100000
* AVIC 0x68000000 + 0x100000 - > 0xf5800000 + 0x100000
2012-05-22 02:50:24 +04:00
* X_MEMC 0xb8000000 + 0x010000 - > 0xf5c00000 + 0x010000
2010-10-25 17:44:25 +04:00
* SPBA0 0x50000000 + 0x100000 - > 0xf5400000 + 0x100000
* mx51 :
2012-05-22 02:50:24 +04:00
* TZIC 0x0fffc000 + 0x004000 - > 0xf4bfc000 + 0x004000
2010-10-25 17:44:25 +04:00
* IRAM 0x1ffe0000 + 0x020000 - > 0xf4fe0000 + 0x020000
2012-05-22 02:50:24 +04:00
* DEBUG 0x60000000 + 0x100000 - > 0xf5000000 + 0x100000
2010-10-25 17:44:25 +04:00
* SPBA0 0x70000000 + 0x100000 - > 0xf5400000 + 0x100000
* AIPS1 0x73f00000 + 0x100000 - > 0xf5700000 + 0x100000
2012-05-22 02:50:24 +04:00
* AIPS2 0x83f00000 + 0x100000 - > 0xf5300000 + 0x100000
2011-09-09 13:17:49 +04:00
* mx53 :
* TZIC 0x0fffc000 + 0x004000 - > 0xf4bfc000 + 0x004000
2012-05-22 02:50:24 +04:00
* DEBUG 0x40000000 + 0x100000 - > 0xf5000000 + 0x100000
2011-09-09 13:17:49 +04:00
* SPBA0 0x50000000 + 0x100000 - > 0xf5400000 + 0x100000
* AIPS1 0x53f00000 + 0x100000 - > 0xf5700000 + 0x100000
* AIPS2 0x63f00000 + 0x100000 - > 0xf5300000 + 0x100000
2011-10-02 11:09:11 +04:00
* mx6q :
2012-05-22 02:50:24 +04:00
* SCU 0x00a00000 + 0x004000 - > 0xf4000000 + 0x004000
2011-10-02 11:09:11 +04:00
* CCM 0x020c4000 + 0x004000 - > 0xf42c4000 + 0x004000
2012-05-22 02:50:24 +04:00
* ANATOP 0x020c8000 + 0x004000 - > 0xf42c8000 + 0x004000
2011-10-02 11:09:11 +04:00
* UART4 0x021f0000 + 0x004000 - > 0xf42f0000 + 0x004000
2010-10-25 17:44:25 +04:00
*/
# define IMX_IO_P2V(x) ( \
2012-05-22 02:50:24 +04:00
( ( ( x ) & 0x80000000 ) > > 7 ) | \
( 0xf4000000 + \
2010-10-25 17:44:25 +04:00
( ( ( x ) & 0x50000000 ) > > 6 ) + \
( ( ( x ) & 0x0b000000 ) > > 4 ) + \
2012-05-22 02:50:24 +04:00
( ( ( x ) & 0x000fffff ) ) ) )
2010-10-25 17:44:25 +04:00
# define IMX_IO_ADDRESS(x) IOMEM(IMX_IO_P2V(x))
2012-09-14 10:14:45 +04:00
# include "mxc.h"
2011-04-02 02:15:49 +04:00
2012-09-14 10:14:45 +04:00
# include "mx51.h"
# include "mx53.h"
# include "mx3x.h"
# include "mx31.h"
# include "mx35.h"
# include "mx2x.h"
# include "mx21.h"
# include "mx27.h"
# include "mx1.h"
# include "mx25.h"
2009-06-04 13:32:12 +04:00
2010-10-25 17:38:09 +04:00
# define imx_map_entry(soc, name, _type) { \
. virtual = soc # # _IO_P2V ( soc # # _ # # name # # _BASE_ADDR ) , \
. pfn = __phys_to_pfn ( soc # # _ # # name # # _BASE_ADDR ) , \
. length = soc # # _ # # name # # _SIZE , \
. type = _type , \
}
2011-08-13 20:14:05 +04:00
/* There's a off-by-one betweem the gpio bank number and the gpiochip */
/* range e.g. GPIO_1_5 is gpio 5 under linux */
# define IMX_GPIO_NR(bank, nr) (((bank) - 1) * 32 + (nr))
2008-03-28 12:59:08 +03:00
# endif /* __ASM_ARCH_MXC_HARDWARE_H__ */