xref: /openbmc/linux/drivers/hwmon/peci/common.h (revision 4f2c0a4acffbec01079c28f839422e64ddeff004)
1*bf3608f3SIwona Winiarska /* SPDX-License-Identifier: GPL-2.0-only */
2*bf3608f3SIwona Winiarska /* Copyright (c) 2021 Intel Corporation */
3*bf3608f3SIwona Winiarska 
4*bf3608f3SIwona Winiarska #include <linux/mutex.h>
5*bf3608f3SIwona Winiarska #include <linux/types.h>
6*bf3608f3SIwona Winiarska 
7*bf3608f3SIwona Winiarska #ifndef __PECI_HWMON_COMMON_H
8*bf3608f3SIwona Winiarska #define __PECI_HWMON_COMMON_H
9*bf3608f3SIwona Winiarska 
10*bf3608f3SIwona Winiarska #define PECI_HWMON_UPDATE_INTERVAL	HZ
11*bf3608f3SIwona Winiarska 
12*bf3608f3SIwona Winiarska /**
13*bf3608f3SIwona Winiarska  * struct peci_sensor_state - PECI state information
14*bf3608f3SIwona Winiarska  * @valid: flag to indicate the sensor value is valid
15*bf3608f3SIwona Winiarska  * @last_updated: time of the last update in jiffies
16*bf3608f3SIwona Winiarska  * @lock: mutex to protect sensor access
17*bf3608f3SIwona Winiarska  */
18*bf3608f3SIwona Winiarska struct peci_sensor_state {
19*bf3608f3SIwona Winiarska 	bool valid;
20*bf3608f3SIwona Winiarska 	unsigned long last_updated;
21*bf3608f3SIwona Winiarska 	struct mutex lock; /* protect sensor access */
22*bf3608f3SIwona Winiarska };
23*bf3608f3SIwona Winiarska 
24*bf3608f3SIwona Winiarska /**
25*bf3608f3SIwona Winiarska  * struct peci_sensor_data - PECI sensor information
26*bf3608f3SIwona Winiarska  * @value: sensor value in milli units
27*bf3608f3SIwona Winiarska  * @state: sensor update state
28*bf3608f3SIwona Winiarska  */
29*bf3608f3SIwona Winiarska 
30*bf3608f3SIwona Winiarska struct peci_sensor_data {
31*bf3608f3SIwona Winiarska 	s32 value;
32*bf3608f3SIwona Winiarska 	struct peci_sensor_state state;
33*bf3608f3SIwona Winiarska };
34*bf3608f3SIwona Winiarska 
35*bf3608f3SIwona Winiarska /**
36*bf3608f3SIwona Winiarska  * peci_sensor_need_update() - check whether sensor update is needed or not
37*bf3608f3SIwona Winiarska  * @sensor: pointer to sensor data struct
38*bf3608f3SIwona Winiarska  *
39*bf3608f3SIwona Winiarska  * Return: true if update is needed, false if not.
40*bf3608f3SIwona Winiarska  */
41*bf3608f3SIwona Winiarska 
peci_sensor_need_update(struct peci_sensor_state * state)42*bf3608f3SIwona Winiarska static inline bool peci_sensor_need_update(struct peci_sensor_state *state)
43*bf3608f3SIwona Winiarska {
44*bf3608f3SIwona Winiarska 	return !state->valid ||
45*bf3608f3SIwona Winiarska 	       time_after(jiffies, state->last_updated + PECI_HWMON_UPDATE_INTERVAL);
46*bf3608f3SIwona Winiarska }
47*bf3608f3SIwona Winiarska 
48*bf3608f3SIwona Winiarska /**
49*bf3608f3SIwona Winiarska  * peci_sensor_mark_updated() - mark the sensor is updated
50*bf3608f3SIwona Winiarska  * @sensor: pointer to sensor data struct
51*bf3608f3SIwona Winiarska  */
peci_sensor_mark_updated(struct peci_sensor_state * state)52*bf3608f3SIwona Winiarska static inline void peci_sensor_mark_updated(struct peci_sensor_state *state)
53*bf3608f3SIwona Winiarska {
54*bf3608f3SIwona Winiarska 	state->valid = true;
55*bf3608f3SIwona Winiarska 	state->last_updated = jiffies;
56*bf3608f3SIwona Winiarska }
57*bf3608f3SIwona Winiarska 
58*bf3608f3SIwona Winiarska #endif /* __PECI_HWMON_COMMON_H */
59