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 )
2016-03-27 12:13:54 -04:00
*
* License : GPL
2005-04-16 15:20:36 -07:00
*/
/****************************************************************************/
2016-03-27 12:13:54 -04:00
# include <linux/moduleparam.h>
2005-04-16 15:20:36 -07:00
# 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>
2012-05-31 22:39:21 +02:00
# include <asm/sections.h>
2005-04-16 15:20:36 -07:00
/****************************************************************************/
2013-01-16 15:36:55 +01:00
# ifdef CONFIG_MTD_ROM
# define MAP_NAME "rom"
# else
# define MAP_NAME "ram"
# endif
2013-01-16 15:36:56 +01:00
/*
* Blackfin uses uclinux_ram_map during startup , so it must not be static .
* Provide a dummy declaration to make sparse happy .
*/
extern struct map_info uclinux_ram_map ;
2005-04-16 15:20:36 -07:00
struct map_info uclinux_ram_map = {
2013-01-16 15:36:55 +01:00
. name = MAP_NAME ,
2009-05-26 19:33:16 -04:00
. size = 0 ,
2005-04-16 15:20:36 -07:00
} ;
2013-01-16 15:36:55 +01:00
static unsigned long physaddr = - 1 ;
module_param ( physaddr , ulong , S_IRUGO ) ;
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 ;
2013-01-16 15:36:55 +01:00
if ( physaddr = = - 1 )
mapp - > phys = ( resource_size_t ) __bss_stop ;
else
mapp - > phys = physaddr ;
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 ;
2013-01-16 15:36:55 +01:00
printk ( " uclinux[mtd]: 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
2012-07-19 15:42:45 +10:00
/*
* The filesystem is guaranteed to be in direct mapped memory . It is
* directly following the kernels own bss region . Following the same
* mechanism used by architectures setting up traditional initrds we
* use phys_to_virt to get the virtual address of its start .
*/
mapp - > virt = phys_to_virt ( mapp - > phys ) ;
2005-04-16 15:20:36 -07:00
if ( mapp - > virt = = 0 ) {
2012-07-19 15:42:45 +10:00
printk ( " uclinux[mtd]: no virtual mapping? \n " ) ;
2005-04-16 15:20:36 -07:00
return ( - EIO ) ;
}
simple_map_init ( mapp ) ;
2013-01-16 15:36:55 +01:00
mtd = do_map_probe ( " map_ " MAP_NAME , mapp ) ;
2005-04-16 15:20:36 -07:00
if ( ! mtd ) {
printk ( " uclinux[mtd]: failed to find a mapping? \n " ) ;
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 ) ;
}
2016-03-27 12:13:54 -04:00
device_initcall ( uclinux_mtd_init ) ;
2005-04-16 15:20:36 -07:00
/****************************************************************************/