linux/drivers/mtd/mtdblock_ro.c
<<
>>
Prefs
   1// SPDX-License-Identifier: GPL-2.0-or-later
   2/*
   3 * Simple read-only (writable only for RAM) mtdblock driver
   4 *
   5 * Copyright \xC2\xA9 2001-2010 David Woodhouse <dwmw2@infradead.org>
   6 */
   7
   8#include <linux/init.h>
   9#include <linux/slab.h>
  10#include <linux/mtd/mtd.h>
  11#include <linux/mtd/blktrans.h>
  12#include <linux/module.h>
  13#include <linux/major.h>
  14
  15static int mtdblock_readsect(struct mtd_blktrans_dev *dev,
  16                              unsigned long block, char *buf)
  17{
  18        size_t retlen;
  19
  20        if (mtd_read(dev->mtd, (block * 512), 512, &retlen, buf))
  21                return 1;
  22        return 0;
  23}
  24
  25static int mtdblock_writesect(struct mtd_blktrans_dev *dev,
  26                              unsigned long block, char *buf)
  27{
  28        size_t retlen;
  29
  30        if (mtd_write(dev->mtd, (block * 512), 512, &retlen, buf))
  31                return 1;
  32        return 0;
  33}
  34
  35static void mtdblock_add_mtd(struct mtd_blktrans_ops *tr, struct mtd_info *mtd)
  36{
  37        struct mtd_blktrans_dev *dev = kzalloc(sizeof(*dev), GFP_KERNEL);
  38
  39        if (!dev)
  40                return;
  41
  42        dev->mtd = mtd;
  43        dev->devnum = mtd->index;
  44
  45        dev->size = mtd->size >> 9;
  46        dev->tr = tr;
  47        dev->readonly = 1;
  48
  49        if (add_mtd_blktrans_dev(dev))
  50                kfree(dev);
  51}
  52
  53static void mtdblock_remove_dev(struct mtd_blktrans_dev *dev)
  54{
  55        del_mtd_blktrans_dev(dev);
  56}
  57
  58static struct mtd_blktrans_ops mtdblock_tr = {
  59        .name           = "mtdblock",
  60        .major          = MTD_BLOCK_MAJOR,
  61        .part_bits      = 0,
  62        .blksize        = 512,
  63        .readsect       = mtdblock_readsect,
  64        .writesect      = mtdblock_writesect,
  65        .add_mtd        = mtdblock_add_mtd,
  66        .remove_dev     = mtdblock_remove_dev,
  67        .owner          = THIS_MODULE,
  68};
  69
  70module_mtd_blktrans(mtdblock_tr);
  71
  72MODULE_LICENSE("GPL");
  73MODULE_AUTHOR("David Woodhouse <dwmw2@infradead.org>");
  74MODULE_DESCRIPTION("Simple read-only block device emulation access to MTD devices");
  75