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