hwmon.h 13.9 KB
Newer Older
1
/* SPDX-License-Identifier: GPL-2.0-only */
2 3 4 5 6 7 8 9 10 11 12 13 14
/*
    hwmon.h - part of lm_sensors, Linux kernel modules for hardware monitoring

    This file declares helper functions for the sysfs class "hwmon",
    for use by sensors drivers.

    Copyright (C) 2005 Mark M. Hoffman <mhoffman@lightlink.com>

*/

#ifndef _HWMON_H_
#define _HWMON_H_

15 16
#include <linux/bitops.h>

17
struct device;
18
struct attribute_group;
19

20 21 22 23 24 25 26
enum hwmon_sensor_types {
	hwmon_chip,
	hwmon_temp,
	hwmon_in,
	hwmon_curr,
	hwmon_power,
	hwmon_energy,
27
	hwmon_humidity,
28
	hwmon_fan,
29
	hwmon_pwm,
30
	hwmon_intrusion,
31
	hwmon_max,
32 33 34 35
};

enum hwmon_chip_attributes {
	hwmon_chip_temp_reset_history,
36
	hwmon_chip_in_reset_history,
37
	hwmon_chip_curr_reset_history,
38
	hwmon_chip_power_reset_history,
39 40 41
	hwmon_chip_register_tz,
	hwmon_chip_update_interval,
	hwmon_chip_alarms,
42 43 44 45 46
	hwmon_chip_samples,
	hwmon_chip_curr_samples,
	hwmon_chip_in_samples,
	hwmon_chip_power_samples,
	hwmon_chip_temp_samples,
47 48 49 50
};

#define HWMON_C_TEMP_RESET_HISTORY	BIT(hwmon_chip_temp_reset_history)
#define HWMON_C_IN_RESET_HISTORY	BIT(hwmon_chip_in_reset_history)
51
#define HWMON_C_CURR_RESET_HISTORY	BIT(hwmon_chip_curr_reset_history)
52
#define HWMON_C_POWER_RESET_HISTORY	BIT(hwmon_chip_power_reset_history)
53 54 55
#define HWMON_C_REGISTER_TZ		BIT(hwmon_chip_register_tz)
#define HWMON_C_UPDATE_INTERVAL		BIT(hwmon_chip_update_interval)
#define HWMON_C_ALARMS			BIT(hwmon_chip_alarms)
56 57 58 59 60
#define HWMON_C_SAMPLES			BIT(hwmon_chip_samples)
#define HWMON_C_CURR_SAMPLES		BIT(hwmon_chip_curr_samples)
#define HWMON_C_IN_SAMPLES		BIT(hwmon_chip_in_samples)
#define HWMON_C_POWER_SAMPLES		BIT(hwmon_chip_power_samples)
#define HWMON_C_TEMP_SAMPLES		BIT(hwmon_chip_temp_samples)
61 62

enum hwmon_temp_attributes {
63 64
	hwmon_temp_enable,
	hwmon_temp_input,
65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89
	hwmon_temp_type,
	hwmon_temp_lcrit,
	hwmon_temp_lcrit_hyst,
	hwmon_temp_min,
	hwmon_temp_min_hyst,
	hwmon_temp_max,
	hwmon_temp_max_hyst,
	hwmon_temp_crit,
	hwmon_temp_crit_hyst,
	hwmon_temp_emergency,
	hwmon_temp_emergency_hyst,
	hwmon_temp_alarm,
	hwmon_temp_lcrit_alarm,
	hwmon_temp_min_alarm,
	hwmon_temp_max_alarm,
	hwmon_temp_crit_alarm,
	hwmon_temp_emergency_alarm,
	hwmon_temp_fault,
	hwmon_temp_offset,
	hwmon_temp_label,
	hwmon_temp_lowest,
	hwmon_temp_highest,
	hwmon_temp_reset_history,
};

