2005-04-17 02:20:36 +04:00
/*
* ts5500_flash . c - - MTD map driver for Technology Systems TS - 5500 board
*
* Copyright ( C ) 2004 Sean Young < sean @ mess . org >
*
* 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
*
* Note :
* - In order for detection to work , jumper 3 must be set .
2005-11-07 14:15:40 +03:00
* - Drive A and B use the resident flash disk ( RFD ) flash translation layer .
* - If you have created your own jffs file system and the bios overwrites
2005-04-17 02:20:36 +04:00
* it during boot , try disabling Drive A : and B : in the boot order .
*/
2005-06-29 13:46:19 +04:00
# include <linux/init.h>
2005-04-17 02:20:36 +04:00
# include <linux/module.h>
# include <linux/kernel.h>
# include <linux/mtd/map.h>
2005-06-29 13:46:19 +04:00
# include <linux/mtd/mtd.h>
2005-04-17 02:20:36 +04:00
# include <linux/mtd/partitions.h>
2005-06-29 13:46:19 +04:00
# include <linux/types.h>
2005-04-17 02:20:36 +04:00
# define WINDOW_ADDR 0x09400000
# define WINDOW_SIZE 0x00200000
static struct map_info ts5500_map = {
. name = " TS-5500 Flash " ,
. size = WINDOW_SIZE ,
. bankwidth = 1 ,
. phys = WINDOW_ADDR
} ;
2017-08-28 11:24:57 +03:00
static const struct mtd_partition ts5500_partitions [ ] = {
2005-04-17 02:20:36 +04:00
{
. name = " Drive A " ,
. offset = 0 ,
. size = 0x0e0000
} ,
{
. name = " BIOS " ,
. offset = 0x0e0000 ,
. size = 0x020000 ,
} ,
{
. name = " Drive B " ,
. offset = 0x100000 ,
. size = 0x100000
}
} ;
2006-03-31 14:29:45 +04:00
# define NUM_PARTITIONS ARRAY_SIZE(ts5500_partitions)
2005-04-17 02:20:36 +04:00
static struct mtd_info * mymtd ;
static int __init init_ts5500_map ( void )
{
int rc = 0 ;
ts5500_map . virt = ioremap_nocache ( ts5500_map . phys , ts5500_map . size ) ;
2005-06-29 13:46:19 +04:00
if ( ! ts5500_map . virt ) {
2005-04-17 02:20:36 +04:00
printk ( KERN_ERR " Failed to ioremap_nocache \n " ) ;
rc = - EIO ;
2005-06-29 13:46:19 +04:00
goto err2 ;
2005-04-17 02:20:36 +04:00
}
simple_map_init ( & ts5500_map ) ;
mymtd = do_map_probe ( " jedec_probe " , & ts5500_map ) ;
2005-06-29 13:46:19 +04:00
if ( ! mymtd )
2005-04-17 02:20:36 +04:00
mymtd = do_map_probe ( " map_rom " , & ts5500_map ) ;
2005-06-29 13:46:19 +04:00
if ( ! mymtd ) {
2005-04-17 02:20:36 +04:00
rc = - ENXIO ;
2005-06-29 13:46:19 +04:00
goto err1 ;
2005-04-17 02:20:36 +04:00
}
mymtd - > owner = THIS_MODULE ;
2011-05-23 13:23:40 +04:00
mtd_device_register ( mymtd , ts5500_partitions , NUM_PARTITIONS ) ;
2005-04-17 02:20:36 +04:00
return 0 ;
2005-06-29 13:46:19 +04:00
err1 :
2005-04-17 02:20:36 +04:00
iounmap ( ts5500_map . virt ) ;
2005-06-29 13:46:19 +04:00
err2 :
2005-04-17 02:20:36 +04:00
return rc ;
}
static void __exit cleanup_ts5500_map ( 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 ( ts5500_map . virt ) {
iounmap ( ts5500_map . virt ) ;
ts5500_map . virt = NULL ;
}
}
module_init ( init_ts5500_map ) ;
module_exit ( cleanup_ts5500_map ) ;
MODULE_LICENSE ( " GPL " ) ;
MODULE_AUTHOR ( " Sean Young <sean@mess.org> " ) ;
2015-03-30 13:06:22 +03:00
MODULE_DESCRIPTION ( " MTD map driver for Technology Systems TS-5500 board " ) ;
2005-04-17 02:20:36 +04:00