linux/include/linux/enclosure.h
<<
>>
Prefs
   1/*
   2 * Enclosure Services
   3 *
   4 * Copyright (C) 2008 James Bottomley <James.Bottomley@HansenPartnership.com>
   5 *
   6**-----------------------------------------------------------------------------
   7**
   8**  This program is free software; you can redistribute it and/or
   9**  modify it under the terms of the GNU General Public License
  10**  version 2 as published by the Free Software Foundation.
  11**
  12**  This program is distributed in the hope that it will be useful,
  13**  but WITHOUT ANY WARRANTY; without even the implied warranty of
  14**  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  15**  GNU General Public License for more details.
  16**
  17**  You should have received a copy of the GNU General Public License
  18**  along with this program; if not, write to the Free Software
  19**  Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  20**
  21**-----------------------------------------------------------------------------
  22*/
  23#ifndef _LINUX_ENCLOSURE_H_
  24#define _LINUX_ENCLOSURE_H_
  25
  26#include <linux/device.h>
  27#include <linux/list.h>
  28
  29/* A few generic types ... taken from ses-2 */
  30enum enclosure_component_type {
  31        ENCLOSURE_COMPONENT_DEVICE = 0x01,
  32        ENCLOSURE_COMPONENT_ARRAY_DEVICE = 0x17,
  33};
  34
  35/* ses-2 common element status */
  36enum enclosure_status {
  37        ENCLOSURE_STATUS_UNSUPPORTED = 0,
  38        ENCLOSURE_STATUS_OK,
  39        ENCLOSURE_STATUS_CRITICAL,
  40        ENCLOSURE_STATUS_NON_CRITICAL,
  41        ENCLOSURE_STATUS_UNRECOVERABLE,
  42        ENCLOSURE_STATUS_NOT_INSTALLED,
  43        ENCLOSURE_STATUS_UNKNOWN,
  44        ENCLOSURE_STATUS_UNAVAILABLE,
  45        /* last element for counting purposes */
  46        ENCLOSURE_STATUS_MAX
  47};
  48
  49/* SFF-8485 activity light settings */
  50enum enclosure_component_setting {
  51        ENCLOSURE_SETTING_DISABLED = 0,
  52        ENCLOSURE_SETTING_ENABLED = 1,
  53        ENCLOSURE_SETTING_BLINK_A_ON_OFF = 2,
  54        ENCLOSURE_SETTING_BLINK_A_OFF_ON = 3,
  55        ENCLOSURE_SETTING_BLINK_B_ON_OFF = 6,
  56        ENCLOSURE_SETTING_BLINK_B_OFF_ON = 7,
  57};
  58
  59struct enclosure_device;
  60struct enclosure_component;
  61struct enclosure_component_callbacks {
  62        void (*get_status)(struct enclosure_device *,
  63                             struct enclosure_component *);
  64        int (*set_status)(struct enclosure_device *,
  65                          struct enclosure_component *,
  66                          enum enclosure_status);
  67        void (*get_fault)(struct enclosure_device *,
  68                          struct enclosure_component *);
  69        int (*set_fault)(struct enclosure_device *,
  70                         struct enclosure_component *,
  71                         enum enclosure_component_setting);
  72        void (*get_active)(struct enclosure_device *,
  73                           struct enclosure_component *);
  74        int (*set_active)(struct enclosure_device *,
  75                          struct enclosure_component *,
  76                          enum enclosure_component_setting);
  77        void (*get_locate)(struct enclosure_device *,
  78                           struct enclosure_component *);
  79        int (*set_locate)(struct enclosure_device *,
  80                          struct enclosure_component *,
  81                          enum enclosure_component_setting);
  82};
  83
  84
  85struct enclosure_component {
  86        void *scratch;
  87        struct device cdev;
  88        struct device *dev;
  89        enum enclosure_component_type type;
  90        int number;
  91        int fault;
  92        int active;
  93        int locate;
  94        enum enclosure_status status;
  95};
  96
  97struct enclosure_device {
  98        void *scratch;
  99        struct list_head node;
 100        struct device edev;
 101        struct enclosure_component_callbacks *cb;
 102        int components;
 103        struct enclosure_component component[0];
 104};
 105
 106static inline struct enclosure_device *
 107to_enclosure_device(struct device *dev)
 108{
 109        return container_of(dev, struct enclosure_device, edev);
 110}
 111
 112static inline struct enclosure_component *
 113to_enclosure_component(struct device *dev)
 114{
 115        return container_of(dev, struct enclosure_component, cdev);
 116}
 117
 118struct enclosure_device *
 119enclosure_register(struct device *, const char *, int,
 120                   struct enclosure_component_callbacks *);
 121void enclosure_unregister(struct enclosure_device *);
 122struct enclosure_component *
 123enclosure_component_register(struct enclosure_device *, unsigned int,
 124                                 enum enclosure_component_type, const char *);
 125int enclosure_add_device(struct enclosure_device *enclosure, int component,
 126                         struct device *dev);
 127int enclosure_remove_device(struct enclosure_device *, struct device *);
 128struct enclosure_device *enclosure_find(struct device *dev,
 129                                        struct enclosure_device *start);
 130int enclosure_for_each_device(int (*fn)(struct enclosure_device *, void *),
 131                              void *data);
 132
 133#endif /* _LINUX_ENCLOSURE_H_ */
 134