90
#define HWMON_T_ENABLE		BIT(hwmon_temp_enable)
91 92 93 94 95 96 97 98 99 100 101 102
#define HWMON_T_INPUT		BIT(hwmon_temp_input)
#define HWMON_T_TYPE		BIT(hwmon_temp_type)
#define HWMON_T_LCRIT		BIT(hwmon_temp_lcrit)
#define HWMON_T_LCRIT_HYST	BIT(hwmon_temp_lcrit_hyst)
#define HWMON_T_MIN		BIT(hwmon_temp_min)
#define HWMON_T_MIN_HYST	BIT(hwmon_temp_min_hyst)
#define HWMON_T_MAX		BIT(hwmon_temp_max)
#define HWMON_T_MAX_HYST	BIT(hwmon_temp_max_hyst)
#define HWMON_T_CRIT		BIT(hwmon_temp_crit)
#define HWMON_T_CRIT_HYST	BIT(hwmon_temp_crit_hyst)
#define HWMON_T_EMERGENCY	BIT(hwmon_temp_emergency)
#define HWMON_T_EMERGENCY_HYST	BIT(hwmon_temp_emergency_hyst)
P
Peter Huewe 已提交
103
#define HWMON_T_ALARM		BIT(hwmon_temp_alarm)
104 105 106
#define HWMON_T_MIN_ALARM	BIT(hwmon_temp_min_alarm)
#define HWMON_T_MAX_ALARM	BIT(hwmon_temp_max_alarm)
#define HWMON_T_CRIT_ALARM	BIT(hwmon_temp_crit_alarm)
107
#define HWMON_T_LCRIT_ALARM	BIT(hwmon_temp_lcrit_alarm)
108 109 110 111 112 113 114 115
#define HWMON_T_EMERGENCY_ALARM	BIT(hwmon_temp_emergency_alarm)
#define HWMON_T_FAULT		BIT(hwmon_temp_fault)
#define HWMON_T_OFFSET		BIT(hwmon_temp_offset)
#define HWMON_T_LABEL		BIT(hwmon_temp_label)
#define HWMON_T_LOWEST		BIT(hwmon_temp_lowest)
#define HWMON_T_HIGHEST		BIT(hwmon_temp_highest)
#define HWMON_T_RESET_HISTORY	BIT(hwmon_temp_reset_history)

116
enum hwmon_in_attributes {
117
	hwmon_in_enable,
118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134
	hwmon_in_input,
	hwmon_in_min,
	hwmon_in_max,
	hwmon_in_lcrit,
	hwmon_in_crit,
	hwmon_in_average,
	hwmon_in_lowest,
	hwmon_in_highest,
	hwmon_in_reset_history,
	hwmon_in_label,
	hwmon_in_alarm,
	hwmon_in_min_alarm,
	hwmon_in_max_alarm,
	hwmon_in_lcrit_alarm,
	hwmon_in_crit_alarm,
};

135
#define HWMON_I_ENABLE		BIT(hwmon_in_enable)
136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151
#define HWMON_I_INPUT		BIT(hwmon_in_input)
#define HWMON_I_MIN		BIT(hwmon_in_min)
#define HWMON_I_MAX		BIT(hwmon_in_max)
#define HWMON_I_LCRIT		BIT(hwmon_in_lcrit)
#define HWMON_I_CRIT		BIT(hwmon_in_crit)
#define HWMON_I_AVERAGE		BIT(hwmon_in_average)
#define HWMON_I_LOWEST		BIT(hwmon_in_lowest)
#define HWMON_I_HIGHEST		BIT(hwmon_in_highest)
#define HWMON_I_RESET_HISTORY	BIT(hwmon_in_reset_history)
#define HWMON_I_LABEL		BIT(hwmon_in_label)
#define HWMON_I_ALARM		BIT(hwmon_in_alarm)
#define HWMON_I_MIN_ALARM	BIT(hwmon_in_min_alarm)
#define HWMON_I_MAX_ALARM	BIT(hwmon_in_max_alarm)
#define HWMON_I_LCRIT_ALARM	BIT(hwmon_in_lcrit_alarm)
#define HWMON_I_CRIT_ALARM	BIT(hwmon_in_crit_alarm)

152
enum hwmon_curr_attributes {
153
	hwmon_curr_enable,
154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170
	hwmon_curr_input,
	hwmon_curr_min,
	hwmon_curr_max,
	hwmon_curr_lcrit,
	hwmon_curr_crit,
	hwmon_curr_average,
	hwmon_curr_lowest,
	hwmon_curr_highest,
	hwmon_curr_reset_history,
	hwmon_curr_label,
	hwmon_curr_alarm,
	hwmon_curr_min_alarm,
	hwmon_curr_max_alarm,
	hwmon_curr_lcrit_alarm,
	hwmon_curr_crit_alarm,
};

