2005-04-17 02:20:36 +04:00
/* netsc520.c -- MTD map driver for AMD NetSc520 Demonstration Board
*
* Copyright ( C ) 2001 Mark Langsdorf ( mark . langsdorf @ amd . com )
* based on sc520cdp . c by Sysgo Real - Time Solutions GmbH
*
* This program is free software ; you can redistribute it and / or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation ; either version 2 of the License , or
* ( at your option ) any later version .
*
* This program is distributed in the hope that it will be useful ,
* but WITHOUT ANY WARRANTY ; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE . See the
* GNU General Public License for more details .
*
* You should have received a copy of the GNU General Public License
* along with this program ; if not , write to the Free Software
* Foundation , Inc . , 59 Temple Place - Suite 330 , Boston , MA 02111 - 1307 , USA
*
* The NetSc520 is a demonstration board for the Elan Sc520 processor available
* from AMD . It has a single back of 16 megs of 32 - bit Flash ROM and another
* 16 megs of SDRAM .
*/
# 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>
/*
* * The single , 16 megabyte flash bank is divided into four virtual
* * partitions . The first partition is 768 KiB and is intended to
* * store the kernel image loaded by the bootstrap loader . The second
2005-11-07 14:15:40 +03:00
* * partition is 256 KiB and holds the BIOS image . The third
2005-04-17 02:20:36 +04:00
* * partition is 14.5 MiB and is intended for the flash file system
* * image . The last partition is 512 KiB and contains another copy
* * of the BIOS image and the reset vector .
* *
* * Only the third partition should be mounted . The first partition
* * should not be mounted , but it can erased and written to using the
* * MTD character routines . The second and fourth partitions should
* * not be touched - it is possible to corrupt the BIOS image by
* * mounting these partitions , and potentially the board will not be
* * recoverable afterwards .
*/
2005-11-07 14:15:40 +03:00
/* partition_info gives details on the logical partitions that the split the
2005-04-17 02:20:36 +04:00
* single flash device into . If the size if zero we use up to the end of the
* device . */
static struct mtd_partition partition_info [ ] = {
2005-11-07 14:15:40 +03:00
{
. name = " NetSc520 boot kernel " ,
. offset = 0 ,
2005-04-17 02:20:36 +04:00
. size = 0xc0000
} ,
2005-11-07 14:15:40 +03:00
{
. name = " NetSc520 Low BIOS " ,
. offset = 0xc0000 ,
2005-04-17 02:20:36 +04:00
. size = 0x40000
} ,
2005-11-07 14:15:40 +03:00
{
. name = " NetSc520 file system " ,
. offset = 0x100000 ,
2005-04-17 02:20:36 +04:00
. size = 0xe80000
} ,
2005-11-07 14:15:40 +03:00
{
. name = " NetSc520 High BIOS " ,
. offset = 0xf80000 ,
2005-04-17 02:20:36 +04:00
. size = 0x80000
} ,
} ;
2006-03-31 14:29:45 +04:00
# define NUM_PARTITIONS ARRAY_SIZE(partition_info)
2005-04-17 02:20:36 +04:00
# define WINDOW_SIZE 0x00100000
# define WINDOW_ADDR 0x00200000
static struct map_info netsc520_map = {
. name = " netsc520 Flash Bank " ,
. size = WINDOW_SIZE ,
. bankwidth = 4 ,
. phys = WINDOW_ADDR ,
} ;
2006-03-31 14:29:45 +04:00
# define NUM_FLASH_BANKS ARRAY_SIZE(netsc520_map)
2005-04-17 02:20:36 +04:00
static struct mtd_info * mymtd ;
static int __init init_netsc520 ( void )
{
2007-02-18 03:02:07 +03:00
printk ( KERN_NOTICE " NetSc520 flash device: 0x%Lx at 0x%Lx \n " ,
( unsigned long long ) netsc520_map . size ,
( unsigned long long ) netsc520_map . phys ) ;
2005-04-17 02:20:36 +04:00
netsc520_map . virt = ioremap_nocache ( netsc520_map . phys , netsc520_map . size ) ;
if ( ! netsc520_map . virt ) {
printk ( " Failed to ioremap_nocache \n " ) ;
return - EIO ;
}
simple_map_init ( & netsc520_map ) ;
mymtd = do_map_probe ( " cfi_probe " , & netsc520_map ) ;
if ( ! mymtd )
mymtd = do_map_probe ( " map_ram " , & netsc520_map ) ;
if ( ! mymtd )
mymtd = do_map_probe ( " map_rom " , & netsc520_map ) ;
if ( ! mymtd ) {
iounmap ( netsc520_map . virt ) ;
return - ENXIO ;
}
2005-11-07 14:15:40 +03:00
2005-04-17 02:20:36 +04:00
mymtd - > owner = THIS_MODULE ;
2011-05-23 13:23:40 +04:00
mtd_device_register ( mymtd , partition_info , NUM_PARTITIONS ) ;
2005-04-17 02:20:36 +04:00
return 0 ;
}
static void __exit cleanup_netsc520 ( void )
{
if ( mymtd ) {
2011-05-23 13:23:40 +04:00
mtd_device_unregister ( mymtd ) ;
2005-04-17 02:20:36 +04:00
map_destroy ( mymtd ) ;
}
if ( netsc520_map . virt ) {
iounmap ( netsc520_map . virt ) ;
netsc520_map . virt = NULL ;
}
}
module_init ( init_netsc520 ) ;
module_exit ( cleanup_netsc520 ) ;
MODULE_LICENSE ( " GPL " ) ;
MODULE_AUTHOR ( " Mark Langsdorf <mark.langsdorf@amd.com> " ) ;
MODULE_DESCRIPTION ( " MTD map driver for AMD NetSc520 Demonstration Board " ) ;