1*dd63353aSNuno Sá // SPDX-License-Identifier: GPL-2.0-only 2*dd63353aSNuno Sá /* 3*dd63353aSNuno Sá * Analog Devices LTC4283 I2C Negative Voltage Hot Swap Controller (HWMON) 4*dd63353aSNuno Sá * 5*dd63353aSNuno Sá * Copyright 2025 Analog Devices Inc. 6*dd63353aSNuno Sá */ 7*dd63353aSNuno Sá #include <linux/auxiliary_bus.h> 8*dd63353aSNuno Sá #include <linux/bitfield.h> 9*dd63353aSNuno Sá #include <linux/bitmap.h> 10*dd63353aSNuno Sá #include <linux/bitops.h> 11*dd63353aSNuno Sá #include <linux/bits.h> 12*dd63353aSNuno Sá 13*dd63353aSNuno Sá #include <linux/debugfs.h> 14*dd63353aSNuno Sá #include <linux/device.h> 15*dd63353aSNuno Sá #include <linux/device/devres.h> 16*dd63353aSNuno Sá #include <linux/hwmon.h> 17*dd63353aSNuno Sá #include <linux/i2c.h> 18*dd63353aSNuno Sá #include <linux/math.h> 19*dd63353aSNuno Sá #include <linux/math64.h> 20*dd63353aSNuno Sá #include <linux/minmax.h> 21*dd63353aSNuno Sá #include <linux/module.h> 22*dd63353aSNuno Sá 23*dd63353aSNuno Sá #include <linux/mod_devicetable.h> 24*dd63353aSNuno Sá #include <linux/property.h> 25*dd63353aSNuno Sá #include <linux/regmap.h> 26*dd63353aSNuno Sá #include <linux/unaligned.h> 27*dd63353aSNuno Sá #include <linux/units.h> 28*dd63353aSNuno Sá 29*dd63353aSNuno Sá #define LTC4283_SYSTEM_STATUS 0x00 30*dd63353aSNuno Sá #define LTC4283_FAULT_STATUS 0x03 31*dd63353aSNuno Sá #define LTC4283_OV_MASK BIT(0) 32*dd63353aSNuno Sá #define LTC4283_UV_MASK BIT(1) 33*dd63353aSNuno Sá #define LTC4283_OC_MASK BIT(2) 34*dd63353aSNuno Sá #define LTC4283_FET_BAD_MASK BIT(3) 35*dd63353aSNuno Sá #define LTC4283_FET_SHORT_MASK BIT(6) 36*dd63353aSNuno Sá #define LTC4283_FAULT_LOG 0x04 37*dd63353aSNuno Sá #define LTC4283_OV_FAULT_MASK BIT(0) 38*dd63353aSNuno Sá #define LTC4283_UV_FAULT_MASK BIT(1) 39*dd63353aSNuno Sá #define LTC4283_OC_FAULT_MASK BIT(2) 40*dd63353aSNuno Sá #define LTC4283_FET_BAD_FAULT_MASK BIT(3) 41*dd63353aSNuno Sá #define LTC4283_PGI_FAULT_MASK BIT(4) 42*dd63353aSNuno Sá #define LTC4283_PWR_FAIL_FAULT_MASK BIT(5) 43*dd63353aSNuno Sá #define LTC4283_FET_SHORT_FAULT_MASK BIT(6) 44*dd63353aSNuno Sá #define LTC4283_ADC_ALM_LOG_1 0x05 45*dd63353aSNuno Sá #define LTC4283_POWER_LOW_ALM BIT(0) 46*dd63353aSNuno Sá #define LTC4283_POWER_HIGH_ALM BIT(1) 47*dd63353aSNuno Sá #define LTC4283_SENSE_LOW_ALM BIT(4) 48*dd63353aSNuno Sá #define LTC4283_SENSE_HIGH_ALM BIT(5) 49*dd63353aSNuno Sá #define LTC4283_ADC_ALM_LOG_2 0x06 50*dd63353aSNuno Sá #define LTC4283_ADC_ALM_LOG_3 0x07 51*dd63353aSNuno Sá #define LTC4283_ADC_ALM_LOG_4 0x08 52*dd63353aSNuno Sá #define LTC4283_ADC_ALM_LOG_5 0x09 53*dd63353aSNuno Sá #define LTC4283_CONTROL_1 0x0a 54*dd63353aSNuno Sá #define LTC4283_RW_PAGE_MASK BIT(0) 55*dd63353aSNuno Sá #define LTC4283_PIGIO2_ACLB_MASK BIT(2) 56*dd63353aSNuno Sá #define LTC4283_PWRGD_RST_CTRL_MASK BIT(3) 57*dd63353aSNuno Sá #define LTC4283_FET_BAD_OFF_MASK BIT(4) 58*dd63353aSNuno Sá #define LTC4283_THERM_TMR_MASK BIT(5) 59*dd63353aSNuno Sá #define LTC4283_DVDT_MASK BIT(6) 60*dd63353aSNuno Sá #define LTC4283_CONTROL_2 0x0b 61*dd63353aSNuno Sá #define LTC4283_OV_RETRY_MASK BIT(0) 62*dd63353aSNuno Sá #define LTC4283_UV_RETRY_MASK BIT(1) 63*dd63353aSNuno Sá #define LTC4283_OC_RETRY_MASK GENMASK(3, 2) 64*dd63353aSNuno Sá #define LTC4283_FET_BAD_RETRY_MASK GENMASK(5, 4) 65*dd63353aSNuno Sá #define LTC4283_EXT_FAULT_RETRY_MASK BIT(7) 66*dd63353aSNuno Sá #define LTC4283_RESERVED_OC 0x0c 67*dd63353aSNuno Sá #define LTC4283_CONFIG_1 0x0d 68*dd63353aSNuno Sá #define LTC4283_FB_MASK GENMASK(3, 2) 69*dd63353aSNuno Sá #define LTC4283_ILIM_MASK GENMASK(7, 4) 70*dd63353aSNuno Sá #define LTC4283_CONFIG_2 0x0e 71*dd63353aSNuno Sá #define LTC4283_COOLING_DL_MASK GENMASK(3, 1) 72*dd63353aSNuno Sá #define LTC4283_FTBD_DL_MASK GENMASK(5, 4) 73*dd63353aSNuno Sá #define LTC4283_CONFIG_3 0x0f 74*dd63353aSNuno Sá #define LTC4283_VPWR_DRNS_MASK BIT(6) 75*dd63353aSNuno Sá #define LTC4283_EXTFLT_TURN_OFF_MASK BIT(7) 76*dd63353aSNuno Sá #define LTC4283_PGIO_CONFIG 0x10 77*dd63353aSNuno Sá #define LTC4283_PGIO1_CFG_MASK GENMASK(1, 0) 78*dd63353aSNuno Sá #define LTC4283_PGIO2_CFG_MASK GENMASK(3, 2) 79*dd63353aSNuno Sá #define LTC4283_PGIO3_CFG_MASK GENMASK(5, 4) 80*dd63353aSNuno Sá #define LTC4283_PGIO4_CFG_MASK GENMASK(7, 6) 81*dd63353aSNuno Sá #define LTC4283_PGIO_CONFIG_2 0x11 82*dd63353aSNuno Sá #define LTC4283_ADC_MASK GENMASK(2, 0) 83*dd63353aSNuno Sá #define LTC4283_ADC_SELECT(c) (0x13 + (c) / 8) 84*dd63353aSNuno Sá #define LTC4283_ADC_SELECT_MASK(c) BIT((c) % 8) 85*dd63353aSNuno Sá #define LTC4283_SENSE_MIN_TH 0x1b 86*dd63353aSNuno Sá #define LTC4283_SENSE_MAX_TH 0x1c 87*dd63353aSNuno Sá #define LTC4283_VPWR_MIN_TH 0x1d 88*dd63353aSNuno Sá #define LTC4283_VPWR_MAX_TH 0x1e 89*dd63353aSNuno Sá #define LTC4283_POWER_MIN_TH 0x1f 90*dd63353aSNuno Sá #define LTC4283_POWER_MAX_TH 0x20 91*dd63353aSNuno Sá #define LTC4283_ADC_2_MIN_TH(c) (0x21 + (c) * 2) 92*dd63353aSNuno Sá #define LTC4283_ADC_2_MAX_TH(c) (0x22 + (c) * 2) 93*dd63353aSNuno Sá #define LTC4283_ADC_2_MIN_TH_DIFF(c) (0x39 + (c) * 2) 94*dd63353aSNuno Sá #define LTC4283_ADC_2_MAX_TH_DIFF(c) (0x3a + (c) * 2) 95*dd63353aSNuno Sá #define LTC4283_SENSE 0x41 96*dd63353aSNuno Sá #define LTC4283_SENSE_MIN 0x42 97*dd63353aSNuno Sá #define LTC4283_SENSE_MAX 0x43 98*dd63353aSNuno Sá #define LTC4283_VPWR 0x44 99*dd63353aSNuno Sá #define LTC4283_VPWR_MIN 0x45 100*dd63353aSNuno Sá #define LTC4283_VPWR_MAX 0x46 101*dd63353aSNuno Sá #define LTC4283_POWER 0x47 102*dd63353aSNuno Sá #define LTC4283_POWER_MIN 0x48 103*dd63353aSNuno Sá #define LTC4283_POWER_MAX 0x49 104*dd63353aSNuno Sá #define LTC4283_RESERVED_68 0x68 105*dd63353aSNuno Sá #define LTC4283_RESERVED_6D 0x6D 106*dd63353aSNuno Sá /* get channels from ADC 2 */ 107*dd63353aSNuno Sá #define LTC4283_ADC_2(c) (0x4a + (c) * 3) 108*dd63353aSNuno Sá #define LTC4283_ADC_2_MIN(c) (0x4b + (c) * 3) 109*dd63353aSNuno Sá #define LTC4283_ADC_2_MAX(c) (0x4c + (c) * 3) 110*dd63353aSNuno Sá #define LTC4283_ADC_2_DIFF(c) (0x6e + (c) * 3) 111*dd63353aSNuno Sá #define LTC4283_ADC_2_MIN_DIFF(c) (0x6f + (c) * 3) 112*dd63353aSNuno Sá #define LTC4283_ADC_2_MAX_DIFF(c) (0x70 + (c) * 3) 113*dd63353aSNuno Sá #define LTC4283_ENERGY 0x7a 114*dd63353aSNuno Sá #define LTC4283_METER_CONTROL 0x84 115*dd63353aSNuno Sá #define LTC4283_INTEGRATE_I_MASK BIT(0) 116*dd63353aSNuno Sá #define LTC4283_METER_HALT_MASK BIT(6) 117*dd63353aSNuno Sá #define LTC4283_RESERVED_86 0x86 118*dd63353aSNuno Sá #define LTC4283_RESERVED_8F 0x8F 119*dd63353aSNuno Sá #define LTC4283_FAULT_LOG_CTRL 0x90 120*dd63353aSNuno Sá #define LTC4283_FAULT_LOG_EN_MASK BIT(7) 121*dd63353aSNuno Sá #define LTC4283_RESERVED_91 0x91 122*dd63353aSNuno Sá #define LTC4283_RESERVED_A1 0xA1 123*dd63353aSNuno Sá #define LTC4283_RESERVED_A3 0xA3 124*dd63353aSNuno Sá #define LTC4283_RESERVED_AC 0xAC 125*dd63353aSNuno Sá #define LTC4283_POWER_PLAY_MSB 0xE7 126*dd63353aSNuno Sá #define LTC4283_POWER_PLAY_LSB 0xE8 127*dd63353aSNuno Sá #define LTC4283_RESERVED_F1 0xF1 128*dd63353aSNuno Sá #define LTC4283_RESERVED_FF 0xFF 129*dd63353aSNuno Sá 130*dd63353aSNuno Sá /* also applies for differential channels */ 131*dd63353aSNuno Sá #define LTC4283_ADC1_FS_uV 32768 132*dd63353aSNuno Sá #define LTC4283_ADC2_FS_mV 2048 133*dd63353aSNuno Sá #define LTC4283_TCONV_uS 64103 134*dd63353aSNuno Sá #define LTC4283_VILIM_MIN_uV 15000 135*dd63353aSNuno Sá #define LTC4283_VILIM_MAX_uV 30000 136*dd63353aSNuno Sá #define LTC4283_VILIM_RANGE \ 137*dd63353aSNuno Sá (LTC4283_VILIM_MAX_uV - LTC4283_VILIM_MIN_uV + 1) 138*dd63353aSNuno Sá 139*dd63353aSNuno Sá #define LTC4283_PGIO_FUNC_GPIO 2 140*dd63353aSNuno Sá #define LTC4283_PGIO2_FUNC_ACLB 3 141*dd63353aSNuno Sá 142*dd63353aSNuno Sá /* 143*dd63353aSNuno Sá * Maximum value for rsense in nano ohms. The reasoning for this value is that 144*dd63353aSNuno Sá * it's the max value for which multiplying by 256 does not overflow long on 145*dd63353aSNuno Sá * 32bits. For the minimum value, is a sane minimum rsense for which power_max 146*dd63353aSNuno Sá * does not overflow 32bits. 147*dd63353aSNuno Sá */ 148*dd63353aSNuno Sá #define LTC4283_MAX_RSENSE 1677721599 149*dd63353aSNuno Sá #define LTC4283_MIN_RSENSE 50000 150*dd63353aSNuno Sá 151*dd63353aSNuno Sá /* voltage channels */ 152*dd63353aSNuno Sá enum { 153*dd63353aSNuno Sá LTC4283_CHAN_VIN, 154*dd63353aSNuno Sá LTC4283_CHAN_VPWR, 155*dd63353aSNuno Sá LTC4283_CHAN_ADI_1, 156*dd63353aSNuno Sá LTC4283_CHAN_ADI_2, 157*dd63353aSNuno Sá LTC4283_CHAN_ADI_3, 158*dd63353aSNuno Sá LTC4283_CHAN_ADI_4, 159*dd63353aSNuno Sá LTC4283_CHAN_ADIO_1, 160*dd63353aSNuno Sá LTC4283_CHAN_ADIO_2, 161*dd63353aSNuno Sá LTC4283_CHAN_ADIO_3, 162*dd63353aSNuno Sá LTC4283_CHAN_ADIO_4, 163*dd63353aSNuno Sá LTC4283_CHAN_DRNS, 164*dd63353aSNuno Sá LTC4283_CHAN_DRAIN, 165*dd63353aSNuno Sá /* differential channels */ 166*dd63353aSNuno Sá LTC4283_CHAN_ADIN12, 167*dd63353aSNuno Sá LTC4283_CHAN_ADIN34, 168*dd63353aSNuno Sá LTC4283_CHAN_ADIO12, 169*dd63353aSNuno Sá LTC4283_CHAN_ADIO34, 170*dd63353aSNuno Sá LTC4283_CHAN_MAX 171*dd63353aSNuno Sá }; 172*dd63353aSNuno Sá 173*dd63353aSNuno Sá /* Just for ease of use on the regmap */ 174*dd63353aSNuno Sá #define LTC4283_ADIO34_MAX \ 175*dd63353aSNuno Sá LTC4283_ADC_2_MAX_DIFF(LTC4283_CHAN_ADIO34 - LTC4283_CHAN_ADIN12) 176*dd63353aSNuno Sá 177*dd63353aSNuno Sá struct ltc4283_hwmon { 178*dd63353aSNuno Sá struct regmap *map; 179*dd63353aSNuno Sá struct i2c_client *client; 180*dd63353aSNuno Sá unsigned long gpio_mask; 181*dd63353aSNuno Sá unsigned long ch_enable_mask; 182*dd63353aSNuno Sá /* in microwatt */ 183*dd63353aSNuno Sá unsigned long power_max; 184*dd63353aSNuno Sá /* in millivolt */ 185*dd63353aSNuno Sá u32 vsense_max; 186*dd63353aSNuno Sá /* in tenths of microohm*/ 187*dd63353aSNuno Sá u32 rsense; 188*dd63353aSNuno Sá bool energy_en; 189*dd63353aSNuno Sá bool ext_fault; 190*dd63353aSNuno Sá }; 191*dd63353aSNuno Sá 192*dd63353aSNuno Sá static int ltc4283_read_voltage_word(const struct ltc4283_hwmon *st, 193*dd63353aSNuno Sá u32 reg, u32 fs, long *val) 194*dd63353aSNuno Sá { 195*dd63353aSNuno Sá unsigned int __raw; 196*dd63353aSNuno Sá int ret; 197*dd63353aSNuno Sá 198*dd63353aSNuno Sá ret = regmap_read(st->map, reg, &__raw); 199*dd63353aSNuno Sá if (ret) 200*dd63353aSNuno Sá return ret; 201*dd63353aSNuno Sá 202*dd63353aSNuno Sá *val = DIV_ROUND_CLOSEST(__raw * fs, BIT(16)); 203*dd63353aSNuno Sá return 0; 204*dd63353aSNuno Sá } 205*dd63353aSNuno Sá 206*dd63353aSNuno Sá static int ltc4283_read_voltage_byte(const struct ltc4283_hwmon *st, 207*dd63353aSNuno Sá u32 reg, u32 fs, long *val) 208*dd63353aSNuno Sá { 209*dd63353aSNuno Sá int ret; 210*dd63353aSNuno Sá u32 in; 211*dd63353aSNuno Sá 212*dd63353aSNuno Sá ret = regmap_read(st->map, reg, &in); 213*dd63353aSNuno Sá if (ret) 214*dd63353aSNuno Sá return ret; 215*dd63353aSNuno Sá 216*dd63353aSNuno Sá *val = DIV_ROUND_CLOSEST(in * fs, BIT(8)); 217*dd63353aSNuno Sá return 0; 218*dd63353aSNuno Sá } 219*dd63353aSNuno Sá 220*dd63353aSNuno Sá static u32 ltc4283_in_reg(u32 attr, u32 channel) 221*dd63353aSNuno Sá { 222*dd63353aSNuno Sá switch (attr) { 223*dd63353aSNuno Sá case hwmon_in_input: 224*dd63353aSNuno Sá if (channel == LTC4283_CHAN_VPWR) 225*dd63353aSNuno Sá return LTC4283_VPWR; 226*dd63353aSNuno Sá if (channel >= LTC4283_CHAN_ADI_1 && channel <= LTC4283_CHAN_DRAIN) 227*dd63353aSNuno Sá return LTC4283_ADC_2(channel - LTC4283_CHAN_ADI_1); 228*dd63353aSNuno Sá return LTC4283_ADC_2_DIFF(channel - LTC4283_CHAN_ADIN12); 229*dd63353aSNuno Sá case hwmon_in_highest: 230*dd63353aSNuno Sá if (channel == LTC4283_CHAN_VPWR) 231*dd63353aSNuno Sá return LTC4283_VPWR_MAX; 232*dd63353aSNuno Sá if (channel >= LTC4283_CHAN_ADI_1 && channel <= LTC4283_CHAN_DRAIN) 233*dd63353aSNuno Sá return LTC4283_ADC_2_MAX(channel - LTC4283_CHAN_ADI_1); 234*dd63353aSNuno Sá return LTC4283_ADC_2_MAX_DIFF(channel - LTC4283_CHAN_ADIN12); 235*dd63353aSNuno Sá case hwmon_in_lowest: 236*dd63353aSNuno Sá if (channel == LTC4283_CHAN_VPWR) 237*dd63353aSNuno Sá return LTC4283_VPWR_MIN; 238*dd63353aSNuno Sá if (channel >= LTC4283_CHAN_ADI_1 && channel <= LTC4283_CHAN_DRAIN) 239*dd63353aSNuno Sá return LTC4283_ADC_2_MIN(channel - LTC4283_CHAN_ADI_1); 240*dd63353aSNuno Sá return LTC4283_ADC_2_MIN_DIFF(channel - LTC4283_CHAN_ADIN12); 241*dd63353aSNuno Sá case hwmon_in_max: 242*dd63353aSNuno Sá if (channel == LTC4283_CHAN_VPWR) 243*dd63353aSNuno Sá return LTC4283_VPWR_MAX_TH; 244*dd63353aSNuno Sá if (channel >= LTC4283_CHAN_ADI_1 && channel <= LTC4283_CHAN_DRAIN) 245*dd63353aSNuno Sá return LTC4283_ADC_2_MAX_TH(channel - LTC4283_CHAN_ADI_1); 246*dd63353aSNuno Sá return LTC4283_ADC_2_MAX_TH_DIFF(channel - LTC4283_CHAN_ADIN12); 247*dd63353aSNuno Sá default: 248*dd63353aSNuno Sá if (channel == LTC4283_CHAN_VPWR) 249*dd63353aSNuno Sá return LTC4283_VPWR_MIN_TH; 250*dd63353aSNuno Sá if (channel >= LTC4283_CHAN_ADI_1 && channel <= LTC4283_CHAN_DRAIN) 251*dd63353aSNuno Sá return LTC4283_ADC_2_MIN_TH(channel - LTC4283_CHAN_ADI_1); 252*dd63353aSNuno Sá return LTC4283_ADC_2_MIN_TH_DIFF(channel - LTC4283_CHAN_ADIN12); 253*dd63353aSNuno Sá } 254*dd63353aSNuno Sá } 255*dd63353aSNuno Sá 256*dd63353aSNuno Sá static int ltc4283_read_in_vals(const struct ltc4283_hwmon *st, 257*dd63353aSNuno Sá u32 attr, u32 channel, long *val) 258*dd63353aSNuno Sá { 259*dd63353aSNuno Sá u32 reg = ltc4283_in_reg(attr, channel); 260*dd63353aSNuno Sá int ret; 261*dd63353aSNuno Sá 262*dd63353aSNuno Sá if (channel < LTC4283_CHAN_ADIN12) { 263*dd63353aSNuno Sá if (attr != hwmon_in_max && attr != hwmon_in_min) 264*dd63353aSNuno Sá return ltc4283_read_voltage_word(st, reg, 265*dd63353aSNuno Sá LTC4283_ADC2_FS_mV, 266*dd63353aSNuno Sá val); 267*dd63353aSNuno Sá 268*dd63353aSNuno Sá return ltc4283_read_voltage_byte(st, reg, 269*dd63353aSNuno Sá LTC4283_ADC2_FS_mV, val); 270*dd63353aSNuno Sá } 271*dd63353aSNuno Sá 272*dd63353aSNuno Sá if (attr != hwmon_in_max && attr != hwmon_in_min) 273*dd63353aSNuno Sá ret = ltc4283_read_voltage_word(st, reg, 274*dd63353aSNuno Sá LTC4283_ADC1_FS_uV, val); 275*dd63353aSNuno Sá else 276*dd63353aSNuno Sá ret = ltc4283_read_voltage_byte(st, reg, 277*dd63353aSNuno Sá LTC4283_ADC1_FS_uV, val); 278*dd63353aSNuno Sá if (ret) 279*dd63353aSNuno Sá return ret; 280*dd63353aSNuno Sá 281*dd63353aSNuno Sá *val = DIV_ROUND_CLOSEST(*val, MILLI); 282*dd63353aSNuno Sá return 0; 283*dd63353aSNuno Sá } 284*dd63353aSNuno Sá 285*dd63353aSNuno Sá static int ltc4283_read_alarm(struct ltc4283_hwmon *st, u32 reg, 286*dd63353aSNuno Sá u32 mask, long *val) 287*dd63353aSNuno Sá { 288*dd63353aSNuno Sá u32 alarm; 289*dd63353aSNuno Sá int ret; 290*dd63353aSNuno Sá 291*dd63353aSNuno Sá ret = regmap_read(st->map, reg, &alarm); 292*dd63353aSNuno Sá if (ret) 293*dd63353aSNuno Sá return ret; 294*dd63353aSNuno Sá 295*dd63353aSNuno Sá *val = !!(alarm & mask); 296*dd63353aSNuno Sá 297*dd63353aSNuno Sá /* If not status/fault logs, clear the alarm after reading it. */ 298*dd63353aSNuno Sá if (reg != LTC4283_FAULT_STATUS && reg != LTC4283_FAULT_LOG) 299*dd63353aSNuno Sá return regmap_write(st->map, reg, alarm & ~mask); 300*dd63353aSNuno Sá 301*dd63353aSNuno Sá return 0; 302*dd63353aSNuno Sá } 303*dd63353aSNuno Sá 304*dd63353aSNuno Sá static int ltc4283_read_in_alarm(struct ltc4283_hwmon *st, u32 channel, 305*dd63353aSNuno Sá bool max_alm, long *val) 306*dd63353aSNuno Sá { 307*dd63353aSNuno Sá if (channel == LTC4283_CHAN_VPWR) 308*dd63353aSNuno Sá return ltc4283_read_alarm(st, LTC4283_ADC_ALM_LOG_1, 309*dd63353aSNuno Sá BIT(2 + max_alm), val); 310*dd63353aSNuno Sá 311*dd63353aSNuno Sá if (channel >= LTC4283_CHAN_ADI_1 && channel <= LTC4283_CHAN_ADI_4) { 312*dd63353aSNuno Sá u32 bit = (channel - LTC4283_CHAN_ADI_1) * 2; 313*dd63353aSNuno Sá /* 314*dd63353aSNuno Sá * Lower channels go to higher bits. We also want to go +1 down 315*dd63353aSNuno Sá * in the min_alarm case. 316*dd63353aSNuno Sá */ 317*dd63353aSNuno Sá return ltc4283_read_alarm(st, LTC4283_ADC_ALM_LOG_2, 318*dd63353aSNuno Sá BIT(7 - bit - !max_alm), val); 319*dd63353aSNuno Sá } 320*dd63353aSNuno Sá 321*dd63353aSNuno Sá if (channel >= LTC4283_CHAN_ADIO_1 && channel <= LTC4283_CHAN_ADIO_4) { 322*dd63353aSNuno Sá u32 bit = (channel - LTC4283_CHAN_ADIO_1) * 2; 323*dd63353aSNuno Sá 324*dd63353aSNuno Sá return ltc4283_read_alarm(st, LTC4283_ADC_ALM_LOG_3, 325*dd63353aSNuno Sá BIT(7 - bit - !max_alm), val); 326*dd63353aSNuno Sá } 327*dd63353aSNuno Sá 328*dd63353aSNuno Sá if (channel >= LTC4283_CHAN_ADIN12 && channel <= LTC4283_CHAN_ADIO34) { 329*dd63353aSNuno Sá u32 bit = (channel - LTC4283_CHAN_ADIN12) * 2; 330*dd63353aSNuno Sá 331*dd63353aSNuno Sá return ltc4283_read_alarm(st, LTC4283_ADC_ALM_LOG_5, 332*dd63353aSNuno Sá BIT(7 - bit - !max_alm), val); 333*dd63353aSNuno Sá } 334*dd63353aSNuno Sá 335*dd63353aSNuno Sá if (channel == LTC4283_CHAN_DRNS) 336*dd63353aSNuno Sá return ltc4283_read_alarm(st, LTC4283_ADC_ALM_LOG_4, 337*dd63353aSNuno Sá BIT(6 + max_alm), val); 338*dd63353aSNuno Sá 339*dd63353aSNuno Sá return ltc4283_read_alarm(st, LTC4283_ADC_ALM_LOG_4, BIT(4 + max_alm), 340*dd63353aSNuno Sá val); 341*dd63353aSNuno Sá } 342*dd63353aSNuno Sá 343*dd63353aSNuno Sá static int ltc4283_read_in(struct ltc4283_hwmon *st, u32 attr, u32 channel, 344*dd63353aSNuno Sá long *val) 345*dd63353aSNuno Sá { 346*dd63353aSNuno Sá switch (attr) { 347*dd63353aSNuno Sá case hwmon_in_input: 348*dd63353aSNuno Sá if (!test_bit(channel, &st->ch_enable_mask)) 349*dd63353aSNuno Sá return -ENODATA; 350*dd63353aSNuno Sá 351*dd63353aSNuno Sá return ltc4283_read_in_vals(st, attr, channel, val); 352*dd63353aSNuno Sá case hwmon_in_highest: 353*dd63353aSNuno Sá case hwmon_in_lowest: 354*dd63353aSNuno Sá case hwmon_in_max: 355*dd63353aSNuno Sá case hwmon_in_min: 356*dd63353aSNuno Sá return ltc4283_read_in_vals(st, attr, channel, val); 357*dd63353aSNuno Sá case hwmon_in_max_alarm: 358*dd63353aSNuno Sá return ltc4283_read_in_alarm(st, channel, true, val); 359*dd63353aSNuno Sá case hwmon_in_min_alarm: 360*dd63353aSNuno Sá return ltc4283_read_in_alarm(st, channel, false, val); 361*dd63353aSNuno Sá case hwmon_in_crit_alarm: 362*dd63353aSNuno Sá return ltc4283_read_alarm(st, LTC4283_FAULT_STATUS, 363*dd63353aSNuno Sá LTC4283_OV_MASK, val); 364*dd63353aSNuno Sá case hwmon_in_lcrit_alarm: 365*dd63353aSNuno Sá return ltc4283_read_alarm(st, LTC4283_FAULT_STATUS, 366*dd63353aSNuno Sá LTC4283_UV_MASK, val); 367*dd63353aSNuno Sá case hwmon_in_fault: 368*dd63353aSNuno Sá /* 369*dd63353aSNuno Sá * We report failure if we detect either a fer_bad or a 370*dd63353aSNuno Sá * fet_short in the status register. 371*dd63353aSNuno Sá */ 372*dd63353aSNuno Sá return ltc4283_read_alarm(st, LTC4283_FAULT_STATUS, 373*dd63353aSNuno Sá LTC4283_FET_BAD_MASK | LTC4283_FET_SHORT_MASK, val); 374*dd63353aSNuno Sá case hwmon_in_enable: 375*dd63353aSNuno Sá *val = test_bit(channel, &st->ch_enable_mask); 376*dd63353aSNuno Sá return 0; 377*dd63353aSNuno Sá default: 378*dd63353aSNuno Sá return -EOPNOTSUPP; 379*dd63353aSNuno Sá } 380*dd63353aSNuno Sá return 0; 381*dd63353aSNuno Sá } 382*dd63353aSNuno Sá 383*dd63353aSNuno Sá static int ltc4283_read_current_word(const struct ltc4283_hwmon *st, u32 reg, 384*dd63353aSNuno Sá long *val) 385*dd63353aSNuno Sá { 386*dd63353aSNuno Sá u64 temp = (u64)LTC4283_ADC1_FS_uV * DECA * MILLI; 387*dd63353aSNuno Sá unsigned int __raw; 388*dd63353aSNuno Sá int ret; 389*dd63353aSNuno Sá 390*dd63353aSNuno Sá ret = regmap_read(st->map, reg, &__raw); 391*dd63353aSNuno Sá if (ret) 392*dd63353aSNuno Sá return ret; 393*dd63353aSNuno Sá 394*dd63353aSNuno Sá *val = DIV64_U64_ROUND_CLOSEST(__raw * temp, 395*dd63353aSNuno Sá BIT_ULL(16) * st->rsense); 396*dd63353aSNuno Sá 397*dd63353aSNuno Sá return 0; 398*dd63353aSNuno Sá } 399*dd63353aSNuno Sá 400*dd63353aSNuno Sá static int ltc4283_read_current_byte(const struct ltc4283_hwmon *st, u32 reg, 401*dd63353aSNuno Sá long *val) 402*dd63353aSNuno Sá { 403*dd63353aSNuno Sá u64 temp = (u64)LTC4283_ADC1_FS_uV * DECA * MILLI; 404*dd63353aSNuno Sá u32 curr; 405*dd63353aSNuno Sá int ret; 406*dd63353aSNuno Sá 407*dd63353aSNuno Sá ret = regmap_read(st->map, reg, &curr); 408*dd63353aSNuno Sá if (ret) 409*dd63353aSNuno Sá return ret; 410*dd63353aSNuno Sá 411*dd63353aSNuno Sá *val = DIV_ROUND_CLOSEST_ULL(curr * temp, BIT(8) * st->rsense); 412*dd63353aSNuno Sá return 0; 413*dd63353aSNuno Sá } 414*dd63353aSNuno Sá 415*dd63353aSNuno Sá static int ltc4283_read_curr(struct ltc4283_hwmon *st, u32 attr, long *val) 416*dd63353aSNuno Sá { 417*dd63353aSNuno Sá switch (attr) { 418*dd63353aSNuno Sá case hwmon_curr_input: 419*dd63353aSNuno Sá return ltc4283_read_current_word(st, LTC4283_SENSE, val); 420*dd63353aSNuno Sá case hwmon_curr_highest: 421*dd63353aSNuno Sá return ltc4283_read_current_word(st, LTC4283_SENSE_MAX, val); 422*dd63353aSNuno Sá case hwmon_curr_lowest: 423*dd63353aSNuno Sá return ltc4283_read_current_word(st, LTC4283_SENSE_MIN, val); 424*dd63353aSNuno Sá case hwmon_curr_max: 425*dd63353aSNuno Sá return ltc4283_read_current_byte(st, LTC4283_SENSE_MAX_TH, val); 426*dd63353aSNuno Sá case hwmon_curr_min: 427*dd63353aSNuno Sá return ltc4283_read_current_byte(st, LTC4283_SENSE_MIN_TH, val); 428*dd63353aSNuno Sá case hwmon_curr_max_alarm: 429*dd63353aSNuno Sá return ltc4283_read_alarm(st, LTC4283_ADC_ALM_LOG_1, 430*dd63353aSNuno Sá LTC4283_SENSE_HIGH_ALM, val); 431*dd63353aSNuno Sá case hwmon_curr_min_alarm: 432*dd63353aSNuno Sá return ltc4283_read_alarm(st, LTC4283_ADC_ALM_LOG_1, 433*dd63353aSNuno Sá LTC4283_SENSE_LOW_ALM, val); 434*dd63353aSNuno Sá case hwmon_curr_crit_alarm: 435*dd63353aSNuno Sá return ltc4283_read_alarm(st, LTC4283_FAULT_STATUS, 436*dd63353aSNuno Sá LTC4283_OC_MASK, val); 437*dd63353aSNuno Sá default: 438*dd63353aSNuno Sá return -EOPNOTSUPP; 439*dd63353aSNuno Sá } 440*dd63353aSNuno Sá } 441*dd63353aSNuno Sá 442*dd63353aSNuno Sá static int ltc4283_read_power_word(const struct ltc4283_hwmon *st, 443*dd63353aSNuno Sá u32 reg, long *val) 444*dd63353aSNuno Sá { 445*dd63353aSNuno Sá u64 temp = (u64)LTC4283_ADC1_FS_uV * LTC4283_ADC2_FS_mV * DECA * MILLI; 446*dd63353aSNuno Sá unsigned int __raw; 447*dd63353aSNuno Sá int ret; 448*dd63353aSNuno Sá 449*dd63353aSNuno Sá ret = regmap_read(st->map, reg, &__raw); 450*dd63353aSNuno Sá if (ret) 451*dd63353aSNuno Sá return ret; 452*dd63353aSNuno Sá 453*dd63353aSNuno Sá /* 454*dd63353aSNuno Sá * Power is given by: 455*dd63353aSNuno Sá * P = CODE(16b) * 32.768mV * 2.048V / (2^16 * Rsense) 456*dd63353aSNuno Sá */ 457*dd63353aSNuno Sá *val = DIV64_U64_ROUND_CLOSEST(temp * __raw, BIT_ULL(16) * st->rsense); 458*dd63353aSNuno Sá 459*dd63353aSNuno Sá return 0; 460*dd63353aSNuno Sá } 461*dd63353aSNuno Sá 462*dd63353aSNuno Sá static int ltc4283_read_power_byte(const struct ltc4283_hwmon *st, 463*dd63353aSNuno Sá u32 reg, long *val) 464*dd63353aSNuno Sá { 465*dd63353aSNuno Sá u64 temp = (u64)LTC4283_ADC1_FS_uV * LTC4283_ADC2_FS_mV * DECA * MILLI; 466*dd63353aSNuno Sá u32 power; 467*dd63353aSNuno Sá int ret; 468*dd63353aSNuno Sá 469*dd63353aSNuno Sá ret = regmap_read(st->map, reg, &power); 470*dd63353aSNuno Sá if (ret) 471*dd63353aSNuno Sá return ret; 472*dd63353aSNuno Sá 473*dd63353aSNuno Sá *val = DIV_ROUND_CLOSEST_ULL(power * temp, BIT(8) * st->rsense); 474*dd63353aSNuno Sá 475*dd63353aSNuno Sá return 0; 476*dd63353aSNuno Sá } 477*dd63353aSNuno Sá 478*dd63353aSNuno Sá static int ltc4283_read_power(struct ltc4283_hwmon *st, u32 attr, long *val) 479*dd63353aSNuno Sá { 480*dd63353aSNuno Sá switch (attr) { 481*dd63353aSNuno Sá case hwmon_power_input: 482*dd63353aSNuno Sá return ltc4283_read_power_word(st, LTC4283_POWER, val); 483*dd63353aSNuno Sá case hwmon_power_input_highest: 484*dd63353aSNuno Sá return ltc4283_read_power_word(st, LTC4283_POWER_MAX, val); 485*dd63353aSNuno Sá case hwmon_power_input_lowest: 486*dd63353aSNuno Sá return ltc4283_read_power_word(st, LTC4283_POWER_MIN, val); 487*dd63353aSNuno Sá case hwmon_power_max_alarm: 488*dd63353aSNuno Sá return ltc4283_read_alarm(st, LTC4283_ADC_ALM_LOG_1, 489*dd63353aSNuno Sá LTC4283_POWER_HIGH_ALM, val); 490*dd63353aSNuno Sá case hwmon_power_min_alarm: 491*dd63353aSNuno Sá return ltc4283_read_alarm(st, LTC4283_ADC_ALM_LOG_1, 492*dd63353aSNuno Sá LTC4283_POWER_LOW_ALM, val); 493*dd63353aSNuno Sá case hwmon_power_max: 494*dd63353aSNuno Sá return ltc4283_read_power_byte(st, LTC4283_POWER_MAX_TH, val); 495*dd63353aSNuno Sá case hwmon_power_min: 496*dd63353aSNuno Sá return ltc4283_read_power_byte(st, LTC4283_POWER_MIN_TH, val); 497*dd63353aSNuno Sá default: 498*dd63353aSNuno Sá return -EOPNOTSUPP; 499*dd63353aSNuno Sá } 500*dd63353aSNuno Sá } 501*dd63353aSNuno Sá 502*dd63353aSNuno Sá static int ltc4283_read_energy(struct ltc4283_hwmon *st, u32 attr, s64 *val) 503*dd63353aSNuno Sá { 504*dd63353aSNuno Sá u64 temp = LTC4283_ADC1_FS_uV * LTC4283_ADC2_FS_mV, energy; 505*dd63353aSNuno Sá u8 raw[8] = {}; 506*dd63353aSNuno Sá int ret; 507*dd63353aSNuno Sá 508*dd63353aSNuno Sá if (!st->energy_en) 509*dd63353aSNuno Sá return -ENODATA; 510*dd63353aSNuno Sá 511*dd63353aSNuno Sá ret = i2c_smbus_read_i2c_block_data(st->client, LTC4283_ENERGY, 6, raw); 512*dd63353aSNuno Sá if (ret < 0) 513*dd63353aSNuno Sá return ret; 514*dd63353aSNuno Sá if (ret != 6) 515*dd63353aSNuno Sá return -EIO; 516*dd63353aSNuno Sá 517*dd63353aSNuno Sá energy = get_unaligned_be64(raw) >> 16; 518*dd63353aSNuno Sá 519*dd63353aSNuno Sá /* 520*dd63353aSNuno Sá * The formula for energy is given by: 521*dd63353aSNuno Sá * E = CODE(48b) * 32.768mV * 2.048V * Tconv / 2^24 * Rsense 522*dd63353aSNuno Sá * 523*dd63353aSNuno Sá * As Rsense can have tenths of micro-ohm resolution, we need to 524*dd63353aSNuno Sá * multiply by DECA to get microjoule. 525*dd63353aSNuno Sá */ 526*dd63353aSNuno Sá 527*dd63353aSNuno Sá /* 528*dd63353aSNuno Sá * Use mul_u64_u64_div_u64() to handle the 128-bit intermediate 529*dd63353aSNuno Sá * product of energy (up to 48 bits) * temp * Tconv without overflow. 530*dd63353aSNuno Sá * Multiply rsense by CENTI to convert from tenths-of-microohm back 531*dd63353aSNuno Sá * to nanoohm so the result comes out in microjoule. 532*dd63353aSNuno Sá */ 533*dd63353aSNuno Sá energy = mul_u64_u64_div_u64(energy, temp * LTC4283_TCONV_uS, 534*dd63353aSNuno Sá BIT_ULL(24) * st->rsense * CENTI); 535*dd63353aSNuno Sá 536*dd63353aSNuno Sá *val = energy; 537*dd63353aSNuno Sá return 0; 538*dd63353aSNuno Sá } 539*dd63353aSNuno Sá 540*dd63353aSNuno Sá static int ltc4283_read(struct device *dev, enum hwmon_sensor_types type, 541*dd63353aSNuno Sá u32 attr, int channel, long *val) 542*dd63353aSNuno Sá { 543*dd63353aSNuno Sá struct ltc4283_hwmon *st = dev_get_drvdata(dev); 544*dd63353aSNuno Sá 545*dd63353aSNuno Sá switch (type) { 546*dd63353aSNuno Sá case hwmon_in: 547*dd63353aSNuno Sá return ltc4283_read_in(st, attr, channel, val); 548*dd63353aSNuno Sá case hwmon_curr: 549*dd63353aSNuno Sá return ltc4283_read_curr(st, attr, val); 550*dd63353aSNuno Sá case hwmon_power: 551*dd63353aSNuno Sá return ltc4283_read_power(st, attr, val); 552*dd63353aSNuno Sá case hwmon_energy: 553*dd63353aSNuno Sá *val = st->energy_en; 554*dd63353aSNuno Sá return 0; 555*dd63353aSNuno Sá case hwmon_energy64: 556*dd63353aSNuno Sá return ltc4283_read_energy(st, attr, (s64 *)val); 557*dd63353aSNuno Sá default: 558*dd63353aSNuno Sá return -EOPNOTSUPP; 559*dd63353aSNuno Sá } 560*dd63353aSNuno Sá } 561*dd63353aSNuno Sá 562*dd63353aSNuno Sá static int ltc4283_write_power_byte(const struct ltc4283_hwmon *st, u32 reg, 563*dd63353aSNuno Sá long val) 564*dd63353aSNuno Sá { 565*dd63353aSNuno Sá u64 temp = (u64)LTC4283_ADC1_FS_uV * LTC4283_ADC2_FS_mV * DECA * MILLI; 566*dd63353aSNuno Sá u32 __raw; 567*dd63353aSNuno Sá 568*dd63353aSNuno Sá val = clamp_val(val, 0, st->power_max); 569*dd63353aSNuno Sá __raw = DIV64_U64_ROUND_CLOSEST(val * BIT_ULL(8) * st->rsense, temp); 570*dd63353aSNuno Sá 571*dd63353aSNuno Sá return regmap_write(st->map, reg, __raw); 572*dd63353aSNuno Sá } 573*dd63353aSNuno Sá 574*dd63353aSNuno Sá static int ltc4283_write_power_word(const struct ltc4283_hwmon *st, 575*dd63353aSNuno Sá u32 reg, unsigned long val) 576*dd63353aSNuno Sá { 577*dd63353aSNuno Sá u64 divisor = (u64)LTC4283_ADC1_FS_uV * LTC4283_ADC2_FS_mV * DECA * MILLI; 578*dd63353aSNuno Sá u16 __raw; 579*dd63353aSNuno Sá 580*dd63353aSNuno Sá __raw = mul_u64_u64_div_u64(val, st->rsense * BIT_ULL(16), divisor); 581*dd63353aSNuno Sá 582*dd63353aSNuno Sá return regmap_write(st->map, reg, __raw); 583*dd63353aSNuno Sá } 584*dd63353aSNuno Sá 585*dd63353aSNuno Sá static int ltc4283_reset_power_hist(struct ltc4283_hwmon *st) 586*dd63353aSNuno Sá { 587*dd63353aSNuno Sá int ret; 588*dd63353aSNuno Sá 589*dd63353aSNuno Sá ret = ltc4283_write_power_word(st, LTC4283_POWER_MIN, st->power_max); 590*dd63353aSNuno Sá if (ret) 591*dd63353aSNuno Sá return ret; 592*dd63353aSNuno Sá 593*dd63353aSNuno Sá ret = ltc4283_write_power_word(st, LTC4283_POWER_MAX, 0); 594*dd63353aSNuno Sá if (ret) 595*dd63353aSNuno Sá return ret; 596*dd63353aSNuno Sá 597*dd63353aSNuno Sá /* Clear possible power faults. */ 598*dd63353aSNuno Sá return regmap_clear_bits(st->map, LTC4283_FAULT_LOG, 599*dd63353aSNuno Sá LTC4283_PWR_FAIL_FAULT_MASK | LTC4283_PGI_FAULT_MASK); 600*dd63353aSNuno Sá } 601*dd63353aSNuno Sá 602*dd63353aSNuno Sá static int ltc4283_write_power(struct ltc4283_hwmon *st, u32 attr, long val) 603*dd63353aSNuno Sá { 604*dd63353aSNuno Sá switch (attr) { 605*dd63353aSNuno Sá case hwmon_power_max: 606*dd63353aSNuno Sá return ltc4283_write_power_byte(st, LTC4283_POWER_MAX_TH, val); 607*dd63353aSNuno Sá case hwmon_power_min: 608*dd63353aSNuno Sá return ltc4283_write_power_byte(st, LTC4283_POWER_MIN_TH, val); 609*dd63353aSNuno Sá case hwmon_power_reset_history: 610*dd63353aSNuno Sá return ltc4283_reset_power_hist(st); 611*dd63353aSNuno Sá default: 612*dd63353aSNuno Sá return -EOPNOTSUPP; 613*dd63353aSNuno Sá } 614*dd63353aSNuno Sá } 615*dd63353aSNuno Sá 616*dd63353aSNuno Sá static int ltc4283_write_in_history(struct ltc4283_hwmon *st, u32 reg, 617*dd63353aSNuno Sá long lowest, u32 fs) 618*dd63353aSNuno Sá { 619*dd63353aSNuno Sá u32 __raw; 620*dd63353aSNuno Sá int ret; 621*dd63353aSNuno Sá 622*dd63353aSNuno Sá __raw = DIV_ROUND_CLOSEST(BIT(16) * lowest, fs); 623*dd63353aSNuno Sá if (__raw == BIT(16)) 624*dd63353aSNuno Sá __raw = U16_MAX; 625*dd63353aSNuno Sá 626*dd63353aSNuno Sá ret = regmap_write(st->map, reg, __raw); 627*dd63353aSNuno Sá if (ret) 628*dd63353aSNuno Sá return ret; 629*dd63353aSNuno Sá 630*dd63353aSNuno Sá return regmap_write(st->map, reg + 1, 0); 631*dd63353aSNuno Sá } 632*dd63353aSNuno Sá 633*dd63353aSNuno Sá static int ltc4283_write_in_byte(const struct ltc4283_hwmon *st, 634*dd63353aSNuno Sá u32 reg, u32 fs, long val) 635*dd63353aSNuno Sá { 636*dd63353aSNuno Sá u32 __raw; 637*dd63353aSNuno Sá 638*dd63353aSNuno Sá val = clamp_val(val, 0, fs); 639*dd63353aSNuno Sá __raw = DIV_ROUND_CLOSEST(val * BIT(8), fs); 640*dd63353aSNuno Sá if (__raw == BIT(8)) 641*dd63353aSNuno Sá __raw = U8_MAX; 642*dd63353aSNuno Sá 643*dd63353aSNuno Sá return regmap_write(st->map, reg, __raw); 644*dd63353aSNuno Sá } 645*dd63353aSNuno Sá 646*dd63353aSNuno Sá static int ltc4283_reset_in_hist(struct ltc4283_hwmon *st, u32 channel) 647*dd63353aSNuno Sá { 648*dd63353aSNuno Sá u32 reg, fs; 649*dd63353aSNuno Sá int ret; 650*dd63353aSNuno Sá 651*dd63353aSNuno Sá /* 652*dd63353aSNuno Sá * Make sure to clear possible under/over voltage faults. Otherwise the 653*dd63353aSNuno Sá * chip won't latch on again. 654*dd63353aSNuno Sá */ 655*dd63353aSNuno Sá if (channel == LTC4283_CHAN_VIN) 656*dd63353aSNuno Sá return regmap_clear_bits(st->map, LTC4283_FAULT_LOG, 657*dd63353aSNuno Sá LTC4283_OV_FAULT_MASK | LTC4283_UV_FAULT_MASK); 658*dd63353aSNuno Sá 659*dd63353aSNuno Sá if (channel == LTC4283_CHAN_VPWR) 660*dd63353aSNuno Sá return ltc4283_write_in_history(st, LTC4283_VPWR_MIN, 661*dd63353aSNuno Sá LTC4283_ADC2_FS_mV, 662*dd63353aSNuno Sá LTC4283_ADC2_FS_mV); 663*dd63353aSNuno Sá 664*dd63353aSNuno Sá if (channel >= LTC4283_CHAN_ADI_1 && channel <= LTC4283_CHAN_DRAIN) { 665*dd63353aSNuno Sá fs = LTC4283_ADC2_FS_mV; 666*dd63353aSNuno Sá reg = LTC4283_ADC_2_MIN(channel - LTC4283_CHAN_ADI_1); 667*dd63353aSNuno Sá } else { 668*dd63353aSNuno Sá fs = LTC4283_ADC1_FS_uV; 669*dd63353aSNuno Sá reg = LTC4283_ADC_2_MIN_DIFF(channel - LTC4283_CHAN_ADIN12); 670*dd63353aSNuno Sá } 671*dd63353aSNuno Sá 672*dd63353aSNuno Sá ret = ltc4283_write_in_history(st, reg, fs, fs); 673*dd63353aSNuno Sá if (ret) 674*dd63353aSNuno Sá return ret; 675*dd63353aSNuno Sá if (channel != LTC4283_CHAN_DRAIN) 676*dd63353aSNuno Sá return 0; 677*dd63353aSNuno Sá 678*dd63353aSNuno Sá /* Then, let's also clear possible fet faults. Same as above. */ 679*dd63353aSNuno Sá return regmap_clear_bits(st->map, LTC4283_FAULT_LOG, 680*dd63353aSNuno Sá LTC4283_FET_BAD_FAULT_MASK | LTC4283_FET_SHORT_FAULT_MASK); 681*dd63353aSNuno Sá } 682*dd63353aSNuno Sá 683*dd63353aSNuno Sá static int ltc4283_write_in_en(struct ltc4283_hwmon *st, u32 channel, bool en) 684*dd63353aSNuno Sá { 685*dd63353aSNuno Sá unsigned int bit, adc_idx = channel - LTC4283_CHAN_ADI_1; 686*dd63353aSNuno Sá unsigned int reg = LTC4283_ADC_SELECT(adc_idx); 687*dd63353aSNuno Sá int ret; 688*dd63353aSNuno Sá 689*dd63353aSNuno Sá bit = LTC4283_ADC_SELECT_MASK(adc_idx); 690*dd63353aSNuno Sá if (channel > LTC4283_CHAN_DRAIN) 691*dd63353aSNuno Sá /* Account for two reserved fields after DRAIN. */ 692*dd63353aSNuno Sá bit <<= 2; 693*dd63353aSNuno Sá 694*dd63353aSNuno Sá if (en) 695*dd63353aSNuno Sá ret = regmap_set_bits(st->map, reg, bit); 696*dd63353aSNuno Sá else 697*dd63353aSNuno Sá ret = regmap_clear_bits(st->map, reg, bit); 698*dd63353aSNuno Sá if (ret) 699*dd63353aSNuno Sá return ret; 700*dd63353aSNuno Sá 701*dd63353aSNuno Sá __assign_bit(channel, &st->ch_enable_mask, en); 702*dd63353aSNuno Sá return 0; 703*dd63353aSNuno Sá } 704*dd63353aSNuno Sá 705*dd63353aSNuno Sá static int ltc4283_write_minmax(struct ltc4283_hwmon *st, long val, 706*dd63353aSNuno Sá u32 channel, bool is_max) 707*dd63353aSNuno Sá { 708*dd63353aSNuno Sá u32 reg; 709*dd63353aSNuno Sá 710*dd63353aSNuno Sá if (channel == LTC4283_CHAN_VPWR) { 711*dd63353aSNuno Sá if (is_max) 712*dd63353aSNuno Sá return ltc4283_write_in_byte(st, LTC4283_VPWR_MAX_TH, 713*dd63353aSNuno Sá LTC4283_ADC2_FS_mV, val); 714*dd63353aSNuno Sá 715*dd63353aSNuno Sá return ltc4283_write_in_byte(st, LTC4283_VPWR_MIN_TH, 716*dd63353aSNuno Sá LTC4283_ADC2_FS_mV, val); 717*dd63353aSNuno Sá } 718*dd63353aSNuno Sá 719*dd63353aSNuno Sá if (channel >= LTC4283_CHAN_ADI_1 && channel <= LTC4283_CHAN_DRAIN) { 720*dd63353aSNuno Sá if (is_max) { 721*dd63353aSNuno Sá reg = LTC4283_ADC_2_MAX_TH(channel - LTC4283_CHAN_ADI_1); 722*dd63353aSNuno Sá return ltc4283_write_in_byte(st, reg, 723*dd63353aSNuno Sá LTC4283_ADC2_FS_mV, val); 724*dd63353aSNuno Sá } 725*dd63353aSNuno Sá 726*dd63353aSNuno Sá reg = LTC4283_ADC_2_MIN_TH(channel - LTC4283_CHAN_ADI_1); 727*dd63353aSNuno Sá return ltc4283_write_in_byte(st, reg, LTC4283_ADC2_FS_mV, val); 728*dd63353aSNuno Sá } 729*dd63353aSNuno Sá 730*dd63353aSNuno Sá /* Clamp before multiplying to avoid overflow on any arch. */ 731*dd63353aSNuno Sá val = clamp_val(val, 0, LONG_MAX / MILLI); 732*dd63353aSNuno Sá 733*dd63353aSNuno Sá if (is_max) { 734*dd63353aSNuno Sá reg = LTC4283_ADC_2_MAX_TH_DIFF(channel - LTC4283_CHAN_ADIN12); 735*dd63353aSNuno Sá return ltc4283_write_in_byte(st, reg, LTC4283_ADC1_FS_uV, 736*dd63353aSNuno Sá val * MILLI); 737*dd63353aSNuno Sá } 738*dd63353aSNuno Sá 739*dd63353aSNuno Sá reg = LTC4283_ADC_2_MIN_TH_DIFF(channel - LTC4283_CHAN_ADIN12); 740*dd63353aSNuno Sá return ltc4283_write_in_byte(st, reg, LTC4283_ADC1_FS_uV, val * MILLI); 741*dd63353aSNuno Sá } 742*dd63353aSNuno Sá 743*dd63353aSNuno Sá static int ltc4283_write_in(struct ltc4283_hwmon *st, u32 attr, long val, 744*dd63353aSNuno Sá int channel) 745*dd63353aSNuno Sá { 746*dd63353aSNuno Sá switch (attr) { 747*dd63353aSNuno Sá case hwmon_in_max: 748*dd63353aSNuno Sá return ltc4283_write_minmax(st, val, channel, true); 749*dd63353aSNuno Sá case hwmon_in_min: 750*dd63353aSNuno Sá return ltc4283_write_minmax(st, val, channel, false); 751*dd63353aSNuno Sá case hwmon_in_reset_history: 752*dd63353aSNuno Sá return ltc4283_reset_in_hist(st, channel); 753*dd63353aSNuno Sá case hwmon_in_enable: 754*dd63353aSNuno Sá return ltc4283_write_in_en(st, channel, !!val); 755*dd63353aSNuno Sá default: 756*dd63353aSNuno Sá return -EOPNOTSUPP; 757*dd63353aSNuno Sá } 758*dd63353aSNuno Sá } 759*dd63353aSNuno Sá 760*dd63353aSNuno Sá static int ltc4283_write_curr_byte(const struct ltc4283_hwmon *st, 761*dd63353aSNuno Sá u32 reg, long val) 762*dd63353aSNuno Sá { 763*dd63353aSNuno Sá u32 temp = LTC4283_ADC1_FS_uV * DECA * MILLI; 764*dd63353aSNuno Sá u32 reg_val, isense_max; 765*dd63353aSNuno Sá 766*dd63353aSNuno Sá isense_max = DIV_ROUND_CLOSEST(st->vsense_max * MICRO * DECA, st->rsense); 767*dd63353aSNuno Sá val = clamp_val(val, 0, isense_max); 768*dd63353aSNuno Sá reg_val = DIV_ROUND_CLOSEST_ULL(val * BIT_ULL(8) * st->rsense, temp); 769*dd63353aSNuno Sá 770*dd63353aSNuno Sá return regmap_write(st->map, reg, reg_val); 771*dd63353aSNuno Sá } 772*dd63353aSNuno Sá 773*dd63353aSNuno Sá static int ltc4283_write_curr_history(struct ltc4283_hwmon *st) 774*dd63353aSNuno Sá { 775*dd63353aSNuno Sá int ret; 776*dd63353aSNuno Sá 777*dd63353aSNuno Sá ret = ltc4283_write_in_history(st, LTC4283_SENSE_MIN, 778*dd63353aSNuno Sá st->vsense_max * MILLI, 779*dd63353aSNuno Sá LTC4283_ADC1_FS_uV); 780*dd63353aSNuno Sá if (ret) 781*dd63353aSNuno Sá return ret; 782*dd63353aSNuno Sá 783*dd63353aSNuno Sá /* Now, let's also clear possible overcurrent logs. */ 784*dd63353aSNuno Sá return regmap_clear_bits(st->map, LTC4283_FAULT_LOG, 785*dd63353aSNuno Sá LTC4283_OC_FAULT_MASK); 786*dd63353aSNuno Sá } 787*dd63353aSNuno Sá 788*dd63353aSNuno Sá static int ltc4283_write_curr(struct ltc4283_hwmon *st, u32 attr, long val) 789*dd63353aSNuno Sá { 790*dd63353aSNuno Sá switch (attr) { 791*dd63353aSNuno Sá case hwmon_curr_max: 792*dd63353aSNuno Sá return ltc4283_write_curr_byte(st, LTC4283_SENSE_MAX_TH, val); 793*dd63353aSNuno Sá case hwmon_curr_min: 794*dd63353aSNuno Sá return ltc4283_write_curr_byte(st, LTC4283_SENSE_MIN_TH, val); 795*dd63353aSNuno Sá case hwmon_curr_reset_history: 796*dd63353aSNuno Sá return ltc4283_write_curr_history(st); 797*dd63353aSNuno Sá default: 798*dd63353aSNuno Sá return -EOPNOTSUPP; 799*dd63353aSNuno Sá } 800*dd63353aSNuno Sá } 801*dd63353aSNuno Sá 802*dd63353aSNuno Sá static int ltc4283_energy_enable_set(struct ltc4283_hwmon *st, long val) 803*dd63353aSNuno Sá { 804*dd63353aSNuno Sá int ret; 805*dd63353aSNuno Sá 806*dd63353aSNuno Sá /* Setting the bit halts the meter. */ 807*dd63353aSNuno Sá val = !!val; 808*dd63353aSNuno Sá ret = regmap_update_bits(st->map, LTC4283_METER_CONTROL, 809*dd63353aSNuno Sá LTC4283_METER_HALT_MASK, 810*dd63353aSNuno Sá FIELD_PREP(LTC4283_METER_HALT_MASK, !val)); 811*dd63353aSNuno Sá if (ret) 812*dd63353aSNuno Sá return ret; 813*dd63353aSNuno Sá 814*dd63353aSNuno Sá st->energy_en = val; 815*dd63353aSNuno Sá 816*dd63353aSNuno Sá return 0; 817*dd63353aSNuno Sá } 818*dd63353aSNuno Sá 819*dd63353aSNuno Sá static int ltc4283_write(struct device *dev, enum hwmon_sensor_types type, 820*dd63353aSNuno Sá u32 attr, int channel, long val) 821*dd63353aSNuno Sá { 822*dd63353aSNuno Sá struct ltc4283_hwmon *st = dev_get_drvdata(dev); 823*dd63353aSNuno Sá 824*dd63353aSNuno Sá switch (type) { 825*dd63353aSNuno Sá case hwmon_power: 826*dd63353aSNuno Sá return ltc4283_write_power(st, attr, val); 827*dd63353aSNuno Sá case hwmon_in: 828*dd63353aSNuno Sá return ltc4283_write_in(st, attr, val, channel); 829*dd63353aSNuno Sá case hwmon_curr: 830*dd63353aSNuno Sá return ltc4283_write_curr(st, attr, val); 831*dd63353aSNuno Sá case hwmon_energy: 832*dd63353aSNuno Sá return ltc4283_energy_enable_set(st, val); 833*dd63353aSNuno Sá default: 834*dd63353aSNuno Sá return -EOPNOTSUPP; 835*dd63353aSNuno Sá } 836*dd63353aSNuno Sá } 837*dd63353aSNuno Sá 838*dd63353aSNuno Sá static umode_t ltc4283_in_is_visible(const struct ltc4283_hwmon *st, 839*dd63353aSNuno Sá u32 attr, int channel) 840*dd63353aSNuno Sá { 841*dd63353aSNuno Sá /* If ADIO is set as a GPIO, don´t make it visible. */ 842*dd63353aSNuno Sá if (channel >= LTC4283_CHAN_ADIO_1 && channel <= LTC4283_CHAN_ADIO_4) { 843*dd63353aSNuno Sá /* ADIOX pins come at index 0 in the gpio mask. */ 844*dd63353aSNuno Sá channel -= LTC4283_CHAN_ADIO_1; 845*dd63353aSNuno Sá if (test_bit(channel, &st->gpio_mask)) 846*dd63353aSNuno Sá return 0; 847*dd63353aSNuno Sá } 848*dd63353aSNuno Sá 849*dd63353aSNuno Sá /* Also take care of differential channels. */ 850*dd63353aSNuno Sá if (channel >= LTC4283_CHAN_ADIO12 && channel <= LTC4283_CHAN_ADIO34) { 851*dd63353aSNuno Sá channel -= LTC4283_CHAN_ADIO12; 852*dd63353aSNuno Sá /* If one channel in the pair is used, make it invisible. */ 853*dd63353aSNuno Sá if (test_bit(channel * 2, &st->gpio_mask) || 854*dd63353aSNuno Sá test_bit(channel * 2 + 1, &st->gpio_mask)) 855*dd63353aSNuno Sá return 0; 856*dd63353aSNuno Sá } 857*dd63353aSNuno Sá 858*dd63353aSNuno Sá switch (attr) { 859*dd63353aSNuno Sá case hwmon_in_input: 860*dd63353aSNuno Sá case hwmon_in_highest: 861*dd63353aSNuno Sá case hwmon_in_lowest: 862*dd63353aSNuno Sá case hwmon_in_max_alarm: 863*dd63353aSNuno Sá case hwmon_in_min_alarm: 864*dd63353aSNuno Sá case hwmon_in_label: 865*dd63353aSNuno Sá case hwmon_in_lcrit_alarm: 866*dd63353aSNuno Sá case hwmon_in_crit_alarm: 867*dd63353aSNuno Sá case hwmon_in_fault: 868*dd63353aSNuno Sá return 0444; 869*dd63353aSNuno Sá case hwmon_in_max: 870*dd63353aSNuno Sá case hwmon_in_min: 871*dd63353aSNuno Sá case hwmon_in_enable: 872*dd63353aSNuno Sá return 0644; 873*dd63353aSNuno Sá case hwmon_in_reset_history: 874*dd63353aSNuno Sá return 0200; 875*dd63353aSNuno Sá default: 876*dd63353aSNuno Sá return 0; 877*dd63353aSNuno Sá } 878*dd63353aSNuno Sá } 879*dd63353aSNuno Sá 880*dd63353aSNuno Sá static umode_t ltc4283_curr_is_visible(u32 attr) 881*dd63353aSNuno Sá { 882*dd63353aSNuno Sá switch (attr) { 883*dd63353aSNuno Sá case hwmon_curr_input: 884*dd63353aSNuno Sá case hwmon_curr_highest: 885*dd63353aSNuno Sá case hwmon_curr_lowest: 886*dd63353aSNuno Sá case hwmon_curr_max_alarm: 887*dd63353aSNuno Sá case hwmon_curr_min_alarm: 888*dd63353aSNuno Sá case hwmon_curr_crit_alarm: 889*dd63353aSNuno Sá case hwmon_curr_label: 890*dd63353aSNuno Sá return 0444; 891*dd63353aSNuno Sá case hwmon_curr_max: 892*dd63353aSNuno Sá case hwmon_curr_min: 893*dd63353aSNuno Sá return 0644; 894*dd63353aSNuno Sá case hwmon_curr_reset_history: 895*dd63353aSNuno Sá return 0200; 896*dd63353aSNuno Sá default: 897*dd63353aSNuno Sá return 0; 898*dd63353aSNuno Sá } 899*dd63353aSNuno Sá } 900*dd63353aSNuno Sá 901*dd63353aSNuno Sá static umode_t ltc4283_power_is_visible(u32 attr) 902*dd63353aSNuno Sá { 903*dd63353aSNuno Sá switch (attr) { 904*dd63353aSNuno Sá case hwmon_power_input: 905*dd63353aSNuno Sá case hwmon_power_input_highest: 906*dd63353aSNuno Sá case hwmon_power_input_lowest: 907*dd63353aSNuno Sá case hwmon_power_label: 908*dd63353aSNuno Sá case hwmon_power_max_alarm: 909*dd63353aSNuno Sá case hwmon_power_min_alarm: 910*dd63353aSNuno Sá return 0444; 911*dd63353aSNuno Sá case hwmon_power_max: 912*dd63353aSNuno Sá case hwmon_power_min: 913*dd63353aSNuno Sá return 0644; 914*dd63353aSNuno Sá case hwmon_power_reset_history: 915*dd63353aSNuno Sá return 0200; 916*dd63353aSNuno Sá default: 917*dd63353aSNuno Sá return 0; 918*dd63353aSNuno Sá } 919*dd63353aSNuno Sá } 920*dd63353aSNuno Sá 921*dd63353aSNuno Sá static umode_t ltc4283_is_visible(const void *data, 922*dd63353aSNuno Sá enum hwmon_sensor_types type, 923*dd63353aSNuno Sá u32 attr, int channel) 924*dd63353aSNuno Sá { 925*dd63353aSNuno Sá switch (type) { 926*dd63353aSNuno Sá case hwmon_in: 927*dd63353aSNuno Sá return ltc4283_in_is_visible(data, attr, channel); 928*dd63353aSNuno Sá case hwmon_curr: 929*dd63353aSNuno Sá return ltc4283_curr_is_visible(attr); 930*dd63353aSNuno Sá case hwmon_power: 931*dd63353aSNuno Sá return ltc4283_power_is_visible(attr); 932*dd63353aSNuno Sá case hwmon_energy: 933*dd63353aSNuno Sá /* hwmon_energy_enable */ 934*dd63353aSNuno Sá return 0644; 935*dd63353aSNuno Sá case hwmon_energy64: 936*dd63353aSNuno Sá /* hwmon_energy_input */ 937*dd63353aSNuno Sá return 0444; 938*dd63353aSNuno Sá default: 939*dd63353aSNuno Sá return 0; 940*dd63353aSNuno Sá } 941*dd63353aSNuno Sá } 942*dd63353aSNuno Sá 943*dd63353aSNuno Sá static const char * const ltc4283_in_strs[] = { 944*dd63353aSNuno Sá "VIN", "VPWR", "VADI1", "VADI2", "VADI3", "VADI4", "VADIO1", "VADIO2", 945*dd63353aSNuno Sá "VADIO3", "VADIO4", "DRNS", "DRAIN", "ADIN2-ADIN1", "ADIN4-ADIN3", 946*dd63353aSNuno Sá "ADIO2-ADIO1", "ADIO4-ADIO3" 947*dd63353aSNuno Sá }; 948*dd63353aSNuno Sá 949*dd63353aSNuno Sá static int ltc4283_read_labels(struct device *dev, 950*dd63353aSNuno Sá enum hwmon_sensor_types type, 951*dd63353aSNuno Sá u32 attr, int channel, const char **str) 952*dd63353aSNuno Sá { 953*dd63353aSNuno Sá switch (type) { 954*dd63353aSNuno Sá case hwmon_in: 955*dd63353aSNuno Sá *str = ltc4283_in_strs[channel]; 956*dd63353aSNuno Sá return 0; 957*dd63353aSNuno Sá case hwmon_curr: 958*dd63353aSNuno Sá *str = "ISENSE"; 959*dd63353aSNuno Sá return 0; 960*dd63353aSNuno Sá case hwmon_power: 961*dd63353aSNuno Sá *str = "Power"; 962*dd63353aSNuno Sá return 0; 963*dd63353aSNuno Sá default: 964*dd63353aSNuno Sá return -EOPNOTSUPP; 965*dd63353aSNuno Sá } 966*dd63353aSNuno Sá } 967*dd63353aSNuno Sá 968*dd63353aSNuno Sá /* 969*dd63353aSNuno Sá * Set max limits for ISENSE and Power as that depends on the max voltage on 970*dd63353aSNuno Sá * rsense that is defined in ILIM_ADJUST. This is specially important for power 971*dd63353aSNuno Sá * because for some rsense and vfsout values, if we allow the default raw 255 972*dd63353aSNuno Sá * value, that would overflow long in 32bit archs when reading back the max 973*dd63353aSNuno Sá * power limit. 974*dd63353aSNuno Sá */ 975*dd63353aSNuno Sá static int ltc4283_set_max_limits(struct ltc4283_hwmon *st, struct device *dev) 976*dd63353aSNuno Sá { 977*dd63353aSNuno Sá u32 temp = st->vsense_max * DECA * MICRO; 978*dd63353aSNuno Sá int ret; 979*dd63353aSNuno Sá 980*dd63353aSNuno Sá ret = ltc4283_write_in_byte(st, LTC4283_SENSE_MAX_TH, LTC4283_ADC1_FS_uV, 981*dd63353aSNuno Sá st->vsense_max * MILLI); 982*dd63353aSNuno Sá if (ret) 983*dd63353aSNuno Sá return ret; 984*dd63353aSNuno Sá 985*dd63353aSNuno Sá /* Power is given by ISENSE * Vout. */ 986*dd63353aSNuno Sá st->power_max = DIV_ROUND_CLOSEST(temp, st->rsense) * LTC4283_ADC2_FS_mV; 987*dd63353aSNuno Sá return ltc4283_write_power_byte(st, LTC4283_POWER_MAX_TH, st->power_max); 988*dd63353aSNuno Sá } 989*dd63353aSNuno Sá 990*dd63353aSNuno Sá static int ltc4283_parse_array_prop(const struct ltc4283_hwmon *st, 991*dd63353aSNuno Sá struct device *dev, const char *prop, 992*dd63353aSNuno Sá const u32 *vals, u32 n_vals) 993*dd63353aSNuno Sá { 994*dd63353aSNuno Sá u32 prop_val; 995*dd63353aSNuno Sá int ret; 996*dd63353aSNuno Sá u32 i; 997*dd63353aSNuno Sá 998*dd63353aSNuno Sá ret = device_property_read_u32(dev, prop, &prop_val); 999*dd63353aSNuno Sá if (ret) 1000*dd63353aSNuno Sá return n_vals; 1001*dd63353aSNuno Sá 1002*dd63353aSNuno Sá for (i = 0; i < n_vals; i++) { 1003*dd63353aSNuno Sá if (prop_val != vals[i]) 1004*dd63353aSNuno Sá continue; 1005*dd63353aSNuno Sá 1006*dd63353aSNuno Sá return i; 1007*dd63353aSNuno Sá } 1008*dd63353aSNuno Sá 1009*dd63353aSNuno Sá return dev_err_probe(dev, -EINVAL, 1010*dd63353aSNuno Sá "Invalid %s property value %u\n", prop, prop_val); 1011*dd63353aSNuno Sá } 1012*dd63353aSNuno Sá 1013*dd63353aSNuno Sá static int ltc4283_get_defaults(struct ltc4283_hwmon *st) 1014*dd63353aSNuno Sá { 1015*dd63353aSNuno Sá u32 reg_val, ilm_adjust, c; 1016*dd63353aSNuno Sá int ret; 1017*dd63353aSNuno Sá 1018*dd63353aSNuno Sá ret = regmap_read(st->map, LTC4283_METER_CONTROL, ®_val); 1019*dd63353aSNuno Sá if (ret) 1020*dd63353aSNuno Sá return ret; 1021*dd63353aSNuno Sá 1022*dd63353aSNuno Sá st->energy_en = !FIELD_GET(LTC4283_METER_HALT_MASK, reg_val); 1023*dd63353aSNuno Sá 1024*dd63353aSNuno Sá ret = regmap_read(st->map, LTC4283_CONFIG_1, ®_val); 1025*dd63353aSNuno Sá if (ret) 1026*dd63353aSNuno Sá return ret; 1027*dd63353aSNuno Sá 1028*dd63353aSNuno Sá ilm_adjust = FIELD_GET(LTC4283_ILIM_MASK, reg_val); 1029*dd63353aSNuno Sá st->vsense_max = LTC4283_VILIM_MIN_uV / MILLI + ilm_adjust; 1030*dd63353aSNuno Sá 1031*dd63353aSNuno Sá ret = regmap_read(st->map, LTC4283_PGIO_CONFIG, ®_val); 1032*dd63353aSNuno Sá if (ret) 1033*dd63353aSNuno Sá return ret; 1034*dd63353aSNuno Sá 1035*dd63353aSNuno Sá /* Can be latter overwritten in ltc4283_pgio_config() */ 1036*dd63353aSNuno Sá if (FIELD_GET(LTC4283_PGIO4_CFG_MASK, reg_val) < LTC4283_PGIO_FUNC_GPIO) 1037*dd63353aSNuno Sá st->ext_fault = true; 1038*dd63353aSNuno Sá 1039*dd63353aSNuno Sá /* VPWR and VIN are always enabled */ 1040*dd63353aSNuno Sá __set_bit(LTC4283_CHAN_VIN, &st->ch_enable_mask); 1041*dd63353aSNuno Sá __set_bit(LTC4283_CHAN_VPWR, &st->ch_enable_mask); 1042*dd63353aSNuno Sá for (c = LTC4283_CHAN_ADI_1; c < LTC4283_CHAN_MAX; c++) { 1043*dd63353aSNuno Sá u32 chan = c - LTC4283_CHAN_ADI_1, bit; 1044*dd63353aSNuno Sá 1045*dd63353aSNuno Sá ret = regmap_read(st->map, LTC4283_ADC_SELECT(chan), ®_val); 1046*dd63353aSNuno Sá if (ret) 1047*dd63353aSNuno Sá return ret; 1048*dd63353aSNuno Sá 1049*dd63353aSNuno Sá bit = LTC4283_ADC_SELECT_MASK(chan); 1050*dd63353aSNuno Sá if (c > LTC4283_CHAN_DRAIN) 1051*dd63353aSNuno Sá /* account for two reserved fields after DRAIN */ 1052*dd63353aSNuno Sá bit <<= 2; 1053*dd63353aSNuno Sá 1054*dd63353aSNuno Sá if (!(bit & reg_val)) 1055*dd63353aSNuno Sá continue; 1056*dd63353aSNuno Sá 1057*dd63353aSNuno Sá __set_bit(c, &st->ch_enable_mask); 1058*dd63353aSNuno Sá } 1059*dd63353aSNuno Sá 1060*dd63353aSNuno Sá return 0; 1061*dd63353aSNuno Sá } 1062*dd63353aSNuno Sá 1063*dd63353aSNuno Sá static const char * const ltc4283_pgio1_funcs[] = { 1064*dd63353aSNuno Sá "inverted_power_good", "power_good", "gpio" 1065*dd63353aSNuno Sá }; 1066*dd63353aSNuno Sá 1067*dd63353aSNuno Sá static const char * const ltc4283_pgio2_funcs[] = { 1068*dd63353aSNuno Sá "inverted_power_good", "power_good", "gpio", "active_current_limiting" 1069*dd63353aSNuno Sá }; 1070*dd63353aSNuno Sá 1071*dd63353aSNuno Sá static const char * const ltc4283_pgio3_funcs[] = { 1072*dd63353aSNuno Sá "inverted_power_good_input", "power_good_input", "gpio" 1073*dd63353aSNuno Sá }; 1074*dd63353aSNuno Sá 1075*dd63353aSNuno Sá static const char * const ltc4283_pgio4_funcs[] = { 1076*dd63353aSNuno Sá "inverted_external_fault", "external_fault", "gpio" 1077*dd63353aSNuno Sá }; 1078*dd63353aSNuno Sá 1079*dd63353aSNuno Sá enum { 1080*dd63353aSNuno Sá LTC4283_PIN_ADIO1, 1081*dd63353aSNuno Sá LTC4283_PIN_ADIO2, 1082*dd63353aSNuno Sá LTC4283_PIN_ADIO3, 1083*dd63353aSNuno Sá LTC4283_PIN_ADIO4, 1084*dd63353aSNuno Sá LTC4283_PIN_PGIO1, 1085*dd63353aSNuno Sá LTC4283_PIN_PGIO2, 1086*dd63353aSNuno Sá LTC4283_PIN_PGIO3, 1087*dd63353aSNuno Sá LTC4283_PIN_PGIO4, 1088*dd63353aSNuno Sá }; 1089*dd63353aSNuno Sá 1090*dd63353aSNuno Sá static int ltc4283_pgio_config(struct ltc4283_hwmon *st, struct device *dev) 1091*dd63353aSNuno Sá { 1092*dd63353aSNuno Sá int ret, func; 1093*dd63353aSNuno Sá 1094*dd63353aSNuno Sá func = device_property_match_property_string(dev, "adi,pgio1-func", 1095*dd63353aSNuno Sá ltc4283_pgio1_funcs, 1096*dd63353aSNuno Sá ARRAY_SIZE(ltc4283_pgio1_funcs)); 1097*dd63353aSNuno Sá if (func < 0 && func != -EINVAL) 1098*dd63353aSNuno Sá return dev_err_probe(dev, func, 1099*dd63353aSNuno Sá "Invalid adi,pgio1-func property\n"); 1100*dd63353aSNuno Sá if (func >= 0) { 1101*dd63353aSNuno Sá if (func == LTC4283_PGIO_FUNC_GPIO) { 1102*dd63353aSNuno Sá __set_bit(LTC4283_PIN_PGIO1, &st->gpio_mask); 1103*dd63353aSNuno Sá /* If GPIO, default to an input pin. */ 1104*dd63353aSNuno Sá func++; 1105*dd63353aSNuno Sá } 1106*dd63353aSNuno Sá 1107*dd63353aSNuno Sá ret = regmap_update_bits(st->map, LTC4283_PGIO_CONFIG, 1108*dd63353aSNuno Sá LTC4283_PGIO1_CFG_MASK, 1109*dd63353aSNuno Sá FIELD_PREP(LTC4283_PGIO1_CFG_MASK, func)); 1110*dd63353aSNuno Sá if (ret) 1111*dd63353aSNuno Sá return ret; 1112*dd63353aSNuno Sá } 1113*dd63353aSNuno Sá 1114*dd63353aSNuno Sá func = device_property_match_property_string(dev, "adi,pgio2-func", 1115*dd63353aSNuno Sá ltc4283_pgio2_funcs, 1116*dd63353aSNuno Sá ARRAY_SIZE(ltc4283_pgio2_funcs)); 1117*dd63353aSNuno Sá 1118*dd63353aSNuno Sá if (func < 0 && func != -EINVAL) 1119*dd63353aSNuno Sá return dev_err_probe(dev, func, 1120*dd63353aSNuno Sá "Invalid adi,pgio2-func property\n"); 1121*dd63353aSNuno Sá if (func >= 0) { 1122*dd63353aSNuno Sá if (func != LTC4283_PGIO2_FUNC_ACLB) { 1123*dd63353aSNuno Sá if (func == LTC4283_PGIO_FUNC_GPIO) { 1124*dd63353aSNuno Sá __set_bit(LTC4283_PIN_PGIO2, &st->gpio_mask); 1125*dd63353aSNuno Sá func++; 1126*dd63353aSNuno Sá } 1127*dd63353aSNuno Sá 1128*dd63353aSNuno Sá ret = regmap_update_bits(st->map, LTC4283_PGIO_CONFIG, 1129*dd63353aSNuno Sá LTC4283_PGIO2_CFG_MASK, 1130*dd63353aSNuno Sá FIELD_PREP(LTC4283_PGIO2_CFG_MASK, func)); 1131*dd63353aSNuno Sá } else { 1132*dd63353aSNuno Sá ret = regmap_set_bits(st->map, LTC4283_CONTROL_1, 1133*dd63353aSNuno Sá LTC4283_PIGIO2_ACLB_MASK); 1134*dd63353aSNuno Sá } 1135*dd63353aSNuno Sá 1136*dd63353aSNuno Sá if (ret) 1137*dd63353aSNuno Sá return ret; 1138*dd63353aSNuno Sá } 1139*dd63353aSNuno Sá 1140*dd63353aSNuno Sá func = device_property_match_property_string(dev, "adi,pgio3-func", 1141*dd63353aSNuno Sá ltc4283_pgio3_funcs, 1142*dd63353aSNuno Sá ARRAY_SIZE(ltc4283_pgio3_funcs)); 1143*dd63353aSNuno Sá 1144*dd63353aSNuno Sá if (func < 0 && func != -EINVAL) 1145*dd63353aSNuno Sá return dev_err_probe(dev, func, 1146*dd63353aSNuno Sá "Invalid adi,pgio3-func property\n"); 1147*dd63353aSNuno Sá if (func >= 0) { 1148*dd63353aSNuno Sá if (func == LTC4283_PGIO_FUNC_GPIO) { 1149*dd63353aSNuno Sá __set_bit(LTC4283_PIN_PGIO3, &st->gpio_mask); 1150*dd63353aSNuno Sá func++; 1151*dd63353aSNuno Sá } 1152*dd63353aSNuno Sá 1153*dd63353aSNuno Sá ret = regmap_update_bits(st->map, LTC4283_PGIO_CONFIG, 1154*dd63353aSNuno Sá LTC4283_PGIO3_CFG_MASK, 1155*dd63353aSNuno Sá FIELD_PREP(LTC4283_PGIO3_CFG_MASK, func)); 1156*dd63353aSNuno Sá if (ret) 1157*dd63353aSNuno Sá return ret; 1158*dd63353aSNuno Sá } 1159*dd63353aSNuno Sá 1160*dd63353aSNuno Sá func = device_property_match_property_string(dev, "adi,pgio4-func", 1161*dd63353aSNuno Sá ltc4283_pgio4_funcs, 1162*dd63353aSNuno Sá ARRAY_SIZE(ltc4283_pgio4_funcs)); 1163*dd63353aSNuno Sá 1164*dd63353aSNuno Sá if (func < 0 && func != -EINVAL) 1165*dd63353aSNuno Sá return dev_err_probe(dev, func, 1166*dd63353aSNuno Sá "Invalid adi,pgio4-func property\n"); 1167*dd63353aSNuno Sá if (func >= 0) { 1168*dd63353aSNuno Sá if (func == LTC4283_PGIO_FUNC_GPIO) { 1169*dd63353aSNuno Sá __set_bit(LTC4283_PIN_PGIO4, &st->gpio_mask); 1170*dd63353aSNuno Sá func++; 1171*dd63353aSNuno Sá st->ext_fault = false; 1172*dd63353aSNuno Sá } else { 1173*dd63353aSNuno Sá st->ext_fault = true; 1174*dd63353aSNuno Sá } 1175*dd63353aSNuno Sá 1176*dd63353aSNuno Sá ret = regmap_update_bits(st->map, LTC4283_PGIO_CONFIG, 1177*dd63353aSNuno Sá LTC4283_PGIO4_CFG_MASK, 1178*dd63353aSNuno Sá FIELD_PREP(LTC4283_PGIO4_CFG_MASK, func)); 1179*dd63353aSNuno Sá if (ret) 1180*dd63353aSNuno Sá return ret; 1181*dd63353aSNuno Sá } 1182*dd63353aSNuno Sá 1183*dd63353aSNuno Sá return 0; 1184*dd63353aSNuno Sá } 1185*dd63353aSNuno Sá 1186*dd63353aSNuno Sá static int ltc4283_adio_config(struct ltc4283_hwmon *st, struct device *dev, 1187*dd63353aSNuno Sá const char *prop, u32 pin) 1188*dd63353aSNuno Sá { 1189*dd63353aSNuno Sá u32 adc_idx; 1190*dd63353aSNuno Sá int ret; 1191*dd63353aSNuno Sá 1192*dd63353aSNuno Sá if (!device_property_read_bool(dev, prop)) 1193*dd63353aSNuno Sá return 0; 1194*dd63353aSNuno Sá 1195*dd63353aSNuno Sá adc_idx = LTC4283_CHAN_ADIO_1 - LTC4283_CHAN_ADI_1 + pin; 1196*dd63353aSNuno Sá ret = regmap_clear_bits(st->map, LTC4283_ADC_SELECT(adc_idx), 1197*dd63353aSNuno Sá LTC4283_ADC_SELECT_MASK(adc_idx)); 1198*dd63353aSNuno Sá if (ret) 1199*dd63353aSNuno Sá return ret; 1200*dd63353aSNuno Sá 1201*dd63353aSNuno Sá __set_bit(pin, &st->gpio_mask); 1202*dd63353aSNuno Sá return 0; 1203*dd63353aSNuno Sá } 1204*dd63353aSNuno Sá 1205*dd63353aSNuno Sá static int ltc4283_pin_config(struct ltc4283_hwmon *st, struct device *dev) 1206*dd63353aSNuno Sá { 1207*dd63353aSNuno Sá int ret; 1208*dd63353aSNuno Sá 1209*dd63353aSNuno Sá ret = ltc4283_pgio_config(st, dev); 1210*dd63353aSNuno Sá if (ret) 1211*dd63353aSNuno Sá return ret; 1212*dd63353aSNuno Sá 1213*dd63353aSNuno Sá ret = ltc4283_adio_config(st, dev, "adi,gpio-on-adio1", LTC4283_PIN_ADIO1); 1214*dd63353aSNuno Sá if (ret) 1215*dd63353aSNuno Sá return ret; 1216*dd63353aSNuno Sá 1217*dd63353aSNuno Sá ret = ltc4283_adio_config(st, dev, "adi,gpio-on-adio2", LTC4283_PIN_ADIO2); 1218*dd63353aSNuno Sá if (ret) 1219*dd63353aSNuno Sá return ret; 1220*dd63353aSNuno Sá 1221*dd63353aSNuno Sá ret = ltc4283_adio_config(st, dev, "adi,gpio-on-adio3", LTC4283_PIN_ADIO3); 1222*dd63353aSNuno Sá if (ret) 1223*dd63353aSNuno Sá return ret; 1224*dd63353aSNuno Sá 1225*dd63353aSNuno Sá return ltc4283_adio_config(st, dev, "adi,gpio-on-adio4", LTC4283_PIN_ADIO4); 1226*dd63353aSNuno Sá } 1227*dd63353aSNuno Sá 1228*dd63353aSNuno Sá static const char * const ltc4283_oc_fet_retry[] = { 1229*dd63353aSNuno Sá "latch-off", "1", "7", "unlimited" 1230*dd63353aSNuno Sá }; 1231*dd63353aSNuno Sá 1232*dd63353aSNuno Sá static const u32 ltc4283_fb_factor[] = { 1233*dd63353aSNuno Sá 100, 50, 20, 10 1234*dd63353aSNuno Sá }; 1235*dd63353aSNuno Sá 1236*dd63353aSNuno Sá static const u32 ltc4283_cooling_dl[] = { 1237*dd63353aSNuno Sá 512, 1002, 2005, 4100, 8190, 16400, 32800, 65600 1238*dd63353aSNuno Sá }; 1239*dd63353aSNuno Sá 1240*dd63353aSNuno Sá static const u32 ltc4283_fet_bad_delay[] = { 1241*dd63353aSNuno Sá 256, 512, 1002, 2005 1242*dd63353aSNuno Sá }; 1243*dd63353aSNuno Sá 1244*dd63353aSNuno Sá static int ltc4283_setup(struct ltc4283_hwmon *st, struct device *dev) 1245*dd63353aSNuno Sá { 1246*dd63353aSNuno Sá u32 val; 1247*dd63353aSNuno Sá int ret; 1248*dd63353aSNuno Sá 1249*dd63353aSNuno Sá /* The part has an eeprom so let's get the needed defaults from it */ 1250*dd63353aSNuno Sá ret = ltc4283_get_defaults(st); 1251*dd63353aSNuno Sá if (ret) 1252*dd63353aSNuno Sá return ret; 1253*dd63353aSNuno Sá 1254*dd63353aSNuno Sá /* 1255*dd63353aSNuno Sá * Default to LTC4283_MIN_RSENSE so we can probe without FW properties. 1256*dd63353aSNuno Sá */ 1257*dd63353aSNuno Sá st->rsense = LTC4283_MIN_RSENSE; 1258*dd63353aSNuno Sá ret = device_property_read_u32(dev, "adi,rsense-nano-ohms", 1259*dd63353aSNuno Sá &st->rsense); 1260*dd63353aSNuno Sá if (!ret) { 1261*dd63353aSNuno Sá if (st->rsense < LTC4283_MIN_RSENSE || st->rsense > LTC4283_MAX_RSENSE) 1262*dd63353aSNuno Sá return dev_err_probe(dev, -EINVAL, 1263*dd63353aSNuno Sá "adi,rsense-nano-ohms(%u) too small or too large [%u %u]\n", 1264*dd63353aSNuno Sá st->rsense, LTC4283_MIN_RSENSE, LTC4283_MAX_RSENSE); 1265*dd63353aSNuno Sá } 1266*dd63353aSNuno Sá 1267*dd63353aSNuno Sá /* 1268*dd63353aSNuno Sá * The resolution for rsense is tenths of micro (eg: 62.5 uOhm) which 1269*dd63353aSNuno Sá * means we need nano in the bindings. However, to make things easier to 1270*dd63353aSNuno Sá * handle (with respect to overflows) we divide it by 100 as we don't 1271*dd63353aSNuno Sá * really need the last two digits. 1272*dd63353aSNuno Sá */ 1273*dd63353aSNuno Sá st->rsense /= CENTI; 1274*dd63353aSNuno Sá 1275*dd63353aSNuno Sá ret = device_property_read_u32(dev, "adi,current-limit-sense-microvolt", 1276*dd63353aSNuno Sá &st->vsense_max); 1277*dd63353aSNuno Sá if (!ret) { 1278*dd63353aSNuno Sá u32 reg_val; 1279*dd63353aSNuno Sá 1280*dd63353aSNuno Sá if (!in_range(st->vsense_max, LTC4283_VILIM_MIN_uV, 1281*dd63353aSNuno Sá LTC4283_VILIM_RANGE)) { 1282*dd63353aSNuno Sá return dev_err_probe(dev, -EINVAL, 1283*dd63353aSNuno Sá "adi,current-limit-sense-microvolt (%u) out of range [%u %u]\n", 1284*dd63353aSNuno Sá st->vsense_max, LTC4283_VILIM_MIN_uV, 1285*dd63353aSNuno Sá LTC4283_VILIM_MAX_uV); 1286*dd63353aSNuno Sá } 1287*dd63353aSNuno Sá 1288*dd63353aSNuno Sá st->vsense_max /= MILLI; 1289*dd63353aSNuno Sá reg_val = FIELD_PREP(LTC4283_ILIM_MASK, 1290*dd63353aSNuno Sá st->vsense_max - LTC4283_VILIM_MIN_uV / MILLI); 1291*dd63353aSNuno Sá ret = regmap_update_bits(st->map, LTC4283_CONFIG_1, 1292*dd63353aSNuno Sá LTC4283_ILIM_MASK, reg_val); 1293*dd63353aSNuno Sá if (ret) 1294*dd63353aSNuno Sá return ret; 1295*dd63353aSNuno Sá } 1296*dd63353aSNuno Sá 1297*dd63353aSNuno Sá ret = ltc4283_parse_array_prop(st, dev, "adi,current-limit-foldback-factor", 1298*dd63353aSNuno Sá ltc4283_fb_factor, ARRAY_SIZE(ltc4283_fb_factor)); 1299*dd63353aSNuno Sá if (ret < 0) 1300*dd63353aSNuno Sá return ret; 1301*dd63353aSNuno Sá if (ret < ARRAY_SIZE(ltc4283_fb_factor)) { 1302*dd63353aSNuno Sá ret = regmap_update_bits(st->map, LTC4283_CONFIG_1, LTC4283_FB_MASK, 1303*dd63353aSNuno Sá FIELD_PREP(LTC4283_FB_MASK, ret)); 1304*dd63353aSNuno Sá if (ret) 1305*dd63353aSNuno Sá return ret; 1306*dd63353aSNuno Sá } 1307*dd63353aSNuno Sá 1308*dd63353aSNuno Sá ret = ltc4283_parse_array_prop(st, dev, "adi,cooling-delay-ms", 1309*dd63353aSNuno Sá ltc4283_cooling_dl, ARRAY_SIZE(ltc4283_cooling_dl)); 1310*dd63353aSNuno Sá if (ret < 0) 1311*dd63353aSNuno Sá return ret; 1312*dd63353aSNuno Sá if (ret < ARRAY_SIZE(ltc4283_cooling_dl)) { 1313*dd63353aSNuno Sá ret = regmap_update_bits(st->map, LTC4283_CONFIG_2, LTC4283_COOLING_DL_MASK, 1314*dd63353aSNuno Sá FIELD_PREP(LTC4283_COOLING_DL_MASK, ret)); 1315*dd63353aSNuno Sá if (ret) 1316*dd63353aSNuno Sá return ret; 1317*dd63353aSNuno Sá } 1318*dd63353aSNuno Sá 1319*dd63353aSNuno Sá ret = ltc4283_parse_array_prop(st, dev, "adi,fet-bad-timer-delay-ms", 1320*dd63353aSNuno Sá ltc4283_fet_bad_delay, ARRAY_SIZE(ltc4283_fet_bad_delay)); 1321*dd63353aSNuno Sá if (ret < 0) 1322*dd63353aSNuno Sá return ret; 1323*dd63353aSNuno Sá if (ret < ARRAY_SIZE(ltc4283_fet_bad_delay)) { 1324*dd63353aSNuno Sá ret = regmap_update_bits(st->map, LTC4283_CONFIG_2, LTC4283_FTBD_DL_MASK, 1325*dd63353aSNuno Sá FIELD_PREP(LTC4283_FTBD_DL_MASK, ret)); 1326*dd63353aSNuno Sá if (ret) 1327*dd63353aSNuno Sá return ret; 1328*dd63353aSNuno Sá } 1329*dd63353aSNuno Sá 1330*dd63353aSNuno Sá ret = ltc4283_set_max_limits(st, dev); 1331*dd63353aSNuno Sá if (ret) 1332*dd63353aSNuno Sá return ret; 1333*dd63353aSNuno Sá 1334*dd63353aSNuno Sá ret = ltc4283_pin_config(st, dev); 1335*dd63353aSNuno Sá if (ret) 1336*dd63353aSNuno Sá return ret; 1337*dd63353aSNuno Sá 1338*dd63353aSNuno Sá if (device_property_read_bool(dev, "adi,power-good-reset-on-fet")) { 1339*dd63353aSNuno Sá ret = regmap_clear_bits(st->map, LTC4283_CONTROL_1, 1340*dd63353aSNuno Sá LTC4283_PWRGD_RST_CTRL_MASK); 1341*dd63353aSNuno Sá if (ret) 1342*dd63353aSNuno Sá return ret; 1343*dd63353aSNuno Sá } 1344*dd63353aSNuno Sá 1345*dd63353aSNuno Sá if (device_property_read_bool(dev, "adi,fet-turn-off-disable")) { 1346*dd63353aSNuno Sá ret = regmap_clear_bits(st->map, LTC4283_CONTROL_1, 1347*dd63353aSNuno Sá LTC4283_FET_BAD_OFF_MASK); 1348*dd63353aSNuno Sá if (ret) 1349*dd63353aSNuno Sá return ret; 1350*dd63353aSNuno Sá } 1351*dd63353aSNuno Sá 1352*dd63353aSNuno Sá if (device_property_read_bool(dev, "adi,tmr-pull-down-disable")) { 1353*dd63353aSNuno Sá ret = regmap_set_bits(st->map, LTC4283_CONTROL_1, 1354*dd63353aSNuno Sá LTC4283_THERM_TMR_MASK); 1355*dd63353aSNuno Sá if (ret) 1356*dd63353aSNuno Sá return ret; 1357*dd63353aSNuno Sá } 1358*dd63353aSNuno Sá 1359*dd63353aSNuno Sá if (device_property_read_bool(dev, "adi,dvdt-inrush-control-disable")) { 1360*dd63353aSNuno Sá ret = regmap_clear_bits(st->map, LTC4283_CONTROL_1, 1361*dd63353aSNuno Sá LTC4283_DVDT_MASK); 1362*dd63353aSNuno Sá if (ret) 1363*dd63353aSNuno Sá return ret; 1364*dd63353aSNuno Sá } 1365*dd63353aSNuno Sá 1366*dd63353aSNuno Sá if (device_property_read_bool(dev, "adi,undervoltage-retry-disable")) { 1367*dd63353aSNuno Sá ret = regmap_clear_bits(st->map, LTC4283_CONTROL_2, 1368*dd63353aSNuno Sá LTC4283_UV_RETRY_MASK); 1369*dd63353aSNuno Sá if (ret) 1370*dd63353aSNuno Sá return ret; 1371*dd63353aSNuno Sá } 1372*dd63353aSNuno Sá 1373*dd63353aSNuno Sá if (device_property_read_bool(dev, "adi,overvoltage-retry-disable")) { 1374*dd63353aSNuno Sá ret = regmap_clear_bits(st->map, LTC4283_CONTROL_2, 1375*dd63353aSNuno Sá LTC4283_OV_RETRY_MASK); 1376*dd63353aSNuno Sá if (ret) 1377*dd63353aSNuno Sá return ret; 1378*dd63353aSNuno Sá } 1379*dd63353aSNuno Sá 1380*dd63353aSNuno Sá if (device_property_read_bool(dev, "adi,external-fault-retry-enable")) { 1381*dd63353aSNuno Sá if (!st->ext_fault) 1382*dd63353aSNuno Sá return dev_err_probe(dev, -EINVAL, 1383*dd63353aSNuno Sá "adi,external-fault-retry-enable set but PGIO4 not configured\n"); 1384*dd63353aSNuno Sá ret = regmap_set_bits(st->map, LTC4283_CONTROL_2, 1385*dd63353aSNuno Sá LTC4283_EXT_FAULT_RETRY_MASK); 1386*dd63353aSNuno Sá if (ret) 1387*dd63353aSNuno Sá return ret; 1388*dd63353aSNuno Sá } 1389*dd63353aSNuno Sá 1390*dd63353aSNuno Sá if (device_property_read_bool(dev, "adi,fault-log-enable")) { 1391*dd63353aSNuno Sá ret = regmap_set_bits(st->map, LTC4283_FAULT_LOG_CTRL, 1392*dd63353aSNuno Sá LTC4283_FAULT_LOG_EN_MASK); 1393*dd63353aSNuno Sá if (ret) 1394*dd63353aSNuno Sá return ret; 1395*dd63353aSNuno Sá } 1396*dd63353aSNuno Sá 1397*dd63353aSNuno Sá ret = device_property_match_property_string(dev, "adi,overcurrent-retries", 1398*dd63353aSNuno Sá ltc4283_oc_fet_retry, 1399*dd63353aSNuno Sá ARRAY_SIZE(ltc4283_oc_fet_retry)); 1400*dd63353aSNuno Sá /* We still want to catch when an invalid string is given. */ 1401*dd63353aSNuno Sá if (ret < 0 && ret != -EINVAL) 1402*dd63353aSNuno Sá return dev_err_probe(dev, ret, 1403*dd63353aSNuno Sá "adi,overcurrent-retries invalid value\n"); 1404*dd63353aSNuno Sá if (ret >= 0) { 1405*dd63353aSNuno Sá ret = regmap_update_bits(st->map, LTC4283_CONTROL_2, 1406*dd63353aSNuno Sá LTC4283_OC_RETRY_MASK, 1407*dd63353aSNuno Sá FIELD_PREP(LTC4283_OC_RETRY_MASK, ret)); 1408*dd63353aSNuno Sá if (ret) 1409*dd63353aSNuno Sá return ret; 1410*dd63353aSNuno Sá } 1411*dd63353aSNuno Sá 1412*dd63353aSNuno Sá ret = device_property_match_property_string(dev, "adi,fet-bad-retries", 1413*dd63353aSNuno Sá ltc4283_oc_fet_retry, 1414*dd63353aSNuno Sá ARRAY_SIZE(ltc4283_oc_fet_retry)); 1415*dd63353aSNuno Sá if (ret < 0 && ret != -EINVAL) 1416*dd63353aSNuno Sá return dev_err_probe(dev, ret, 1417*dd63353aSNuno Sá "adi,fet-bad-retries invalid value\n"); 1418*dd63353aSNuno Sá if (ret >= 0) { 1419*dd63353aSNuno Sá ret = regmap_update_bits(st->map, LTC4283_CONTROL_2, 1420*dd63353aSNuno Sá LTC4283_FET_BAD_RETRY_MASK, 1421*dd63353aSNuno Sá FIELD_PREP(LTC4283_FET_BAD_RETRY_MASK, ret)); 1422*dd63353aSNuno Sá if (ret) 1423*dd63353aSNuno Sá return ret; 1424*dd63353aSNuno Sá } 1425*dd63353aSNuno Sá 1426*dd63353aSNuno Sá if (device_property_read_bool(dev, "adi,external-fault-fet-off-enable")) { 1427*dd63353aSNuno Sá if (!st->ext_fault) 1428*dd63353aSNuno Sá return dev_err_probe(dev, -EINVAL, 1429*dd63353aSNuno Sá "adi,external-fault-fet-off-enable set but PGIO4 not configured\n"); 1430*dd63353aSNuno Sá ret = regmap_set_bits(st->map, LTC4283_CONFIG_3, 1431*dd63353aSNuno Sá LTC4283_EXTFLT_TURN_OFF_MASK); 1432*dd63353aSNuno Sá if (ret) 1433*dd63353aSNuno Sá return ret; 1434*dd63353aSNuno Sá } 1435*dd63353aSNuno Sá 1436*dd63353aSNuno Sá if (device_property_read_bool(dev, "adi,vpower-drns-enable")) { 1437*dd63353aSNuno Sá u32 chan = LTC4283_CHAN_DRNS - LTC4283_CHAN_ADI_1; 1438*dd63353aSNuno Sá 1439*dd63353aSNuno Sá __clear_bit(LTC4283_CHAN_DRNS, &st->ch_enable_mask); 1440*dd63353aSNuno Sá /* 1441*dd63353aSNuno Sá * Then, let's by default disable DRNS from ADC2 given that it 1442*dd63353aSNuno Sá * is already being monitored by the VPWR channel. One can still 1443*dd63353aSNuno Sá * enable it later on if needed. 1444*dd63353aSNuno Sá */ 1445*dd63353aSNuno Sá ret = regmap_clear_bits(st->map, LTC4283_ADC_SELECT(chan), 1446*dd63353aSNuno Sá LTC4283_ADC_SELECT_MASK(chan)); 1447*dd63353aSNuno Sá if (ret) 1448*dd63353aSNuno Sá return ret; 1449*dd63353aSNuno Sá 1450*dd63353aSNuno Sá val = 1; 1451*dd63353aSNuno Sá } else { 1452*dd63353aSNuno Sá val = 0; 1453*dd63353aSNuno Sá } 1454*dd63353aSNuno Sá 1455*dd63353aSNuno Sá ret = regmap_update_bits(st->map, LTC4283_CONFIG_3, 1456*dd63353aSNuno Sá LTC4283_VPWR_DRNS_MASK, 1457*dd63353aSNuno Sá FIELD_PREP(LTC4283_VPWR_DRNS_MASK, val)); 1458*dd63353aSNuno Sá if (ret) 1459*dd63353aSNuno Sá return ret; 1460*dd63353aSNuno Sá 1461*dd63353aSNuno Sá /* Make sure the ADC has 12bit resolution since we're assuming that. */ 1462*dd63353aSNuno Sá ret = regmap_update_bits(st->map, LTC4283_PGIO_CONFIG_2, 1463*dd63353aSNuno Sá LTC4283_ADC_MASK, 1464*dd63353aSNuno Sá FIELD_PREP(LTC4283_ADC_MASK, 3)); 1465*dd63353aSNuno Sá if (ret) 1466*dd63353aSNuno Sá return ret; 1467*dd63353aSNuno Sá 1468*dd63353aSNuno Sá /* Energy reads (which are 6 byte block reads) rely on page access */ 1469*dd63353aSNuno Sá ret = regmap_set_bits(st->map, LTC4283_CONTROL_1, LTC4283_RW_PAGE_MASK); 1470*dd63353aSNuno Sá if (ret) 1471*dd63353aSNuno Sá return ret; 1472*dd63353aSNuno Sá 1473*dd63353aSNuno Sá /* 1474*dd63353aSNuno Sá * Make sure we are integrating power as we only support reporting 1475*dd63353aSNuno Sá * consumed energy. 1476*dd63353aSNuno Sá */ 1477*dd63353aSNuno Sá return regmap_clear_bits(st->map, LTC4283_METER_CONTROL, 1478*dd63353aSNuno Sá LTC4283_INTEGRATE_I_MASK); 1479*dd63353aSNuno Sá } 1480*dd63353aSNuno Sá 1481*dd63353aSNuno Sá static const struct hwmon_channel_info * const ltc4283_info[] = { 1482*dd63353aSNuno Sá HWMON_CHANNEL_INFO(in, 1483*dd63353aSNuno Sá HWMON_I_LCRIT_ALARM | HWMON_I_CRIT_ALARM | 1484*dd63353aSNuno Sá HWMON_I_RESET_HISTORY | HWMON_I_LABEL, 1485*dd63353aSNuno Sá HWMON_I_INPUT | HWMON_I_LOWEST | HWMON_I_HIGHEST | 1486*dd63353aSNuno Sá HWMON_I_MAX | HWMON_I_MIN | HWMON_I_MIN_ALARM | 1487*dd63353aSNuno Sá HWMON_I_MAX_ALARM | HWMON_I_RESET_HISTORY | 1488*dd63353aSNuno Sá HWMON_I_LABEL, 1489*dd63353aSNuno Sá HWMON_I_INPUT | HWMON_I_LOWEST | HWMON_I_HIGHEST | 1490*dd63353aSNuno Sá HWMON_I_MAX | HWMON_I_MIN | HWMON_I_MIN_ALARM | 1491*dd63353aSNuno Sá HWMON_I_RESET_HISTORY | HWMON_I_MAX_ALARM | 1492*dd63353aSNuno Sá HWMON_I_ENABLE | HWMON_I_LABEL, 1493*dd63353aSNuno Sá HWMON_I_INPUT | HWMON_I_LOWEST | HWMON_I_HIGHEST | 1494*dd63353aSNuno Sá HWMON_I_MAX | HWMON_I_MIN | HWMON_I_MIN_ALARM | 1495*dd63353aSNuno Sá HWMON_I_RESET_HISTORY | HWMON_I_MAX_ALARM | 1496*dd63353aSNuno Sá HWMON_I_ENABLE | HWMON_I_LABEL, 1497*dd63353aSNuno Sá HWMON_I_INPUT | HWMON_I_LOWEST | HWMON_I_HIGHEST | 1498*dd63353aSNuno Sá HWMON_I_MAX | HWMON_I_MIN | HWMON_I_MIN_ALARM | 1499*dd63353aSNuno Sá HWMON_I_RESET_HISTORY | HWMON_I_MAX_ALARM | 1500*dd63353aSNuno Sá HWMON_I_ENABLE | HWMON_I_LABEL, 1501*dd63353aSNuno Sá HWMON_I_INPUT | HWMON_I_LOWEST | HWMON_I_HIGHEST | 1502*dd63353aSNuno Sá HWMON_I_MAX | HWMON_I_MIN | HWMON_I_MIN_ALARM | 1503*dd63353aSNuno Sá HWMON_I_RESET_HISTORY | HWMON_I_MAX_ALARM | 1504*dd63353aSNuno Sá HWMON_I_ENABLE | HWMON_I_LABEL, 1505*dd63353aSNuno Sá HWMON_I_INPUT | HWMON_I_LOWEST | HWMON_I_HIGHEST | 1506*dd63353aSNuno Sá HWMON_I_MAX | HWMON_I_MIN | HWMON_I_MIN_ALARM | 1507*dd63353aSNuno Sá HWMON_I_RESET_HISTORY | HWMON_I_MAX_ALARM | 1508*dd63353aSNuno Sá HWMON_I_ENABLE | HWMON_I_LABEL, 1509*dd63353aSNuno Sá HWMON_I_INPUT | HWMON_I_LOWEST | HWMON_I_HIGHEST | 1510*dd63353aSNuno Sá HWMON_I_MAX | HWMON_I_MIN | HWMON_I_MIN_ALARM | 1511*dd63353aSNuno Sá HWMON_I_RESET_HISTORY | HWMON_I_MAX_ALARM | 1512*dd63353aSNuno Sá HWMON_I_ENABLE | HWMON_I_LABEL, 1513*dd63353aSNuno Sá HWMON_I_INPUT | HWMON_I_LOWEST | HWMON_I_HIGHEST | 1514*dd63353aSNuno Sá HWMON_I_MAX | HWMON_I_MIN | HWMON_I_MIN_ALARM | 1515*dd63353aSNuno Sá HWMON_I_RESET_HISTORY | HWMON_I_MAX_ALARM | 1516*dd63353aSNuno Sá HWMON_I_ENABLE | HWMON_I_LABEL, 1517*dd63353aSNuno Sá HWMON_I_INPUT | HWMON_I_LOWEST | HWMON_I_HIGHEST | 1518*dd63353aSNuno Sá HWMON_I_MAX | HWMON_I_MIN | HWMON_I_MIN_ALARM | 1519*dd63353aSNuno Sá HWMON_I_RESET_HISTORY | HWMON_I_MAX_ALARM | 1520*dd63353aSNuno Sá HWMON_I_ENABLE | HWMON_I_LABEL, 1521*dd63353aSNuno Sá HWMON_I_INPUT | HWMON_I_LOWEST | HWMON_I_HIGHEST | 1522*dd63353aSNuno Sá HWMON_I_MAX | HWMON_I_MIN | HWMON_I_MIN_ALARM | 1523*dd63353aSNuno Sá HWMON_I_RESET_HISTORY | HWMON_I_MAX_ALARM | 1524*dd63353aSNuno Sá HWMON_I_ENABLE | HWMON_I_LABEL, 1525*dd63353aSNuno Sá HWMON_I_INPUT | HWMON_I_LOWEST | HWMON_I_HIGHEST | 1526*dd63353aSNuno Sá HWMON_I_MAX | HWMON_I_MIN | HWMON_I_MIN_ALARM | 1527*dd63353aSNuno Sá HWMON_I_RESET_HISTORY | HWMON_I_MAX_ALARM | 1528*dd63353aSNuno Sá HWMON_I_FAULT | HWMON_I_ENABLE | HWMON_I_LABEL, 1529*dd63353aSNuno Sá HWMON_I_INPUT | HWMON_I_LOWEST | HWMON_I_HIGHEST | 1530*dd63353aSNuno Sá HWMON_I_MAX | HWMON_I_MIN | HWMON_I_MIN_ALARM | 1531*dd63353aSNuno Sá HWMON_I_RESET_HISTORY | HWMON_I_MAX_ALARM | 1532*dd63353aSNuno Sá HWMON_I_ENABLE | HWMON_I_LABEL, 1533*dd63353aSNuno Sá HWMON_I_INPUT | HWMON_I_LOWEST | HWMON_I_HIGHEST | 1534*dd63353aSNuno Sá HWMON_I_MAX | HWMON_I_MIN | HWMON_I_MIN_ALARM | 1535*dd63353aSNuno Sá HWMON_I_RESET_HISTORY | HWMON_I_MAX_ALARM | 1536*dd63353aSNuno Sá HWMON_I_ENABLE | HWMON_I_LABEL, 1537*dd63353aSNuno Sá HWMON_I_INPUT | HWMON_I_LOWEST | HWMON_I_HIGHEST | 1538*dd63353aSNuno Sá HWMON_I_MAX | HWMON_I_MIN | HWMON_I_MIN_ALARM | 1539*dd63353aSNuno Sá HWMON_I_RESET_HISTORY | HWMON_I_MAX_ALARM | 1540*dd63353aSNuno Sá HWMON_I_ENABLE | HWMON_I_LABEL, 1541*dd63353aSNuno Sá HWMON_I_INPUT | HWMON_I_LOWEST | HWMON_I_HIGHEST | 1542*dd63353aSNuno Sá HWMON_I_MAX | HWMON_I_MIN | HWMON_I_MIN_ALARM | 1543*dd63353aSNuno Sá HWMON_I_RESET_HISTORY | HWMON_I_MAX_ALARM | 1544*dd63353aSNuno Sá HWMON_I_ENABLE | HWMON_I_LABEL), 1545*dd63353aSNuno Sá HWMON_CHANNEL_INFO(curr, 1546*dd63353aSNuno Sá HWMON_C_INPUT | HWMON_C_LOWEST | HWMON_C_HIGHEST | 1547*dd63353aSNuno Sá HWMON_C_MAX | HWMON_C_MIN | HWMON_C_MIN_ALARM | 1548*dd63353aSNuno Sá HWMON_C_MAX_ALARM | HWMON_C_CRIT_ALARM | 1549*dd63353aSNuno Sá HWMON_C_RESET_HISTORY | HWMON_C_LABEL), 1550*dd63353aSNuno Sá HWMON_CHANNEL_INFO(power, 1551*dd63353aSNuno Sá HWMON_P_INPUT | HWMON_P_INPUT_LOWEST | 1552*dd63353aSNuno Sá HWMON_P_INPUT_HIGHEST | HWMON_P_MAX | HWMON_P_MIN | 1553*dd63353aSNuno Sá HWMON_P_MAX_ALARM | HWMON_P_MIN_ALARM | 1554*dd63353aSNuno Sá HWMON_P_RESET_HISTORY | HWMON_P_LABEL), 1555*dd63353aSNuno Sá HWMON_CHANNEL_INFO(energy, 1556*dd63353aSNuno Sá HWMON_E_ENABLE), 1557*dd63353aSNuno Sá HWMON_CHANNEL_INFO(energy64, 1558*dd63353aSNuno Sá HWMON_E_INPUT), 1559*dd63353aSNuno Sá NULL 1560*dd63353aSNuno Sá }; 1561*dd63353aSNuno Sá 1562*dd63353aSNuno Sá static const struct hwmon_ops ltc4283_ops = { 1563*dd63353aSNuno Sá .read = ltc4283_read, 1564*dd63353aSNuno Sá .write = ltc4283_write, 1565*dd63353aSNuno Sá .is_visible = ltc4283_is_visible, 1566*dd63353aSNuno Sá .read_string = ltc4283_read_labels, 1567*dd63353aSNuno Sá }; 1568*dd63353aSNuno Sá 1569*dd63353aSNuno Sá static const struct hwmon_chip_info ltc4283_chip_info = { 1570*dd63353aSNuno Sá .ops = <c4283_ops, 1571*dd63353aSNuno Sá .info = ltc4283_info, 1572*dd63353aSNuno Sá }; 1573*dd63353aSNuno Sá 1574*dd63353aSNuno Sá static int ltc4283_show_fault_log(void *arg, u64 *val, u32 mask) 1575*dd63353aSNuno Sá { 1576*dd63353aSNuno Sá struct ltc4283_hwmon *st = arg; 1577*dd63353aSNuno Sá long alarm; 1578*dd63353aSNuno Sá int ret; 1579*dd63353aSNuno Sá 1580*dd63353aSNuno Sá ret = ltc4283_read_alarm(st, LTC4283_FAULT_LOG, mask, &alarm); 1581*dd63353aSNuno Sá if (ret) 1582*dd63353aSNuno Sá return ret; 1583*dd63353aSNuno Sá 1584*dd63353aSNuno Sá *val = alarm; 1585*dd63353aSNuno Sá 1586*dd63353aSNuno Sá return 0; 1587*dd63353aSNuno Sá } 1588*dd63353aSNuno Sá 1589*dd63353aSNuno Sá static int ltc4283_show_in0_lcrit_fault_log(void *arg, u64 *val) 1590*dd63353aSNuno Sá { 1591*dd63353aSNuno Sá return ltc4283_show_fault_log(arg, val, LTC4283_UV_FAULT_MASK); 1592*dd63353aSNuno Sá } 1593*dd63353aSNuno Sá DEFINE_DEBUGFS_ATTRIBUTE(ltc4283_in0_lcrit_fault_log, 1594*dd63353aSNuno Sá ltc4283_show_in0_lcrit_fault_log, NULL, "%llu\n"); 1595*dd63353aSNuno Sá 1596*dd63353aSNuno Sá static int ltc4283_show_in0_crit_fault_log(void *arg, u64 *val) 1597*dd63353aSNuno Sá { 1598*dd63353aSNuno Sá return ltc4283_show_fault_log(arg, val, LTC4283_OV_FAULT_MASK); 1599*dd63353aSNuno Sá } 1600*dd63353aSNuno Sá DEFINE_DEBUGFS_ATTRIBUTE(ltc4283_in0_crit_fault_log, 1601*dd63353aSNuno Sá ltc4283_show_in0_crit_fault_log, NULL, "%llu\n"); 1602*dd63353aSNuno Sá 1603*dd63353aSNuno Sá static int ltc4283_show_fet_bad_fault_log(void *arg, u64 *val) 1604*dd63353aSNuno Sá { 1605*dd63353aSNuno Sá return ltc4283_show_fault_log(arg, val, LTC4283_FET_BAD_FAULT_MASK); 1606*dd63353aSNuno Sá } 1607*dd63353aSNuno Sá DEFINE_DEBUGFS_ATTRIBUTE(ltc4283_fet_bad_fault_log, 1608*dd63353aSNuno Sá ltc4283_show_fet_bad_fault_log, NULL, "%llu\n"); 1609*dd63353aSNuno Sá 1610*dd63353aSNuno Sá static int ltc4283_show_fet_short_fault_log(void *arg, u64 *val) 1611*dd63353aSNuno Sá { 1612*dd63353aSNuno Sá return ltc4283_show_fault_log(arg, val, LTC4283_FET_SHORT_FAULT_MASK); 1613*dd63353aSNuno Sá } 1614*dd63353aSNuno Sá DEFINE_DEBUGFS_ATTRIBUTE(ltc4283_fet_short_fault_log, 1615*dd63353aSNuno Sá ltc4283_show_fet_short_fault_log, NULL, "%llu\n"); 1616*dd63353aSNuno Sá 1617*dd63353aSNuno Sá static int ltc4283_show_curr1_crit_fault_log(void *arg, u64 *val) 1618*dd63353aSNuno Sá { 1619*dd63353aSNuno Sá return ltc4283_show_fault_log(arg, val, LTC4283_OC_FAULT_MASK); 1620*dd63353aSNuno Sá } 1621*dd63353aSNuno Sá DEFINE_DEBUGFS_ATTRIBUTE(ltc4283_curr1_crit_fault_log, 1622*dd63353aSNuno Sá ltc4283_show_curr1_crit_fault_log, NULL, "%llu\n"); 1623*dd63353aSNuno Sá 1624*dd63353aSNuno Sá static int ltc4283_show_power1_failed_fault_log(void *arg, u64 *val) 1625*dd63353aSNuno Sá { 1626*dd63353aSNuno Sá return ltc4283_show_fault_log(arg, val, LTC4283_PWR_FAIL_FAULT_MASK); 1627*dd63353aSNuno Sá } 1628*dd63353aSNuno Sá DEFINE_DEBUGFS_ATTRIBUTE(ltc4283_power1_failed_fault_log, 1629*dd63353aSNuno Sá ltc4283_show_power1_failed_fault_log, NULL, "%llu\n"); 1630*dd63353aSNuno Sá 1631*dd63353aSNuno Sá static int ltc4283_show_power1_good_input_fault_log(void *arg, u64 *val) 1632*dd63353aSNuno Sá { 1633*dd63353aSNuno Sá return ltc4283_show_fault_log(arg, val, LTC4283_PGI_FAULT_MASK); 1634*dd63353aSNuno Sá } 1635*dd63353aSNuno Sá DEFINE_DEBUGFS_ATTRIBUTE(ltc4283_power1_good_input_fault_log, 1636*dd63353aSNuno Sá ltc4283_show_power1_good_input_fault_log, NULL, "%llu\n"); 1637*dd63353aSNuno Sá 1638*dd63353aSNuno Sá static void ltc4283_debugfs_init(struct ltc4283_hwmon *st, struct i2c_client *i2c) 1639*dd63353aSNuno Sá { 1640*dd63353aSNuno Sá debugfs_create_file_unsafe("in0_crit_fault_log", 0400, i2c->debugfs, st, 1641*dd63353aSNuno Sá <c4283_in0_crit_fault_log); 1642*dd63353aSNuno Sá debugfs_create_file_unsafe("in0_lcrit_fault_log", 0400, i2c->debugfs, st, 1643*dd63353aSNuno Sá <c4283_in0_lcrit_fault_log); 1644*dd63353aSNuno Sá debugfs_create_file_unsafe("in11_fet_bad_fault_log", 0400, i2c->debugfs, st, 1645*dd63353aSNuno Sá <c4283_fet_bad_fault_log); 1646*dd63353aSNuno Sá debugfs_create_file_unsafe("in11_fet_short_fault_log", 0400, i2c->debugfs, st, 1647*dd63353aSNuno Sá <c4283_fet_short_fault_log); 1648*dd63353aSNuno Sá debugfs_create_file_unsafe("curr1_crit_fault_log", 0400, i2c->debugfs, st, 1649*dd63353aSNuno Sá <c4283_curr1_crit_fault_log); 1650*dd63353aSNuno Sá debugfs_create_file_unsafe("power1_failed_fault_log", 0400, i2c->debugfs, st, 1651*dd63353aSNuno Sá <c4283_power1_failed_fault_log); 1652*dd63353aSNuno Sá debugfs_create_file_unsafe("power1_good_input_fault_log", 0400, i2c->debugfs, 1653*dd63353aSNuno Sá st, <c4283_power1_good_input_fault_log); 1654*dd63353aSNuno Sá } 1655*dd63353aSNuno Sá 1656*dd63353aSNuno Sá static bool ltc4283_is_word_reg(unsigned int reg) 1657*dd63353aSNuno Sá { 1658*dd63353aSNuno Sá return reg >= LTC4283_SENSE && reg <= LTC4283_ADIO34_MAX; 1659*dd63353aSNuno Sá } 1660*dd63353aSNuno Sá 1661*dd63353aSNuno Sá static int ltc4283_reg_read(void *context, unsigned int reg, unsigned int *val) 1662*dd63353aSNuno Sá { 1663*dd63353aSNuno Sá struct i2c_client *client = context; 1664*dd63353aSNuno Sá int ret; 1665*dd63353aSNuno Sá 1666*dd63353aSNuno Sá if (ltc4283_is_word_reg(reg)) 1667*dd63353aSNuno Sá ret = i2c_smbus_read_word_swapped(client, reg); 1668*dd63353aSNuno Sá else 1669*dd63353aSNuno Sá ret = i2c_smbus_read_byte_data(client, reg); 1670*dd63353aSNuno Sá 1671*dd63353aSNuno Sá if (ret < 0) 1672*dd63353aSNuno Sá return ret; 1673*dd63353aSNuno Sá 1674*dd63353aSNuno Sá *val = ret; 1675*dd63353aSNuno Sá return 0; 1676*dd63353aSNuno Sá } 1677*dd63353aSNuno Sá 1678*dd63353aSNuno Sá static int ltc4283_reg_write(void *context, unsigned int reg, unsigned int val) 1679*dd63353aSNuno Sá { 1680*dd63353aSNuno Sá struct i2c_client *client = context; 1681*dd63353aSNuno Sá 1682*dd63353aSNuno Sá if (ltc4283_is_word_reg(reg)) 1683*dd63353aSNuno Sá return i2c_smbus_write_word_swapped(client, reg, val); 1684*dd63353aSNuno Sá 1685*dd63353aSNuno Sá return i2c_smbus_write_byte_data(client, reg, val); 1686*dd63353aSNuno Sá } 1687*dd63353aSNuno Sá 1688*dd63353aSNuno Sá static const struct regmap_bus ltc4283_regmap_bus = { 1689*dd63353aSNuno Sá .reg_read = ltc4283_reg_read, 1690*dd63353aSNuno Sá .reg_write = ltc4283_reg_write, 1691*dd63353aSNuno Sá }; 1692*dd63353aSNuno Sá 1693*dd63353aSNuno Sá static bool ltc4283_writable_reg(struct device *dev, unsigned int reg) 1694*dd63353aSNuno Sá { 1695*dd63353aSNuno Sá switch (reg) { 1696*dd63353aSNuno Sá case LTC4283_SYSTEM_STATUS ... LTC4283_FAULT_STATUS: 1697*dd63353aSNuno Sá return false; 1698*dd63353aSNuno Sá case LTC4283_RESERVED_OC: 1699*dd63353aSNuno Sá return false; 1700*dd63353aSNuno Sá case LTC4283_RESERVED_86 ... LTC4283_RESERVED_8F: 1701*dd63353aSNuno Sá return false; 1702*dd63353aSNuno Sá case LTC4283_RESERVED_91 ... LTC4283_RESERVED_A1: 1703*dd63353aSNuno Sá return false; 1704*dd63353aSNuno Sá case LTC4283_RESERVED_A3: 1705*dd63353aSNuno Sá return false; 1706*dd63353aSNuno Sá case LTC4283_RESERVED_AC: 1707*dd63353aSNuno Sá return false; 1708*dd63353aSNuno Sá case LTC4283_POWER_PLAY_MSB ... LTC4283_POWER_PLAY_LSB: 1709*dd63353aSNuno Sá return false; 1710*dd63353aSNuno Sá case LTC4283_RESERVED_F1 ... LTC4283_RESERVED_FF: 1711*dd63353aSNuno Sá return false; 1712*dd63353aSNuno Sá default: 1713*dd63353aSNuno Sá return true; 1714*dd63353aSNuno Sá } 1715*dd63353aSNuno Sá } 1716*dd63353aSNuno Sá 1717*dd63353aSNuno Sá static const struct regmap_config ltc4283_regmap_config = { 1718*dd63353aSNuno Sá .reg_bits = 8, 1719*dd63353aSNuno Sá .val_bits = 16, 1720*dd63353aSNuno Sá .max_register = 0xFF, 1721*dd63353aSNuno Sá .writeable_reg = ltc4283_writable_reg, 1722*dd63353aSNuno Sá }; 1723*dd63353aSNuno Sá 1724*dd63353aSNuno Sá static int ltc4283_probe(struct i2c_client *client) 1725*dd63353aSNuno Sá { 1726*dd63353aSNuno Sá struct device *dev = &client->dev, *hwmon; 1727*dd63353aSNuno Sá struct auxiliary_device *adev; 1728*dd63353aSNuno Sá struct ltc4283_hwmon *st; 1729*dd63353aSNuno Sá int ret, id; 1730*dd63353aSNuno Sá 1731*dd63353aSNuno Sá st = devm_kzalloc(dev, sizeof(*st), GFP_KERNEL); 1732*dd63353aSNuno Sá if (!st) 1733*dd63353aSNuno Sá return -ENOMEM; 1734*dd63353aSNuno Sá 1735*dd63353aSNuno Sá if (!i2c_check_functionality(client->adapter, 1736*dd63353aSNuno Sá I2C_FUNC_SMBUS_BYTE_DATA | 1737*dd63353aSNuno Sá I2C_FUNC_SMBUS_WORD_DATA | 1738*dd63353aSNuno Sá I2C_FUNC_SMBUS_READ_I2C_BLOCK)) 1739*dd63353aSNuno Sá return -EOPNOTSUPP; 1740*dd63353aSNuno Sá 1741*dd63353aSNuno Sá st->client = client; 1742*dd63353aSNuno Sá st->map = devm_regmap_init(dev, <c4283_regmap_bus, client, 1743*dd63353aSNuno Sá <c4283_regmap_config); 1744*dd63353aSNuno Sá if (IS_ERR(st->map)) 1745*dd63353aSNuno Sá return dev_err_probe(dev, PTR_ERR(st->map), 1746*dd63353aSNuno Sá "Failed to create regmap\n"); 1747*dd63353aSNuno Sá 1748*dd63353aSNuno Sá ret = ltc4283_setup(st, dev); 1749*dd63353aSNuno Sá if (ret) 1750*dd63353aSNuno Sá return ret; 1751*dd63353aSNuno Sá 1752*dd63353aSNuno Sá hwmon = devm_hwmon_device_register_with_info(dev, "ltc4283", st, 1753*dd63353aSNuno Sá <c4283_chip_info, NULL); 1754*dd63353aSNuno Sá 1755*dd63353aSNuno Sá if (IS_ERR(hwmon)) 1756*dd63353aSNuno Sá return PTR_ERR(hwmon); 1757*dd63353aSNuno Sá 1758*dd63353aSNuno Sá ltc4283_debugfs_init(st, client); 1759*dd63353aSNuno Sá 1760*dd63353aSNuno Sá if (!st->gpio_mask) 1761*dd63353aSNuno Sá return 0; 1762*dd63353aSNuno Sá 1763*dd63353aSNuno Sá id = (client->adapter->nr << 10) | client->addr; 1764*dd63353aSNuno Sá adev = __devm_auxiliary_device_create(dev, KBUILD_MODNAME, "gpio", 1765*dd63353aSNuno Sá &st->gpio_mask, id); 1766*dd63353aSNuno Sá if (!adev) 1767*dd63353aSNuno Sá return dev_err_probe(dev, -ENODEV, "Failed to add GPIO device\n"); 1768*dd63353aSNuno Sá 1769*dd63353aSNuno Sá return 0; 1770*dd63353aSNuno Sá } 1771*dd63353aSNuno Sá 1772*dd63353aSNuno Sá static const struct of_device_id ltc4283_of_match[] = { 1773*dd63353aSNuno Sá { .compatible = "adi,ltc4283" }, 1774*dd63353aSNuno Sá { } 1775*dd63353aSNuno Sá }; 1776*dd63353aSNuno Sá 1777*dd63353aSNuno Sá static const struct i2c_device_id ltc4283_i2c_id[] = { 1778*dd63353aSNuno Sá { "ltc4283" }, 1779*dd63353aSNuno Sá { } 1780*dd63353aSNuno Sá }; 1781*dd63353aSNuno Sá MODULE_DEVICE_TABLE(i2c, ltc4283_i2c_id); 1782*dd63353aSNuno Sá 1783*dd63353aSNuno Sá static struct i2c_driver ltc4283_driver = { 1784*dd63353aSNuno Sá .driver = { 1785*dd63353aSNuno Sá .name = "ltc4283", 1786*dd63353aSNuno Sá .of_match_table = ltc4283_of_match, 1787*dd63353aSNuno Sá }, 1788*dd63353aSNuno Sá .probe = ltc4283_probe, 1789*dd63353aSNuno Sá .id_table = ltc4283_i2c_id, 1790*dd63353aSNuno Sá }; 1791*dd63353aSNuno Sá module_i2c_driver(ltc4283_driver); 1792*dd63353aSNuno Sá 1793*dd63353aSNuno Sá MODULE_AUTHOR("Nuno Sá <nuno.sa@analog.com>"); 1794*dd63353aSNuno Sá MODULE_DESCRIPTION("LTC4283 Hot Swap Controller driver"); 1795*dd63353aSNuno Sá MODULE_LICENSE("GPL"); 1796