~ubuntu-branches/ubuntu/precise/linux-lowlatency/precise

« back to all changes in this revision

Viewing changes to drivers/mtd/mtdblock_ro.c

  • Committer: Package Import Robot
  • Author(s): Alessio Igor Bogani
  • Date: 2011-10-26 11:13:05 UTC
  • Revision ID: package-import@ubuntu.com-20111026111305-tz023xykf0i6eosh
Tags: upstream-3.2.0
Import upstream version 3.2.0

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
/*
 
2
 * Simple read-only (writable only for RAM) mtdblock driver
 
3
 *
 
4
 * Copyright © 2001-2010 David Woodhouse <dwmw2@infradead.org>
 
5
 *
 
6
 * This program is free software; you can redistribute it and/or modify
 
7
 * it under the terms of the GNU General Public License as published by
 
8
 * the Free Software Foundation; either version 2 of the License, or
 
9
 * (at your option) any later version.
 
10
 *
 
11
 * This program is distributed in the hope that it will be useful,
 
12
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 
13
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 
14
 * GNU General Public License for more details.
 
15
 *
 
16
 * You should have received a copy of the GNU General Public License
 
17
 * along with this program; if not, write to the Free Software
 
18
 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
 
19
 *
 
20
 */
 
21
 
 
22
#include <linux/init.h>
 
23
#include <linux/slab.h>
 
24
#include <linux/mtd/mtd.h>
 
25
#include <linux/mtd/blktrans.h>
 
26
#include <linux/module.h>
 
27
 
 
28
static int mtdblock_readsect(struct mtd_blktrans_dev *dev,
 
29
                              unsigned long block, char *buf)
 
30
{
 
31
        size_t retlen;
 
32
 
 
33
        if (dev->mtd->read(dev->mtd, (block * 512), 512, &retlen, buf))
 
34
                return 1;
 
35
        return 0;
 
36
}
 
37
 
 
38
static int mtdblock_writesect(struct mtd_blktrans_dev *dev,
 
39
                              unsigned long block, char *buf)
 
40
{
 
41
        size_t retlen;
 
42
 
 
43
        if (dev->mtd->write(dev->mtd, (block * 512), 512, &retlen, buf))
 
44
                return 1;
 
45
        return 0;
 
46
}
 
47
 
 
48
static void mtdblock_add_mtd(struct mtd_blktrans_ops *tr, struct mtd_info *mtd)
 
49
{
 
50
        struct mtd_blktrans_dev *dev = kzalloc(sizeof(*dev), GFP_KERNEL);
 
51
 
 
52
        if (!dev)
 
53
                return;
 
54
 
 
55
        dev->mtd = mtd;
 
56
        dev->devnum = mtd->index;
 
57
 
 
58
        dev->size = mtd->size >> 9;
 
59
        dev->tr = tr;
 
60
        dev->readonly = 1;
 
61
 
 
62
        if (add_mtd_blktrans_dev(dev))
 
63
                kfree(dev);
 
64
}
 
65
 
 
66
static void mtdblock_remove_dev(struct mtd_blktrans_dev *dev)
 
67
{
 
68
        del_mtd_blktrans_dev(dev);
 
69
}
 
70
 
 
71
static struct mtd_blktrans_ops mtdblock_tr = {
 
72
        .name           = "mtdblock",
 
73
        .major          = 31,
 
74
        .part_bits      = 0,
 
75
        .blksize        = 512,
 
76
        .readsect       = mtdblock_readsect,
 
77
        .writesect      = mtdblock_writesect,
 
78
        .add_mtd        = mtdblock_add_mtd,
 
79
        .remove_dev     = mtdblock_remove_dev,
 
80
        .owner          = THIS_MODULE,
 
81
};
 
82
 
 
83
static int __init mtdblock_init(void)
 
84
{
 
85
        return register_mtd_blktrans(&mtdblock_tr);
 
86
}
 
87
 
 
88
static void __exit mtdblock_exit(void)
 
89
{
 
90
        deregister_mtd_blktrans(&mtdblock_tr);
 
91
}
 
92
 
 
93
module_init(mtdblock_init);
 
94
module_exit(mtdblock_exit);
 
95
 
 
96
MODULE_LICENSE("GPL");
 
97
MODULE_AUTHOR("David Woodhouse <dwmw2@infradead.org>");
 
98
MODULE_DESCRIPTION("Simple read-only block device emulation access to MTD devices");