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
13struct hd_geometry;
14struct mtd_info;
15struct mtd_blktrans_ops;
16struct file;
17struct inode;
18
19struct 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
40struct 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
74extern int register_mtd_blktrans(struct mtd_blktrans_ops *tr);
75extern int deregister_mtd_blktrans(struct mtd_blktrans_ops *tr);
76extern int add_mtd_blktrans_dev(struct mtd_blktrans_dev *dev);
77extern int del_mtd_blktrans_dev(struct mtd_blktrans_dev *dev);
78extern 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