2019-05-19 13:08:20 +01:00
// SPDX-License-Identifier: GPL-2.0-only
2005-04-16 15:20:36 -07:00
/*
* Common code to handle absent " placeholder " devices
* Copyright 2001 Resilience Corporation < ebrower @ resilience . com >
*
* This map driver is used to allocate " placeholder " MTD
2005-11-07 11:15:37 +00:00
* devices on systems that have socketed / removable media .
* Use of this driver as a fallback preserves the expected
2005-04-16 15:20:36 -07:00
* registration of MTD device nodes regardless of probe outcome .
* A usage example is as follows :
*
* my_dev [ i ] = do_map_probe ( " cfi " , & my_map [ i ] ) ;
* if ( NULL = = my_dev [ i ] ) {
* my_dev [ i ] = do_map_probe ( " map_absent " , & my_map [ i ] ) ;
* }
*
* Any device ' probed ' with this driver will return - ENODEV
* upon open .
*/
# include <linux/module.h>
# include <linux/types.h>
# include <linux/kernel.h>
# include <linux/errno.h>
# include <linux/slab.h>
# include <linux/init.h>
# include <linux/mtd/mtd.h>
# include <linux/mtd/map.h>
static int map_absent_read ( struct mtd_info * , loff_t , size_t , size_t * , u_char * ) ;
static int map_absent_write ( struct mtd_info * , loff_t , size_t , size_t * , const u_char * ) ;
static int map_absent_erase ( struct mtd_info * , struct erase_info * ) ;
static void map_absent_sync ( struct mtd_info * ) ;
static struct mtd_info * map_absent_probe ( struct map_info * map ) ;
static void map_absent_destroy ( struct mtd_info * ) ;
static struct mtd_chip_driver map_absent_chipdrv = {
. probe = map_absent_probe ,
. destroy = map_absent_destroy ,
. name = " map_absent " ,
. module = THIS_MODULE
} ;
static struct mtd_info * map_absent_probe ( struct map_info * map )
{
struct mtd_info * mtd ;
2006-11-15 21:10:29 +02:00
mtd = kzalloc ( sizeof ( * mtd ) , GFP_KERNEL ) ;
2005-04-16 15:20:36 -07:00
if ( ! mtd ) {
return NULL ;
}
map - > fldrv = & map_absent_chipdrv ;
mtd - > priv = map ;
mtd - > name = map - > name ;
mtd - > type = MTD_ABSENT ;
mtd - > size = map - > size ;
2012-01-30 14:58:32 +02:00
mtd - > _erase = map_absent_erase ;
mtd - > _read = map_absent_read ;
mtd - > _write = map_absent_write ;
mtd - > _sync = map_absent_sync ;
2005-04-16 15:20:36 -07:00
mtd - > flags = 0 ;
2006-06-22 18:15:48 +04:00
mtd - > erasesize = PAGE_SIZE ;
mtd - > writesize = 1 ;
2005-04-16 15:20:36 -07:00
__module_get ( THIS_MODULE ) ;
return mtd ;
}
static int map_absent_read ( struct mtd_info * mtd , loff_t from , size_t len , size_t * retlen , u_char * buf )
{
return - ENODEV ;
}
static int map_absent_write ( struct mtd_info * mtd , loff_t to , size_t len , size_t * retlen , const u_char * buf )
{
2005-11-07 11:15:37 +00:00
return - ENODEV ;
2005-04-16 15:20:36 -07:00
}
static int map_absent_erase ( struct mtd_info * mtd , struct erase_info * instr )
{
return - ENODEV ;
}
static void map_absent_sync ( struct mtd_info * mtd )
{
/* nop */
}
static void map_absent_destroy ( struct mtd_info * mtd )
{
/* nop */
}
static int __init map_absent_init ( void )
{
register_mtd_chip_driver ( & map_absent_chipdrv ) ;
return 0 ;
}
static void __exit map_absent_exit ( void )
{
unregister_mtd_chip_driver ( & map_absent_chipdrv ) ;
}
module_init ( map_absent_init ) ;
module_exit ( map_absent_exit ) ;
MODULE_LICENSE ( " GPL " ) ;
MODULE_AUTHOR ( " Resilience Corporation - Eric Brower <ebrower@resilience.com> " ) ;
MODULE_DESCRIPTION ( " Placeholder MTD chip driver for 'absent' chips " ) ;