VisionFive2 Linux kernel

StarFive Tech Linux Kernel for VisionFive (JH7110) boards (mirror)

More than 9999 Commits   32 Branches   54 Tags
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__ */