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 )
*/
/****************************************************************************/
# include <linux/module.h>
# include <linux/types.h>
# include <linux/init.h>
# include <linux/kernel.h>
# include <linux/fs.h>
2008-07-23 21:28:13 -07:00
# include <linux/mm.h>
2005-04-16 15:20:36 -07:00
# include <linux/major.h>
# include <linux/mtd/mtd.h>
# include <linux/mtd/map.h>
# include <linux/mtd/partitions.h>
# include <asm/io.h>
/****************************************************************************/
2009-05-26 19:33:16 -04:00
extern char _ebss ;
2005-04-16 15:20:36 -07:00
struct map_info uclinux_ram_map = {
. name = " RAM " ,
2009-05-26 19:33:16 -04:00
. phys = ( unsigned long ) & _ebss ,
. size = 0 ,
2005-04-16 15:20:36 -07:00
} ;
2009-05-26 19:33:17 -04:00
static struct mtd_info * uclinux_ram_mtdinfo ;
2005-04-16 15:20:36 -07:00
/****************************************************************************/
2009-05-26 19:33:17 -04:00
static struct mtd_partition uclinux_romfs [ ] = {
2005-04-16 15:20:36 -07:00
{ . 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
/****************************************************************************/
2009-05-26 19:33:17 -04:00
static int uclinux_point ( struct mtd_info * mtd , loff_t from , size_t len ,
2008-04-29 23:26:49 -07:00
size_t * retlen , void * * virt , resource_size_t * phys )
2005-04-16 15:20:36 -07:00
{
struct map_info * map = mtd - > priv ;
2008-04-29 23:26:49 -07:00
* virt = map - > virt + from ;
if ( phys )
* phys = map - > phys + from ;
2005-04-16 15:20:36 -07:00
* retlen = len ;
return ( 0 ) ;
}
/****************************************************************************/
2008-11-25 02:55:09 +02:00
static int __init uclinux_mtd_init ( void )
2005-04-16 15:20:36 -07:00
{
struct mtd_info * mtd ;
struct map_info * mapp ;
mapp = & uclinux_ram_map ;
2009-05-26 19:33:16 -04:00
if ( ! mapp - > size )
mapp - > size = PAGE_ALIGN ( ntohl ( * ( ( unsigned long * ) ( mapp - > phys + 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 ;
2012-01-30 14:58:32 +02:00
mtd - > _point = uclinux_point ;
2005-04-16 15:20:36 -07:00
mtd - > priv = mapp ;
uclinux_ram_mtdinfo = mtd ;
2011-05-23 10:23:12 +01:00
mtd_device_register ( mtd , uclinux_romfs , NUM_PARTITIONS ) ;
2005-04-16 15:20:36 -07:00
return ( 0 ) ;
}
/****************************************************************************/
2008-11-25 02:55:09 +02:00
static void __exit uclinux_mtd_cleanup ( void )
2005-04-16 15:20:36 -07:00
{
if ( uclinux_ram_mtdinfo ) {
2011-05-23 10:23:12 +01:00
mtd_device_unregister ( uclinux_ram_mtdinfo ) ;
2005-04-16 15:20:36 -07:00
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 " ) ;
/****************************************************************************/