1 | /* SPDX-License-Identifier: GPL-2.0-or-later */ |
2 | /* |
3 | * Copyright © 2003-2010 David Woodhouse <dwmw2@infradead.org> |
4 | */ |
5 | |
6 | #ifndef __MTD_TRANS_H__ |
7 | #define __MTD_TRANS_H__ |
8 | |
9 | #include <linux/mutex.h> |
10 | #include <linux/kref.h> |
11 | #include <linux/sysfs.h> |
12 | |
13 | struct hd_geometry; |
14 | struct mtd_info; |
15 | struct mtd_blktrans_ops; |
16 | struct file; |
17 | struct inode; |
18 | |
19 | struct mtd_blktrans_dev { |
20 | struct mtd_blktrans_ops *tr; |
21 | struct list_head list; |
22 | struct mtd_info *mtd; |
23 | struct mutex lock; |
24 | int devnum; |
25 | bool bg_stop; |
26 | unsigned long size; |
27 | int readonly; |
28 | int open; |
29 | struct kref ref; |
30 | struct gendisk *disk; |
31 | struct attribute_group *disk_attributes; |
32 | struct request_queue *rq; |
33 | struct list_head rq_list; |
34 | struct blk_mq_tag_set *tag_set; |
35 | spinlock_t queue_lock; |
36 | void *priv; |
37 | bool writable; |
38 | }; |
39 | |
40 | struct mtd_blktrans_ops { |
41 | char *name; |
42 | int major; |
43 | int part_bits; |
44 | int blksize; |
45 | int blkshift; |
46 | |
47 | /* Access functions */ |
48 | int (*readsect)(struct mtd_blktrans_dev *dev, |
49 | unsigned long block, char *buffer); |
50 | int (*writesect)(struct mtd_blktrans_dev *dev, |
51 | unsigned long block, char *buffer); |
52 | int (*discard)(struct mtd_blktrans_dev *dev, |
53 | unsigned long block, unsigned nr_blocks); |
54 | void (*background)(struct mtd_blktrans_dev *dev); |
55 | |
56 | /* Block layer ioctls */ |
57 | int (*getgeo)(struct mtd_blktrans_dev *dev, struct hd_geometry *geo); |
58 | int (*flush)(struct mtd_blktrans_dev *dev); |
59 | |
60 | /* Called with mtd_table_mutex held; no race with add/remove */ |
61 | int (*open)(struct mtd_blktrans_dev *dev); |
62 | void (*release)(struct mtd_blktrans_dev *dev); |
63 | |
64 | /* Called on {de,}registration and on subsequent addition/removal |
65 | of devices, with mtd_table_mutex held. */ |
66 | void (*add_mtd)(struct mtd_blktrans_ops *tr, struct mtd_info *mtd); |
67 | void (*remove_dev)(struct mtd_blktrans_dev *dev); |
68 | |
69 | struct list_head devs; |
70 | struct list_head list; |
71 | struct module *owner; |
72 | }; |
73 | |
74 | extern int register_mtd_blktrans(struct mtd_blktrans_ops *tr); |
75 | extern int deregister_mtd_blktrans(struct mtd_blktrans_ops *tr); |
76 | extern int add_mtd_blktrans_dev(struct mtd_blktrans_dev *dev); |
77 | extern int del_mtd_blktrans_dev(struct mtd_blktrans_dev *dev); |
78 | extern int mtd_blktrans_cease_background(struct mtd_blktrans_dev *dev); |
79 | |
80 | /** |
81 | * module_mtd_blktrans() - Helper macro for registering a mtd blktrans driver |
82 | * @__mtd_blktrans: mtd_blktrans_ops struct |
83 | * |
84 | * Helper macro for mtd blktrans drivers which do not do anything special in |
85 | * module init/exit. This eliminates a lot of boilerplate. Each module may only |
86 | * use this macro once, and calling it replaces module_init() and module_exit() |
87 | */ |
88 | #define module_mtd_blktrans(__mtd_blktrans) \ |
89 | module_driver(__mtd_blktrans, register_mtd_blktrans, \ |
90 | deregister_mtd_blktrans) |
91 | |
92 | #endif /* __MTD_TRANS_H__ */ |
93 | |