93 lines · c
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/removal65 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 driver82 * @__mtd_blktrans: mtd_blktrans_ops struct83 *84 * Helper macro for mtd blktrans drivers which do not do anything special in85 * module init/exit. This eliminates a lot of boilerplate. Each module may only86 * 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