Back to home page

OSCL-LXR

 
 

    


0001 /* SPDX-License-Identifier: GPL-2.0-or-later */
0002 /*
0003  * Copyright © 2003-2010 David Woodhouse <dwmw2@infradead.org>
0004  */
0005 
0006 #ifndef __MTD_TRANS_H__
0007 #define __MTD_TRANS_H__
0008 
0009 #include <linux/mutex.h>
0010 #include <linux/kref.h>
0011 #include <linux/sysfs.h>
0012 
0013 struct hd_geometry;
0014 struct mtd_info;
0015 struct mtd_blktrans_ops;
0016 struct file;
0017 struct inode;
0018 
0019 struct mtd_blktrans_dev {
0020     struct mtd_blktrans_ops *tr;
0021     struct list_head list;
0022     struct mtd_info *mtd;
0023     struct mutex lock;
0024     int devnum;
0025     bool bg_stop;
0026     unsigned long size;
0027     int readonly;
0028     int open;
0029     struct kref ref;
0030     struct gendisk *disk;
0031     struct attribute_group *disk_attributes;
0032     struct request_queue *rq;
0033     struct list_head rq_list;
0034     struct blk_mq_tag_set *tag_set;
0035     spinlock_t queue_lock;
0036     void *priv;
0037     fmode_t file_mode;
0038 };
0039 
0040 struct mtd_blktrans_ops {
0041     char *name;
0042     int major;
0043     int part_bits;
0044     int blksize;
0045     int blkshift;
0046 
0047     /* Access functions */
0048     int (*readsect)(struct mtd_blktrans_dev *dev,
0049             unsigned long block, char *buffer);
0050     int (*writesect)(struct mtd_blktrans_dev *dev,
0051              unsigned long block, char *buffer);
0052     int (*discard)(struct mtd_blktrans_dev *dev,
0053                unsigned long block, unsigned nr_blocks);
0054     void (*background)(struct mtd_blktrans_dev *dev);
0055 
0056     /* Block layer ioctls */
0057     int (*getgeo)(struct mtd_blktrans_dev *dev, struct hd_geometry *geo);
0058     int (*flush)(struct mtd_blktrans_dev *dev);
0059 
0060     /* Called with mtd_table_mutex held; no race with add/remove */
0061     int (*open)(struct mtd_blktrans_dev *dev);
0062     void (*release)(struct mtd_blktrans_dev *dev);
0063 
0064     /* Called on {de,}registration and on subsequent addition/removal
0065        of devices, with mtd_table_mutex held. */
0066     void (*add_mtd)(struct mtd_blktrans_ops *tr, struct mtd_info *mtd);
0067     void (*remove_dev)(struct mtd_blktrans_dev *dev);
0068 
0069     struct list_head devs;
0070     struct list_head list;
0071     struct module *owner;
0072 };
0073 
0074 extern int register_mtd_blktrans(struct mtd_blktrans_ops *tr);
0075 extern int deregister_mtd_blktrans(struct mtd_blktrans_ops *tr);
0076 extern int add_mtd_blktrans_dev(struct mtd_blktrans_dev *dev);
0077 extern int del_mtd_blktrans_dev(struct mtd_blktrans_dev *dev);
0078 extern int mtd_blktrans_cease_background(struct mtd_blktrans_dev *dev);
0079 
0080 /**
0081  * module_mtd_blktrans() - Helper macro for registering a mtd blktrans driver
0082  * @__mtd_blktrans: mtd_blktrans_ops struct
0083  *
0084  * Helper macro for mtd blktrans drivers which do not do anything special in
0085  * module init/exit. This eliminates a lot of boilerplate. Each module may only
0086  * use this macro once, and calling it replaces module_init() and module_exit()
0087  */
0088 #define module_mtd_blktrans(__mtd_blktrans) \
0089     module_driver(__mtd_blktrans, register_mtd_blktrans, \
0090                     deregister_mtd_blktrans)
0091 
0092 #endif /* __MTD_TRANS_H__ */