171
#define HWMON_C_ENABLE		BIT(hwmon_curr_enable)
172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187
#define HWMON_C_INPUT		BIT(hwmon_curr_input)
#define HWMON_C_MIN		BIT(hwmon_curr_min)
#define HWMON_C_MAX		BIT(hwmon_curr_max)
#define HWMON_C_LCRIT		BIT(hwmon_curr_lcrit)
#define HWMON_C_CRIT		BIT(hwmon_curr_crit)
#define HWMON_C_AVERAGE		BIT(hwmon_curr_average)
#define HWMON_C_LOWEST		BIT(hwmon_curr_lowest)
#define HWMON_C_HIGHEST		BIT(hwmon_curr_highest)
#define HWMON_C_RESET_HISTORY	BIT(hwmon_curr_reset_history)
#define HWMON_C_LABEL		BIT(hwmon_curr_label)
#define HWMON_C_ALARM		BIT(hwmon_curr_alarm)
#define HWMON_C_MIN_ALARM	BIT(hwmon_curr_min_alarm)
#define HWMON_C_MAX_ALARM	BIT(hwmon_curr_max_alarm)
#define HWMON_C_LCRIT_ALARM	BIT(hwmon_curr_lcrit_alarm)
#define HWMON_C_CRIT_ALARM	BIT(hwmon_curr_crit_alarm)

188
enum hwmon_power_attributes {
189
	hwmon_power_enable,
190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206
	hwmon_power_average,
	hwmon_power_average_interval,
	hwmon_power_average_interval_max,
	hwmon_power_average_interval_min,
	hwmon_power_average_highest,
	hwmon_power_average_lowest,
	hwmon_power_average_max,
	hwmon_power_average_min,
	hwmon_power_input,
	hwmon_power_input_highest,
	hwmon_power_input_lowest,
	hwmon_power_reset_history,
	hwmon_power_accuracy,
	hwmon_power_cap,
	hwmon_power_cap_hyst,
	hwmon_power_cap_max,
	hwmon_power_cap_min,
207
	hwmon_power_min,
208 209
	hwmon_power_max,
	hwmon_power_crit,
210
	hwmon_power_lcrit,
211 212 213
	hwmon_power_label,
	hwmon_power_alarm,
	hwmon_power_cap_alarm,
214
	hwmon_power_min_alarm,
215
	hwmon_power_max_alarm,
216
	hwmon_power_lcrit_alarm,
217 218 219
	hwmon_power_crit_alarm,
};

220
#define HWMON_P_ENABLE			BIT(hwmon_power_enable)
221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237
#define HWMON_P_AVERAGE			BIT(hwmon_power_average)
#define HWMON_P_AVERAGE_INTERVAL	BIT(hwmon_power_average_interval)
#define HWMON_P_AVERAGE_INTERVAL_MAX	BIT(hwmon_power_average_interval_max)
#define HWMON_P_AVERAGE_INTERVAL_MIN	BIT(hwmon_power_average_interval_min)
#define HWMON_P_AVERAGE_HIGHEST		BIT(hwmon_power_average_highest)
#define HWMON_P_AVERAGE_LOWEST		BIT(hwmon_power_average_lowest)
#define HWMON_P_AVERAGE_MAX		BIT(hwmon_power_average_max)
#define HWMON_P_AVERAGE_MIN		BIT(hwmon_power_average_min)
#define HWMON_P_INPUT			BIT(hwmon_power_input)
#define HWMON_P_INPUT_HIGHEST		BIT(hwmon_power_input_highest)
#define HWMON_P_INPUT_LOWEST		BIT(hwmon_power_input_lowest)
#define HWMON_P_RESET_HISTORY		BIT(hwmon_power_reset_history)
#define HWMON_P_ACCURACY		BIT(hwmon_power_accuracy)
#define HWMON_P_CAP			BIT(hwmon_power_cap)
#define HWMON_P_CAP_HYST		BIT(hwmon_power_cap_hyst)
#define HWMON_P_CAP_MAX			BIT(hwmon_power_cap_max)
#define HWMON_P_CAP_MIN			BIT(hwmon_power_cap_min)
238
#define HWMON_P_MIN			BIT(hwmon_power_min)
239
#define HWMON_P_MAX			BIT(hwmon_power_max)
240
#define HWMON_P_LCRIT			BIT(hwmon_power_lcrit)
241 242 243 244
#define HWMON_P_CRIT			BIT(hwmon_power_crit)
#define HWMON_P_LABEL			BIT(hwmon_power_label)
#define HWMON_P_ALARM			BIT(hwmon_power_alarm)
#define HWMON_P_CAP_ALARM		BIT(hwmon_power_cap_alarm)
N
Nuno Sá 已提交
245
#define HWMON_P_MIN_ALARM		BIT(hwmon_power_min_alarm)
246
#define HWMON_P_MAX_ALARM		BIT(hwmon_power_max_alarm)
247
#define HWMON_P_LCRIT_ALARM		BIT(hwmon_power_lcrit_alarm)
248 249
#define HWMON_P_CRIT_ALARM		BIT(hwmon_power_crit_alarm)

