2005-04-16 15:20:36 -07:00
/*
* Handle mapping of the NOR flash on implementa A7 boards
*
* Copyright 2002 SYSGO Real - Time Solutions GmbH
2005-11-07 11:15:40 +00:00
*
2005-04-16 15:20:36 -07:00
* 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 .
*/
# include <linux/module.h>
# include <linux/types.h>
# include <linux/kernel.h>
# include <linux/init.h>
# include <asm/io.h>
# include <linux/mtd/mtd.h>
# include <linux/mtd/map.h>
# include <linux/mtd/partitions.h>
# define WINDOW_ADDR0 0x00000000 /* physical properties of flash */
# define WINDOW_SIZE0 0x00800000
# define WINDOW_ADDR1 0x10000000 /* physical properties of flash */
# define WINDOW_SIZE1 0x00800000
# define NUM_FLASHBANKS 2
# define BUSWIDTH 4
# define MSG_PREFIX "impA7:" /* prefix for our printk()'s */
# define MTDID "impa7-%d" /* for mtdparts= partitioning */
static struct mtd_info * impa7_mtd [ NUM_FLASHBANKS ] ;
2013-03-12 10:46:37 +02:00
static const char * const rom_probe_types [ ] = { " jedec_probe " , NULL } ;
2005-04-16 15:20:36 -07:00
static struct map_info impa7_map [ NUM_FLASHBANKS ] = {
{
. name = " impA7 NOR Flash Bank #0 " ,
. size = WINDOW_SIZE0 ,
. bankwidth = BUSWIDTH ,
} ,
{
. name = " impA7 NOR Flash Bank #1 " ,
. size = WINDOW_SIZE1 ,
. bankwidth = BUSWIDTH ,
} ,
} ;
/*
2005-11-07 11:15:40 +00:00
* MTD partitioning stuff
2005-04-16 15:20:36 -07:00
*/
2011-06-02 17:59:44 +04:00
static struct mtd_partition partitions [ ] =
2005-04-16 15:20:36 -07:00
{
{
. name = " FileSystem " ,
. size = 0x800000 ,
. offset = 0x00000000
} ,
} ;
2008-11-25 02:54:59 +02:00
static int __init init_impa7 ( void )
2005-04-16 15:20:36 -07:00
{
2013-03-12 10:46:37 +02:00
const char * const * type ;
2005-04-16 15:20:36 -07:00
int i ;
static struct { u_long addr ; u_long size ; } pt [ NUM_FLASHBANKS ] = {
{ WINDOW_ADDR0 , WINDOW_SIZE0 } ,
{ WINDOW_ADDR1 , WINDOW_SIZE1 } ,
} ;
int devicesfound = 0 ;
for ( i = 0 ; i < NUM_FLASHBANKS ; i + + )
{
printk ( KERN_NOTICE MSG_PREFIX " probing 0x%08lx at 0x%08lx \n " ,
pt [ i ] . size , pt [ i ] . addr ) ;
impa7_map [ i ] . phys = pt [ i ] . addr ;
impa7_map [ i ] . virt = ioremap ( pt [ i ] . addr , pt [ i ] . size ) ;
if ( ! impa7_map [ i ] . virt ) {
printk ( MSG_PREFIX " failed to ioremap \n " ) ;
return - EIO ;
}
simple_map_init ( & impa7_map [ i ] ) ;
2013-08-07 16:12:14 +09:00
impa7_mtd [ i ] = NULL ;
2005-04-16 15:20:36 -07:00
type = rom_probe_types ;
for ( ; ! impa7_mtd [ i ] & & * type ; type + + ) {
impa7_mtd [ i ] = do_map_probe ( * type , & impa7_map [ i ] ) ;
}
if ( impa7_mtd [ i ] ) {
impa7_mtd [ i ] - > owner = THIS_MODULE ;
devicesfound + + ;
mtd: do not use plain 0 as NULL
The first 3 arguments of 'mtd_device_parse_register()' are pointers,
but many callers pass '0' instead of 'NULL'. Fix this globally. Thanks
to coccinelle for making it easy to do with the following semantic patch:
@@
expression mtd, types, parser_data, parts, nr_parts;
@@
(
-mtd_device_parse_register(mtd, 0, parser_data, parts, nr_parts)
+mtd_device_parse_register(mtd, NULL, parser_data, parts, nr_parts)
|
-mtd_device_parse_register(mtd, types, 0, parts, nr_parts)
+mtd_device_parse_register(mtd, types, NULL, parts, nr_parts)
|
-mtd_device_parse_register(mtd, types, parser_data, 0, nr_parts)
+mtd_device_parse_register(mtd, types, parser_data, NULL, nr_parts)
)
Signed-off-by: Artem Bityutskiy <artem.bityutskiy@linux.intel.com>
Signed-off-by: David Woodhouse <David.Woodhouse@intel.com>
2012-03-09 19:24:26 +02:00
mtd_device_parse_register ( impa7_mtd [ i ] , NULL , NULL ,
2011-06-02 17:59:44 +04:00
partitions ,
ARRAY_SIZE ( partitions ) ) ;
2013-08-07 16:12:14 +09:00
} else {
iounmap ( ( void __iomem * ) impa7_map [ i ] . virt ) ;
2005-04-16 15:20:36 -07:00
}
}
return devicesfound = = 0 ? - ENXIO : 0 ;
}
static void __exit cleanup_impa7 ( void )
{
int i ;
for ( i = 0 ; i < NUM_FLASHBANKS ; i + + ) {
if ( impa7_mtd [ i ] ) {
2011-05-23 10:23:04 +01:00
mtd_device_unregister ( impa7_mtd [ i ] ) ;
2005-04-16 15:20:36 -07:00
map_destroy ( impa7_mtd [ i ] ) ;
2013-08-07 16:12:14 +09:00
iounmap ( ( void __iomem * ) impa7_map [ i ] . virt ) ;
impa7_map [ i ] . virt = NULL ;
2005-04-16 15:20:36 -07:00
}
}
}
module_init ( init_impa7 ) ;
module_exit ( cleanup_impa7 ) ;
MODULE_LICENSE ( " GPL " ) ;
MODULE_AUTHOR ( " Pavel Bartusek <pba@sysgo.de> " ) ;
MODULE_DESCRIPTION ( " MTD map driver for implementa impA7 " ) ;