2005-04-16 15:20:36 -07:00
/****************************************************************************/
/*
* uclinux . c - - generic memory mapped MTD driver for uclinux
*
* ( C ) Copyright 2002 , Greg Ungerer ( gerg @ snapgear . com )
*
2005-11-07 11:15:40 +00:00
* $ Id : uclinux . c , v 1.12 2005 / 11 / 07 11 : 14 : 29 gleixner Exp $
2005-04-16 15:20:36 -07:00
*/
/****************************************************************************/
# include <linux/module.h>
# include <linux/types.h>
# include <linux/init.h>
# include <linux/kernel.h>
# include <linux/fs.h>
# include <linux/major.h>
# include <linux/root_dev.h>
# include <linux/mtd/mtd.h>
# include <linux/mtd/map.h>
# include <linux/mtd/partitions.h>
# include <asm/io.h>
/****************************************************************************/
struct map_info uclinux_ram_map = {
. name = " RAM " ,
} ;
struct mtd_info * uclinux_ram_mtdinfo ;
/****************************************************************************/
struct mtd_partition uclinux_romfs [ ] = {
{ . name = " ROMfs " }
} ;
2006-03-31 02:29:45 -08:00
# define NUM_PARTITIONS ARRAY_SIZE(uclinux_romfs)
2005-04-16 15:20:36 -07:00
/****************************************************************************/
int uclinux_point ( struct mtd_info * mtd , loff_t from , size_t len ,
size_t * retlen , u_char * * mtdbuf )
{
struct map_info * map = mtd - > priv ;
* mtdbuf = ( u_char * ) ( map - > virt + ( ( int ) from ) ) ;
* retlen = len ;
return ( 0 ) ;
}
/****************************************************************************/
int __init uclinux_mtd_init ( void )
{
struct mtd_info * mtd ;
struct map_info * mapp ;
extern char _ebss ;
2005-09-12 11:18:10 +10:00
unsigned long addr = ( unsigned long ) & _ebss ;
2005-04-16 15:20:36 -07:00
mapp = & uclinux_ram_map ;
2005-09-12 11:18:10 +10:00
mapp - > phys = addr ;
mapp - > size = PAGE_ALIGN ( ntohl ( * ( ( unsigned long * ) ( addr + 8 ) ) ) ) ;
2005-04-16 15:20:36 -07:00
mapp - > bankwidth = 4 ;
printk ( " uclinux[mtd]: RAM probe address=0x%x size=0x%x \n " ,
2005-09-12 11:18:10 +10:00
( int ) mapp - > phys , ( int ) mapp - > size ) ;
2005-04-16 15:20:36 -07:00
mapp - > virt = ioremap_nocache ( mapp - > phys , mapp - > size ) ;
if ( mapp - > virt = = 0 ) {
printk ( " uclinux[mtd]: ioremap_nocache() failed \n " ) ;
return ( - EIO ) ;
}
simple_map_init ( mapp ) ;
mtd = do_map_probe ( " map_ram " , mapp ) ;
if ( ! mtd ) {
printk ( " uclinux[mtd]: failed to find a mapping? \n " ) ;
iounmap ( mapp - > virt ) ;
return ( - ENXIO ) ;
}
2005-11-07 11:15:40 +00:00
2005-04-16 15:20:36 -07:00
mtd - > owner = THIS_MODULE ;
mtd - > point = uclinux_point ;
mtd - > priv = mapp ;
uclinux_ram_mtdinfo = mtd ;
add_mtd_partitions ( mtd , uclinux_romfs , NUM_PARTITIONS ) ;
printk ( " uclinux[mtd]: set %s to be root filesystem \n " ,
uclinux_romfs [ 0 ] . name ) ;
ROOT_DEV = MKDEV ( MTD_BLOCK_MAJOR , 0 ) ;
return ( 0 ) ;
}
/****************************************************************************/
void __exit uclinux_mtd_cleanup ( void )
{
if ( uclinux_ram_mtdinfo ) {
del_mtd_partitions ( uclinux_ram_mtdinfo ) ;
map_destroy ( uclinux_ram_mtdinfo ) ;
uclinux_ram_mtdinfo = NULL ;
}
2005-09-12 11:18:10 +10:00
if ( uclinux_ram_map . virt ) {
2005-04-16 15:20:36 -07:00
iounmap ( ( void * ) uclinux_ram_map . virt ) ;
uclinux_ram_map . virt = 0 ;
}
}
/****************************************************************************/
module_init ( uclinux_mtd_init ) ;
module_exit ( uclinux_mtd_cleanup ) ;
MODULE_LICENSE ( " GPL " ) ;
MODULE_AUTHOR ( " Greg Ungerer <gerg@snapgear.com> " ) ;
MODULE_DESCRIPTION ( " Generic RAM based MTD for uClinux " ) ;
/****************************************************************************/