xref: /OK3568_Linux_fs/kernel/include/linux/mtd/blktrans.h (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1*4882a593Smuzhiyun /* SPDX-License-Identifier: GPL-2.0-or-later */
2*4882a593Smuzhiyun /*
3*4882a593Smuzhiyun  * Copyright © 2003-2010 David Woodhouse <dwmw2@infradead.org>
4*4882a593Smuzhiyun  */
5*4882a593Smuzhiyun 
6*4882a593Smuzhiyun #ifndef __MTD_TRANS_H__
7*4882a593Smuzhiyun #define __MTD_TRANS_H__
8*4882a593Smuzhiyun 
9*4882a593Smuzhiyun #include <linux/mutex.h>
10*4882a593Smuzhiyun #include <linux/kref.h>
11*4882a593Smuzhiyun #include <linux/sysfs.h>
12*4882a593Smuzhiyun 
13*4882a593Smuzhiyun struct hd_geometry;
14*4882a593Smuzhiyun struct mtd_info;
15*4882a593Smuzhiyun struct mtd_blktrans_ops;
16*4882a593Smuzhiyun struct file;
17*4882a593Smuzhiyun struct inode;
18*4882a593Smuzhiyun 
19*4882a593Smuzhiyun struct mtd_blktrans_dev {
20*4882a593Smuzhiyun 	struct mtd_blktrans_ops *tr;
21*4882a593Smuzhiyun 	struct list_head list;
22*4882a593Smuzhiyun 	struct mtd_info *mtd;
23*4882a593Smuzhiyun 	struct mutex lock;
24*4882a593Smuzhiyun 	int devnum;
25*4882a593Smuzhiyun 	bool bg_stop;
26*4882a593Smuzhiyun 	unsigned long size;
27*4882a593Smuzhiyun 	int readonly;
28*4882a593Smuzhiyun 	int open;
29*4882a593Smuzhiyun 	struct kref ref;
30*4882a593Smuzhiyun 	struct gendisk *disk;
31*4882a593Smuzhiyun 	struct attribute_group *disk_attributes;
32*4882a593Smuzhiyun 	struct request_queue *rq;
33*4882a593Smuzhiyun 	struct list_head rq_list;
34*4882a593Smuzhiyun 	struct blk_mq_tag_set *tag_set;
35*4882a593Smuzhiyun 	spinlock_t queue_lock;
36*4882a593Smuzhiyun 	void *priv;
37*4882a593Smuzhiyun 	fmode_t file_mode;
38*4882a593Smuzhiyun };
39*4882a593Smuzhiyun 
40*4882a593Smuzhiyun struct mtd_blktrans_ops {
41*4882a593Smuzhiyun 	char *name;
42*4882a593Smuzhiyun 	int major;
43*4882a593Smuzhiyun 	int part_bits;
44*4882a593Smuzhiyun 	int blksize;
45*4882a593Smuzhiyun 	int blkshift;
46*4882a593Smuzhiyun 
47*4882a593Smuzhiyun 	/* Access functions */
48*4882a593Smuzhiyun 	int (*readsect)(struct mtd_blktrans_dev *dev,
49*4882a593Smuzhiyun 		    unsigned long block, char *buffer);
50*4882a593Smuzhiyun 	int (*writesect)(struct mtd_blktrans_dev *dev,
51*4882a593Smuzhiyun 		     unsigned long block, char *buffer);
52*4882a593Smuzhiyun 	int (*discard)(struct mtd_blktrans_dev *dev,
53*4882a593Smuzhiyun 		       unsigned long block, unsigned nr_blocks);
54*4882a593Smuzhiyun 	void (*background)(struct mtd_blktrans_dev *dev);
55*4882a593Smuzhiyun 
56*4882a593Smuzhiyun 	/* Block layer ioctls */
57*4882a593Smuzhiyun 	int (*getgeo)(struct mtd_blktrans_dev *dev, struct hd_geometry *geo);
58*4882a593Smuzhiyun 	int (*flush)(struct mtd_blktrans_dev *dev);
59*4882a593Smuzhiyun 
60*4882a593Smuzhiyun 	/* Called with mtd_table_mutex held; no race with add/remove */
61*4882a593Smuzhiyun 	int (*open)(struct mtd_blktrans_dev *dev);
62*4882a593Smuzhiyun 	void (*release)(struct mtd_blktrans_dev *dev);
63*4882a593Smuzhiyun 
64*4882a593Smuzhiyun 	/* Called on {de,}registration and on subsequent addition/removal
65*4882a593Smuzhiyun 	   of devices, with mtd_table_mutex held. */
66*4882a593Smuzhiyun 	void (*add_mtd)(struct mtd_blktrans_ops *tr, struct mtd_info *mtd);
67*4882a593Smuzhiyun 	void (*remove_dev)(struct mtd_blktrans_dev *dev);
68*4882a593Smuzhiyun 
69*4882a593Smuzhiyun 	struct list_head devs;
70*4882a593Smuzhiyun 	struct list_head list;
71*4882a593Smuzhiyun 	struct module *owner;
72*4882a593Smuzhiyun };
73*4882a593Smuzhiyun 
74*4882a593Smuzhiyun extern int register_mtd_blktrans(struct mtd_blktrans_ops *tr);
75*4882a593Smuzhiyun extern int deregister_mtd_blktrans(struct mtd_blktrans_ops *tr);
76*4882a593Smuzhiyun extern int add_mtd_blktrans_dev(struct mtd_blktrans_dev *dev);
77*4882a593Smuzhiyun extern int del_mtd_blktrans_dev(struct mtd_blktrans_dev *dev);
78*4882a593Smuzhiyun extern int mtd_blktrans_cease_background(struct mtd_blktrans_dev *dev);
79*4882a593Smuzhiyun 
80*4882a593Smuzhiyun 
81*4882a593Smuzhiyun #endif /* __MTD_TRANS_H__ */
82