linux/include/linux/transport_class.h
<<
>>
Prefs
   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