0001
0002 #ifndef S390_CCWGROUP_H
0003 #define S390_CCWGROUP_H
0004
0005 struct ccw_device;
0006 struct ccw_driver;
0007
0008
0009
0010
0011
0012
0013
0014
0015
0016 struct ccwgroup_device {
0017 enum {
0018 CCWGROUP_OFFLINE,
0019 CCWGROUP_ONLINE,
0020 } state;
0021
0022 atomic_t onoff;
0023 struct mutex reg_mutex;
0024
0025 unsigned int count;
0026 struct device dev;
0027 struct work_struct ungroup_work;
0028 struct ccw_device *cdev[];
0029 };
0030
0031
0032
0033
0034
0035
0036
0037
0038
0039
0040
0041 struct ccwgroup_driver {
0042 int (*setup) (struct ccwgroup_device *);
0043 void (*remove) (struct ccwgroup_device *);
0044 int (*set_online) (struct ccwgroup_device *);
0045 int (*set_offline) (struct ccwgroup_device *);
0046 void (*shutdown)(struct ccwgroup_device *);
0047
0048 struct device_driver driver;
0049 struct ccw_driver *ccw_driver;
0050 };
0051
0052 extern int ccwgroup_driver_register (struct ccwgroup_driver *cdriver);
0053 extern void ccwgroup_driver_unregister (struct ccwgroup_driver *cdriver);
0054 int ccwgroup_create_dev(struct device *root, struct ccwgroup_driver *gdrv,
0055 int num_devices, const char *buf);
0056
0057 extern int ccwgroup_set_online(struct ccwgroup_device *gdev);
0058 int ccwgroup_set_offline(struct ccwgroup_device *gdev, bool call_gdrv);
0059
0060 extern int ccwgroup_probe_ccwdev(struct ccw_device *cdev);
0061 extern void ccwgroup_remove_ccwdev(struct ccw_device *cdev);
0062
0063 #define to_ccwgroupdev(x) container_of((x), struct ccwgroup_device, dev)
0064 #define to_ccwgroupdrv(x) container_of((x), struct ccwgroup_driver, driver)
0065
0066 #if IS_ENABLED(CONFIG_CCWGROUP)
0067 bool dev_is_ccwgroup(struct device *dev);
0068 #else
0069 static inline bool dev_is_ccwgroup(struct device *dev)
0070 {
0071 return false;
0072 }
0073 #endif
0074
0075 #endif