2005-04-17 02:20:36 +04:00
/*
* Simple read - only ( writable only for RAM ) mtdblock driver
2010-08-08 23:58:20 +04:00
*
* Copyright © 2001 - 2010 David Woodhouse < dwmw2 @ infradead . 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 . , 51 Franklin St , Fifth Floor , Boston , MA 02110 - 1301 USA
*
2005-04-17 02:20:36 +04:00
*/
# include <linux/init.h>
# include <linux/slab.h>
# include <linux/mtd/mtd.h>
# include <linux/mtd/blktrans.h>
2011-07-03 23:17:31 +04:00
# include <linux/module.h>
2013-10-14 01:05:23 +04:00
# include <linux/major.h>
2005-04-17 02:20:36 +04:00
static int mtdblock_readsect ( struct mtd_blktrans_dev * dev ,
unsigned long block , char * buf )
{
size_t retlen ;
2011-12-23 19:30:16 +04:00
if ( mtd_read ( dev - > mtd , ( block * 512 ) , 512 , & retlen , buf ) )
2005-04-17 02:20:36 +04:00
return 1 ;
return 0 ;
}
static int mtdblock_writesect ( struct mtd_blktrans_dev * dev ,
unsigned long block , char * buf )
{
size_t retlen ;
2011-12-23 19:35:41 +04:00
if ( mtd_write ( dev - > mtd , ( block * 512 ) , 512 , & retlen , buf ) )
2005-04-17 02:20:36 +04:00
return 1 ;
return 0 ;
}
static void mtdblock_add_mtd ( struct mtd_blktrans_ops * tr , struct mtd_info * mtd )
{
2006-11-15 22:10:29 +03:00
struct mtd_blktrans_dev * dev = kzalloc ( sizeof ( * dev ) , GFP_KERNEL ) ;
2005-04-17 02:20:36 +04:00
if ( ! dev )
return ;
dev - > mtd = mtd ;
dev - > devnum = mtd - > index ;
2006-10-27 12:09:33 +04:00
2005-04-17 02:20:36 +04:00
dev - > size = mtd - > size > > 9 ;
dev - > tr = tr ;
2006-04-13 20:53:55 +04:00
dev - > readonly = 1 ;
2005-04-17 02:20:36 +04:00
2010-02-22 21:39:31 +03:00
if ( add_mtd_blktrans_dev ( dev ) )
kfree ( dev ) ;
2005-04-17 02:20:36 +04:00
}
static void mtdblock_remove_dev ( struct mtd_blktrans_dev * dev )
{
del_mtd_blktrans_dev ( dev ) ;
}
static struct mtd_blktrans_ops mtdblock_tr = {
. name = " mtdblock " ,
2013-10-09 03:59:08 +04:00
. major = MTD_BLOCK_MAJOR ,
2005-04-17 02:20:36 +04:00
. part_bits = 0 ,
2006-10-27 12:09:33 +04:00
. blksize = 512 ,
2005-04-17 02:20:36 +04:00
. readsect = mtdblock_readsect ,
. writesect = mtdblock_writesect ,
. add_mtd = mtdblock_add_mtd ,
. remove_dev = mtdblock_remove_dev ,
. owner = THIS_MODULE ,
} ;
static int __init mtdblock_init ( void )
{
return register_mtd_blktrans ( & mtdblock_tr ) ;
}
static void __exit mtdblock_exit ( void )
{
deregister_mtd_blktrans ( & mtdblock_tr ) ;
}
module_init ( mtdblock_init ) ;
module_exit ( mtdblock_exit ) ;
MODULE_LICENSE ( " GPL " ) ;
MODULE_AUTHOR ( " David Woodhouse <dwmw2@infradead.org> " ) ;
MODULE_DESCRIPTION ( " Simple read-only block device emulation access to MTD devices " ) ;