250
enum hwmon_energy_attributes {
251
	hwmon_energy_enable,
252 253 254 255
	hwmon_energy_input,
	hwmon_energy_label,
};

256
#define HWMON_E_ENABLE			BIT(hwmon_energy_enable)
257 258 259 260
#define HWMON_E_INPUT			BIT(hwmon_energy_input)
#define HWMON_E_LABEL			BIT(hwmon_energy_label)

enum hwmon_humidity_attributes {
261
	hwmon_humidity_enable,
262 263 264 265 266 267 268 269 270 271
	hwmon_humidity_input,
	hwmon_humidity_label,
	hwmon_humidity_min,
	hwmon_humidity_min_hyst,
	hwmon_humidity_max,
	hwmon_humidity_max_hyst,
	hwmon_humidity_alarm,
	hwmon_humidity_fault,
};

272
#define HWMON_H_ENABLE			BIT(hwmon_humidity_enable)
273 274 275 276 277 278 279 280 281
#define HWMON_H_INPUT			BIT(hwmon_humidity_input)
#define HWMON_H_LABEL			BIT(hwmon_humidity_label)
#define HWMON_H_MIN			BIT(hwmon_humidity_min)
#define HWMON_H_MIN_HYST		BIT(hwmon_humidity_min_hyst)
#define HWMON_H_MAX			BIT(hwmon_humidity_max)
#define HWMON_H_MAX_HYST		BIT(hwmon_humidity_max_hyst)
#define HWMON_H_ALARM			BIT(hwmon_humidity_alarm)
#define HWMON_H_FAULT			BIT(hwmon_humidity_fault)

282
enum hwmon_fan_attributes {
283
	hwmon_fan_enable,
284 285 286 287 288 289 290 291 292 293 294 295 296
	hwmon_fan_input,
	hwmon_fan_label,
	hwmon_fan_min,
	hwmon_fan_max,
	hwmon_fan_div,
	hwmon_fan_pulses,
	hwmon_fan_target,
	hwmon_fan_alarm,
	hwmon_fan_min_alarm,
	hwmon_fan_max_alarm,
	hwmon_fan_fault,
};

297
#define HWMON_F_ENABLE			BIT(hwmon_fan_enable)
298 299 300 301 302 303 304 305 306 307 308 309
#define HWMON_F_INPUT			BIT(hwmon_fan_input)
#define HWMON_F_LABEL			BIT(hwmon_fan_label)
#define HWMON_F_MIN			BIT(hwmon_fan_min)
#define HWMON_F_MAX			BIT(hwmon_fan_max)
#define HWMON_F_DIV			BIT(hwmon_fan_div)
#define HWMON_F_PULSES			BIT(hwmon_fan_pulses)
#define HWMON_F_TARGET			BIT(hwmon_fan_target)
#define HWMON_F_ALARM			BIT(hwmon_fan_alarm)
#define HWMON_F_MIN_ALARM		BIT(hwmon_fan_min_alarm)
#define HWMON_F_MAX_ALARM		BIT(hwmon_fan_max_alarm)
#define HWMON_F_FAULT			BIT(hwmon_fan_fault)

310 311 312 313 314 315 316 317 318 319 320 321
enum hwmon_pwm_attributes {
	hwmon_pwm_input,
	hwmon_pwm_enable,
	hwmon_pwm_mode,
	hwmon_pwm_freq,
};

#define HWMON_PWM_INPUT			BIT(hwmon_pwm_input)
#define HWMON_PWM_ENABLE		BIT(hwmon_pwm_enable)
#define HWMON_PWM_MODE			BIT(hwmon_pwm_mode)
#define HWMON_PWM_FREQ			BIT(hwmon_pwm_freq)

322 323 324 325 326 327 328
enum hwmon_intrusion_attributes {
	hwmon_intrusion_alarm,
	hwmon_intrusion_beep,
};
#define HWMON_INTRUSION_ALARM		BIT(hwmon_intrusion_alarm)
#define HWMON_INTRUSION_BEEP		BIT(hwmon_intrusion_beep)

