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