root/drivers/macintosh/windfarm.h

/* [<][>][^][v][top][bottom][index][help] */

INCLUDED FROM


DEFINITIONS

This source file includes following definitions.
  1. wf_control_set_max
  2. wf_control_set_min
  3. wf_control_set
  4. wf_control_get
  5. wf_control_get_min
  6. wf_control_get_max
  7. wf_sensor_get

   1 /* SPDX-License-Identifier: GPL-2.0-only */
   2 /*
   3  * Windfarm PowerMac thermal control.
   4  *
   5  * (c) Copyright 2005 Benjamin Herrenschmidt, IBM Corp.
   6  *                    <benh@kernel.crashing.org>
   7  */
   8 
   9 #ifndef __WINDFARM_H__
  10 #define __WINDFARM_H__
  11 
  12 #include <linux/kref.h>
  13 #include <linux/list.h>
  14 #include <linux/module.h>
  15 #include <linux/notifier.h>
  16 #include <linux/device.h>
  17 
  18 /* Display a 16.16 fixed point value */
  19 #define FIX32TOPRINT(f) (((s32)(f)) >> 16),(((((s32)(f)) & 0xffff) * 1000) >> 16)
  20 
  21 /*
  22  * Control objects
  23  */
  24 
  25 struct wf_control;
  26 
  27 struct wf_control_ops {
  28         int                     (*set_value)(struct wf_control *ct, s32 val);
  29         int                     (*get_value)(struct wf_control *ct, s32 *val);
  30         s32                     (*get_min)(struct wf_control *ct);
  31         s32                     (*get_max)(struct wf_control *ct);
  32         void                    (*release)(struct wf_control *ct);
  33         struct module           *owner;
  34 };
  35 
  36 struct wf_control {
  37         struct list_head                link;
  38         const struct wf_control_ops     *ops;
  39         const char                      *name;
  40         int                             type;
  41         struct kref                     ref;
  42         struct device_attribute         attr;
  43         void                            *priv;
  44 };
  45 
  46 #define WF_CONTROL_TYPE_GENERIC         0
  47 #define WF_CONTROL_RPM_FAN              1
  48 #define WF_CONTROL_PWM_FAN              2
  49 
  50 
  51 /* Note about lifetime rules: wf_register_control() will initialize
  52  * the kref and wf_unregister_control will decrement it, thus the
  53  * object creating/disposing a given control shouldn't assume it
  54  * still exists after wf_unregister_control has been called.
  55  */
  56 extern int wf_register_control(struct wf_control *ct);
  57 extern void wf_unregister_control(struct wf_control *ct);
  58 extern int wf_get_control(struct wf_control *ct);
  59 extern void wf_put_control(struct wf_control *ct);
  60 
  61 static inline int wf_control_set_max(struct wf_control *ct)
  62 {
  63         s32 vmax = ct->ops->get_max(ct);
  64         return ct->ops->set_value(ct, vmax);
  65 }
  66 
  67 static inline int wf_control_set_min(struct wf_control *ct)
  68 {
  69         s32 vmin = ct->ops->get_min(ct);
  70         return ct->ops->set_value(ct, vmin);
  71 }
  72 
  73 static inline int wf_control_set(struct wf_control *ct, s32 val)
  74 {
  75         return ct->ops->set_value(ct, val);
  76 }
  77 
  78 static inline int wf_control_get(struct wf_control *ct, s32 *val)
  79 {
  80         return ct->ops->get_value(ct, val);
  81 }
  82 
  83 static inline s32 wf_control_get_min(struct wf_control *ct)
  84 {
  85         return ct->ops->get_min(ct);
  86 }
  87 
  88 static inline s32 wf_control_get_max(struct wf_control *ct)
  89 {
  90         return ct->ops->get_max(ct);
  91 }
  92 
  93 /*
  94  * Sensor objects
  95  */
  96 
  97 struct wf_sensor;
  98 
  99 struct wf_sensor_ops {
 100         int                     (*get_value)(struct wf_sensor *sr, s32 *val);
 101         void                    (*release)(struct wf_sensor *sr);
 102         struct module           *owner;
 103 };
 104 
 105 struct wf_sensor {
 106         struct list_head                link;
 107         const struct wf_sensor_ops      *ops;
 108         const char                      *name;
 109         struct kref                     ref;
 110         struct device_attribute         attr;
 111         void                            *priv;
 112 };
 113 
 114 /* Same lifetime rules as controls */
 115 extern int wf_register_sensor(struct wf_sensor *sr);
 116 extern void wf_unregister_sensor(struct wf_sensor *sr);
 117 extern int wf_get_sensor(struct wf_sensor *sr);
 118 extern void wf_put_sensor(struct wf_sensor *sr);
 119 
 120 static inline int wf_sensor_get(struct wf_sensor *sr, s32 *val)
 121 {
 122         return sr->ops->get_value(sr, val);
 123 }
 124 
 125 /* For use by clients. Note that we are a bit racy here since
 126  * notifier_block doesn't have a module owner field. I may fix
 127  * it one day ...
 128  *
 129  * LOCKING NOTE !
 130  *
 131  * All "events" except WF_EVENT_TICK are called with an internal mutex
 132  * held which will deadlock if you call basically any core routine.
 133  * So don't ! Just take note of the event and do your actual operations
 134  * from the ticker.
 135  *
 136  */
 137 extern int wf_register_client(struct notifier_block *nb);
 138 extern int wf_unregister_client(struct notifier_block *nb);
 139 
 140 /* Overtemp conditions. Those are refcounted */
 141 extern void wf_set_overtemp(void);
 142 extern void wf_clear_overtemp(void);
 143 
 144 #define WF_EVENT_NEW_CONTROL    0 /* param is wf_control * */
 145 #define WF_EVENT_NEW_SENSOR     1 /* param is wf_sensor * */
 146 #define WF_EVENT_OVERTEMP       2 /* no param */
 147 #define WF_EVENT_NORMALTEMP     3 /* overtemp condition cleared */
 148 #define WF_EVENT_TICK           4 /* 1 second tick */
 149 
 150 /* Note: If that driver gets more broad use, we could replace the
 151  * simplistic overtemp bits with "environmental conditions". That
 152  * could then be used to also notify of things like fan failure,
 153  * case open, battery conditions, ...
 154  */
 155 
 156 #endif /* __WINDFARM_H__ */

/* [<][>][^][v][top][bottom][index][help] */