^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1) // SPDX-License-Identifier: GPL-2.0-or-later
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3) * A hwmon driver for the Analog Devices ADT7462
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4) * Copyright (C) 2008 IBM
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6) * Author: Darrick J. Wong <darrick.wong@oracle.com>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9) #include <linux/module.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10) #include <linux/jiffies.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11) #include <linux/i2c.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12) #include <linux/hwmon.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 13) #include <linux/hwmon-sysfs.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 14) #include <linux/err.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 15) #include <linux/mutex.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 16) #include <linux/log2.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 17) #include <linux/slab.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 18)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 19) /* Addresses to scan */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 20) static const unsigned short normal_i2c[] = { 0x58, 0x5C, I2C_CLIENT_END };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 21)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 22) /* ADT7462 registers */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 23) #define ADT7462_REG_DEVICE 0x3D
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 24) #define ADT7462_REG_VENDOR 0x3E
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 25) #define ADT7462_REG_REVISION 0x3F
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 26)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 27) #define ADT7462_REG_MIN_TEMP_BASE_ADDR 0x44
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 28) #define ADT7462_REG_MIN_TEMP_MAX_ADDR 0x47
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 29) #define ADT7462_REG_MAX_TEMP_BASE_ADDR 0x48
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 30) #define ADT7462_REG_MAX_TEMP_MAX_ADDR 0x4B
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 31) #define ADT7462_REG_TEMP_BASE_ADDR 0x88
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 32) #define ADT7462_REG_TEMP_MAX_ADDR 0x8F
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 33)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 34) #define ADT7462_REG_FAN_BASE_ADDR 0x98
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 35) #define ADT7462_REG_FAN_MAX_ADDR 0x9F
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 36) #define ADT7462_REG_FAN2_BASE_ADDR 0xA2
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 37) #define ADT7462_REG_FAN2_MAX_ADDR 0xA9
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 38) #define ADT7462_REG_FAN_ENABLE 0x07
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 39) #define ADT7462_REG_FAN_MIN_BASE_ADDR 0x78
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 40) #define ADT7462_REG_FAN_MIN_MAX_ADDR 0x7F
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 41)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 42) #define ADT7462_REG_CFG2 0x02
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 43) #define ADT7462_FSPD_MASK 0x20
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 44)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 45) #define ADT7462_REG_PWM_BASE_ADDR 0xAA
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 46) #define ADT7462_REG_PWM_MAX_ADDR 0xAD
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 47) #define ADT7462_REG_PWM_MIN_BASE_ADDR 0x28
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 48) #define ADT7462_REG_PWM_MIN_MAX_ADDR 0x2B
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 49) #define ADT7462_REG_PWM_MAX 0x2C
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 50) #define ADT7462_REG_PWM_TEMP_MIN_BASE_ADDR 0x5C
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 51) #define ADT7462_REG_PWM_TEMP_MIN_MAX_ADDR 0x5F
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 52) #define ADT7462_REG_PWM_TEMP_RANGE_BASE_ADDR 0x60
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 53) #define ADT7462_REG_PWM_TEMP_RANGE_MAX_ADDR 0x63
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 54) #define ADT7462_PWM_HYST_MASK 0x0F
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 55) #define ADT7462_PWM_RANGE_MASK 0xF0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 56) #define ADT7462_PWM_RANGE_SHIFT 4
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 57) #define ADT7462_REG_PWM_CFG_BASE_ADDR 0x21
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 58) #define ADT7462_REG_PWM_CFG_MAX_ADDR 0x24
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 59) #define ADT7462_PWM_CHANNEL_MASK 0xE0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 60) #define ADT7462_PWM_CHANNEL_SHIFT 5
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 61)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 62) #define ADT7462_REG_PIN_CFG_BASE_ADDR 0x10
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 63) #define ADT7462_REG_PIN_CFG_MAX_ADDR 0x13
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 64) #define ADT7462_PIN7_INPUT 0x01 /* cfg0 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 65) #define ADT7462_DIODE3_INPUT 0x20
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 66) #define ADT7462_DIODE1_INPUT 0x40
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 67) #define ADT7462_VID_INPUT 0x80
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 68) #define ADT7462_PIN22_INPUT 0x04 /* cfg1 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 69) #define ADT7462_PIN21_INPUT 0x08
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 70) #define ADT7462_PIN19_INPUT 0x10
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 71) #define ADT7462_PIN15_INPUT 0x20
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 72) #define ADT7462_PIN13_INPUT 0x40
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 73) #define ADT7462_PIN8_INPUT 0x80
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 74) #define ADT7462_PIN23_MASK 0x03
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 75) #define ADT7462_PIN23_SHIFT 0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 76) #define ADT7462_PIN26_MASK 0x0C /* cfg2 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 77) #define ADT7462_PIN26_SHIFT 2
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 78) #define ADT7462_PIN25_MASK 0x30
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 79) #define ADT7462_PIN25_SHIFT 4
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 80) #define ADT7462_PIN24_MASK 0xC0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 81) #define ADT7462_PIN24_SHIFT 6
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 82) #define ADT7462_PIN26_VOLT_INPUT 0x08
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 83) #define ADT7462_PIN25_VOLT_INPUT 0x20
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 84) #define ADT7462_PIN28_SHIFT 4 /* cfg3 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 85) #define ADT7462_PIN28_VOLT 0x5
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 86)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 87) #define ADT7462_REG_ALARM1 0xB8
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 88) #define ADT7462_LT_ALARM 0x02
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 89) #define ADT7462_R1T_ALARM 0x04
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 90) #define ADT7462_R2T_ALARM 0x08
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 91) #define ADT7462_R3T_ALARM 0x10
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 92) #define ADT7462_REG_ALARM2 0xBB
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 93) #define ADT7462_V0_ALARM 0x01
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 94) #define ADT7462_V1_ALARM 0x02
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 95) #define ADT7462_V2_ALARM 0x04
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 96) #define ADT7462_V3_ALARM 0x08
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 97) #define ADT7462_V4_ALARM 0x10
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 98) #define ADT7462_V5_ALARM 0x20
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 99) #define ADT7462_V6_ALARM 0x40
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 100) #define ADT7462_V7_ALARM 0x80
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 101) #define ADT7462_REG_ALARM3 0xBC
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 102) #define ADT7462_V8_ALARM 0x08
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 103) #define ADT7462_V9_ALARM 0x10
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 104) #define ADT7462_V10_ALARM 0x20
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 105) #define ADT7462_V11_ALARM 0x40
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 106) #define ADT7462_V12_ALARM 0x80
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 107) #define ADT7462_REG_ALARM4 0xBD
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 108) #define ADT7462_F0_ALARM 0x01
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 109) #define ADT7462_F1_ALARM 0x02
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 110) #define ADT7462_F2_ALARM 0x04
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 111) #define ADT7462_F3_ALARM 0x08
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 112) #define ADT7462_F4_ALARM 0x10
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 113) #define ADT7462_F5_ALARM 0x20
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 114) #define ADT7462_F6_ALARM 0x40
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 115) #define ADT7462_F7_ALARM 0x80
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 116) #define ADT7462_ALARM1 0x0000
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 117) #define ADT7462_ALARM2 0x0100
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 118) #define ADT7462_ALARM3 0x0200
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 119) #define ADT7462_ALARM4 0x0300
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 120) #define ADT7462_ALARM_REG_SHIFT 8
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 121) #define ADT7462_ALARM_FLAG_MASK 0x0F
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 122)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 123) #define ADT7462_TEMP_COUNT 4
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 124) #define ADT7462_TEMP_REG(x) (ADT7462_REG_TEMP_BASE_ADDR + ((x) * 2))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 125) #define ADT7462_TEMP_MIN_REG(x) (ADT7462_REG_MIN_TEMP_BASE_ADDR + (x))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 126) #define ADT7462_TEMP_MAX_REG(x) (ADT7462_REG_MAX_TEMP_BASE_ADDR + (x))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 127) #define TEMP_FRAC_OFFSET 6
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 128)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 129) #define ADT7462_FAN_COUNT 8
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 130) #define ADT7462_REG_FAN_MIN(x) (ADT7462_REG_FAN_MIN_BASE_ADDR + (x))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 131)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 132) #define ADT7462_PWM_COUNT 4
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 133) #define ADT7462_REG_PWM(x) (ADT7462_REG_PWM_BASE_ADDR + (x))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 134) #define ADT7462_REG_PWM_MIN(x) (ADT7462_REG_PWM_MIN_BASE_ADDR + (x))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 135) #define ADT7462_REG_PWM_TMIN(x) \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 136) (ADT7462_REG_PWM_TEMP_MIN_BASE_ADDR + (x))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 137) #define ADT7462_REG_PWM_TRANGE(x) \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 138) (ADT7462_REG_PWM_TEMP_RANGE_BASE_ADDR + (x))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 139)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 140) #define ADT7462_PIN_CFG_REG_COUNT 4
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 141) #define ADT7462_REG_PIN_CFG(x) (ADT7462_REG_PIN_CFG_BASE_ADDR + (x))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 142) #define ADT7462_REG_PWM_CFG(x) (ADT7462_REG_PWM_CFG_BASE_ADDR + (x))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 143)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 144) #define ADT7462_ALARM_REG_COUNT 4
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 145)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 146) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 147) * The chip can measure 13 different voltage sources:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 148) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 149) * 1. +12V1 (pin 7)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 150) * 2. Vccp1/+2.5V/+1.8V/+1.5V (pin 23)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 151) * 3. +12V3 (pin 22)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 152) * 4. +5V (pin 21)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 153) * 5. +1.25V/+0.9V (pin 19)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 154) * 6. +2.5V/+1.8V (pin 15)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 155) * 7. +3.3v (pin 13)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 156) * 8. +12V2 (pin 8)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 157) * 9. Vbatt/FSB_Vtt (pin 26)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 158) * A. +3.3V/+1.2V1 (pin 25)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 159) * B. Vccp2/+2.5V/+1.8V/+1.5V (pin 24)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 160) * C. +1.5V ICH (only if BOTH pin 28/29 are set to +1.5V)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 161) * D. +1.5V 3GPIO (only if BOTH pin 28/29 are set to +1.5V)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 162) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 163) * Each of these 13 has a factor to convert raw to voltage. Even better,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 164) * the pins can be connected to other sensors (tach/gpio/hot/etc), which
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 165) * makes the bookkeeping tricky.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 166) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 167) * Some, but not all, of these voltages have low/high limits.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 168) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 169) #define ADT7462_VOLT_COUNT 13
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 170)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 171) #define ADT7462_VENDOR 0x41
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 172) #define ADT7462_DEVICE 0x62
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 173) /* datasheet only mentions a revision 4 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 174) #define ADT7462_REVISION 0x04
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 175)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 176) /* How often do we reread sensors values? (In jiffies) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 177) #define SENSOR_REFRESH_INTERVAL (2 * HZ)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 178)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 179) /* How often do we reread sensor limit values? (In jiffies) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 180) #define LIMIT_REFRESH_INTERVAL (60 * HZ)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 181)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 182) /* datasheet says to divide this number by the fan reading to get fan rpm */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 183) #define FAN_PERIOD_TO_RPM(x) ((90000 * 60) / (x))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 184) #define FAN_RPM_TO_PERIOD FAN_PERIOD_TO_RPM
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 185) #define FAN_PERIOD_INVALID 65535
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 186) #define FAN_DATA_VALID(x) ((x) && (x) != FAN_PERIOD_INVALID)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 187)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 188) #define MASK_AND_SHIFT(value, prefix) \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 189) (((value) & prefix##_MASK) >> prefix##_SHIFT)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 190)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 191) struct adt7462_data {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 192) struct i2c_client *client;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 193) struct mutex lock;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 194) char sensors_valid;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 195) char limits_valid;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 196) unsigned long sensors_last_updated; /* In jiffies */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 197) unsigned long limits_last_updated; /* In jiffies */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 198)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 199) u8 temp[ADT7462_TEMP_COUNT];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 200) /* bits 6-7 are quarter pieces of temp */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 201) u8 temp_frac[ADT7462_TEMP_COUNT];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 202) u8 temp_min[ADT7462_TEMP_COUNT];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 203) u8 temp_max[ADT7462_TEMP_COUNT];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 204) u16 fan[ADT7462_FAN_COUNT];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 205) u8 fan_enabled;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 206) u8 fan_min[ADT7462_FAN_COUNT];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 207) u8 cfg2;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 208) u8 pwm[ADT7462_PWM_COUNT];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 209) u8 pin_cfg[ADT7462_PIN_CFG_REG_COUNT];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 210) u8 voltages[ADT7462_VOLT_COUNT];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 211) u8 volt_max[ADT7462_VOLT_COUNT];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 212) u8 volt_min[ADT7462_VOLT_COUNT];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 213) u8 pwm_min[ADT7462_PWM_COUNT];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 214) u8 pwm_tmin[ADT7462_PWM_COUNT];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 215) u8 pwm_trange[ADT7462_PWM_COUNT];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 216) u8 pwm_max; /* only one per chip */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 217) u8 pwm_cfg[ADT7462_PWM_COUNT];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 218) u8 alarms[ADT7462_ALARM_REG_COUNT];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 219) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 220)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 221) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 222) * 16-bit registers on the ADT7462 are low-byte first. The data sheet says
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 223) * that the low byte must be read before the high byte.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 224) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 225) static inline int adt7462_read_word_data(struct i2c_client *client, u8 reg)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 226) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 227) u16 foo;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 228) foo = i2c_smbus_read_byte_data(client, reg);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 229) foo |= ((u16)i2c_smbus_read_byte_data(client, reg + 1) << 8);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 230) return foo;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 231) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 232)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 233) /* For some reason these registers are not contiguous. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 234) static int ADT7462_REG_FAN(int fan)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 235) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 236) if (fan < 4)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 237) return ADT7462_REG_FAN_BASE_ADDR + (2 * fan);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 238) return ADT7462_REG_FAN2_BASE_ADDR + (2 * (fan - 4));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 239) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 240)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 241) /* Voltage registers are scattered everywhere */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 242) static int ADT7462_REG_VOLT_MAX(struct adt7462_data *data, int which)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 243) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 244) switch (which) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 245) case 0:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 246) if (!(data->pin_cfg[0] & ADT7462_PIN7_INPUT))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 247) return 0x7C;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 248) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 249) case 1:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 250) return 0x69;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 251) case 2:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 252) if (!(data->pin_cfg[1] & ADT7462_PIN22_INPUT))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 253) return 0x7F;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 254) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 255) case 3:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 256) if (!(data->pin_cfg[1] & ADT7462_PIN21_INPUT))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 257) return 0x7E;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 258) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 259) case 4:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 260) if (!(data->pin_cfg[0] & ADT7462_DIODE3_INPUT))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 261) return 0x4B;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 262) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 263) case 5:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 264) if (!(data->pin_cfg[0] & ADT7462_DIODE1_INPUT))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 265) return 0x49;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 266) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 267) case 6:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 268) if (!(data->pin_cfg[1] & ADT7462_PIN13_INPUT))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 269) return 0x68;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 270) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 271) case 7:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 272) if (!(data->pin_cfg[1] & ADT7462_PIN8_INPUT))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 273) return 0x7D;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 274) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 275) case 8:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 276) if (!(data->pin_cfg[2] & ADT7462_PIN26_VOLT_INPUT))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 277) return 0x6C;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 278) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 279) case 9:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 280) if (!(data->pin_cfg[2] & ADT7462_PIN25_VOLT_INPUT))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 281) return 0x6B;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 282) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 283) case 10:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 284) return 0x6A;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 285) case 11:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 286) if (data->pin_cfg[3] >> ADT7462_PIN28_SHIFT ==
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 287) ADT7462_PIN28_VOLT &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 288) !(data->pin_cfg[0] & ADT7462_VID_INPUT))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 289) return 0x50;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 290) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 291) case 12:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 292) if (data->pin_cfg[3] >> ADT7462_PIN28_SHIFT ==
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 293) ADT7462_PIN28_VOLT &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 294) !(data->pin_cfg[0] & ADT7462_VID_INPUT))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 295) return 0x4C;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 296) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 297) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 298) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 299) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 300)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 301) static int ADT7462_REG_VOLT_MIN(struct adt7462_data *data, int which)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 302) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 303) switch (which) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 304) case 0:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 305) if (!(data->pin_cfg[0] & ADT7462_PIN7_INPUT))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 306) return 0x6D;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 307) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 308) case 1:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 309) return 0x72;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 310) case 2:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 311) if (!(data->pin_cfg[1] & ADT7462_PIN22_INPUT))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 312) return 0x6F;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 313) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 314) case 3:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 315) if (!(data->pin_cfg[1] & ADT7462_PIN21_INPUT))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 316) return 0x71;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 317) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 318) case 4:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 319) if (!(data->pin_cfg[0] & ADT7462_DIODE3_INPUT))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 320) return 0x47;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 321) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 322) case 5:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 323) if (!(data->pin_cfg[0] & ADT7462_DIODE1_INPUT))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 324) return 0x45;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 325) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 326) case 6:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 327) if (!(data->pin_cfg[1] & ADT7462_PIN13_INPUT))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 328) return 0x70;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 329) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 330) case 7:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 331) if (!(data->pin_cfg[1] & ADT7462_PIN8_INPUT))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 332) return 0x6E;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 333) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 334) case 8:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 335) if (!(data->pin_cfg[2] & ADT7462_PIN26_VOLT_INPUT))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 336) return 0x75;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 337) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 338) case 9:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 339) if (!(data->pin_cfg[2] & ADT7462_PIN25_VOLT_INPUT))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 340) return 0x74;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 341) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 342) case 10:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 343) return 0x73;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 344) case 11:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 345) if (data->pin_cfg[3] >> ADT7462_PIN28_SHIFT ==
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 346) ADT7462_PIN28_VOLT &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 347) !(data->pin_cfg[0] & ADT7462_VID_INPUT))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 348) return 0x76;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 349) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 350) case 12:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 351) if (data->pin_cfg[3] >> ADT7462_PIN28_SHIFT ==
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 352) ADT7462_PIN28_VOLT &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 353) !(data->pin_cfg[0] & ADT7462_VID_INPUT))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 354) return 0x77;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 355) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 356) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 357) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 358) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 359)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 360) static int ADT7462_REG_VOLT(struct adt7462_data *data, int which)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 361) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 362) switch (which) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 363) case 0:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 364) if (!(data->pin_cfg[0] & ADT7462_PIN7_INPUT))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 365) return 0xA3;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 366) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 367) case 1:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 368) return 0x90;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 369) case 2:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 370) if (!(data->pin_cfg[1] & ADT7462_PIN22_INPUT))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 371) return 0xA9;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 372) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 373) case 3:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 374) if (!(data->pin_cfg[1] & ADT7462_PIN21_INPUT))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 375) return 0xA7;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 376) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 377) case 4:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 378) if (!(data->pin_cfg[0] & ADT7462_DIODE3_INPUT))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 379) return 0x8F;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 380) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 381) case 5:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 382) if (!(data->pin_cfg[0] & ADT7462_DIODE1_INPUT))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 383) return 0x8B;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 384) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 385) case 6:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 386) if (!(data->pin_cfg[1] & ADT7462_PIN13_INPUT))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 387) return 0x96;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 388) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 389) case 7:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 390) if (!(data->pin_cfg[1] & ADT7462_PIN8_INPUT))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 391) return 0xA5;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 392) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 393) case 8:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 394) if (!(data->pin_cfg[2] & ADT7462_PIN26_VOLT_INPUT))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 395) return 0x93;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 396) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 397) case 9:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 398) if (!(data->pin_cfg[2] & ADT7462_PIN25_VOLT_INPUT))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 399) return 0x92;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 400) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 401) case 10:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 402) return 0x91;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 403) case 11:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 404) if (data->pin_cfg[3] >> ADT7462_PIN28_SHIFT ==
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 405) ADT7462_PIN28_VOLT &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 406) !(data->pin_cfg[0] & ADT7462_VID_INPUT))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 407) return 0x94;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 408) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 409) case 12:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 410) if (data->pin_cfg[3] >> ADT7462_PIN28_SHIFT ==
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 411) ADT7462_PIN28_VOLT &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 412) !(data->pin_cfg[0] & ADT7462_VID_INPUT))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 413) return 0x95;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 414) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 415) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 416) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 417) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 418)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 419) /* Provide labels for sysfs */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 420) static const char *voltage_label(struct adt7462_data *data, int which)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 421) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 422) switch (which) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 423) case 0:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 424) if (!(data->pin_cfg[0] & ADT7462_PIN7_INPUT))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 425) return "+12V1";
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 426) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 427) case 1:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 428) switch (MASK_AND_SHIFT(data->pin_cfg[1], ADT7462_PIN23)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 429) case 0:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 430) return "Vccp1";
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 431) case 1:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 432) return "+2.5V";
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 433) case 2:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 434) return "+1.8V";
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 435) case 3:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 436) return "+1.5V";
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 437) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 438) fallthrough;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 439) case 2:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 440) if (!(data->pin_cfg[1] & ADT7462_PIN22_INPUT))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 441) return "+12V3";
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 442) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 443) case 3:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 444) if (!(data->pin_cfg[1] & ADT7462_PIN21_INPUT))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 445) return "+5V";
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 446) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 447) case 4:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 448) if (!(data->pin_cfg[0] & ADT7462_DIODE3_INPUT)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 449) if (data->pin_cfg[1] & ADT7462_PIN19_INPUT)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 450) return "+0.9V";
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 451) return "+1.25V";
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 452) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 453) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 454) case 5:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 455) if (!(data->pin_cfg[0] & ADT7462_DIODE1_INPUT)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 456) if (data->pin_cfg[1] & ADT7462_PIN19_INPUT)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 457) return "+1.8V";
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 458) return "+2.5V";
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 459) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 460) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 461) case 6:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 462) if (!(data->pin_cfg[1] & ADT7462_PIN13_INPUT))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 463) return "+3.3V";
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 464) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 465) case 7:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 466) if (!(data->pin_cfg[1] & ADT7462_PIN8_INPUT))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 467) return "+12V2";
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 468) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 469) case 8:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 470) switch (MASK_AND_SHIFT(data->pin_cfg[2], ADT7462_PIN26)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 471) case 0:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 472) return "Vbatt";
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 473) case 1:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 474) return "FSB_Vtt";
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 475) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 476) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 477) case 9:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 478) switch (MASK_AND_SHIFT(data->pin_cfg[2], ADT7462_PIN25)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 479) case 0:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 480) return "+3.3V";
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 481) case 1:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 482) return "+1.2V1";
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 483) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 484) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 485) case 10:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 486) switch (MASK_AND_SHIFT(data->pin_cfg[2], ADT7462_PIN24)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 487) case 0:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 488) return "Vccp2";
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 489) case 1:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 490) return "+2.5V";
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 491) case 2:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 492) return "+1.8V";
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 493) case 3:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 494) return "+1.5";
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 495) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 496) fallthrough;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 497) case 11:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 498) if (data->pin_cfg[3] >> ADT7462_PIN28_SHIFT ==
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 499) ADT7462_PIN28_VOLT &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 500) !(data->pin_cfg[0] & ADT7462_VID_INPUT))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 501) return "+1.5V ICH";
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 502) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 503) case 12:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 504) if (data->pin_cfg[3] >> ADT7462_PIN28_SHIFT ==
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 505) ADT7462_PIN28_VOLT &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 506) !(data->pin_cfg[0] & ADT7462_VID_INPUT))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 507) return "+1.5V 3GPIO";
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 508) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 509) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 510) return "N/A";
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 511) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 512)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 513) /* Multipliers are actually in uV, not mV. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 514) static int voltage_multiplier(struct adt7462_data *data, int which)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 515) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 516) switch (which) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 517) case 0:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 518) if (!(data->pin_cfg[0] & ADT7462_PIN7_INPUT))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 519) return 62500;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 520) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 521) case 1:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 522) switch (MASK_AND_SHIFT(data->pin_cfg[1], ADT7462_PIN23)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 523) case 0:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 524) if (data->pin_cfg[0] & ADT7462_VID_INPUT)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 525) return 12500;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 526) return 6250;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 527) case 1:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 528) return 13000;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 529) case 2:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 530) return 9400;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 531) case 3:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 532) return 7800;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 533) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 534) fallthrough;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 535) case 2:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 536) if (!(data->pin_cfg[1] & ADT7462_PIN22_INPUT))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 537) return 62500;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 538) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 539) case 3:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 540) if (!(data->pin_cfg[1] & ADT7462_PIN21_INPUT))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 541) return 26000;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 542) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 543) case 4:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 544) if (!(data->pin_cfg[0] & ADT7462_DIODE3_INPUT)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 545) if (data->pin_cfg[1] & ADT7462_PIN19_INPUT)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 546) return 4690;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 547) return 6500;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 548) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 549) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 550) case 5:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 551) if (!(data->pin_cfg[0] & ADT7462_DIODE1_INPUT)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 552) if (data->pin_cfg[1] & ADT7462_PIN15_INPUT)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 553) return 9400;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 554) return 13000;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 555) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 556) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 557) case 6:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 558) if (!(data->pin_cfg[1] & ADT7462_PIN13_INPUT))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 559) return 17200;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 560) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 561) case 7:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 562) if (!(data->pin_cfg[1] & ADT7462_PIN8_INPUT))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 563) return 62500;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 564) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 565) case 8:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 566) switch (MASK_AND_SHIFT(data->pin_cfg[2], ADT7462_PIN26)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 567) case 0:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 568) return 15600;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 569) case 1:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 570) return 6250;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 571) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 572) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 573) case 9:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 574) switch (MASK_AND_SHIFT(data->pin_cfg[2], ADT7462_PIN25)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 575) case 0:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 576) return 17200;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 577) case 1:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 578) return 6250;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 579) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 580) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 581) case 10:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 582) switch (MASK_AND_SHIFT(data->pin_cfg[2], ADT7462_PIN24)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 583) case 0:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 584) return 6250;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 585) case 1:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 586) return 13000;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 587) case 2:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 588) return 9400;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 589) case 3:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 590) return 7800;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 591) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 592) fallthrough;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 593) case 11:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 594) case 12:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 595) if (data->pin_cfg[3] >> ADT7462_PIN28_SHIFT ==
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 596) ADT7462_PIN28_VOLT &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 597) !(data->pin_cfg[0] & ADT7462_VID_INPUT))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 598) return 7800;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 599) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 600) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 601) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 602)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 603) static int temp_enabled(struct adt7462_data *data, int which)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 604) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 605) switch (which) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 606) case 0:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 607) case 2:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 608) return 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 609) case 1:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 610) if (data->pin_cfg[0] & ADT7462_DIODE1_INPUT)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 611) return 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 612) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 613) case 3:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 614) if (data->pin_cfg[0] & ADT7462_DIODE3_INPUT)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 615) return 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 616) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 617) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 618) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 619) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 620)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 621) static const char *temp_label(struct adt7462_data *data, int which)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 622) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 623) switch (which) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 624) case 0:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 625) return "local";
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 626) case 1:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 627) if (data->pin_cfg[0] & ADT7462_DIODE1_INPUT)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 628) return "remote1";
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 629) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 630) case 2:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 631) return "remote2";
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 632) case 3:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 633) if (data->pin_cfg[0] & ADT7462_DIODE3_INPUT)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 634) return "remote3";
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 635) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 636) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 637) return "N/A";
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 638) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 639)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 640) /* Map Trange register values to mC */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 641) #define NUM_TRANGE_VALUES 16
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 642) static const int trange_values[NUM_TRANGE_VALUES] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 643) 2000,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 644) 2500,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 645) 3300,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 646) 4000,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 647) 5000,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 648) 6700,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 649) 8000,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 650) 10000,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 651) 13300,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 652) 16000,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 653) 20000,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 654) 26700,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 655) 32000,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 656) 40000,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 657) 53300,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 658) 80000
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 659) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 660)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 661) static int find_trange_value(int trange)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 662) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 663) int i;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 664)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 665) for (i = 0; i < NUM_TRANGE_VALUES; i++)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 666) if (trange_values[i] == trange)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 667) return i;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 668)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 669) return -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 670) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 671)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 672) static struct adt7462_data *adt7462_update_device(struct device *dev)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 673) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 674) struct adt7462_data *data = dev_get_drvdata(dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 675) struct i2c_client *client = data->client;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 676) unsigned long local_jiffies = jiffies;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 677) int i;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 678)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 679) mutex_lock(&data->lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 680) if (time_before(local_jiffies, data->sensors_last_updated +
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 681) SENSOR_REFRESH_INTERVAL)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 682) && data->sensors_valid)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 683) goto no_sensor_update;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 684)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 685) for (i = 0; i < ADT7462_TEMP_COUNT; i++) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 686) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 687) * Reading the fractional register locks the integral
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 688) * register until both have been read.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 689) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 690) data->temp_frac[i] = i2c_smbus_read_byte_data(client,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 691) ADT7462_TEMP_REG(i));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 692) data->temp[i] = i2c_smbus_read_byte_data(client,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 693) ADT7462_TEMP_REG(i) + 1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 694) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 695)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 696) for (i = 0; i < ADT7462_FAN_COUNT; i++)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 697) data->fan[i] = adt7462_read_word_data(client,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 698) ADT7462_REG_FAN(i));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 699)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 700) data->fan_enabled = i2c_smbus_read_byte_data(client,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 701) ADT7462_REG_FAN_ENABLE);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 702)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 703) for (i = 0; i < ADT7462_PWM_COUNT; i++)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 704) data->pwm[i] = i2c_smbus_read_byte_data(client,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 705) ADT7462_REG_PWM(i));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 706)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 707) for (i = 0; i < ADT7462_PIN_CFG_REG_COUNT; i++)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 708) data->pin_cfg[i] = i2c_smbus_read_byte_data(client,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 709) ADT7462_REG_PIN_CFG(i));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 710)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 711) for (i = 0; i < ADT7462_VOLT_COUNT; i++) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 712) int reg = ADT7462_REG_VOLT(data, i);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 713) if (!reg)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 714) data->voltages[i] = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 715) else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 716) data->voltages[i] = i2c_smbus_read_byte_data(client,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 717) reg);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 718) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 719)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 720) data->alarms[0] = i2c_smbus_read_byte_data(client, ADT7462_REG_ALARM1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 721) data->alarms[1] = i2c_smbus_read_byte_data(client, ADT7462_REG_ALARM2);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 722) data->alarms[2] = i2c_smbus_read_byte_data(client, ADT7462_REG_ALARM3);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 723) data->alarms[3] = i2c_smbus_read_byte_data(client, ADT7462_REG_ALARM4);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 724)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 725) data->sensors_last_updated = local_jiffies;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 726) data->sensors_valid = 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 727)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 728) no_sensor_update:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 729) if (time_before(local_jiffies, data->limits_last_updated +
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 730) LIMIT_REFRESH_INTERVAL)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 731) && data->limits_valid)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 732) goto out;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 733)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 734) for (i = 0; i < ADT7462_TEMP_COUNT; i++) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 735) data->temp_min[i] = i2c_smbus_read_byte_data(client,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 736) ADT7462_TEMP_MIN_REG(i));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 737) data->temp_max[i] = i2c_smbus_read_byte_data(client,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 738) ADT7462_TEMP_MAX_REG(i));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 739) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 740)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 741) for (i = 0; i < ADT7462_FAN_COUNT; i++)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 742) data->fan_min[i] = i2c_smbus_read_byte_data(client,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 743) ADT7462_REG_FAN_MIN(i));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 744)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 745) for (i = 0; i < ADT7462_VOLT_COUNT; i++) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 746) int reg = ADT7462_REG_VOLT_MAX(data, i);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 747) data->volt_max[i] =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 748) (reg ? i2c_smbus_read_byte_data(client, reg) : 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 749)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 750) reg = ADT7462_REG_VOLT_MIN(data, i);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 751) data->volt_min[i] =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 752) (reg ? i2c_smbus_read_byte_data(client, reg) : 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 753) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 754)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 755) for (i = 0; i < ADT7462_PWM_COUNT; i++) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 756) data->pwm_min[i] = i2c_smbus_read_byte_data(client,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 757) ADT7462_REG_PWM_MIN(i));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 758) data->pwm_tmin[i] = i2c_smbus_read_byte_data(client,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 759) ADT7462_REG_PWM_TMIN(i));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 760) data->pwm_trange[i] = i2c_smbus_read_byte_data(client,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 761) ADT7462_REG_PWM_TRANGE(i));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 762) data->pwm_cfg[i] = i2c_smbus_read_byte_data(client,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 763) ADT7462_REG_PWM_CFG(i));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 764) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 765)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 766) data->pwm_max = i2c_smbus_read_byte_data(client, ADT7462_REG_PWM_MAX);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 767)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 768) data->cfg2 = i2c_smbus_read_byte_data(client, ADT7462_REG_CFG2);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 769)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 770) data->limits_last_updated = local_jiffies;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 771) data->limits_valid = 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 772)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 773) out:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 774) mutex_unlock(&data->lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 775) return data;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 776) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 777)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 778) static ssize_t temp_min_show(struct device *dev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 779) struct device_attribute *devattr, char *buf)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 780) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 781) struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 782) struct adt7462_data *data = adt7462_update_device(dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 783)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 784) if (!temp_enabled(data, attr->index))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 785) return sprintf(buf, "0\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 786)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 787) return sprintf(buf, "%d\n", 1000 * (data->temp_min[attr->index] - 64));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 788) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 789)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 790) static ssize_t temp_min_store(struct device *dev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 791) struct device_attribute *devattr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 792) const char *buf, size_t count)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 793) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 794) struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 795) struct adt7462_data *data = dev_get_drvdata(dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 796) struct i2c_client *client = data->client;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 797) long temp;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 798)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 799) if (kstrtol(buf, 10, &temp) || !temp_enabled(data, attr->index))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 800) return -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 801)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 802) temp = clamp_val(temp, -64000, 191000);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 803) temp = DIV_ROUND_CLOSEST(temp, 1000) + 64;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 804)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 805) mutex_lock(&data->lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 806) data->temp_min[attr->index] = temp;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 807) i2c_smbus_write_byte_data(client, ADT7462_TEMP_MIN_REG(attr->index),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 808) temp);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 809) mutex_unlock(&data->lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 810)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 811) return count;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 812) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 813)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 814) static ssize_t temp_max_show(struct device *dev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 815) struct device_attribute *devattr, char *buf)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 816) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 817) struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 818) struct adt7462_data *data = adt7462_update_device(dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 819)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 820) if (!temp_enabled(data, attr->index))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 821) return sprintf(buf, "0\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 822)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 823) return sprintf(buf, "%d\n", 1000 * (data->temp_max[attr->index] - 64));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 824) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 825)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 826) static ssize_t temp_max_store(struct device *dev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 827) struct device_attribute *devattr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 828) const char *buf, size_t count)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 829) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 830) struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 831) struct adt7462_data *data = dev_get_drvdata(dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 832) struct i2c_client *client = data->client;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 833) long temp;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 834)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 835) if (kstrtol(buf, 10, &temp) || !temp_enabled(data, attr->index))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 836) return -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 837)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 838) temp = clamp_val(temp, -64000, 191000);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 839) temp = DIV_ROUND_CLOSEST(temp, 1000) + 64;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 840)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 841) mutex_lock(&data->lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 842) data->temp_max[attr->index] = temp;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 843) i2c_smbus_write_byte_data(client, ADT7462_TEMP_MAX_REG(attr->index),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 844) temp);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 845) mutex_unlock(&data->lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 846)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 847) return count;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 848) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 849)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 850) static ssize_t temp_show(struct device *dev, struct device_attribute *devattr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 851) char *buf)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 852) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 853) struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 854) struct adt7462_data *data = adt7462_update_device(dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 855) u8 frac = data->temp_frac[attr->index] >> TEMP_FRAC_OFFSET;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 856)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 857) if (!temp_enabled(data, attr->index))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 858) return sprintf(buf, "0\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 859)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 860) return sprintf(buf, "%d\n", 1000 * (data->temp[attr->index] - 64) +
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 861) 250 * frac);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 862) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 863)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 864) static ssize_t temp_label_show(struct device *dev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 865) struct device_attribute *devattr, char *buf)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 866) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 867) struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 868) struct adt7462_data *data = adt7462_update_device(dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 869)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 870) return sprintf(buf, "%s\n", temp_label(data, attr->index));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 871) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 872)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 873) static ssize_t volt_max_show(struct device *dev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 874) struct device_attribute *devattr, char *buf)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 875) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 876) struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 877) struct adt7462_data *data = adt7462_update_device(dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 878) int x = voltage_multiplier(data, attr->index);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 879)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 880) x *= data->volt_max[attr->index];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 881) x /= 1000; /* convert from uV to mV */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 882)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 883) return sprintf(buf, "%d\n", x);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 884) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 885)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 886) static ssize_t volt_max_store(struct device *dev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 887) struct device_attribute *devattr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 888) const char *buf, size_t count)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 889) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 890) struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 891) struct adt7462_data *data = dev_get_drvdata(dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 892) struct i2c_client *client = data->client;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 893) int x = voltage_multiplier(data, attr->index);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 894) long temp;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 895)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 896) if (kstrtol(buf, 10, &temp) || !x)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 897) return -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 898)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 899) temp = clamp_val(temp, 0, 255 * x / 1000);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 900) temp *= 1000; /* convert mV to uV */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 901) temp = DIV_ROUND_CLOSEST(temp, x);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 902)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 903) mutex_lock(&data->lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 904) data->volt_max[attr->index] = temp;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 905) i2c_smbus_write_byte_data(client,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 906) ADT7462_REG_VOLT_MAX(data, attr->index),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 907) temp);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 908) mutex_unlock(&data->lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 909)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 910) return count;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 911) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 912)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 913) static ssize_t volt_min_show(struct device *dev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 914) struct device_attribute *devattr, char *buf)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 915) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 916) struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 917) struct adt7462_data *data = adt7462_update_device(dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 918) int x = voltage_multiplier(data, attr->index);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 919)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 920) x *= data->volt_min[attr->index];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 921) x /= 1000; /* convert from uV to mV */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 922)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 923) return sprintf(buf, "%d\n", x);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 924) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 925)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 926) static ssize_t volt_min_store(struct device *dev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 927) struct device_attribute *devattr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 928) const char *buf, size_t count)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 929) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 930) struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 931) struct adt7462_data *data = dev_get_drvdata(dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 932) struct i2c_client *client = data->client;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 933) int x = voltage_multiplier(data, attr->index);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 934) long temp;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 935)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 936) if (kstrtol(buf, 10, &temp) || !x)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 937) return -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 938)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 939) temp = clamp_val(temp, 0, 255 * x / 1000);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 940) temp *= 1000; /* convert mV to uV */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 941) temp = DIV_ROUND_CLOSEST(temp, x);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 942)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 943) mutex_lock(&data->lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 944) data->volt_min[attr->index] = temp;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 945) i2c_smbus_write_byte_data(client,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 946) ADT7462_REG_VOLT_MIN(data, attr->index),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 947) temp);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 948) mutex_unlock(&data->lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 949)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 950) return count;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 951) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 952)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 953) static ssize_t voltage_show(struct device *dev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 954) struct device_attribute *devattr, char *buf)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 955) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 956) struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 957) struct adt7462_data *data = adt7462_update_device(dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 958) int x = voltage_multiplier(data, attr->index);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 959)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 960) x *= data->voltages[attr->index];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 961) x /= 1000; /* convert from uV to mV */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 962)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 963) return sprintf(buf, "%d\n", x);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 964) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 965)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 966) static ssize_t voltage_label_show(struct device *dev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 967) struct device_attribute *devattr, char *buf)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 968) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 969) struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 970) struct adt7462_data *data = adt7462_update_device(dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 971)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 972) return sprintf(buf, "%s\n", voltage_label(data, attr->index));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 973) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 974)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 975) static ssize_t alarm_show(struct device *dev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 976) struct device_attribute *devattr, char *buf)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 977) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 978) struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 979) struct adt7462_data *data = adt7462_update_device(dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 980) int reg = attr->index >> ADT7462_ALARM_REG_SHIFT;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 981) int mask = attr->index & ADT7462_ALARM_FLAG_MASK;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 982)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 983) if (data->alarms[reg] & mask)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 984) return sprintf(buf, "1\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 985) else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 986) return sprintf(buf, "0\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 987) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 988)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 989) static int fan_enabled(struct adt7462_data *data, int fan)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 990) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 991) return data->fan_enabled & (1 << fan);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 992) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 993)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 994) static ssize_t fan_min_show(struct device *dev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 995) struct device_attribute *devattr, char *buf)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 996) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 997) struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 998) struct adt7462_data *data = adt7462_update_device(dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 999) u16 temp;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1000)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1001) /* Only the MSB of the min fan period is stored... */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1002) temp = data->fan_min[attr->index];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1003) temp <<= 8;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1004)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1005) if (!fan_enabled(data, attr->index) ||
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1006) !FAN_DATA_VALID(temp))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1007) return sprintf(buf, "0\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1008)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1009) return sprintf(buf, "%d\n", FAN_PERIOD_TO_RPM(temp));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1010) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1011)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1012) static ssize_t fan_min_store(struct device *dev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1013) struct device_attribute *devattr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1014) const char *buf, size_t count)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1015) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1016) struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1017) struct adt7462_data *data = dev_get_drvdata(dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1018) struct i2c_client *client = data->client;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1019) long temp;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1020)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1021) if (kstrtol(buf, 10, &temp) || !temp ||
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1022) !fan_enabled(data, attr->index))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1023) return -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1024)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1025) temp = FAN_RPM_TO_PERIOD(temp);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1026) temp >>= 8;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1027) temp = clamp_val(temp, 1, 255);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1028)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1029) mutex_lock(&data->lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1030) data->fan_min[attr->index] = temp;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1031) i2c_smbus_write_byte_data(client, ADT7462_REG_FAN_MIN(attr->index),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1032) temp);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1033) mutex_unlock(&data->lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1034)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1035) return count;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1036) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1037)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1038) static ssize_t fan_show(struct device *dev, struct device_attribute *devattr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1039) char *buf)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1040) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1041) struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1042) struct adt7462_data *data = adt7462_update_device(dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1043)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1044) if (!fan_enabled(data, attr->index) ||
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1045) !FAN_DATA_VALID(data->fan[attr->index]))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1046) return sprintf(buf, "0\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1047)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1048) return sprintf(buf, "%d\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1049) FAN_PERIOD_TO_RPM(data->fan[attr->index]));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1050) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1051)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1052) static ssize_t force_pwm_max_show(struct device *dev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1053) struct device_attribute *devattr, char *buf)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1054) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1055) struct adt7462_data *data = adt7462_update_device(dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1056) return sprintf(buf, "%d\n", (data->cfg2 & ADT7462_FSPD_MASK ? 1 : 0));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1057) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1058)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1059) static ssize_t force_pwm_max_store(struct device *dev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1060) struct device_attribute *devattr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1061) const char *buf, size_t count)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1062) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1063) struct adt7462_data *data = dev_get_drvdata(dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1064) struct i2c_client *client = data->client;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1065) long temp;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1066) u8 reg;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1067)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1068) if (kstrtol(buf, 10, &temp))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1069) return -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1070)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1071) mutex_lock(&data->lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1072) reg = i2c_smbus_read_byte_data(client, ADT7462_REG_CFG2);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1073) if (temp)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1074) reg |= ADT7462_FSPD_MASK;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1075) else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1076) reg &= ~ADT7462_FSPD_MASK;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1077) data->cfg2 = reg;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1078) i2c_smbus_write_byte_data(client, ADT7462_REG_CFG2, reg);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1079) mutex_unlock(&data->lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1080)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1081) return count;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1082) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1083)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1084) static ssize_t pwm_show(struct device *dev, struct device_attribute *devattr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1085) char *buf)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1086) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1087) struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1088) struct adt7462_data *data = adt7462_update_device(dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1089) return sprintf(buf, "%d\n", data->pwm[attr->index]);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1090) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1091)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1092) static ssize_t pwm_store(struct device *dev, struct device_attribute *devattr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1093) const char *buf, size_t count)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1094) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1095) struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1096) struct adt7462_data *data = dev_get_drvdata(dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1097) struct i2c_client *client = data->client;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1098) long temp;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1099)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1100) if (kstrtol(buf, 10, &temp))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1101) return -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1102)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1103) temp = clamp_val(temp, 0, 255);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1104)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1105) mutex_lock(&data->lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1106) data->pwm[attr->index] = temp;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1107) i2c_smbus_write_byte_data(client, ADT7462_REG_PWM(attr->index), temp);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1108) mutex_unlock(&data->lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1109)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1110) return count;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1111) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1112)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1113) static ssize_t pwm_max_show(struct device *dev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1114) struct device_attribute *devattr, char *buf)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1115) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1116) struct adt7462_data *data = adt7462_update_device(dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1117) return sprintf(buf, "%d\n", data->pwm_max);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1118) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1119)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1120) static ssize_t pwm_max_store(struct device *dev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1121) struct device_attribute *devattr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1122) const char *buf, size_t count)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1123) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1124) struct adt7462_data *data = dev_get_drvdata(dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1125) struct i2c_client *client = data->client;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1126) long temp;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1127)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1128) if (kstrtol(buf, 10, &temp))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1129) return -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1130)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1131) temp = clamp_val(temp, 0, 255);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1132)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1133) mutex_lock(&data->lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1134) data->pwm_max = temp;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1135) i2c_smbus_write_byte_data(client, ADT7462_REG_PWM_MAX, temp);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1136) mutex_unlock(&data->lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1137)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1138) return count;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1139) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1140)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1141) static ssize_t pwm_min_show(struct device *dev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1142) struct device_attribute *devattr, char *buf)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1143) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1144) struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1145) struct adt7462_data *data = adt7462_update_device(dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1146) return sprintf(buf, "%d\n", data->pwm_min[attr->index]);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1147) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1148)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1149) static ssize_t pwm_min_store(struct device *dev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1150) struct device_attribute *devattr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1151) const char *buf, size_t count)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1152) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1153) struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1154) struct adt7462_data *data = dev_get_drvdata(dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1155) struct i2c_client *client = data->client;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1156) long temp;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1157)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1158) if (kstrtol(buf, 10, &temp))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1159) return -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1160)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1161) temp = clamp_val(temp, 0, 255);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1162)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1163) mutex_lock(&data->lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1164) data->pwm_min[attr->index] = temp;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1165) i2c_smbus_write_byte_data(client, ADT7462_REG_PWM_MIN(attr->index),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1166) temp);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1167) mutex_unlock(&data->lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1168)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1169) return count;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1170) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1171)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1172) static ssize_t pwm_hyst_show(struct device *dev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1173) struct device_attribute *devattr, char *buf)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1174) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1175) struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1176) struct adt7462_data *data = adt7462_update_device(dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1177) return sprintf(buf, "%d\n", 1000 *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1178) (data->pwm_trange[attr->index] & ADT7462_PWM_HYST_MASK));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1179) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1180)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1181) static ssize_t pwm_hyst_store(struct device *dev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1182) struct device_attribute *devattr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1183) const char *buf, size_t count)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1184) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1185) struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1186) struct adt7462_data *data = dev_get_drvdata(dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1187) struct i2c_client *client = data->client;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1188) long temp;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1189)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1190) if (kstrtol(buf, 10, &temp))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1191) return -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1192)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1193) temp = clamp_val(temp, 0, 15000);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1194) temp = DIV_ROUND_CLOSEST(temp, 1000);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1195)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1196) /* package things up */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1197) temp &= ADT7462_PWM_HYST_MASK;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1198) temp |= data->pwm_trange[attr->index] & ADT7462_PWM_RANGE_MASK;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1199)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1200) mutex_lock(&data->lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1201) data->pwm_trange[attr->index] = temp;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1202) i2c_smbus_write_byte_data(client, ADT7462_REG_PWM_TRANGE(attr->index),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1203) temp);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1204) mutex_unlock(&data->lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1205)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1206) return count;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1207) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1208)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1209) static ssize_t pwm_tmax_show(struct device *dev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1210) struct device_attribute *devattr, char *buf)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1211) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1212) struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1213) struct adt7462_data *data = adt7462_update_device(dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1214)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1215) /* tmax = tmin + trange */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1216) int trange = trange_values[data->pwm_trange[attr->index] >>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1217) ADT7462_PWM_RANGE_SHIFT];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1218) int tmin = (data->pwm_tmin[attr->index] - 64) * 1000;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1219)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1220) return sprintf(buf, "%d\n", tmin + trange);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1221) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1222)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1223) static ssize_t pwm_tmax_store(struct device *dev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1224) struct device_attribute *devattr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1225) const char *buf, size_t count)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1226) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1227) int temp;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1228) struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1229) struct adt7462_data *data = dev_get_drvdata(dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1230) struct i2c_client *client = data->client;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1231) int tmin, trange_value;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1232) long trange;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1233)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1234) if (kstrtol(buf, 10, &trange))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1235) return -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1236)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1237) /* trange = tmax - tmin */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1238) tmin = (data->pwm_tmin[attr->index] - 64) * 1000;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1239) trange_value = find_trange_value(trange - tmin);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1240) if (trange_value < 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1241) return trange_value;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1242)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1243) temp = trange_value << ADT7462_PWM_RANGE_SHIFT;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1244) temp |= data->pwm_trange[attr->index] & ADT7462_PWM_HYST_MASK;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1245)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1246) mutex_lock(&data->lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1247) data->pwm_trange[attr->index] = temp;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1248) i2c_smbus_write_byte_data(client, ADT7462_REG_PWM_TRANGE(attr->index),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1249) temp);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1250) mutex_unlock(&data->lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1251)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1252) return count;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1253) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1254)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1255) static ssize_t pwm_tmin_show(struct device *dev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1256) struct device_attribute *devattr, char *buf)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1257) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1258) struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1259) struct adt7462_data *data = adt7462_update_device(dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1260) return sprintf(buf, "%d\n", 1000 * (data->pwm_tmin[attr->index] - 64));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1261) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1262)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1263) static ssize_t pwm_tmin_store(struct device *dev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1264) struct device_attribute *devattr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1265) const char *buf, size_t count)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1266) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1267) struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1268) struct adt7462_data *data = dev_get_drvdata(dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1269) struct i2c_client *client = data->client;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1270) long temp;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1271)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1272) if (kstrtol(buf, 10, &temp))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1273) return -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1274)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1275) temp = clamp_val(temp, -64000, 191000);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1276) temp = DIV_ROUND_CLOSEST(temp, 1000) + 64;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1277)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1278) mutex_lock(&data->lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1279) data->pwm_tmin[attr->index] = temp;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1280) i2c_smbus_write_byte_data(client, ADT7462_REG_PWM_TMIN(attr->index),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1281) temp);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1282) mutex_unlock(&data->lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1283)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1284) return count;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1285) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1286)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1287) static ssize_t pwm_auto_show(struct device *dev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1288) struct device_attribute *devattr, char *buf)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1289) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1290) struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1291) struct adt7462_data *data = adt7462_update_device(dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1292) int cfg = data->pwm_cfg[attr->index] >> ADT7462_PWM_CHANNEL_SHIFT;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1293)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1294) switch (cfg) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1295) case 4: /* off */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1296) return sprintf(buf, "0\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1297) case 7: /* manual */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1298) return sprintf(buf, "1\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1299) default: /* automatic */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1300) return sprintf(buf, "2\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1301) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1302) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1303)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1304) static void set_pwm_channel(struct i2c_client *client,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1305) struct adt7462_data *data,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1306) int which,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1307) int value)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1308) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1309) int temp = data->pwm_cfg[which] & ~ADT7462_PWM_CHANNEL_MASK;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1310) temp |= value << ADT7462_PWM_CHANNEL_SHIFT;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1311)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1312) mutex_lock(&data->lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1313) data->pwm_cfg[which] = temp;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1314) i2c_smbus_write_byte_data(client, ADT7462_REG_PWM_CFG(which), temp);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1315) mutex_unlock(&data->lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1316) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1317)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1318) static ssize_t pwm_auto_store(struct device *dev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1319) struct device_attribute *devattr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1320) const char *buf, size_t count)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1321) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1322) struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1323) struct adt7462_data *data = dev_get_drvdata(dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1324) struct i2c_client *client = data->client;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1325) long temp;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1326)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1327) if (kstrtol(buf, 10, &temp))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1328) return -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1329)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1330) switch (temp) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1331) case 0: /* off */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1332) set_pwm_channel(client, data, attr->index, 4);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1333) return count;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1334) case 1: /* manual */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1335) set_pwm_channel(client, data, attr->index, 7);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1336) return count;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1337) default:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1338) return -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1339) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1340) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1341)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1342) static ssize_t pwm_auto_temp_show(struct device *dev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1343) struct device_attribute *devattr, char *buf)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1344) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1345) struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1346) struct adt7462_data *data = adt7462_update_device(dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1347) int channel = data->pwm_cfg[attr->index] >> ADT7462_PWM_CHANNEL_SHIFT;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1348)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1349) switch (channel) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1350) case 0: /* temp[1234] only */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1351) case 1:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1352) case 2:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1353) case 3:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1354) return sprintf(buf, "%d\n", (1 << channel));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1355) case 5: /* temp1 & temp4 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1356) return sprintf(buf, "9\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1357) case 6:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1358) return sprintf(buf, "15\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1359) default:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1360) return sprintf(buf, "0\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1361) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1362) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1363)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1364) static int cvt_auto_temp(int input)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1365) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1366) if (input == 0xF)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1367) return 6;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1368) if (input == 0x9)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1369) return 5;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1370) if (input < 1 || !is_power_of_2(input))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1371) return -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1372) return ilog2(input);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1373) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1374)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1375) static ssize_t pwm_auto_temp_store(struct device *dev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1376) struct device_attribute *devattr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1377) const char *buf, size_t count)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1378) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1379) struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1380) struct adt7462_data *data = dev_get_drvdata(dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1381) struct i2c_client *client = data->client;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1382) long temp;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1383)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1384) if (kstrtol(buf, 10, &temp))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1385) return -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1386)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1387) temp = cvt_auto_temp(temp);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1388) if (temp < 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1389) return temp;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1390)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1391) set_pwm_channel(client, data, attr->index, temp);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1392)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1393) return count;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1394) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1395)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1396) static SENSOR_DEVICE_ATTR_RW(temp1_max, temp_max, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1397) static SENSOR_DEVICE_ATTR_RW(temp2_max, temp_max, 1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1398) static SENSOR_DEVICE_ATTR_RW(temp3_max, temp_max, 2);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1399) static SENSOR_DEVICE_ATTR_RW(temp4_max, temp_max, 3);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1400)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1401) static SENSOR_DEVICE_ATTR_RW(temp1_min, temp_min, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1402) static SENSOR_DEVICE_ATTR_RW(temp2_min, temp_min, 1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1403) static SENSOR_DEVICE_ATTR_RW(temp3_min, temp_min, 2);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1404) static SENSOR_DEVICE_ATTR_RW(temp4_min, temp_min, 3);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1405)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1406) static SENSOR_DEVICE_ATTR_RO(temp1_input, temp, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1407) static SENSOR_DEVICE_ATTR_RO(temp2_input, temp, 1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1408) static SENSOR_DEVICE_ATTR_RO(temp3_input, temp, 2);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1409) static SENSOR_DEVICE_ATTR_RO(temp4_input, temp, 3);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1410)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1411) static SENSOR_DEVICE_ATTR_RO(temp1_label, temp_label, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1412) static SENSOR_DEVICE_ATTR_RO(temp2_label, temp_label, 1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1413) static SENSOR_DEVICE_ATTR_RO(temp3_label, temp_label, 2);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1414) static SENSOR_DEVICE_ATTR_RO(temp4_label, temp_label, 3);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1415)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1416) static SENSOR_DEVICE_ATTR_RO(temp1_alarm, alarm,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1417) ADT7462_ALARM1 | ADT7462_LT_ALARM);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1418) static SENSOR_DEVICE_ATTR_RO(temp2_alarm, alarm,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1419) ADT7462_ALARM1 | ADT7462_R1T_ALARM);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1420) static SENSOR_DEVICE_ATTR_RO(temp3_alarm, alarm,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1421) ADT7462_ALARM1 | ADT7462_R2T_ALARM);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1422) static SENSOR_DEVICE_ATTR_RO(temp4_alarm, alarm,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1423) ADT7462_ALARM1 | ADT7462_R3T_ALARM);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1424)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1425) static SENSOR_DEVICE_ATTR_RW(in1_max, volt_max, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1426) static SENSOR_DEVICE_ATTR_RW(in2_max, volt_max, 1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1427) static SENSOR_DEVICE_ATTR_RW(in3_max, volt_max, 2);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1428) static SENSOR_DEVICE_ATTR_RW(in4_max, volt_max, 3);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1429) static SENSOR_DEVICE_ATTR_RW(in5_max, volt_max, 4);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1430) static SENSOR_DEVICE_ATTR_RW(in6_max, volt_max, 5);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1431) static SENSOR_DEVICE_ATTR_RW(in7_max, volt_max, 6);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1432) static SENSOR_DEVICE_ATTR_RW(in8_max, volt_max, 7);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1433) static SENSOR_DEVICE_ATTR_RW(in9_max, volt_max, 8);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1434) static SENSOR_DEVICE_ATTR_RW(in10_max, volt_max, 9);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1435) static SENSOR_DEVICE_ATTR_RW(in11_max, volt_max, 10);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1436) static SENSOR_DEVICE_ATTR_RW(in12_max, volt_max, 11);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1437) static SENSOR_DEVICE_ATTR_RW(in13_max, volt_max, 12);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1438)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1439) static SENSOR_DEVICE_ATTR_RW(in1_min, volt_min, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1440) static SENSOR_DEVICE_ATTR_RW(in2_min, volt_min, 1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1441) static SENSOR_DEVICE_ATTR_RW(in3_min, volt_min, 2);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1442) static SENSOR_DEVICE_ATTR_RW(in4_min, volt_min, 3);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1443) static SENSOR_DEVICE_ATTR_RW(in5_min, volt_min, 4);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1444) static SENSOR_DEVICE_ATTR_RW(in6_min, volt_min, 5);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1445) static SENSOR_DEVICE_ATTR_RW(in7_min, volt_min, 6);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1446) static SENSOR_DEVICE_ATTR_RW(in8_min, volt_min, 7);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1447) static SENSOR_DEVICE_ATTR_RW(in9_min, volt_min, 8);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1448) static SENSOR_DEVICE_ATTR_RW(in10_min, volt_min, 9);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1449) static SENSOR_DEVICE_ATTR_RW(in11_min, volt_min, 10);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1450) static SENSOR_DEVICE_ATTR_RW(in12_min, volt_min, 11);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1451) static SENSOR_DEVICE_ATTR_RW(in13_min, volt_min, 12);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1452)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1453) static SENSOR_DEVICE_ATTR_RO(in1_input, voltage, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1454) static SENSOR_DEVICE_ATTR_RO(in2_input, voltage, 1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1455) static SENSOR_DEVICE_ATTR_RO(in3_input, voltage, 2);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1456) static SENSOR_DEVICE_ATTR_RO(in4_input, voltage, 3);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1457) static SENSOR_DEVICE_ATTR_RO(in5_input, voltage, 4);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1458) static SENSOR_DEVICE_ATTR_RO(in6_input, voltage, 5);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1459) static SENSOR_DEVICE_ATTR_RO(in7_input, voltage, 6);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1460) static SENSOR_DEVICE_ATTR_RO(in8_input, voltage, 7);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1461) static SENSOR_DEVICE_ATTR_RO(in9_input, voltage, 8);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1462) static SENSOR_DEVICE_ATTR_RO(in10_input, voltage, 9);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1463) static SENSOR_DEVICE_ATTR_RO(in11_input, voltage, 10);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1464) static SENSOR_DEVICE_ATTR_RO(in12_input, voltage, 11);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1465) static SENSOR_DEVICE_ATTR_RO(in13_input, voltage, 12);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1466)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1467) static SENSOR_DEVICE_ATTR_RO(in1_label, voltage_label, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1468) static SENSOR_DEVICE_ATTR_RO(in2_label, voltage_label, 1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1469) static SENSOR_DEVICE_ATTR_RO(in3_label, voltage_label, 2);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1470) static SENSOR_DEVICE_ATTR_RO(in4_label, voltage_label, 3);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1471) static SENSOR_DEVICE_ATTR_RO(in5_label, voltage_label, 4);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1472) static SENSOR_DEVICE_ATTR_RO(in6_label, voltage_label, 5);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1473) static SENSOR_DEVICE_ATTR_RO(in7_label, voltage_label, 6);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1474) static SENSOR_DEVICE_ATTR_RO(in8_label, voltage_label, 7);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1475) static SENSOR_DEVICE_ATTR_RO(in9_label, voltage_label, 8);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1476) static SENSOR_DEVICE_ATTR_RO(in10_label, voltage_label, 9);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1477) static SENSOR_DEVICE_ATTR_RO(in11_label, voltage_label, 10);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1478) static SENSOR_DEVICE_ATTR_RO(in12_label, voltage_label, 11);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1479) static SENSOR_DEVICE_ATTR_RO(in13_label, voltage_label, 12);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1480)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1481) static SENSOR_DEVICE_ATTR_RO(in1_alarm, alarm,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1482) ADT7462_ALARM2 | ADT7462_V0_ALARM);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1483) static SENSOR_DEVICE_ATTR_RO(in2_alarm, alarm,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1484) ADT7462_ALARM2 | ADT7462_V7_ALARM);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1485) static SENSOR_DEVICE_ATTR_RO(in3_alarm, alarm,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1486) ADT7462_ALARM2 | ADT7462_V2_ALARM);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1487) static SENSOR_DEVICE_ATTR_RO(in4_alarm, alarm,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1488) ADT7462_ALARM2 | ADT7462_V6_ALARM);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1489) static SENSOR_DEVICE_ATTR_RO(in5_alarm, alarm,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1490) ADT7462_ALARM2 | ADT7462_V5_ALARM);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1491) static SENSOR_DEVICE_ATTR_RO(in6_alarm, alarm,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1492) ADT7462_ALARM2 | ADT7462_V4_ALARM);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1493) static SENSOR_DEVICE_ATTR_RO(in7_alarm, alarm,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1494) ADT7462_ALARM2 | ADT7462_V3_ALARM);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1495) static SENSOR_DEVICE_ATTR_RO(in8_alarm, alarm,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1496) ADT7462_ALARM2 | ADT7462_V1_ALARM);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1497) static SENSOR_DEVICE_ATTR_RO(in9_alarm, alarm,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1498) ADT7462_ALARM3 | ADT7462_V10_ALARM);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1499) static SENSOR_DEVICE_ATTR_RO(in10_alarm, alarm,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1500) ADT7462_ALARM3 | ADT7462_V9_ALARM);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1501) static SENSOR_DEVICE_ATTR_RO(in11_alarm, alarm,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1502) ADT7462_ALARM3 | ADT7462_V8_ALARM);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1503) static SENSOR_DEVICE_ATTR_RO(in12_alarm, alarm,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1504) ADT7462_ALARM3 | ADT7462_V11_ALARM);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1505) static SENSOR_DEVICE_ATTR_RO(in13_alarm, alarm,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1506) ADT7462_ALARM3 | ADT7462_V12_ALARM);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1507)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1508) static SENSOR_DEVICE_ATTR_RW(fan1_min, fan_min, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1509) static SENSOR_DEVICE_ATTR_RW(fan2_min, fan_min, 1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1510) static SENSOR_DEVICE_ATTR_RW(fan3_min, fan_min, 2);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1511) static SENSOR_DEVICE_ATTR_RW(fan4_min, fan_min, 3);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1512) static SENSOR_DEVICE_ATTR_RW(fan5_min, fan_min, 4);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1513) static SENSOR_DEVICE_ATTR_RW(fan6_min, fan_min, 5);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1514) static SENSOR_DEVICE_ATTR_RW(fan7_min, fan_min, 6);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1515) static SENSOR_DEVICE_ATTR_RW(fan8_min, fan_min, 7);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1516)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1517) static SENSOR_DEVICE_ATTR_RO(fan1_input, fan, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1518) static SENSOR_DEVICE_ATTR_RO(fan2_input, fan, 1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1519) static SENSOR_DEVICE_ATTR_RO(fan3_input, fan, 2);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1520) static SENSOR_DEVICE_ATTR_RO(fan4_input, fan, 3);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1521) static SENSOR_DEVICE_ATTR_RO(fan5_input, fan, 4);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1522) static SENSOR_DEVICE_ATTR_RO(fan6_input, fan, 5);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1523) static SENSOR_DEVICE_ATTR_RO(fan7_input, fan, 6);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1524) static SENSOR_DEVICE_ATTR_RO(fan8_input, fan, 7);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1525)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1526) static SENSOR_DEVICE_ATTR_RO(fan1_alarm, alarm,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1527) ADT7462_ALARM4 | ADT7462_F0_ALARM);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1528) static SENSOR_DEVICE_ATTR_RO(fan2_alarm, alarm,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1529) ADT7462_ALARM4 | ADT7462_F1_ALARM);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1530) static SENSOR_DEVICE_ATTR_RO(fan3_alarm, alarm,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1531) ADT7462_ALARM4 | ADT7462_F2_ALARM);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1532) static SENSOR_DEVICE_ATTR_RO(fan4_alarm, alarm,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1533) ADT7462_ALARM4 | ADT7462_F3_ALARM);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1534) static SENSOR_DEVICE_ATTR_RO(fan5_alarm, alarm,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1535) ADT7462_ALARM4 | ADT7462_F4_ALARM);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1536) static SENSOR_DEVICE_ATTR_RO(fan6_alarm, alarm,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1537) ADT7462_ALARM4 | ADT7462_F5_ALARM);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1538) static SENSOR_DEVICE_ATTR_RO(fan7_alarm, alarm,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1539) ADT7462_ALARM4 | ADT7462_F6_ALARM);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1540) static SENSOR_DEVICE_ATTR_RO(fan8_alarm, alarm,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1541) ADT7462_ALARM4 | ADT7462_F7_ALARM);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1542)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1543) static SENSOR_DEVICE_ATTR_RW(force_pwm_max, force_pwm_max, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1544)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1545) static SENSOR_DEVICE_ATTR_RW(pwm1, pwm, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1546) static SENSOR_DEVICE_ATTR_RW(pwm2, pwm, 1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1547) static SENSOR_DEVICE_ATTR_RW(pwm3, pwm, 2);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1548) static SENSOR_DEVICE_ATTR_RW(pwm4, pwm, 3);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1549)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1550) static SENSOR_DEVICE_ATTR_RW(pwm1_auto_point1_pwm, pwm_min, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1551) static SENSOR_DEVICE_ATTR_RW(pwm2_auto_point1_pwm, pwm_min, 1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1552) static SENSOR_DEVICE_ATTR_RW(pwm3_auto_point1_pwm, pwm_min, 2);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1553) static SENSOR_DEVICE_ATTR_RW(pwm4_auto_point1_pwm, pwm_min, 3);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1554)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1555) static SENSOR_DEVICE_ATTR_RW(pwm1_auto_point2_pwm, pwm_max, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1556) static SENSOR_DEVICE_ATTR_RW(pwm2_auto_point2_pwm, pwm_max, 1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1557) static SENSOR_DEVICE_ATTR_RW(pwm3_auto_point2_pwm, pwm_max, 2);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1558) static SENSOR_DEVICE_ATTR_RW(pwm4_auto_point2_pwm, pwm_max, 3);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1559)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1560) static SENSOR_DEVICE_ATTR_RW(temp1_auto_point1_hyst, pwm_hyst, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1561) static SENSOR_DEVICE_ATTR_RW(temp2_auto_point1_hyst, pwm_hyst, 1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1562) static SENSOR_DEVICE_ATTR_RW(temp3_auto_point1_hyst, pwm_hyst, 2);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1563) static SENSOR_DEVICE_ATTR_RW(temp4_auto_point1_hyst, pwm_hyst, 3);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1564)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1565) static SENSOR_DEVICE_ATTR_RW(temp1_auto_point2_hyst, pwm_hyst, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1566) static SENSOR_DEVICE_ATTR_RW(temp2_auto_point2_hyst, pwm_hyst, 1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1567) static SENSOR_DEVICE_ATTR_RW(temp3_auto_point2_hyst, pwm_hyst, 2);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1568) static SENSOR_DEVICE_ATTR_RW(temp4_auto_point2_hyst, pwm_hyst, 3);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1569)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1570) static SENSOR_DEVICE_ATTR_RW(temp1_auto_point1_temp, pwm_tmin, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1571) static SENSOR_DEVICE_ATTR_RW(temp2_auto_point1_temp, pwm_tmin, 1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1572) static SENSOR_DEVICE_ATTR_RW(temp3_auto_point1_temp, pwm_tmin, 2);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1573) static SENSOR_DEVICE_ATTR_RW(temp4_auto_point1_temp, pwm_tmin, 3);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1574)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1575) static SENSOR_DEVICE_ATTR_RW(temp1_auto_point2_temp, pwm_tmax, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1576) static SENSOR_DEVICE_ATTR_RW(temp2_auto_point2_temp, pwm_tmax, 1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1577) static SENSOR_DEVICE_ATTR_RW(temp3_auto_point2_temp, pwm_tmax, 2);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1578) static SENSOR_DEVICE_ATTR_RW(temp4_auto_point2_temp, pwm_tmax, 3);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1579)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1580) static SENSOR_DEVICE_ATTR_RW(pwm1_enable, pwm_auto, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1581) static SENSOR_DEVICE_ATTR_RW(pwm2_enable, pwm_auto, 1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1582) static SENSOR_DEVICE_ATTR_RW(pwm3_enable, pwm_auto, 2);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1583) static SENSOR_DEVICE_ATTR_RW(pwm4_enable, pwm_auto, 3);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1584)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1585) static SENSOR_DEVICE_ATTR_RW(pwm1_auto_channels_temp, pwm_auto_temp, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1586) static SENSOR_DEVICE_ATTR_RW(pwm2_auto_channels_temp, pwm_auto_temp, 1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1587) static SENSOR_DEVICE_ATTR_RW(pwm3_auto_channels_temp, pwm_auto_temp, 2);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1588) static SENSOR_DEVICE_ATTR_RW(pwm4_auto_channels_temp, pwm_auto_temp, 3);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1589)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1590) static struct attribute *adt7462_attrs[] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1591) &sensor_dev_attr_temp1_max.dev_attr.attr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1592) &sensor_dev_attr_temp2_max.dev_attr.attr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1593) &sensor_dev_attr_temp3_max.dev_attr.attr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1594) &sensor_dev_attr_temp4_max.dev_attr.attr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1595)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1596) &sensor_dev_attr_temp1_min.dev_attr.attr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1597) &sensor_dev_attr_temp2_min.dev_attr.attr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1598) &sensor_dev_attr_temp3_min.dev_attr.attr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1599) &sensor_dev_attr_temp4_min.dev_attr.attr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1600)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1601) &sensor_dev_attr_temp1_input.dev_attr.attr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1602) &sensor_dev_attr_temp2_input.dev_attr.attr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1603) &sensor_dev_attr_temp3_input.dev_attr.attr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1604) &sensor_dev_attr_temp4_input.dev_attr.attr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1605)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1606) &sensor_dev_attr_temp1_label.dev_attr.attr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1607) &sensor_dev_attr_temp2_label.dev_attr.attr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1608) &sensor_dev_attr_temp3_label.dev_attr.attr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1609) &sensor_dev_attr_temp4_label.dev_attr.attr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1610)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1611) &sensor_dev_attr_temp1_alarm.dev_attr.attr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1612) &sensor_dev_attr_temp2_alarm.dev_attr.attr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1613) &sensor_dev_attr_temp3_alarm.dev_attr.attr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1614) &sensor_dev_attr_temp4_alarm.dev_attr.attr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1615)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1616) &sensor_dev_attr_in1_max.dev_attr.attr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1617) &sensor_dev_attr_in2_max.dev_attr.attr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1618) &sensor_dev_attr_in3_max.dev_attr.attr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1619) &sensor_dev_attr_in4_max.dev_attr.attr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1620) &sensor_dev_attr_in5_max.dev_attr.attr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1621) &sensor_dev_attr_in6_max.dev_attr.attr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1622) &sensor_dev_attr_in7_max.dev_attr.attr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1623) &sensor_dev_attr_in8_max.dev_attr.attr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1624) &sensor_dev_attr_in9_max.dev_attr.attr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1625) &sensor_dev_attr_in10_max.dev_attr.attr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1626) &sensor_dev_attr_in11_max.dev_attr.attr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1627) &sensor_dev_attr_in12_max.dev_attr.attr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1628) &sensor_dev_attr_in13_max.dev_attr.attr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1629)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1630) &sensor_dev_attr_in1_min.dev_attr.attr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1631) &sensor_dev_attr_in2_min.dev_attr.attr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1632) &sensor_dev_attr_in3_min.dev_attr.attr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1633) &sensor_dev_attr_in4_min.dev_attr.attr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1634) &sensor_dev_attr_in5_min.dev_attr.attr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1635) &sensor_dev_attr_in6_min.dev_attr.attr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1636) &sensor_dev_attr_in7_min.dev_attr.attr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1637) &sensor_dev_attr_in8_min.dev_attr.attr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1638) &sensor_dev_attr_in9_min.dev_attr.attr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1639) &sensor_dev_attr_in10_min.dev_attr.attr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1640) &sensor_dev_attr_in11_min.dev_attr.attr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1641) &sensor_dev_attr_in12_min.dev_attr.attr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1642) &sensor_dev_attr_in13_min.dev_attr.attr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1643)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1644) &sensor_dev_attr_in1_input.dev_attr.attr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1645) &sensor_dev_attr_in2_input.dev_attr.attr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1646) &sensor_dev_attr_in3_input.dev_attr.attr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1647) &sensor_dev_attr_in4_input.dev_attr.attr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1648) &sensor_dev_attr_in5_input.dev_attr.attr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1649) &sensor_dev_attr_in6_input.dev_attr.attr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1650) &sensor_dev_attr_in7_input.dev_attr.attr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1651) &sensor_dev_attr_in8_input.dev_attr.attr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1652) &sensor_dev_attr_in9_input.dev_attr.attr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1653) &sensor_dev_attr_in10_input.dev_attr.attr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1654) &sensor_dev_attr_in11_input.dev_attr.attr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1655) &sensor_dev_attr_in12_input.dev_attr.attr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1656) &sensor_dev_attr_in13_input.dev_attr.attr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1657)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1658) &sensor_dev_attr_in1_label.dev_attr.attr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1659) &sensor_dev_attr_in2_label.dev_attr.attr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1660) &sensor_dev_attr_in3_label.dev_attr.attr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1661) &sensor_dev_attr_in4_label.dev_attr.attr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1662) &sensor_dev_attr_in5_label.dev_attr.attr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1663) &sensor_dev_attr_in6_label.dev_attr.attr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1664) &sensor_dev_attr_in7_label.dev_attr.attr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1665) &sensor_dev_attr_in8_label.dev_attr.attr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1666) &sensor_dev_attr_in9_label.dev_attr.attr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1667) &sensor_dev_attr_in10_label.dev_attr.attr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1668) &sensor_dev_attr_in11_label.dev_attr.attr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1669) &sensor_dev_attr_in12_label.dev_attr.attr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1670) &sensor_dev_attr_in13_label.dev_attr.attr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1671)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1672) &sensor_dev_attr_in1_alarm.dev_attr.attr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1673) &sensor_dev_attr_in2_alarm.dev_attr.attr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1674) &sensor_dev_attr_in3_alarm.dev_attr.attr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1675) &sensor_dev_attr_in4_alarm.dev_attr.attr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1676) &sensor_dev_attr_in5_alarm.dev_attr.attr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1677) &sensor_dev_attr_in6_alarm.dev_attr.attr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1678) &sensor_dev_attr_in7_alarm.dev_attr.attr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1679) &sensor_dev_attr_in8_alarm.dev_attr.attr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1680) &sensor_dev_attr_in9_alarm.dev_attr.attr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1681) &sensor_dev_attr_in10_alarm.dev_attr.attr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1682) &sensor_dev_attr_in11_alarm.dev_attr.attr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1683) &sensor_dev_attr_in12_alarm.dev_attr.attr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1684) &sensor_dev_attr_in13_alarm.dev_attr.attr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1685)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1686) &sensor_dev_attr_fan1_min.dev_attr.attr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1687) &sensor_dev_attr_fan2_min.dev_attr.attr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1688) &sensor_dev_attr_fan3_min.dev_attr.attr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1689) &sensor_dev_attr_fan4_min.dev_attr.attr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1690) &sensor_dev_attr_fan5_min.dev_attr.attr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1691) &sensor_dev_attr_fan6_min.dev_attr.attr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1692) &sensor_dev_attr_fan7_min.dev_attr.attr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1693) &sensor_dev_attr_fan8_min.dev_attr.attr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1694)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1695) &sensor_dev_attr_fan1_input.dev_attr.attr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1696) &sensor_dev_attr_fan2_input.dev_attr.attr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1697) &sensor_dev_attr_fan3_input.dev_attr.attr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1698) &sensor_dev_attr_fan4_input.dev_attr.attr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1699) &sensor_dev_attr_fan5_input.dev_attr.attr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1700) &sensor_dev_attr_fan6_input.dev_attr.attr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1701) &sensor_dev_attr_fan7_input.dev_attr.attr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1702) &sensor_dev_attr_fan8_input.dev_attr.attr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1703)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1704) &sensor_dev_attr_fan1_alarm.dev_attr.attr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1705) &sensor_dev_attr_fan2_alarm.dev_attr.attr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1706) &sensor_dev_attr_fan3_alarm.dev_attr.attr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1707) &sensor_dev_attr_fan4_alarm.dev_attr.attr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1708) &sensor_dev_attr_fan5_alarm.dev_attr.attr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1709) &sensor_dev_attr_fan6_alarm.dev_attr.attr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1710) &sensor_dev_attr_fan7_alarm.dev_attr.attr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1711) &sensor_dev_attr_fan8_alarm.dev_attr.attr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1712)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1713) &sensor_dev_attr_force_pwm_max.dev_attr.attr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1714) &sensor_dev_attr_pwm1.dev_attr.attr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1715) &sensor_dev_attr_pwm2.dev_attr.attr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1716) &sensor_dev_attr_pwm3.dev_attr.attr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1717) &sensor_dev_attr_pwm4.dev_attr.attr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1718)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1719) &sensor_dev_attr_pwm1_auto_point1_pwm.dev_attr.attr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1720) &sensor_dev_attr_pwm2_auto_point1_pwm.dev_attr.attr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1721) &sensor_dev_attr_pwm3_auto_point1_pwm.dev_attr.attr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1722) &sensor_dev_attr_pwm4_auto_point1_pwm.dev_attr.attr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1723)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1724) &sensor_dev_attr_pwm1_auto_point2_pwm.dev_attr.attr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1725) &sensor_dev_attr_pwm2_auto_point2_pwm.dev_attr.attr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1726) &sensor_dev_attr_pwm3_auto_point2_pwm.dev_attr.attr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1727) &sensor_dev_attr_pwm4_auto_point2_pwm.dev_attr.attr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1728)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1729) &sensor_dev_attr_temp1_auto_point1_hyst.dev_attr.attr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1730) &sensor_dev_attr_temp2_auto_point1_hyst.dev_attr.attr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1731) &sensor_dev_attr_temp3_auto_point1_hyst.dev_attr.attr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1732) &sensor_dev_attr_temp4_auto_point1_hyst.dev_attr.attr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1733)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1734) &sensor_dev_attr_temp1_auto_point2_hyst.dev_attr.attr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1735) &sensor_dev_attr_temp2_auto_point2_hyst.dev_attr.attr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1736) &sensor_dev_attr_temp3_auto_point2_hyst.dev_attr.attr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1737) &sensor_dev_attr_temp4_auto_point2_hyst.dev_attr.attr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1738)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1739) &sensor_dev_attr_temp1_auto_point1_temp.dev_attr.attr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1740) &sensor_dev_attr_temp2_auto_point1_temp.dev_attr.attr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1741) &sensor_dev_attr_temp3_auto_point1_temp.dev_attr.attr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1742) &sensor_dev_attr_temp4_auto_point1_temp.dev_attr.attr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1743)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1744) &sensor_dev_attr_temp1_auto_point2_temp.dev_attr.attr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1745) &sensor_dev_attr_temp2_auto_point2_temp.dev_attr.attr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1746) &sensor_dev_attr_temp3_auto_point2_temp.dev_attr.attr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1747) &sensor_dev_attr_temp4_auto_point2_temp.dev_attr.attr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1748)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1749) &sensor_dev_attr_pwm1_enable.dev_attr.attr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1750) &sensor_dev_attr_pwm2_enable.dev_attr.attr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1751) &sensor_dev_attr_pwm3_enable.dev_attr.attr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1752) &sensor_dev_attr_pwm4_enable.dev_attr.attr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1753)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1754) &sensor_dev_attr_pwm1_auto_channels_temp.dev_attr.attr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1755) &sensor_dev_attr_pwm2_auto_channels_temp.dev_attr.attr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1756) &sensor_dev_attr_pwm3_auto_channels_temp.dev_attr.attr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1757) &sensor_dev_attr_pwm4_auto_channels_temp.dev_attr.attr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1758) NULL
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1759) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1760)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1761) ATTRIBUTE_GROUPS(adt7462);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1762)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1763) /* Return 0 if detection is successful, -ENODEV otherwise */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1764) static int adt7462_detect(struct i2c_client *client,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1765) struct i2c_board_info *info)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1766) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1767) struct i2c_adapter *adapter = client->adapter;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1768) int vendor, device, revision;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1769)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1770) if (!i2c_check_functionality(adapter, I2C_FUNC_SMBUS_BYTE_DATA))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1771) return -ENODEV;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1772)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1773) vendor = i2c_smbus_read_byte_data(client, ADT7462_REG_VENDOR);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1774) if (vendor != ADT7462_VENDOR)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1775) return -ENODEV;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1776)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1777) device = i2c_smbus_read_byte_data(client, ADT7462_REG_DEVICE);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1778) if (device != ADT7462_DEVICE)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1779) return -ENODEV;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1780)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1781) revision = i2c_smbus_read_byte_data(client, ADT7462_REG_REVISION);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1782) if (revision != ADT7462_REVISION)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1783) return -ENODEV;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1784)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1785) strlcpy(info->type, "adt7462", I2C_NAME_SIZE);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1786)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1787) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1788) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1789)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1790) static int adt7462_probe(struct i2c_client *client)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1791) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1792) struct device *dev = &client->dev;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1793) struct adt7462_data *data;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1794) struct device *hwmon_dev;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1795)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1796) data = devm_kzalloc(dev, sizeof(struct adt7462_data), GFP_KERNEL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1797) if (!data)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1798) return -ENOMEM;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1799)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1800) data->client = client;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1801) mutex_init(&data->lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1802)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1803) dev_info(&client->dev, "%s chip found\n", client->name);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1804)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1805) hwmon_dev = devm_hwmon_device_register_with_groups(dev, client->name,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1806) data,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1807) adt7462_groups);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1808) return PTR_ERR_OR_ZERO(hwmon_dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1809) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1810)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1811) static const struct i2c_device_id adt7462_id[] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1812) { "adt7462", 0 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1813) { }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1814) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1815) MODULE_DEVICE_TABLE(i2c, adt7462_id);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1816)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1817) static struct i2c_driver adt7462_driver = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1818) .class = I2C_CLASS_HWMON,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1819) .driver = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1820) .name = "adt7462",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1821) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1822) .probe_new = adt7462_probe,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1823) .id_table = adt7462_id,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1824) .detect = adt7462_detect,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1825) .address_list = normal_i2c,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1826) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1827)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1828) module_i2c_driver(adt7462_driver);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1829)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1830) MODULE_AUTHOR("Darrick J. Wong <darrick.wong@oracle.com>");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1831) MODULE_DESCRIPTION("ADT7462 driver");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1832) MODULE_LICENSE("GPL");