Home | History | Annotate | Download | only in linux
      1 /*
      2  * transport_class.h - a generic container for all transport classes
      3  *
      4  * Copyright (c) 2005 - James Bottomley <James.Bottomley (at) steeleye.com>
      5  *
      6  * This file is licensed under GPLv2
      7  */
      8 
      9 #ifndef _TRANSPORT_CLASS_H_
     10 #define _TRANSPORT_CLASS_H_
     11 
     12 #include <linux/device.h>
     13 #include <linux/attribute_container.h>
     14 
     15 struct transport_container;
     16 
     17 struct transport_class {
     18 	struct class class;
     19 	int (*setup)(struct transport_container *, struct device *,
     20 		     struct class_device *);
     21 	int (*configure)(struct transport_container *, struct device *,
     22 			 struct class_device *);
     23 	int (*remove)(struct transport_container *, struct device *,
     24 		      struct class_device *);
     25 };
     26 
     27 #define DECLARE_TRANSPORT_CLASS(cls, nm, su, rm, cfg)			\
     28 struct transport_class cls = {						\
     29 	.class = {							\
     30 		.name = nm,						\
     31 	},								\
     32 	.setup = su,							\
     33 	.remove = rm,							\
     34 	.configure = cfg,						\
     35 }
     36 
     37 
     38 struct anon_transport_class {
     39 	struct transport_class tclass;
     40 	struct attribute_container container;
     41 };
     42 
     43 #define DECLARE_ANON_TRANSPORT_CLASS(cls, mtch, cfg)		\
     44 struct anon_transport_class cls = {				\
     45 	.tclass = {						\
     46 		.configure = cfg,				\
     47 	},							\
     48 	. container = {						\
     49 		.match = mtch,					\
     50 	},							\
     51 }
     52 
     53 #define class_to_transport_class(x) \
     54 	container_of(x, struct transport_class, class)
     55 
     56 struct transport_container {
     57 	struct attribute_container ac;
     58 	struct attribute_group *statistics;
     59 };
     60 
     61 #define attribute_container_to_transport_container(x) \
     62 	container_of(x, struct transport_container, ac)
     63 
     64 void transport_remove_device(struct device *);
     65 void transport_add_device(struct device *);
     66 void transport_setup_device(struct device *);
     67 void transport_configure_device(struct device *);
     68 void transport_destroy_device(struct device *);
     69 
     70 static inline void
     71 transport_register_device(struct device *dev)
     72 {
     73 	transport_setup_device(dev);
     74 	transport_add_device(dev);
     75 }
     76 
     77 static inline void
     78 transport_unregister_device(struct device *dev)
     79 {
     80 	transport_remove_device(dev);
     81 	transport_destroy_device(dev);
     82 }
     83 
     84 static inline int transport_container_register(struct transport_container *tc)
     85 {
     86 	return attribute_container_register(&tc->ac);
     87 }
     88 
     89 static inline int transport_container_unregister(struct transport_container *tc)
     90 {
     91 	return attribute_container_unregister(&tc->ac);
     92 }
     93 
     94 int transport_class_register(struct transport_class *);
     95 int anon_transport_class_register(struct anon_transport_class *);
     96 void transport_class_unregister(struct transport_class *);
     97 void anon_transport_class_unregister(struct anon_transport_class *);
     98 
     99 
    100 #endif
    101