Linux kernel & device driver programming

Cross-Referenced Linux and Device Driver Code

[ source navigation ] [ diff markup ] [ identifier search ] [ freetext search ] [ file search ]
Version: [ 2.6.11.8 ] [ 2.6.25 ] [ 2.6.25.8 ] [ 2.6.31.13 ] Architecture: [ i386 ]
  1 /*
  2  * $Id: mtdblock_ro.c,v 1.19 2004/11/16 18:28:59 dwmw2 Exp $
  3  *
  4  * (C) 2003 David Woodhouse <dwmw2@infradead.org>
  5  *
  6  * Simple read-only (writable only for RAM) mtdblock driver
  7  */
  8 
  9 #include <linux/init.h>
 10 #include <linux/slab.h>
 11 #include <linux/mtd/mtd.h>
 12 #include <linux/mtd/blktrans.h>
 13 
 14 static int mtdblock_readsect(struct mtd_blktrans_dev *dev,
 15                               unsigned long block, char *buf)
 16 {
 17         size_t retlen;
 18 
 19         if (dev->mtd->read(dev->mtd, (block * 512), 512, &retlen, buf))
 20                 return 1;
 21         return 0;
 22 }
 23 
 24 static int mtdblock_writesect(struct mtd_blktrans_dev *dev,
 25                               unsigned long block, char *buf)
 26 {
 27         size_t retlen;
 28 
 29         if (dev->mtd->write(dev->mtd, (block * 512), 512, &retlen, buf))
 30                 return 1;
 31         return 0;
 32 }
 33 
 34 static void mtdblock_add_mtd(struct mtd_blktrans_ops *tr, struct mtd_info *mtd)
 35 {
 36         struct mtd_blktrans_dev *dev = kmalloc(sizeof(*dev), GFP_KERNEL);
 37 
 38         if (!dev)
 39                 return;
 40 
 41         memset(dev, 0, sizeof(*dev));
 42 
 43         dev->mtd = mtd;
 44         dev->devnum = mtd->index;
 45         dev->blksize = 512;
 46         dev->size = mtd->size >> 9;
 47         dev->tr = tr;
 48         if ((mtd->flags & (MTD_CLEAR_BITS|MTD_SET_BITS|MTD_WRITEABLE)) !=
 49             (MTD_CLEAR_BITS|MTD_SET_BITS|MTD_WRITEABLE))
 50                 dev->readonly = 1;
 51 
 52         add_mtd_blktrans_dev(dev);
 53 }
 54 
 55 static void mtdblock_remove_dev(struct mtd_blktrans_dev *dev)
 56 {
 57         del_mtd_blktrans_dev(dev);
 58         kfree(dev);
 59 }
 60 
 61 static struct mtd_blktrans_ops mtdblock_tr = {
 62         .name           = "mtdblock",
 63         .major          = 31,
 64         .part_bits      = 0,
 65         .readsect       = mtdblock_readsect,
 66         .writesect      = mtdblock_writesect,
 67         .add_mtd        = mtdblock_add_mtd,
 68         .remove_dev     = mtdblock_remove_dev,
 69         .owner          = THIS_MODULE,
 70 };
 71 
 72 static int __init mtdblock_init(void)
 73 {
 74         return register_mtd_blktrans(&mtdblock_tr);
 75 }
 76 
 77 static void __exit mtdblock_exit(void)
 78 {
 79         deregister_mtd_blktrans(&mtdblock_tr);
 80 }
 81 
 82 module_init(mtdblock_init);
 83 module_exit(mtdblock_exit);
 84 
 85 MODULE_LICENSE("GPL");
 86 MODULE_AUTHOR("David Woodhouse <dwmw2@infradead.org>");
 87 MODULE_DESCRIPTION("Simple read-only block device emulation access to MTD devices");
 88 
  This page was automatically generated by the LXR engine.