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