xref: /linux-6.15/include/linux/hwmon.h (revision 79bc0af9)
1b886d83cSThomas Gleixner /* SPDX-License-Identifier: GPL-2.0-only */
21236441fSMark M. Hoffman /*
31236441fSMark M. Hoffman     hwmon.h - part of lm_sensors, Linux kernel modules for hardware monitoring
41236441fSMark M. Hoffman 
51236441fSMark M. Hoffman     This file declares helper functions for the sysfs class "hwmon",
61236441fSMark M. Hoffman     for use by sensors drivers.
71236441fSMark M. Hoffman 
81236441fSMark M. Hoffman     Copyright (C) 2005 Mark M. Hoffman <[email protected]>
91236441fSMark M. Hoffman 
101236441fSMark M. Hoffman */
111236441fSMark M. Hoffman 
121236441fSMark M. Hoffman #ifndef _HWMON_H_
131236441fSMark M. Hoffman #define _HWMON_H_
141236441fSMark M. Hoffman 
15d560168bSGuenter Roeck #include <linux/bitops.h>
16d560168bSGuenter Roeck 
17313162d0SPaul Gortmaker struct device;
18bab2243cSGuenter Roeck struct attribute_group;
191236441fSMark M. Hoffman 
20d560168bSGuenter Roeck enum hwmon_sensor_types {
21d560168bSGuenter Roeck 	hwmon_chip,
22d560168bSGuenter Roeck 	hwmon_temp,
23d560168bSGuenter Roeck 	hwmon_in,
24d560168bSGuenter Roeck 	hwmon_curr,
25d560168bSGuenter Roeck 	hwmon_power,
26d560168bSGuenter Roeck 	hwmon_energy,
276bfcca44SGuenter Roeck 	hwmon_humidity,
288faee73fSGuenter Roeck 	hwmon_fan,
29f9f7bb3aSGuenter Roeck 	hwmon_pwm,
304413405fSDr. David Alan Gilbert 	hwmon_intrusion,
31d5753800SSudeep Holla 	hwmon_max,
32d560168bSGuenter Roeck };
33d560168bSGuenter Roeck 
34d560168bSGuenter Roeck enum hwmon_chip_attributes {
35d560168bSGuenter Roeck 	hwmon_chip_temp_reset_history,
3600d616cfSGuenter Roeck 	hwmon_chip_in_reset_history,
379b26947cSGuenter Roeck 	hwmon_chip_curr_reset_history,
38b308f5c7SGuenter Roeck 	hwmon_chip_power_reset_history,
39d560168bSGuenter Roeck 	hwmon_chip_register_tz,
40d560168bSGuenter Roeck 	hwmon_chip_update_interval,
41d560168bSGuenter Roeck 	hwmon_chip_alarms,
429f00995eSGuenter Roeck 	hwmon_chip_samples,
439f00995eSGuenter Roeck 	hwmon_chip_curr_samples,
449f00995eSGuenter Roeck 	hwmon_chip_in_samples,
459f00995eSGuenter Roeck 	hwmon_chip_power_samples,
469f00995eSGuenter Roeck 	hwmon_chip_temp_samples,
47fe6ac237SJames Seo 	hwmon_chip_beep_enable,
484ce6e8a8SGuenter Roeck 	hwmon_chip_pec,
49d560168bSGuenter Roeck };
50d560168bSGuenter Roeck 
51d560168bSGuenter Roeck #define HWMON_C_TEMP_RESET_HISTORY	BIT(hwmon_chip_temp_reset_history)
52d560168bSGuenter Roeck #define HWMON_C_IN_RESET_HISTORY	BIT(hwmon_chip_in_reset_history)
539b26947cSGuenter Roeck #define HWMON_C_CURR_RESET_HISTORY	BIT(hwmon_chip_curr_reset_history)
54b308f5c7SGuenter Roeck #define HWMON_C_POWER_RESET_HISTORY	BIT(hwmon_chip_power_reset_history)
55d560168bSGuenter Roeck #define HWMON_C_REGISTER_TZ		BIT(hwmon_chip_register_tz)
56d560168bSGuenter Roeck #define HWMON_C_UPDATE_INTERVAL		BIT(hwmon_chip_update_interval)
57d560168bSGuenter Roeck #define HWMON_C_ALARMS			BIT(hwmon_chip_alarms)
589f00995eSGuenter Roeck #define HWMON_C_SAMPLES			BIT(hwmon_chip_samples)
599f00995eSGuenter Roeck #define HWMON_C_CURR_SAMPLES		BIT(hwmon_chip_curr_samples)
609f00995eSGuenter Roeck #define HWMON_C_IN_SAMPLES		BIT(hwmon_chip_in_samples)
619f00995eSGuenter Roeck #define HWMON_C_POWER_SAMPLES		BIT(hwmon_chip_power_samples)
629f00995eSGuenter Roeck #define HWMON_C_TEMP_SAMPLES		BIT(hwmon_chip_temp_samples)
63fe6ac237SJames Seo #define HWMON_C_BEEP_ENABLE		BIT(hwmon_chip_beep_enable)
644ce6e8a8SGuenter Roeck #define HWMON_C_PEC			BIT(hwmon_chip_pec)
65d560168bSGuenter Roeck 
66d560168bSGuenter Roeck enum hwmon_temp_attributes {
67002c6b54SGuenter Roeck 	hwmon_temp_enable,
68002c6b54SGuenter Roeck 	hwmon_temp_input,
69d560168bSGuenter Roeck 	hwmon_temp_type,
70d560168bSGuenter Roeck 	hwmon_temp_lcrit,
71d560168bSGuenter Roeck 	hwmon_temp_lcrit_hyst,
72d560168bSGuenter Roeck 	hwmon_temp_min,
73d560168bSGuenter Roeck 	hwmon_temp_min_hyst,
74d560168bSGuenter Roeck 	hwmon_temp_max,
75d560168bSGuenter Roeck 	hwmon_temp_max_hyst,
76d560168bSGuenter Roeck 	hwmon_temp_crit,
77d560168bSGuenter Roeck 	hwmon_temp_crit_hyst,
78d560168bSGuenter Roeck 	hwmon_temp_emergency,
79d560168bSGuenter Roeck 	hwmon_temp_emergency_hyst,
80d560168bSGuenter Roeck 	hwmon_temp_alarm,
81d560168bSGuenter Roeck 	hwmon_temp_lcrit_alarm,
82d560168bSGuenter Roeck 	hwmon_temp_min_alarm,
83d560168bSGuenter Roeck 	hwmon_temp_max_alarm,
84d560168bSGuenter Roeck 	hwmon_temp_crit_alarm,
85d560168bSGuenter Roeck 	hwmon_temp_emergency_alarm,
86d560168bSGuenter Roeck 	hwmon_temp_fault,
87d560168bSGuenter Roeck 	hwmon_temp_offset,
88d560168bSGuenter Roeck 	hwmon_temp_label,
89d560168bSGuenter Roeck 	hwmon_temp_lowest,
90d560168bSGuenter Roeck 	hwmon_temp_highest,
91d560168bSGuenter Roeck 	hwmon_temp_reset_history,
921967f712SZbigniew Lukwinski 	hwmon_temp_rated_min,
931967f712SZbigniew Lukwinski 	hwmon_temp_rated_max,
94fe6ac237SJames Seo 	hwmon_temp_beep,
95d560168bSGuenter Roeck };
96d560168bSGuenter Roeck 
97002c6b54SGuenter Roeck #define HWMON_T_ENABLE		BIT(hwmon_temp_enable)
98d560168bSGuenter Roeck #define HWMON_T_INPUT		BIT(hwmon_temp_input)
99d560168bSGuenter Roeck #define HWMON_T_TYPE		BIT(hwmon_temp_type)
100d560168bSGuenter Roeck #define HWMON_T_LCRIT		BIT(hwmon_temp_lcrit)
101d560168bSGuenter Roeck #define HWMON_T_LCRIT_HYST	BIT(hwmon_temp_lcrit_hyst)
102d560168bSGuenter Roeck #define HWMON_T_MIN		BIT(hwmon_temp_min)
103d560168bSGuenter Roeck #define HWMON_T_MIN_HYST	BIT(hwmon_temp_min_hyst)
104d560168bSGuenter Roeck #define HWMON_T_MAX		BIT(hwmon_temp_max)
105d560168bSGuenter Roeck #define HWMON_T_MAX_HYST	BIT(hwmon_temp_max_hyst)
106d560168bSGuenter Roeck #define HWMON_T_CRIT		BIT(hwmon_temp_crit)
107d560168bSGuenter Roeck #define HWMON_T_CRIT_HYST	BIT(hwmon_temp_crit_hyst)
108d560168bSGuenter Roeck #define HWMON_T_EMERGENCY	BIT(hwmon_temp_emergency)
109d560168bSGuenter Roeck #define HWMON_T_EMERGENCY_HYST	BIT(hwmon_temp_emergency_hyst)
110a5023a99SPeter Huewe #define HWMON_T_ALARM		BIT(hwmon_temp_alarm)
111d560168bSGuenter Roeck #define HWMON_T_MIN_ALARM	BIT(hwmon_temp_min_alarm)
112d560168bSGuenter Roeck #define HWMON_T_MAX_ALARM	BIT(hwmon_temp_max_alarm)
113d560168bSGuenter Roeck #define HWMON_T_CRIT_ALARM	BIT(hwmon_temp_crit_alarm)
1142fe31e43SAndrew Lunn #define HWMON_T_LCRIT_ALARM	BIT(hwmon_temp_lcrit_alarm)
115d560168bSGuenter Roeck #define HWMON_T_EMERGENCY_ALARM	BIT(hwmon_temp_emergency_alarm)
116d560168bSGuenter Roeck #define HWMON_T_FAULT		BIT(hwmon_temp_fault)
117d560168bSGuenter Roeck #define HWMON_T_OFFSET		BIT(hwmon_temp_offset)
118d560168bSGuenter Roeck #define HWMON_T_LABEL		BIT(hwmon_temp_label)
119d560168bSGuenter Roeck #define HWMON_T_LOWEST		BIT(hwmon_temp_lowest)
120d560168bSGuenter Roeck #define HWMON_T_HIGHEST		BIT(hwmon_temp_highest)
121d560168bSGuenter Roeck #define HWMON_T_RESET_HISTORY	BIT(hwmon_temp_reset_history)
1221967f712SZbigniew Lukwinski #define HWMON_T_RATED_MIN	BIT(hwmon_temp_rated_min)
1231967f712SZbigniew Lukwinski #define HWMON_T_RATED_MAX	BIT(hwmon_temp_rated_max)
124fe6ac237SJames Seo #define HWMON_T_BEEP		BIT(hwmon_temp_beep)
125d560168bSGuenter Roeck 
12600d616cfSGuenter Roeck enum hwmon_in_attributes {
127002c6b54SGuenter Roeck 	hwmon_in_enable,
12800d616cfSGuenter Roeck 	hwmon_in_input,
12900d616cfSGuenter Roeck 	hwmon_in_min,
13000d616cfSGuenter Roeck 	hwmon_in_max,
13100d616cfSGuenter Roeck 	hwmon_in_lcrit,
13200d616cfSGuenter Roeck 	hwmon_in_crit,
13300d616cfSGuenter Roeck 	hwmon_in_average,
13400d616cfSGuenter Roeck 	hwmon_in_lowest,
13500d616cfSGuenter Roeck 	hwmon_in_highest,
13600d616cfSGuenter Roeck 	hwmon_in_reset_history,
13700d616cfSGuenter Roeck 	hwmon_in_label,
13800d616cfSGuenter Roeck 	hwmon_in_alarm,
13900d616cfSGuenter Roeck 	hwmon_in_min_alarm,
14000d616cfSGuenter Roeck 	hwmon_in_max_alarm,
14100d616cfSGuenter Roeck 	hwmon_in_lcrit_alarm,
14200d616cfSGuenter Roeck 	hwmon_in_crit_alarm,
1431967f712SZbigniew Lukwinski 	hwmon_in_rated_min,
1441967f712SZbigniew Lukwinski 	hwmon_in_rated_max,
145fe6ac237SJames Seo 	hwmon_in_beep,
14635c1bfb9SNuno Sa 	hwmon_in_fault,
14700d616cfSGuenter Roeck };
14800d616cfSGuenter Roeck 
149002c6b54SGuenter Roeck #define HWMON_I_ENABLE		BIT(hwmon_in_enable)
15000d616cfSGuenter Roeck #define HWMON_I_INPUT		BIT(hwmon_in_input)
15100d616cfSGuenter Roeck #define HWMON_I_MIN		BIT(hwmon_in_min)
15200d616cfSGuenter Roeck #define HWMON_I_MAX		BIT(hwmon_in_max)
15300d616cfSGuenter Roeck #define HWMON_I_LCRIT		BIT(hwmon_in_lcrit)
15400d616cfSGuenter Roeck #define HWMON_I_CRIT		BIT(hwmon_in_crit)
15500d616cfSGuenter Roeck #define HWMON_I_AVERAGE		BIT(hwmon_in_average)
15600d616cfSGuenter Roeck #define HWMON_I_LOWEST		BIT(hwmon_in_lowest)
15700d616cfSGuenter Roeck #define HWMON_I_HIGHEST		BIT(hwmon_in_highest)
15800d616cfSGuenter Roeck #define HWMON_I_RESET_HISTORY	BIT(hwmon_in_reset_history)
15900d616cfSGuenter Roeck #define HWMON_I_LABEL		BIT(hwmon_in_label)
16000d616cfSGuenter Roeck #define HWMON_I_ALARM		BIT(hwmon_in_alarm)
16100d616cfSGuenter Roeck #define HWMON_I_MIN_ALARM	BIT(hwmon_in_min_alarm)
16200d616cfSGuenter Roeck #define HWMON_I_MAX_ALARM	BIT(hwmon_in_max_alarm)
16300d616cfSGuenter Roeck #define HWMON_I_LCRIT_ALARM	BIT(hwmon_in_lcrit_alarm)
16400d616cfSGuenter Roeck #define HWMON_I_CRIT_ALARM	BIT(hwmon_in_crit_alarm)
1651967f712SZbigniew Lukwinski #define HWMON_I_RATED_MIN	BIT(hwmon_in_rated_min)
1661967f712SZbigniew Lukwinski #define HWMON_I_RATED_MAX	BIT(hwmon_in_rated_max)
167fe6ac237SJames Seo #define HWMON_I_BEEP		BIT(hwmon_in_beep)
16835c1bfb9SNuno Sa #define HWMON_I_FAULT		BIT(hwmon_in_fault)
16900d616cfSGuenter Roeck 
1709b26947cSGuenter Roeck enum hwmon_curr_attributes {
171002c6b54SGuenter Roeck 	hwmon_curr_enable,
1729b26947cSGuenter Roeck 	hwmon_curr_input,
1739b26947cSGuenter Roeck 	hwmon_curr_min,
1749b26947cSGuenter Roeck 	hwmon_curr_max,
1759b26947cSGuenter Roeck 	hwmon_curr_lcrit,
1769b26947cSGuenter Roeck 	hwmon_curr_crit,
1779b26947cSGuenter Roeck 	hwmon_curr_average,
1789b26947cSGuenter Roeck 	hwmon_curr_lowest,
1799b26947cSGuenter Roeck 	hwmon_curr_highest,
1809b26947cSGuenter Roeck 	hwmon_curr_reset_history,
1819b26947cSGuenter Roeck 	hwmon_curr_label,
1829b26947cSGuenter Roeck 	hwmon_curr_alarm,
1839b26947cSGuenter Roeck 	hwmon_curr_min_alarm,
1849b26947cSGuenter Roeck 	hwmon_curr_max_alarm,
1859b26947cSGuenter Roeck 	hwmon_curr_lcrit_alarm,
1869b26947cSGuenter Roeck 	hwmon_curr_crit_alarm,
1871967f712SZbigniew Lukwinski 	hwmon_curr_rated_min,
1881967f712SZbigniew Lukwinski 	hwmon_curr_rated_max,
189fe6ac237SJames Seo 	hwmon_curr_beep,
1909b26947cSGuenter Roeck };
1919b26947cSGuenter Roeck 
192002c6b54SGuenter Roeck #define HWMON_C_ENABLE		BIT(hwmon_curr_enable)
1939b26947cSGuenter Roeck #define HWMON_C_INPUT		BIT(hwmon_curr_input)
1949b26947cSGuenter Roeck #define HWMON_C_MIN		BIT(hwmon_curr_min)
1959b26947cSGuenter Roeck #define HWMON_C_MAX		BIT(hwmon_curr_max)
1969b26947cSGuenter Roeck #define HWMON_C_LCRIT		BIT(hwmon_curr_lcrit)
1979b26947cSGuenter Roeck #define HWMON_C_CRIT		BIT(hwmon_curr_crit)
1989b26947cSGuenter Roeck #define HWMON_C_AVERAGE		BIT(hwmon_curr_average)
1999b26947cSGuenter Roeck #define HWMON_C_LOWEST		BIT(hwmon_curr_lowest)
2009b26947cSGuenter Roeck #define HWMON_C_HIGHEST		BIT(hwmon_curr_highest)
2019b26947cSGuenter Roeck #define HWMON_C_RESET_HISTORY	BIT(hwmon_curr_reset_history)
2029b26947cSGuenter Roeck #define HWMON_C_LABEL		BIT(hwmon_curr_label)
2039b26947cSGuenter Roeck #define HWMON_C_ALARM		BIT(hwmon_curr_alarm)
2049b26947cSGuenter Roeck #define HWMON_C_MIN_ALARM	BIT(hwmon_curr_min_alarm)
2059b26947cSGuenter Roeck #define HWMON_C_MAX_ALARM	BIT(hwmon_curr_max_alarm)
2069b26947cSGuenter Roeck #define HWMON_C_LCRIT_ALARM	BIT(hwmon_curr_lcrit_alarm)
2079b26947cSGuenter Roeck #define HWMON_C_CRIT_ALARM	BIT(hwmon_curr_crit_alarm)
2081967f712SZbigniew Lukwinski #define HWMON_C_RATED_MIN	BIT(hwmon_curr_rated_min)
2091967f712SZbigniew Lukwinski #define HWMON_C_RATED_MAX	BIT(hwmon_curr_rated_max)
210fe6ac237SJames Seo #define HWMON_C_BEEP		BIT(hwmon_curr_beep)
2119b26947cSGuenter Roeck 
212b308f5c7SGuenter Roeck enum hwmon_power_attributes {
213002c6b54SGuenter Roeck 	hwmon_power_enable,
214b308f5c7SGuenter Roeck 	hwmon_power_average,
215b308f5c7SGuenter Roeck 	hwmon_power_average_interval,
216b308f5c7SGuenter Roeck 	hwmon_power_average_interval_max,
217b308f5c7SGuenter Roeck 	hwmon_power_average_interval_min,
218b308f5c7SGuenter Roeck 	hwmon_power_average_highest,
219b308f5c7SGuenter Roeck 	hwmon_power_average_lowest,
220b308f5c7SGuenter Roeck 	hwmon_power_average_max,
221b308f5c7SGuenter Roeck 	hwmon_power_average_min,
222b308f5c7SGuenter Roeck 	hwmon_power_input,
223b308f5c7SGuenter Roeck 	hwmon_power_input_highest,
224b308f5c7SGuenter Roeck 	hwmon_power_input_lowest,
225b308f5c7SGuenter Roeck 	hwmon_power_reset_history,
226b308f5c7SGuenter Roeck 	hwmon_power_accuracy,
227b308f5c7SGuenter Roeck 	hwmon_power_cap,
228b308f5c7SGuenter Roeck 	hwmon_power_cap_hyst,
229b308f5c7SGuenter Roeck 	hwmon_power_cap_max,
230b308f5c7SGuenter Roeck 	hwmon_power_cap_min,
231aa7f29b0SAndrew Lunn 	hwmon_power_min,
232b308f5c7SGuenter Roeck 	hwmon_power_max,
233b308f5c7SGuenter Roeck 	hwmon_power_crit,
234aa7f29b0SAndrew Lunn 	hwmon_power_lcrit,
235b308f5c7SGuenter Roeck 	hwmon_power_label,
236b308f5c7SGuenter Roeck 	hwmon_power_alarm,
237b308f5c7SGuenter Roeck 	hwmon_power_cap_alarm,
238aa7f29b0SAndrew Lunn 	hwmon_power_min_alarm,
239b308f5c7SGuenter Roeck 	hwmon_power_max_alarm,
240aa7f29b0SAndrew Lunn 	hwmon_power_lcrit_alarm,
241b308f5c7SGuenter Roeck 	hwmon_power_crit_alarm,
2421967f712SZbigniew Lukwinski 	hwmon_power_rated_min,
2431967f712SZbigniew Lukwinski 	hwmon_power_rated_max,
244b308f5c7SGuenter Roeck };
245b308f5c7SGuenter Roeck 
246002c6b54SGuenter Roeck #define HWMON_P_ENABLE			BIT(hwmon_power_enable)
247b308f5c7SGuenter Roeck #define HWMON_P_AVERAGE			BIT(hwmon_power_average)
248b308f5c7SGuenter Roeck #define HWMON_P_AVERAGE_INTERVAL	BIT(hwmon_power_average_interval)
249b308f5c7SGuenter Roeck #define HWMON_P_AVERAGE_INTERVAL_MAX	BIT(hwmon_power_average_interval_max)
250b308f5c7SGuenter Roeck #define HWMON_P_AVERAGE_INTERVAL_MIN	BIT(hwmon_power_average_interval_min)
251b308f5c7SGuenter Roeck #define HWMON_P_AVERAGE_HIGHEST		BIT(hwmon_power_average_highest)
252b308f5c7SGuenter Roeck #define HWMON_P_AVERAGE_LOWEST		BIT(hwmon_power_average_lowest)
253b308f5c7SGuenter Roeck #define HWMON_P_AVERAGE_MAX		BIT(hwmon_power_average_max)
254b308f5c7SGuenter Roeck #define HWMON_P_AVERAGE_MIN		BIT(hwmon_power_average_min)
255b308f5c7SGuenter Roeck #define HWMON_P_INPUT			BIT(hwmon_power_input)
256b308f5c7SGuenter Roeck #define HWMON_P_INPUT_HIGHEST		BIT(hwmon_power_input_highest)
257b308f5c7SGuenter Roeck #define HWMON_P_INPUT_LOWEST		BIT(hwmon_power_input_lowest)
258b308f5c7SGuenter Roeck #define HWMON_P_RESET_HISTORY		BIT(hwmon_power_reset_history)
259b308f5c7SGuenter Roeck #define HWMON_P_ACCURACY		BIT(hwmon_power_accuracy)
260b308f5c7SGuenter Roeck #define HWMON_P_CAP			BIT(hwmon_power_cap)
261b308f5c7SGuenter Roeck #define HWMON_P_CAP_HYST		BIT(hwmon_power_cap_hyst)
262b308f5c7SGuenter Roeck #define HWMON_P_CAP_MAX			BIT(hwmon_power_cap_max)
263b308f5c7SGuenter Roeck #define HWMON_P_CAP_MIN			BIT(hwmon_power_cap_min)
264aa7f29b0SAndrew Lunn #define HWMON_P_MIN			BIT(hwmon_power_min)
265b308f5c7SGuenter Roeck #define HWMON_P_MAX			BIT(hwmon_power_max)
266aa7f29b0SAndrew Lunn #define HWMON_P_LCRIT			BIT(hwmon_power_lcrit)
267b308f5c7SGuenter Roeck #define HWMON_P_CRIT			BIT(hwmon_power_crit)
268b308f5c7SGuenter Roeck #define HWMON_P_LABEL			BIT(hwmon_power_label)
269b308f5c7SGuenter Roeck #define HWMON_P_ALARM			BIT(hwmon_power_alarm)
270b308f5c7SGuenter Roeck #define HWMON_P_CAP_ALARM		BIT(hwmon_power_cap_alarm)
27130945d31SNuno Sá #define HWMON_P_MIN_ALARM		BIT(hwmon_power_min_alarm)
272b308f5c7SGuenter Roeck #define HWMON_P_MAX_ALARM		BIT(hwmon_power_max_alarm)
273aa7f29b0SAndrew Lunn #define HWMON_P_LCRIT_ALARM		BIT(hwmon_power_lcrit_alarm)
274b308f5c7SGuenter Roeck #define HWMON_P_CRIT_ALARM		BIT(hwmon_power_crit_alarm)
2751967f712SZbigniew Lukwinski #define HWMON_P_RATED_MIN		BIT(hwmon_power_rated_min)
2761967f712SZbigniew Lukwinski #define HWMON_P_RATED_MAX		BIT(hwmon_power_rated_max)
277b308f5c7SGuenter Roeck 
2786bfcca44SGuenter Roeck enum hwmon_energy_attributes {
279002c6b54SGuenter Roeck 	hwmon_energy_enable,
2806bfcca44SGuenter Roeck 	hwmon_energy_input,
2816bfcca44SGuenter Roeck 	hwmon_energy_label,
2826bfcca44SGuenter Roeck };
2836bfcca44SGuenter Roeck 
284002c6b54SGuenter Roeck #define HWMON_E_ENABLE			BIT(hwmon_energy_enable)
2856bfcca44SGuenter Roeck #define HWMON_E_INPUT			BIT(hwmon_energy_input)
2866bfcca44SGuenter Roeck #define HWMON_E_LABEL			BIT(hwmon_energy_label)
2876bfcca44SGuenter Roeck 
2886bfcca44SGuenter Roeck enum hwmon_humidity_attributes {
289002c6b54SGuenter Roeck 	hwmon_humidity_enable,
2906bfcca44SGuenter Roeck 	hwmon_humidity_input,
2916bfcca44SGuenter Roeck 	hwmon_humidity_label,
2926bfcca44SGuenter Roeck 	hwmon_humidity_min,
2936bfcca44SGuenter Roeck 	hwmon_humidity_min_hyst,
2946bfcca44SGuenter Roeck 	hwmon_humidity_max,
2956bfcca44SGuenter Roeck 	hwmon_humidity_max_hyst,
2966bfcca44SGuenter Roeck 	hwmon_humidity_alarm,
2976bfcca44SGuenter Roeck 	hwmon_humidity_fault,
2981967f712SZbigniew Lukwinski 	hwmon_humidity_rated_min,
2991967f712SZbigniew Lukwinski 	hwmon_humidity_rated_max,
3005f85c4d1SJavier Carrasco 	hwmon_humidity_min_alarm,
3015f85c4d1SJavier Carrasco 	hwmon_humidity_max_alarm,
3026bfcca44SGuenter Roeck };
3036bfcca44SGuenter Roeck 
304002c6b54SGuenter Roeck #define HWMON_H_ENABLE			BIT(hwmon_humidity_enable)
3056bfcca44SGuenter Roeck #define HWMON_H_INPUT			BIT(hwmon_humidity_input)
3066bfcca44SGuenter Roeck #define HWMON_H_LABEL			BIT(hwmon_humidity_label)
3076bfcca44SGuenter Roeck #define HWMON_H_MIN			BIT(hwmon_humidity_min)
3086bfcca44SGuenter Roeck #define HWMON_H_MIN_HYST		BIT(hwmon_humidity_min_hyst)
3096bfcca44SGuenter Roeck #define HWMON_H_MAX			BIT(hwmon_humidity_max)
3106bfcca44SGuenter Roeck #define HWMON_H_MAX_HYST		BIT(hwmon_humidity_max_hyst)
3116bfcca44SGuenter Roeck #define HWMON_H_ALARM			BIT(hwmon_humidity_alarm)
3126bfcca44SGuenter Roeck #define HWMON_H_FAULT			BIT(hwmon_humidity_fault)
3131967f712SZbigniew Lukwinski #define HWMON_H_RATED_MIN		BIT(hwmon_humidity_rated_min)
3141967f712SZbigniew Lukwinski #define HWMON_H_RATED_MAX		BIT(hwmon_humidity_rated_max)
3155f85c4d1SJavier Carrasco #define HWMON_H_MIN_ALARM		BIT(hwmon_humidity_min_alarm)
3165f85c4d1SJavier Carrasco #define HWMON_H_MAX_ALARM		BIT(hwmon_humidity_max_alarm)
3176bfcca44SGuenter Roeck 
3188faee73fSGuenter Roeck enum hwmon_fan_attributes {
319002c6b54SGuenter Roeck 	hwmon_fan_enable,
3208faee73fSGuenter Roeck 	hwmon_fan_input,
3218faee73fSGuenter Roeck 	hwmon_fan_label,
3228faee73fSGuenter Roeck 	hwmon_fan_min,
3238faee73fSGuenter Roeck 	hwmon_fan_max,
3248faee73fSGuenter Roeck 	hwmon_fan_div,
3258faee73fSGuenter Roeck 	hwmon_fan_pulses,
3268faee73fSGuenter Roeck 	hwmon_fan_target,
3278faee73fSGuenter Roeck 	hwmon_fan_alarm,
3288faee73fSGuenter Roeck 	hwmon_fan_min_alarm,
3298faee73fSGuenter Roeck 	hwmon_fan_max_alarm,
3308faee73fSGuenter Roeck 	hwmon_fan_fault,
331fe6ac237SJames Seo 	hwmon_fan_beep,
3328faee73fSGuenter Roeck };
3338faee73fSGuenter Roeck 
334002c6b54SGuenter Roeck #define HWMON_F_ENABLE			BIT(hwmon_fan_enable)
3358faee73fSGuenter Roeck #define HWMON_F_INPUT			BIT(hwmon_fan_input)
3368faee73fSGuenter Roeck #define HWMON_F_LABEL			BIT(hwmon_fan_label)
3378faee73fSGuenter Roeck #define HWMON_F_MIN			BIT(hwmon_fan_min)
3388faee73fSGuenter Roeck #define HWMON_F_MAX			BIT(hwmon_fan_max)
3398faee73fSGuenter Roeck #define HWMON_F_DIV			BIT(hwmon_fan_div)
3408faee73fSGuenter Roeck #define HWMON_F_PULSES			BIT(hwmon_fan_pulses)
3418faee73fSGuenter Roeck #define HWMON_F_TARGET			BIT(hwmon_fan_target)
3428faee73fSGuenter Roeck #define HWMON_F_ALARM			BIT(hwmon_fan_alarm)
3438faee73fSGuenter Roeck #define HWMON_F_MIN_ALARM		BIT(hwmon_fan_min_alarm)
3448faee73fSGuenter Roeck #define HWMON_F_MAX_ALARM		BIT(hwmon_fan_max_alarm)
3458faee73fSGuenter Roeck #define HWMON_F_FAULT			BIT(hwmon_fan_fault)
346fe6ac237SJames Seo #define HWMON_F_BEEP			BIT(hwmon_fan_beep)
3478faee73fSGuenter Roeck 
348f9f7bb3aSGuenter Roeck enum hwmon_pwm_attributes {
349f9f7bb3aSGuenter Roeck 	hwmon_pwm_input,
350f9f7bb3aSGuenter Roeck 	hwmon_pwm_enable,
351f9f7bb3aSGuenter Roeck 	hwmon_pwm_mode,
352f9f7bb3aSGuenter Roeck 	hwmon_pwm_freq,
353e75d16e5SArmin Wolf 	hwmon_pwm_auto_channels_temp,
354f9f7bb3aSGuenter Roeck };
355f9f7bb3aSGuenter Roeck 
356f9f7bb3aSGuenter Roeck #define HWMON_PWM_INPUT			BIT(hwmon_pwm_input)
357f9f7bb3aSGuenter Roeck #define HWMON_PWM_ENABLE		BIT(hwmon_pwm_enable)
358f9f7bb3aSGuenter Roeck #define HWMON_PWM_MODE			BIT(hwmon_pwm_mode)
359f9f7bb3aSGuenter Roeck #define HWMON_PWM_FREQ			BIT(hwmon_pwm_freq)
360e75d16e5SArmin Wolf #define HWMON_PWM_AUTO_CHANNELS_TEMP	BIT(hwmon_pwm_auto_channels_temp)
361f9f7bb3aSGuenter Roeck 
3624413405fSDr. David Alan Gilbert enum hwmon_intrusion_attributes {
3634413405fSDr. David Alan Gilbert 	hwmon_intrusion_alarm,
3644413405fSDr. David Alan Gilbert 	hwmon_intrusion_beep,
3654413405fSDr. David Alan Gilbert };
3664413405fSDr. David Alan Gilbert #define HWMON_INTRUSION_ALARM		BIT(hwmon_intrusion_alarm)
3674413405fSDr. David Alan Gilbert #define HWMON_INTRUSION_BEEP		BIT(hwmon_intrusion_beep)
3684413405fSDr. David Alan Gilbert 
369d560168bSGuenter Roeck /**
370d560168bSGuenter Roeck  * struct hwmon_ops - hwmon device operations
371*79bc0af9SHeiner Kallweit  * @visible:	Static visibility. If non-zero, 'is_visible' is ignored.
372*79bc0af9SHeiner Kallweit  * @is_visible: Callback to return attribute visibility. Mandatory unless
373*79bc0af9SHeiner Kallweit  *		'visible' is non-zero.
374d560168bSGuenter Roeck  *		Parameters are:
375d560168bSGuenter Roeck  *		@const void *drvdata:
376d560168bSGuenter Roeck  *			Pointer to driver-private data structure passed
377d560168bSGuenter Roeck  *			as argument to hwmon_device_register_with_info().
378d560168bSGuenter Roeck  *		@type:	Sensor type
379d560168bSGuenter Roeck  *		@attr:	Sensor attribute
380d560168bSGuenter Roeck  *		@channel:
381d560168bSGuenter Roeck  *			Channel number
382d560168bSGuenter Roeck  *		The function returns the file permissions.
383d560168bSGuenter Roeck  *		If the return value is 0, no attribute will be created.
384e159ab5cSGuenter Roeck  * @read:	Read callback for data attributes. Mandatory if readable
385e159ab5cSGuenter Roeck  *		data attributes are present.
386d560168bSGuenter Roeck  *		Parameters are:
387d560168bSGuenter Roeck  *		@dev:	Pointer to hardware monitoring device
388d560168bSGuenter Roeck  *		@type:	Sensor type
389d560168bSGuenter Roeck  *		@attr:	Sensor attribute
390d560168bSGuenter Roeck  *		@channel:
391d560168bSGuenter Roeck  *			Channel number
392d560168bSGuenter Roeck  *		@val:	Pointer to returned value
393d560168bSGuenter Roeck  *		The function returns 0 on success or a negative error number.
394e159ab5cSGuenter Roeck  * @read_string:
395e159ab5cSGuenter Roeck  *		Read callback for string attributes. Mandatory if string
396e159ab5cSGuenter Roeck  *		attributes are present.
397e159ab5cSGuenter Roeck  *		Parameters are:
398e159ab5cSGuenter Roeck  *		@dev:	Pointer to hardware monitoring device
399e159ab5cSGuenter Roeck  *		@type:	Sensor type
400e159ab5cSGuenter Roeck  *		@attr:	Sensor attribute
401e159ab5cSGuenter Roeck  *		@channel:
402e159ab5cSGuenter Roeck  *			Channel number
403e159ab5cSGuenter Roeck  *		@str:	Pointer to returned string
404e159ab5cSGuenter Roeck  *		The function returns 0 on success or a negative error number.
405e159ab5cSGuenter Roeck  * @write:	Write callback for data attributes. Mandatory if writeable
406e159ab5cSGuenter Roeck  *		data attributes are present.
407d560168bSGuenter Roeck  *		Parameters are:
408d560168bSGuenter Roeck  *		@dev:	Pointer to hardware monitoring device
409d560168bSGuenter Roeck  *		@type:	Sensor type
410d560168bSGuenter Roeck  *		@attr:	Sensor attribute
411d560168bSGuenter Roeck  *		@channel:
412d560168bSGuenter Roeck  *			Channel number
413d560168bSGuenter Roeck  *		@val:	Value to write
414d560168bSGuenter Roeck  *		The function returns 0 on success or a negative error number.
415d560168bSGuenter Roeck  */
416d560168bSGuenter Roeck struct hwmon_ops {
417*79bc0af9SHeiner Kallweit 	umode_t visible;
418d560168bSGuenter Roeck 	umode_t (*is_visible)(const void *drvdata, enum hwmon_sensor_types type,
419d560168bSGuenter Roeck 			      u32 attr, int channel);
420d560168bSGuenter Roeck 	int (*read)(struct device *dev, enum hwmon_sensor_types type,
421d560168bSGuenter Roeck 		    u32 attr, int channel, long *val);
422e159ab5cSGuenter Roeck 	int (*read_string)(struct device *dev, enum hwmon_sensor_types type,
4235ba6bcbcSJean Delvare 		    u32 attr, int channel, const char **str);
424d560168bSGuenter Roeck 	int (*write)(struct device *dev, enum hwmon_sensor_types type,
425d560168bSGuenter Roeck 		     u32 attr, int channel, long val);
426d560168bSGuenter Roeck };
427d560168bSGuenter Roeck 
428d560168bSGuenter Roeck /**
429130d1688SLukas Bulwahn  * struct hwmon_channel_info - Channel information
430d560168bSGuenter Roeck  * @type:	Channel type.
431d560168bSGuenter Roeck  * @config:	Pointer to NULL-terminated list of channel parameters.
432d560168bSGuenter Roeck  *		Use for per-channel attributes.
433d560168bSGuenter Roeck  */
434d560168bSGuenter Roeck struct hwmon_channel_info {
435d560168bSGuenter Roeck 	enum hwmon_sensor_types type;
436d560168bSGuenter Roeck 	const u32 *config;
437d560168bSGuenter Roeck };
438d560168bSGuenter Roeck 
439c43a113cSCharles Keepax #define HWMON_CHANNEL_INFO(stype, ...)		\
440b9f55084SJani Nikula 	(&(const struct hwmon_channel_info) {	\
441c43a113cSCharles Keepax 		.type = hwmon_##stype,		\
442b9f55084SJani Nikula 		.config = (const u32 []) {	\
443c43a113cSCharles Keepax 			__VA_ARGS__, 0		\
444c43a113cSCharles Keepax 		}				\
445c43a113cSCharles Keepax 	})
446c43a113cSCharles Keepax 
447d560168bSGuenter Roeck /**
448130d1688SLukas Bulwahn  * struct hwmon_chip_info - Chip configuration
449d560168bSGuenter Roeck  * @ops:	Pointer to hwmon operations.
450d560168bSGuenter Roeck  * @info:	Null-terminated list of channel information.
451d560168bSGuenter Roeck  */
452d560168bSGuenter Roeck struct hwmon_chip_info {
453d560168bSGuenter Roeck 	const struct hwmon_ops *ops;
454d8cc9415SKrzysztof Kozlowski 	const struct hwmon_channel_info * const *info;
455d560168bSGuenter Roeck };
456d560168bSGuenter Roeck 
457af1bd36cSGuenter Roeck /* hwmon_device_register() is deprecated */
4581beeffe4STony Jones struct device *hwmon_device_register(struct device *dev);
459af1bd36cSGuenter Roeck 
4605720a18bSGuenter Roeck /*
4615720a18bSGuenter Roeck  * hwmon_device_register_with_groups() and
4625720a18bSGuenter Roeck  * devm_hwmon_device_register_with_groups() are deprecated.
4635720a18bSGuenter Roeck  */
464bab2243cSGuenter Roeck struct device *
465bab2243cSGuenter Roeck hwmon_device_register_with_groups(struct device *dev, const char *name,
466bab2243cSGuenter Roeck 				  void *drvdata,
467bab2243cSGuenter Roeck 				  const struct attribute_group **groups);
46874188cbaSGuenter Roeck struct device *
46974188cbaSGuenter Roeck devm_hwmon_device_register_with_groups(struct device *dev, const char *name,
47074188cbaSGuenter Roeck 				       void *drvdata,
47174188cbaSGuenter Roeck 				       const struct attribute_group **groups);
472d560168bSGuenter Roeck struct device *
473d560168bSGuenter Roeck hwmon_device_register_with_info(struct device *dev,
474d560168bSGuenter Roeck 				const char *name, void *drvdata,
475d560168bSGuenter Roeck 				const struct hwmon_chip_info *info,
476848ba0a2SGuenter Roeck 				const struct attribute_group **extra_groups);
477d560168bSGuenter Roeck struct device *
478e5d21072SGuenter Roeck hwmon_device_register_for_thermal(struct device *dev, const char *name,
479e5d21072SGuenter Roeck 				  void *drvdata);
480e5d21072SGuenter Roeck struct device *
481d560168bSGuenter Roeck devm_hwmon_device_register_with_info(struct device *dev,
482d560168bSGuenter Roeck 				const char *name, void *drvdata,
483d560168bSGuenter Roeck 				const struct hwmon_chip_info *info,
484848ba0a2SGuenter Roeck 				const struct attribute_group **extra_groups);
4851236441fSMark M. Hoffman 
4861beeffe4STony Jones void hwmon_device_unregister(struct device *dev);
4871236441fSMark M. Hoffman 
4881597b374SGuenter Roeck int hwmon_notify_event(struct device *dev, enum hwmon_sensor_types type,
4891597b374SGuenter Roeck 		       u32 attr, int channel);
4901597b374SGuenter Roeck 
4911ad6c3b7SMichael Walle char *hwmon_sanitize_name(const char *name);
4921ad6c3b7SMichael Walle char *devm_hwmon_sanitize_name(struct device *dev, const char *name);
4931ad6c3b7SMichael Walle 
494dcb5d0fcSAndrew Lunn /**
495dcb5d0fcSAndrew Lunn  * hwmon_is_bad_char - Is the char invalid in a hwmon name
496dcb5d0fcSAndrew Lunn  * @ch: the char to be considered
497dcb5d0fcSAndrew Lunn  *
498dcb5d0fcSAndrew Lunn  * hwmon_is_bad_char() can be used to determine if the given character
499dcb5d0fcSAndrew Lunn  * may not be used in a hwmon name.
500dcb5d0fcSAndrew Lunn  *
501dcb5d0fcSAndrew Lunn  * Returns true if the char is invalid, false otherwise.
502dcb5d0fcSAndrew Lunn  */
hwmon_is_bad_char(const char ch)503dcb5d0fcSAndrew Lunn static inline bool hwmon_is_bad_char(const char ch)
504dcb5d0fcSAndrew Lunn {
505dcb5d0fcSAndrew Lunn 	switch (ch) {
506dcb5d0fcSAndrew Lunn 	case '-':
507dcb5d0fcSAndrew Lunn 	case '*':
508dcb5d0fcSAndrew Lunn 	case ' ':
509dcb5d0fcSAndrew Lunn 	case '\t':
510dcb5d0fcSAndrew Lunn 	case '\n':
511dcb5d0fcSAndrew Lunn 		return true;
512dcb5d0fcSAndrew Lunn 	default:
513dcb5d0fcSAndrew Lunn 		return false;
514dcb5d0fcSAndrew Lunn 	}
515dcb5d0fcSAndrew Lunn }
516dcb5d0fcSAndrew Lunn 
5171236441fSMark M. Hoffman #endif
518