xref: /linux/drivers/hwmon/ltc4283.c (revision 9611c0ce215a66770ccbe5c126bf57ba8c31bcad)
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, &reg_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, &reg_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, &reg_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), &reg_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 = &ltc4283_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á 				   &ltc4283_in0_crit_fault_log);
1642*dd63353aSNuno Sá 	debugfs_create_file_unsafe("in0_lcrit_fault_log", 0400, i2c->debugfs, st,
1643*dd63353aSNuno Sá 				   &ltc4283_in0_lcrit_fault_log);
1644*dd63353aSNuno Sá 	debugfs_create_file_unsafe("in11_fet_bad_fault_log", 0400, i2c->debugfs, st,
1645*dd63353aSNuno Sá 				   &ltc4283_fet_bad_fault_log);
1646*dd63353aSNuno Sá 	debugfs_create_file_unsafe("in11_fet_short_fault_log", 0400, i2c->debugfs, st,
1647*dd63353aSNuno Sá 				   &ltc4283_fet_short_fault_log);
1648*dd63353aSNuno Sá 	debugfs_create_file_unsafe("curr1_crit_fault_log", 0400, i2c->debugfs, st,
1649*dd63353aSNuno Sá 				   &ltc4283_curr1_crit_fault_log);
1650*dd63353aSNuno Sá 	debugfs_create_file_unsafe("power1_failed_fault_log", 0400, i2c->debugfs, st,
1651*dd63353aSNuno Sá 				   &ltc4283_power1_failed_fault_log);
1652*dd63353aSNuno Sá 	debugfs_create_file_unsafe("power1_good_input_fault_log", 0400, i2c->debugfs,
1653*dd63353aSNuno Sá 				   st, &ltc4283_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, &ltc4283_regmap_bus, client,
1743*dd63353aSNuno Sá 				   &ltc4283_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á 						     &ltc4283_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