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