329 330 331 332 333 334 335 336 337 338 339 340 341
/**
 * struct hwmon_ops - hwmon device operations
 * @is_visible: Callback to return attribute visibility. Mandatory.
 *		Parameters are:
 *		@const void *drvdata:
 *			Pointer to driver-private data structure passed
 *			as argument to hwmon_device_register_with_info().
 *		@type:	Sensor type
 *		@attr:	Sensor attribute
 *		@channel:
 *			Channel number
 *		The function returns the file permissions.
 *		If the return value is 0, no attribute will be created.
342 343
 * @read:	Read callback for data attributes. Mandatory if readable
 *		data attributes are present.
344 345 346 347 348 349 350 351
 *		Parameters are:
 *		@dev:	Pointer to hardware monitoring device
 *		@type:	Sensor type
 *		@attr:	Sensor attribute
 *		@channel:
 *			Channel number
 *		@val:	Pointer to returned value
 *		The function returns 0 on success or a negative error number.
352 353 354 355 356 357 358 359 360 361 362 363 364
 * @read_string:
 *		Read callback for string attributes. Mandatory if string
 *		attributes are present.
 *		Parameters are:
 *		@dev:	Pointer to hardware monitoring device
 *		@type:	Sensor type
 *		@attr:	Sensor attribute
 *		@channel:
 *			Channel number
 *		@str:	Pointer to returned string
 *		The function returns 0 on success or a negative error number.
 * @write:	Write callback for data attributes. Mandatory if writeable
 *		data attributes are present.
365 366 367 368 369 370 371 372 373 374 375 376 377 378
 *		Parameters are:
 *		@dev:	Pointer to hardware monitoring device
 *		@type:	Sensor type
 *		@attr:	Sensor attribute
 *		@channel:
 *			Channel number
 *		@val:	Value to write
 *		The function returns 0 on success or a negative error number.
 */
struct hwmon_ops {
	umode_t (*is_visible)(const void *drvdata, enum hwmon_sensor_types type,
			      u32 attr, int channel);
	int (*read)(struct device *dev, enum hwmon_sensor_types type,
		    u32 attr, int channel, long *val);
379
	int (*read_string)(struct device *dev, enum hwmon_sensor_types type,
380
		    u32 attr, int channel, const char **str);
381 382 383 384 385 386 387 388 389 390 391 392 393 394 395
	int (*write)(struct device *dev, enum hwmon_sensor_types type,
		     u32 attr, int channel, long val);
};

/**
 * Channel information
 * @type:	Channel type.
 * @config:	Pointer to NULL-terminated list of channel parameters.
 *		Use for per-channel attributes.
 */
struct hwmon_channel_info {
	enum hwmon_sensor_types type;
	const u32 *config;
};

396 397 398 399 400 401 402 403
#define HWMON_CHANNEL_INFO(stype, ...)	\
	(&(struct hwmon_channel_info) {	\
		.type = hwmon_##stype,	\
		.config = (u32 []) {	\
			__VA_ARGS__, 0	\
		}			\
	})

404 405 406 407 408 409 410 411 412 413
/**
 * Chip configuration
 * @ops:	Pointer to hwmon operations.
 * @info:	Null-terminated list of channel information.
 */
struct hwmon_chip_info {
	const struct hwmon_ops *ops;
	const struct hwmon_channel_info **info;
};

414
/* hwmon_device_register() is deprecated */
415
struct device *hwmon_device_register(struct device *dev);
416

417 418 419 420
struct device *
hwmon_device_register_with_groups(struct device *dev, const char *name,
				  void *drvdata,
				  const struct attribute_group **groups);
421 422 423 424
struct device *
devm_hwmon_device_register_with_groups(struct device *dev, const char *name,
				       void *drvdata,
				       const struct attribute_group **groups);
425 426 427 428
struct device *
hwmon_device_register_with_info(struct device *dev,
				const char *name, void *drvdata,
				const struct hwmon_chip_info *info,
429
				const struct attribute_group **extra_groups);
430 431
struct device *
devm_hwmon_device_register_with_info(struct device *dev,
432 433 434
				const char *name, void *drvdata,
				const struct hwmon_chip_info *info,
				const struct attribute_group **extra_groups);
435

436
void hwmon_device_unregister(struct device *dev);
437
void devm_hwmon_device_unregister(struct device *dev);
438

439 440 441 442 443 444 445 446 447 448 449 450 451 452 453 454 455 456 457 458 459 460 461
/**
 * hwmon_is_bad_char - Is the char invalid in a hwmon name
 * @ch: the char to be considered
 *
 * hwmon_is_bad_char() can be used to determine if the given character
 * may not be used in a hwmon name.
 *
 * Returns true if the char is invalid, false otherwise.
 */
static inline bool hwmon_is_bad_char(const char ch)
{
	switch (ch) {
	case '-':
	case '*':
	case ' ':
	case '\t':
	case '\n':
		return true;
	default:
		return false;
	}
}

462
#endif