forked from mirrors/linux
		
	This patch introduces the module_mtd_blktrans macro which is a convenience macro for mtd blktrans modules similar to module_platform_driver. It is intended to be used by drivers which init/exit section does nothing but register/unregister the mtd blktrans driver. By using this macro it is possible to eliminate a few lines of boilerplate code per mtd blktrans driver. Signed-off-by: Dejin Zheng <zhengdejin5@gmail.com> Signed-off-by: Miquel Raynal <miquel.raynal@bootlin.com> Link: https://lore.kernel.org/linux-mtd/20210213164600.409061-2-zhengdejin5@gmail.com
		
			
				
	
	
		
			92 lines
		
	
	
	
		
			2.6 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			92 lines
		
	
	
	
		
			2.6 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
/* SPDX-License-Identifier: GPL-2.0-or-later */
 | 
						|
/*
 | 
						|
 * Copyright © 2003-2010 David Woodhouse <dwmw2@infradead.org>
 | 
						|
 */
 | 
						|
 | 
						|
#ifndef __MTD_TRANS_H__
 | 
						|
#define __MTD_TRANS_H__
 | 
						|
 | 
						|
#include <linux/mutex.h>
 | 
						|
#include <linux/kref.h>
 | 
						|
#include <linux/sysfs.h>
 | 
						|
 | 
						|
struct hd_geometry;
 | 
						|
struct mtd_info;
 | 
						|
struct mtd_blktrans_ops;
 | 
						|
struct file;
 | 
						|
struct inode;
 | 
						|
 | 
						|
struct mtd_blktrans_dev {
 | 
						|
	struct mtd_blktrans_ops *tr;
 | 
						|
	struct list_head list;
 | 
						|
	struct mtd_info *mtd;
 | 
						|
	struct mutex lock;
 | 
						|
	int devnum;
 | 
						|
	bool bg_stop;
 | 
						|
	unsigned long size;
 | 
						|
	int readonly;
 | 
						|
	int open;
 | 
						|
	struct kref ref;
 | 
						|
	struct gendisk *disk;
 | 
						|
	struct attribute_group *disk_attributes;
 | 
						|
	struct request_queue *rq;
 | 
						|
	struct list_head rq_list;
 | 
						|
	struct blk_mq_tag_set *tag_set;
 | 
						|
	spinlock_t queue_lock;
 | 
						|
	void *priv;
 | 
						|
	fmode_t file_mode;
 | 
						|
};
 | 
						|
 | 
						|
struct mtd_blktrans_ops {
 | 
						|
	char *name;
 | 
						|
	int major;
 | 
						|
	int part_bits;
 | 
						|
	int blksize;
 | 
						|
	int blkshift;
 | 
						|
 | 
						|
	/* Access functions */
 | 
						|
	int (*readsect)(struct mtd_blktrans_dev *dev,
 | 
						|
		    unsigned long block, char *buffer);
 | 
						|
	int (*writesect)(struct mtd_blktrans_dev *dev,
 | 
						|
		     unsigned long block, char *buffer);
 | 
						|
	int (*discard)(struct mtd_blktrans_dev *dev,
 | 
						|
		       unsigned long block, unsigned nr_blocks);
 | 
						|
	void (*background)(struct mtd_blktrans_dev *dev);
 | 
						|
 | 
						|
	/* Block layer ioctls */
 | 
						|
	int (*getgeo)(struct mtd_blktrans_dev *dev, struct hd_geometry *geo);
 | 
						|
	int (*flush)(struct mtd_blktrans_dev *dev);
 | 
						|
 | 
						|
	/* Called with mtd_table_mutex held; no race with add/remove */
 | 
						|
	int (*open)(struct mtd_blktrans_dev *dev);
 | 
						|
	void (*release)(struct mtd_blktrans_dev *dev);
 | 
						|
 | 
						|
	/* Called on {de,}registration and on subsequent addition/removal
 | 
						|
	   of devices, with mtd_table_mutex held. */
 | 
						|
	void (*add_mtd)(struct mtd_blktrans_ops *tr, struct mtd_info *mtd);
 | 
						|
	void (*remove_dev)(struct mtd_blktrans_dev *dev);
 | 
						|
 | 
						|
	struct list_head devs;
 | 
						|
	struct list_head list;
 | 
						|
	struct module *owner;
 | 
						|
};
 | 
						|
 | 
						|
extern int register_mtd_blktrans(struct mtd_blktrans_ops *tr);
 | 
						|
extern int deregister_mtd_blktrans(struct mtd_blktrans_ops *tr);
 | 
						|
extern int add_mtd_blktrans_dev(struct mtd_blktrans_dev *dev);
 | 
						|
extern int del_mtd_blktrans_dev(struct mtd_blktrans_dev *dev);
 | 
						|
extern int mtd_blktrans_cease_background(struct mtd_blktrans_dev *dev);
 | 
						|
 | 
						|
/**
 | 
						|
 * module_mtd_blktrans() - Helper macro for registering a mtd blktrans driver
 | 
						|
 * @__mtd_blktrans: mtd_blktrans_ops struct
 | 
						|
 *
 | 
						|
 * Helper macro for mtd blktrans drivers which do not do anything special in
 | 
						|
 * module init/exit. This eliminates a lot of boilerplate. Each module may only
 | 
						|
 * use this macro once, and calling it replaces module_init() and module_exit()
 | 
						|
 */
 | 
						|
#define module_mtd_blktrans(__mtd_blktrans) \
 | 
						|
	module_driver(__mtd_blktrans, register_mtd_blktrans, \
 | 
						|
					deregister_mtd_blktrans)
 | 
						|
 | 
						|
#endif /* __MTD_TRANS_H__ */
 |