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 © 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 (mtd_type_is_nand(mtd))
  50                pr_warn("%s: MTD device '%s' is NAND, please consider using UBI block devices instead.\n",
  51                        tr->name, mtd->name);
  52
  53        if (add_mtd_blktrans_dev(dev))
  54                kfree(dev);
  55}
  56
  57static void mtdblock_remove_dev(struct mtd_blktrans_dev *dev)
  58{
  59        del_mtd_blktrans_dev(dev);
  60}
  61
  62static struct mtd_blktrans_ops mtdblock_tr = {
  63        .name           = "mtdblock",
  64        .major          = MTD_BLOCK_MAJOR,
  65        .part_bits      = 0,
  66        .blksize        = 512,
  67        .readsect       = mtdblock_readsect,
  68        .writesect      = mtdblock_writesect,
  69        .add_mtd        = mtdblock_add_mtd,
  70        .remove_dev     = mtdblock_remove_dev,
  71        .owner          = THIS_MODULE,
  72};
  73
  74module_mtd_blktrans(mtdblock_tr);
  75
  76MODULE_LICENSE("GPL");
  77MODULE_AUTHOR("David Woodhouse <dwmw2@infradead.org>");
  78MODULE_DESCRIPTION("Simple read-only block device emulation access to MTD devices");
  79