2005-04-16 15:20:36 -07:00
/*
2005-11-07 11:15:40 +00:00
* $ Id : iq80310 . c , v 1.21 2005 / 11 / 07 11 : 14 : 27 gleixner Exp $
2005-04-16 15:20:36 -07:00
*
* Mapping for the Intel XScale IQ80310 evaluation board
*
* Author : Nicolas Pitre
* Copyright : ( C ) 2001 MontaVista Software Inc .
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 <linux/slab.h>
# include <asm/io.h>
# include <linux/mtd/mtd.h>
# include <linux/mtd/map.h>
# include <linux/mtd/partitions.h>
# define WINDOW_ADDR 0
# define WINDOW_SIZE 8*1024*1024
# define BUSWIDTH 1
static struct mtd_info * mymtd ;
static struct map_info iq80310_map = {
. name = " IQ80310 flash " ,
. size = WINDOW_SIZE ,
. bankwidth = BUSWIDTH ,
. phys = WINDOW_ADDR
} ;
static struct mtd_partition iq80310_partitions [ 4 ] = {
{
. name = " Firmware " ,
. size = 0x00080000 ,
. offset = 0 ,
. mask_flags = MTD_WRITEABLE /* force read-only */
} , {
. name = " Kernel " ,
. size = 0x000a0000 ,
. offset = 0x00080000 ,
} , {
. name = " Filesystem " ,
. size = 0x00600000 ,
. offset = 0x00120000
} , {
. name = " RedBoot " ,
. size = 0x000e0000 ,
. offset = 0x00720000 ,
. mask_flags = MTD_WRITEABLE
}
} ;
static struct mtd_info * mymtd ;
static struct mtd_partition * parsed_parts ;
static const char * probes [ ] = { " RedBoot " , " cmdlinepart " , NULL } ;
static int __init init_iq80310 ( void )
{
struct mtd_partition * parts ;
int nb_parts = 0 ;
int parsed_nr_parts = 0 ;
int ret ;
iq80310_map . virt = ioremap ( WINDOW_ADDR , WINDOW_SIZE ) ;
if ( ! iq80310_map . virt ) {
printk ( " Failed to ioremap \n " ) ;
return - EIO ;
}
simple_map_init ( & iq80310_map ) ;
mymtd = do_map_probe ( " cfi_probe " , & iq80310_map ) ;
if ( ! mymtd ) {
iounmap ( ( void * ) iq80310_map . virt ) ;
return - ENXIO ;
}
mymtd - > owner = THIS_MODULE ;
ret = parse_mtd_partitions ( mymtd , probes , & parsed_parts , 0 ) ;
if ( ret > 0 )
parsed_nr_parts = ret ;
if ( parsed_nr_parts > 0 ) {
parts = parsed_parts ;
nb_parts = parsed_nr_parts ;
} else {
parts = iq80310_partitions ;
nb_parts = ARRAY_SIZE ( iq80310_partitions ) ;
}
add_mtd_partitions ( mymtd , parts , nb_parts ) ;
return 0 ;
}
static void __exit cleanup_iq80310 ( void )
{
if ( mymtd ) {
del_mtd_partitions ( mymtd ) ;
map_destroy ( mymtd ) ;
2005-11-07 01:01:27 -08:00
kfree ( parsed_parts ) ;
2005-04-16 15:20:36 -07:00
}
if ( iq80310_map . virt )
iounmap ( ( void * ) iq80310_map . virt ) ;
}
module_init ( init_iq80310 ) ;
module_exit ( cleanup_iq80310 ) ;
MODULE_LICENSE ( " GPL " ) ;
MODULE_AUTHOR ( " Nicolas Pitre <nico@cam.org> " ) ;
MODULE_DESCRIPTION ( " MTD map driver for Intel XScale IQ80310 evaluation board " ) ;