xref: /linux/drivers/hwmon/mcp9982.c (revision 0fc8f6200d2313278fbf4539bbab74677c685531)
1*e2fe950fSVictor Duicu // SPDX-License-Identifier: GPL-2.0+
2*e2fe950fSVictor Duicu /*
3*e2fe950fSVictor Duicu  * HWMON driver for MCP998X/33 and MCP998XD/33D Multichannel Automotive
4*e2fe950fSVictor Duicu  * Temperature Monitor Family
5*e2fe950fSVictor Duicu  *
6*e2fe950fSVictor Duicu  * Copyright (C) 2026 Microchip Technology Inc. and its subsidiaries
7*e2fe950fSVictor Duicu  *
8*e2fe950fSVictor Duicu  * Author: Victor Duicu <victor.duicu@microchip.com>
9*e2fe950fSVictor Duicu  *
10*e2fe950fSVictor Duicu  * Datasheet can be found here:
11*e2fe950fSVictor Duicu  * https://ww1.microchip.com/downloads/aemDocuments/documents/MSLD/ProductDocuments/DataSheets/MCP998X-Family-Data-Sheet-DS20006827.pdf
12*e2fe950fSVictor Duicu  */
13*e2fe950fSVictor Duicu 
14*e2fe950fSVictor Duicu #include <linux/array_size.h>
15*e2fe950fSVictor Duicu #include <linux/bitfield.h>
16*e2fe950fSVictor Duicu #include <linux/bitops.h>
17*e2fe950fSVictor Duicu #include <linux/bits.h>
18*e2fe950fSVictor Duicu #include <linux/byteorder/generic.h>
19*e2fe950fSVictor Duicu #include <linux/delay.h>
20*e2fe950fSVictor Duicu #include <linux/device/devres.h>
21*e2fe950fSVictor Duicu #include <linux/device.h>
22*e2fe950fSVictor Duicu #include <linux/dev_printk.h>
23*e2fe950fSVictor Duicu #include <linux/err.h>
24*e2fe950fSVictor Duicu #include <linux/hwmon.h>
25*e2fe950fSVictor Duicu #include <linux/i2c.h>
26*e2fe950fSVictor Duicu #include <linux/math.h>
27*e2fe950fSVictor Duicu #include <linux/minmax.h>
28*e2fe950fSVictor Duicu #include <linux/property.h>
29*e2fe950fSVictor Duicu #include <linux/regmap.h>
30*e2fe950fSVictor Duicu #include <linux/time64.h>
31*e2fe950fSVictor Duicu #include <linux/util_macros.h>
32*e2fe950fSVictor Duicu 
33*e2fe950fSVictor Duicu /* MCP9982 Registers */
34*e2fe950fSVictor Duicu #define MCP9982_HIGH_BYTE_ADDR(index)		(2 * (index))
35*e2fe950fSVictor Duicu #define MCP9982_ONE_SHOT_ADDR			0x0A
36*e2fe950fSVictor Duicu #define MCP9982_INTERNAL_HIGH_LIMIT_ADDR	0x0B
37*e2fe950fSVictor Duicu #define MCP9982_INTERNAL_LOW_LIMIT_ADDR		0x0C
38*e2fe950fSVictor Duicu #define MCP9982_EXT_HIGH_LIMIT_ADDR(index)	(4 * ((index) - 1) + 0x0D)
39*e2fe950fSVictor Duicu #define MCP9982_EXT_LOW_LIMIT_ADDR(index)	(4 * ((index) - 1) + 0x0F)
40*e2fe950fSVictor Duicu #define MCP9982_THERM_LIMIT_ADDR(index)		((index) + 0x1D)
41*e2fe950fSVictor Duicu #define MCP9982_CFG_ADDR			0x22
42*e2fe950fSVictor Duicu #define MCP9982_CONV_ADDR			0x24
43*e2fe950fSVictor Duicu #define MCP9982_HYS_ADDR			0x25
44*e2fe950fSVictor Duicu #define MCP9982_CONSEC_ALRT_ADDR		0x26
45*e2fe950fSVictor Duicu #define MCP9982_ALRT_CFG_ADDR			0x27
46*e2fe950fSVictor Duicu #define MCP9982_RUNNING_AVG_ADDR		0x28
47*e2fe950fSVictor Duicu #define MCP9982_HOTTEST_CFG_ADDR		0x29
48*e2fe950fSVictor Duicu #define MCP9982_STATUS_ADDR			0x2A
49*e2fe950fSVictor Duicu #define MCP9982_EXT_FAULT_STATUS_ADDR		0x2B
50*e2fe950fSVictor Duicu #define MCP9982_HIGH_LIMIT_STATUS_ADDR		0x2C
51*e2fe950fSVictor Duicu #define MCP9982_LOW_LIMIT_STATUS_ADDR		0x2D
52*e2fe950fSVictor Duicu #define MCP9982_THERM_LIMIT_STATUS_ADDR		0x2E
53*e2fe950fSVictor Duicu #define MCP9982_HOTTEST_HIGH_BYTE_ADDR		0x2F
54*e2fe950fSVictor Duicu #define MCP9982_HOTTEST_LOW_BYTE_ADDR		0x30
55*e2fe950fSVictor Duicu #define MCP9982_HOTTEST_STATUS_ADDR		0x31
56*e2fe950fSVictor Duicu #define MCP9982_THERM_SHTDWN_CFG_ADDR		0x32
57*e2fe950fSVictor Duicu #define MCP9982_HRDW_THERM_SHTDWN_LIMIT_ADDR	0x33
58*e2fe950fSVictor Duicu #define MCP9982_EXT_BETA_CFG_ADDR(index)	((index) + 0x33)
59*e2fe950fSVictor Duicu #define MCP9982_EXT_IDEAL_ADDR(index)		((index) + 0x35)
60*e2fe950fSVictor Duicu 
61*e2fe950fSVictor Duicu /* MCP9982 Bits */
62*e2fe950fSVictor Duicu #define MCP9982_CFG_MSKAL			BIT(7)
63*e2fe950fSVictor Duicu #define MCP9982_CFG_RS				BIT(6)
64*e2fe950fSVictor Duicu #define MCP9982_CFG_ATTHM			BIT(5)
65*e2fe950fSVictor Duicu #define MCP9982_CFG_RECD12			BIT(4)
66*e2fe950fSVictor Duicu #define MCP9982_CFG_RECD34			BIT(3)
67*e2fe950fSVictor Duicu #define MCP9982_CFG_RANGE			BIT(2)
68*e2fe950fSVictor Duicu #define MCP9982_CFG_DA_ENA			BIT(1)
69*e2fe950fSVictor Duicu #define MCP9982_CFG_APDD			BIT(0)
70*e2fe950fSVictor Duicu 
71*e2fe950fSVictor Duicu #define MCP9982_STATUS_BUSY			BIT(5)
72*e2fe950fSVictor Duicu 
73*e2fe950fSVictor Duicu /* Constants and default values */
74*e2fe950fSVictor Duicu #define MCP9982_MAX_NUM_CHANNELS		5
75*e2fe950fSVictor Duicu #define MCP9982_BETA_AUTODETECT			16
76*e2fe950fSVictor Duicu #define MCP9982_IDEALITY_DEFAULT		18
77*e2fe950fSVictor Duicu #define MCP9982_OFFSET				64
78*e2fe950fSVictor Duicu #define MCP9982_DEFAULT_CONSEC_ALRT_VAL		112
79*e2fe950fSVictor Duicu #define MCP9982_DEFAULT_HYS_VAL			10
80*e2fe950fSVictor Duicu #define MCP9982_DEFAULT_CONV_VAL		6
81*e2fe950fSVictor Duicu #define MCP9982_WAKE_UP_TIME_US			125000
82*e2fe950fSVictor Duicu #define MCP9982_WAKE_UP_TIME_MAX_US		130000
83*e2fe950fSVictor Duicu #define MCP9982_HIGH_LIMIT_DEFAULT		85000
84*e2fe950fSVictor Duicu #define MCP9982_LOW_LIMIT_DEFAULT		0
85*e2fe950fSVictor Duicu 
86*e2fe950fSVictor Duicu static const struct hwmon_channel_info * const mcp9985_info[] = {
87*e2fe950fSVictor Duicu 	HWMON_CHANNEL_INFO(temp,
88*e2fe950fSVictor Duicu 			   HWMON_T_INPUT | HWMON_T_LABEL | HWMON_T_MIN |
89*e2fe950fSVictor Duicu 			   HWMON_T_MIN_ALARM | HWMON_T_MAX | HWMON_T_MAX_ALARM |
90*e2fe950fSVictor Duicu 			   HWMON_T_MAX_HYST | HWMON_T_CRIT | HWMON_T_CRIT_ALARM |
91*e2fe950fSVictor Duicu 			   HWMON_T_CRIT_HYST,
92*e2fe950fSVictor Duicu 			   HWMON_T_INPUT | HWMON_T_LABEL | HWMON_T_MIN |
93*e2fe950fSVictor Duicu 			   HWMON_T_MIN_ALARM | HWMON_T_MAX | HWMON_T_MAX_ALARM |
94*e2fe950fSVictor Duicu 			   HWMON_T_MAX_HYST | HWMON_T_CRIT | HWMON_T_CRIT_ALARM |
95*e2fe950fSVictor Duicu 			   HWMON_T_CRIT_HYST,
96*e2fe950fSVictor Duicu 			   HWMON_T_INPUT | HWMON_T_LABEL | HWMON_T_MIN |
97*e2fe950fSVictor Duicu 			   HWMON_T_MIN_ALARM | HWMON_T_MAX | HWMON_T_MAX_ALARM |
98*e2fe950fSVictor Duicu 			   HWMON_T_MAX_HYST | HWMON_T_CRIT | HWMON_T_CRIT_ALARM |
99*e2fe950fSVictor Duicu 			   HWMON_T_CRIT_HYST,
100*e2fe950fSVictor Duicu 			   HWMON_T_INPUT | HWMON_T_LABEL | HWMON_T_MIN |
101*e2fe950fSVictor Duicu 			   HWMON_T_MIN_ALARM | HWMON_T_MAX | HWMON_T_MAX_ALARM |
102*e2fe950fSVictor Duicu 			   HWMON_T_MAX_HYST | HWMON_T_CRIT | HWMON_T_CRIT_ALARM |
103*e2fe950fSVictor Duicu 			   HWMON_T_CRIT_HYST,
104*e2fe950fSVictor Duicu 			   HWMON_T_INPUT | HWMON_T_LABEL | HWMON_T_MIN |
105*e2fe950fSVictor Duicu 			   HWMON_T_MIN_ALARM | HWMON_T_MAX | HWMON_T_MAX_ALARM |
106*e2fe950fSVictor Duicu 			   HWMON_T_MAX_HYST | HWMON_T_CRIT | HWMON_T_CRIT_ALARM |
107*e2fe950fSVictor Duicu 			   HWMON_T_CRIT_HYST),
108*e2fe950fSVictor Duicu 	HWMON_CHANNEL_INFO(chip,
109*e2fe950fSVictor Duicu 			   HWMON_C_UPDATE_INTERVAL),
110*e2fe950fSVictor Duicu 	NULL
111*e2fe950fSVictor Duicu };
112*e2fe950fSVictor Duicu 
113*e2fe950fSVictor Duicu /**
114*e2fe950fSVictor Duicu  * struct mcp9982_features - features of a mcp9982 instance
115*e2fe950fSVictor Duicu  * @name:			chip's name
116*e2fe950fSVictor Duicu  * @phys_channels:		number of physical channels supported by the chip
117*e2fe950fSVictor Duicu  * @hw_thermal_shutdown:	presence of hardware thermal shutdown circuitry
118*e2fe950fSVictor Duicu  * @allow_apdd:			whether the chip supports enabling APDD
119*e2fe950fSVictor Duicu  * @has_recd34:			whether the chip has the channels that are affected by recd34
120*e2fe950fSVictor Duicu  */
121*e2fe950fSVictor Duicu struct mcp9982_features {
122*e2fe950fSVictor Duicu 	const char	*name;
123*e2fe950fSVictor Duicu 	u8		phys_channels;
124*e2fe950fSVictor Duicu 	bool		hw_thermal_shutdown;
125*e2fe950fSVictor Duicu 	bool		allow_apdd;
126*e2fe950fSVictor Duicu 	bool		has_recd34;
127*e2fe950fSVictor Duicu };
128*e2fe950fSVictor Duicu 
129*e2fe950fSVictor Duicu static const struct mcp9982_features mcp9933_chip_config = {
130*e2fe950fSVictor Duicu 	.name = "mcp9933",
131*e2fe950fSVictor Duicu 	.phys_channels = 3,
132*e2fe950fSVictor Duicu 	.hw_thermal_shutdown = false,
133*e2fe950fSVictor Duicu 	.allow_apdd = true,
134*e2fe950fSVictor Duicu 	.has_recd34 = false,
135*e2fe950fSVictor Duicu };
136*e2fe950fSVictor Duicu 
137*e2fe950fSVictor Duicu static const struct mcp9982_features mcp9933d_chip_config = {
138*e2fe950fSVictor Duicu 	.name = "mcp9933d",
139*e2fe950fSVictor Duicu 	.phys_channels = 3,
140*e2fe950fSVictor Duicu 	.hw_thermal_shutdown = true,
141*e2fe950fSVictor Duicu 	.allow_apdd = true,
142*e2fe950fSVictor Duicu 	.has_recd34 = false,
143*e2fe950fSVictor Duicu };
144*e2fe950fSVictor Duicu 
145*e2fe950fSVictor Duicu static const struct mcp9982_features mcp9982_chip_config = {
146*e2fe950fSVictor Duicu 	.name = "mcp9982",
147*e2fe950fSVictor Duicu 	.phys_channels = 2,
148*e2fe950fSVictor Duicu 	.hw_thermal_shutdown = false,
149*e2fe950fSVictor Duicu 	.allow_apdd = false,
150*e2fe950fSVictor Duicu 	.has_recd34 = false,
151*e2fe950fSVictor Duicu };
152*e2fe950fSVictor Duicu 
153*e2fe950fSVictor Duicu static const struct mcp9982_features mcp9982d_chip_config = {
154*e2fe950fSVictor Duicu 	.name = "mcp9982d",
155*e2fe950fSVictor Duicu 	.phys_channels = 2,
156*e2fe950fSVictor Duicu 	.hw_thermal_shutdown = true,
157*e2fe950fSVictor Duicu 	.allow_apdd = false,
158*e2fe950fSVictor Duicu 	.has_recd34 = false,
159*e2fe950fSVictor Duicu };
160*e2fe950fSVictor Duicu 
161*e2fe950fSVictor Duicu static const struct mcp9982_features mcp9983_chip_config = {
162*e2fe950fSVictor Duicu 	.name = "mcp9983",
163*e2fe950fSVictor Duicu 	.phys_channels = 3,
164*e2fe950fSVictor Duicu 	.hw_thermal_shutdown = false,
165*e2fe950fSVictor Duicu 	.allow_apdd = false,
166*e2fe950fSVictor Duicu 	.has_recd34 = true,
167*e2fe950fSVictor Duicu };
168*e2fe950fSVictor Duicu 
169*e2fe950fSVictor Duicu static const struct mcp9982_features mcp9983d_chip_config = {
170*e2fe950fSVictor Duicu 	.name = "mcp9983d",
171*e2fe950fSVictor Duicu 	.phys_channels = 3,
172*e2fe950fSVictor Duicu 	.hw_thermal_shutdown = true,
173*e2fe950fSVictor Duicu 	.allow_apdd = false,
174*e2fe950fSVictor Duicu 	.has_recd34 = true,
175*e2fe950fSVictor Duicu };
176*e2fe950fSVictor Duicu 
177*e2fe950fSVictor Duicu static const struct mcp9982_features mcp9984_chip_config = {
178*e2fe950fSVictor Duicu 	.name = "mcp9984",
179*e2fe950fSVictor Duicu 	.phys_channels = 4,
180*e2fe950fSVictor Duicu 	.hw_thermal_shutdown = false,
181*e2fe950fSVictor Duicu 	.allow_apdd = true,
182*e2fe950fSVictor Duicu 	.has_recd34 = true,
183*e2fe950fSVictor Duicu };
184*e2fe950fSVictor Duicu 
185*e2fe950fSVictor Duicu static const struct mcp9982_features mcp9984d_chip_config = {
186*e2fe950fSVictor Duicu 	.name = "mcp9984d",
187*e2fe950fSVictor Duicu 	.phys_channels = 4,
188*e2fe950fSVictor Duicu 	.hw_thermal_shutdown = true,
189*e2fe950fSVictor Duicu 	.allow_apdd = true,
190*e2fe950fSVictor Duicu 	.has_recd34 = true,
191*e2fe950fSVictor Duicu };
192*e2fe950fSVictor Duicu 
193*e2fe950fSVictor Duicu static const struct mcp9982_features mcp9985_chip_config = {
194*e2fe950fSVictor Duicu 	.name = "mcp9985",
195*e2fe950fSVictor Duicu 	.phys_channels = 5,
196*e2fe950fSVictor Duicu 	.hw_thermal_shutdown = false,
197*e2fe950fSVictor Duicu 	.allow_apdd = true,
198*e2fe950fSVictor Duicu 	.has_recd34 = true,
199*e2fe950fSVictor Duicu };
200*e2fe950fSVictor Duicu 
201*e2fe950fSVictor Duicu static const struct mcp9982_features mcp9985d_chip_config = {
202*e2fe950fSVictor Duicu 	.name = "mcp9985d",
203*e2fe950fSVictor Duicu 	.phys_channels = 5,
204*e2fe950fSVictor Duicu 	.hw_thermal_shutdown = true,
205*e2fe950fSVictor Duicu 	.allow_apdd = true,
206*e2fe950fSVictor Duicu 	.has_recd34 = true,
207*e2fe950fSVictor Duicu };
208*e2fe950fSVictor Duicu 
209*e2fe950fSVictor Duicu static const unsigned int mcp9982_update_interval[11] = {
210*e2fe950fSVictor Duicu 	16000, 8000, 4000, 2000, 1000, 500, 250, 125, 64, 32, 16
211*e2fe950fSVictor Duicu };
212*e2fe950fSVictor Duicu 
213*e2fe950fSVictor Duicu /* MCP9982 regmap configuration */
214*e2fe950fSVictor Duicu static const struct regmap_range mcp9982_regmap_wr_ranges[] = {
215*e2fe950fSVictor Duicu 	regmap_reg_range(MCP9982_ONE_SHOT_ADDR, MCP9982_CFG_ADDR),
216*e2fe950fSVictor Duicu 	regmap_reg_range(MCP9982_CONV_ADDR, MCP9982_HOTTEST_CFG_ADDR),
217*e2fe950fSVictor Duicu 	regmap_reg_range(MCP9982_THERM_SHTDWN_CFG_ADDR, MCP9982_THERM_SHTDWN_CFG_ADDR),
218*e2fe950fSVictor Duicu 	regmap_reg_range(MCP9982_EXT_BETA_CFG_ADDR(1), MCP9982_EXT_IDEAL_ADDR(4)),
219*e2fe950fSVictor Duicu };
220*e2fe950fSVictor Duicu 
221*e2fe950fSVictor Duicu static const struct regmap_access_table mcp9982_regmap_wr_table = {
222*e2fe950fSVictor Duicu 	.yes_ranges = mcp9982_regmap_wr_ranges,
223*e2fe950fSVictor Duicu 	.n_yes_ranges = ARRAY_SIZE(mcp9982_regmap_wr_ranges),
224*e2fe950fSVictor Duicu };
225*e2fe950fSVictor Duicu 
226*e2fe950fSVictor Duicu static const struct regmap_range mcp9982_regmap_rd_ranges[] = {
227*e2fe950fSVictor Duicu 	regmap_reg_range(MCP9982_HIGH_BYTE_ADDR(0), MCP9982_CFG_ADDR),
228*e2fe950fSVictor Duicu 	regmap_reg_range(MCP9982_CONV_ADDR, MCP9982_EXT_IDEAL_ADDR(4)),
229*e2fe950fSVictor Duicu };
230*e2fe950fSVictor Duicu 
231*e2fe950fSVictor Duicu static const struct regmap_access_table mcp9982_regmap_rd_table = {
232*e2fe950fSVictor Duicu 	.yes_ranges = mcp9982_regmap_rd_ranges,
233*e2fe950fSVictor Duicu 	.n_yes_ranges = ARRAY_SIZE(mcp9982_regmap_rd_ranges),
234*e2fe950fSVictor Duicu };
235*e2fe950fSVictor Duicu 
236*e2fe950fSVictor Duicu static bool mcp9982_is_volatile_reg(struct device *dev, unsigned int reg)
237*e2fe950fSVictor Duicu {
238*e2fe950fSVictor Duicu 	switch (reg) {
239*e2fe950fSVictor Duicu 	case MCP9982_ONE_SHOT_ADDR:
240*e2fe950fSVictor Duicu 	case MCP9982_INTERNAL_HIGH_LIMIT_ADDR:
241*e2fe950fSVictor Duicu 	case MCP9982_INTERNAL_LOW_LIMIT_ADDR:
242*e2fe950fSVictor Duicu 	case MCP9982_EXT_LOW_LIMIT_ADDR(1):
243*e2fe950fSVictor Duicu 	case MCP9982_EXT_LOW_LIMIT_ADDR(1) + 1:
244*e2fe950fSVictor Duicu 	case MCP9982_EXT_LOW_LIMIT_ADDR(2):
245*e2fe950fSVictor Duicu 	case MCP9982_EXT_LOW_LIMIT_ADDR(2) + 1:
246*e2fe950fSVictor Duicu 	case MCP9982_EXT_LOW_LIMIT_ADDR(3):
247*e2fe950fSVictor Duicu 	case MCP9982_EXT_LOW_LIMIT_ADDR(3) + 1:
248*e2fe950fSVictor Duicu 	case MCP9982_EXT_LOW_LIMIT_ADDR(4):
249*e2fe950fSVictor Duicu 	case MCP9982_EXT_LOW_LIMIT_ADDR(4) + 1:
250*e2fe950fSVictor Duicu 	case MCP9982_EXT_HIGH_LIMIT_ADDR(1):
251*e2fe950fSVictor Duicu 	case MCP9982_EXT_HIGH_LIMIT_ADDR(1) + 1:
252*e2fe950fSVictor Duicu 	case MCP9982_EXT_HIGH_LIMIT_ADDR(2):
253*e2fe950fSVictor Duicu 	case MCP9982_EXT_HIGH_LIMIT_ADDR(2) + 1:
254*e2fe950fSVictor Duicu 	case MCP9982_EXT_HIGH_LIMIT_ADDR(3):
255*e2fe950fSVictor Duicu 	case MCP9982_EXT_HIGH_LIMIT_ADDR(3) + 1:
256*e2fe950fSVictor Duicu 	case MCP9982_EXT_HIGH_LIMIT_ADDR(4):
257*e2fe950fSVictor Duicu 	case MCP9982_EXT_HIGH_LIMIT_ADDR(4) + 1:
258*e2fe950fSVictor Duicu 	case MCP9982_THERM_LIMIT_ADDR(0):
259*e2fe950fSVictor Duicu 	case MCP9982_THERM_LIMIT_ADDR(1):
260*e2fe950fSVictor Duicu 	case MCP9982_THERM_LIMIT_ADDR(2):
261*e2fe950fSVictor Duicu 	case MCP9982_THERM_LIMIT_ADDR(3):
262*e2fe950fSVictor Duicu 	case MCP9982_THERM_LIMIT_ADDR(4):
263*e2fe950fSVictor Duicu 	case MCP9982_CFG_ADDR:
264*e2fe950fSVictor Duicu 	case MCP9982_CONV_ADDR:
265*e2fe950fSVictor Duicu 	case MCP9982_HYS_ADDR:
266*e2fe950fSVictor Duicu 	case MCP9982_CONSEC_ALRT_ADDR:
267*e2fe950fSVictor Duicu 	case MCP9982_ALRT_CFG_ADDR:
268*e2fe950fSVictor Duicu 	case MCP9982_RUNNING_AVG_ADDR:
269*e2fe950fSVictor Duicu 	case MCP9982_HOTTEST_CFG_ADDR:
270*e2fe950fSVictor Duicu 	case MCP9982_THERM_SHTDWN_CFG_ADDR:
271*e2fe950fSVictor Duicu 		return false;
272*e2fe950fSVictor Duicu 	default:
273*e2fe950fSVictor Duicu 		return true;
274*e2fe950fSVictor Duicu 	}
275*e2fe950fSVictor Duicu }
276*e2fe950fSVictor Duicu 
277*e2fe950fSVictor Duicu static const struct regmap_config mcp9982_regmap_config = {
278*e2fe950fSVictor Duicu 	.reg_bits = 8,
279*e2fe950fSVictor Duicu 	.val_bits = 8,
280*e2fe950fSVictor Duicu 	.rd_table = &mcp9982_regmap_rd_table,
281*e2fe950fSVictor Duicu 	.wr_table = &mcp9982_regmap_wr_table,
282*e2fe950fSVictor Duicu 	.volatile_reg = mcp9982_is_volatile_reg,
283*e2fe950fSVictor Duicu 	.max_register = MCP9982_EXT_IDEAL_ADDR(4),
284*e2fe950fSVictor Duicu 	.cache_type = REGCACHE_MAPLE,
285*e2fe950fSVictor Duicu };
286*e2fe950fSVictor Duicu 
287*e2fe950fSVictor Duicu /**
288*e2fe950fSVictor Duicu  * struct mcp9982_priv - information about chip parameters
289*e2fe950fSVictor Duicu  * @regmap:			device register map
290*e2fe950fSVictor Duicu  * @chip:			pointer to structure holding chip features
291*e2fe950fSVictor Duicu  * @labels:			labels of the channels
292*e2fe950fSVictor Duicu  * @interval_idx:		index representing the current update interval
293*e2fe950fSVictor Duicu  * @enabled_channel_mask:	mask containing which channels should be enabled
294*e2fe950fSVictor Duicu  * @num_channels:		number of active physical channels
295*e2fe950fSVictor Duicu  * @recd34_enable:		state of Resistance Error Correction(REC) on channels 3 and 4
296*e2fe950fSVictor Duicu  * @recd12_enable:		state of Resistance Error Correction(REC) on channels 1 and 2
297*e2fe950fSVictor Duicu  * @apdd_enable:		state of anti-parallel diode mode
298*e2fe950fSVictor Duicu  * @run_state:			chip is in Run state, otherwise is in Standby state
299*e2fe950fSVictor Duicu  */
300*e2fe950fSVictor Duicu struct mcp9982_priv {
301*e2fe950fSVictor Duicu 	struct regmap *regmap;
302*e2fe950fSVictor Duicu 	const struct mcp9982_features *chip;
303*e2fe950fSVictor Duicu 	const char *labels[MCP9982_MAX_NUM_CHANNELS];
304*e2fe950fSVictor Duicu 	unsigned int interval_idx;
305*e2fe950fSVictor Duicu 	unsigned long enabled_channel_mask;
306*e2fe950fSVictor Duicu 	u8 num_channels;
307*e2fe950fSVictor Duicu 	bool recd34_enable;
308*e2fe950fSVictor Duicu 	bool recd12_enable;
309*e2fe950fSVictor Duicu 	bool apdd_enable;
310*e2fe950fSVictor Duicu 	bool run_state;
311*e2fe950fSVictor Duicu };
312*e2fe950fSVictor Duicu 
313*e2fe950fSVictor Duicu static int mcp9982_read_limit(struct mcp9982_priv *priv, u8 address, long *val)
314*e2fe950fSVictor Duicu {
315*e2fe950fSVictor Duicu 	unsigned int limit, reg_high, reg_low;
316*e2fe950fSVictor Duicu 	int ret;
317*e2fe950fSVictor Duicu 
318*e2fe950fSVictor Duicu 	switch (address) {
319*e2fe950fSVictor Duicu 	case MCP9982_INTERNAL_HIGH_LIMIT_ADDR:
320*e2fe950fSVictor Duicu 	case MCP9982_INTERNAL_LOW_LIMIT_ADDR:
321*e2fe950fSVictor Duicu 	case MCP9982_THERM_LIMIT_ADDR(0):
322*e2fe950fSVictor Duicu 	case MCP9982_THERM_LIMIT_ADDR(1):
323*e2fe950fSVictor Duicu 	case MCP9982_THERM_LIMIT_ADDR(2):
324*e2fe950fSVictor Duicu 	case MCP9982_THERM_LIMIT_ADDR(3):
325*e2fe950fSVictor Duicu 	case MCP9982_THERM_LIMIT_ADDR(4):
326*e2fe950fSVictor Duicu 		ret = regmap_read(priv->regmap, address, &limit);
327*e2fe950fSVictor Duicu 		if (ret)
328*e2fe950fSVictor Duicu 			return ret;
329*e2fe950fSVictor Duicu 
330*e2fe950fSVictor Duicu 		*val = ((int)limit - MCP9982_OFFSET) * 1000;
331*e2fe950fSVictor Duicu 
332*e2fe950fSVictor Duicu 		return 0;
333*e2fe950fSVictor Duicu 	case MCP9982_EXT_HIGH_LIMIT_ADDR(1):
334*e2fe950fSVictor Duicu 	case MCP9982_EXT_HIGH_LIMIT_ADDR(2):
335*e2fe950fSVictor Duicu 	case MCP9982_EXT_HIGH_LIMIT_ADDR(3):
336*e2fe950fSVictor Duicu 	case MCP9982_EXT_HIGH_LIMIT_ADDR(4):
337*e2fe950fSVictor Duicu 	case MCP9982_EXT_LOW_LIMIT_ADDR(1):
338*e2fe950fSVictor Duicu 	case MCP9982_EXT_LOW_LIMIT_ADDR(2):
339*e2fe950fSVictor Duicu 	case MCP9982_EXT_LOW_LIMIT_ADDR(3):
340*e2fe950fSVictor Duicu 	case MCP9982_EXT_LOW_LIMIT_ADDR(4):
341*e2fe950fSVictor Duicu 		/*
342*e2fe950fSVictor Duicu 		 * In order to keep consistency with reading temperature memory region we will use
343*e2fe950fSVictor Duicu 		 * single byte I2C read.
344*e2fe950fSVictor Duicu 		 */
345*e2fe950fSVictor Duicu 		ret = regmap_read(priv->regmap, address, &reg_high);
346*e2fe950fSVictor Duicu 		if (ret)
347*e2fe950fSVictor Duicu 			return ret;
348*e2fe950fSVictor Duicu 
349*e2fe950fSVictor Duicu 		ret = regmap_read(priv->regmap, address + 1, &reg_low);
350*e2fe950fSVictor Duicu 		if (ret)
351*e2fe950fSVictor Duicu 			return ret;
352*e2fe950fSVictor Duicu 
353*e2fe950fSVictor Duicu 		*val = ((reg_high << 8) + reg_low) >> 5;
354*e2fe950fSVictor Duicu 		*val = (*val - (MCP9982_OFFSET << 3)) * 125;
355*e2fe950fSVictor Duicu 
356*e2fe950fSVictor Duicu 		return 0;
357*e2fe950fSVictor Duicu 	default:
358*e2fe950fSVictor Duicu 		return -EINVAL;
359*e2fe950fSVictor Duicu 	}
360*e2fe950fSVictor Duicu }
361*e2fe950fSVictor Duicu 
362*e2fe950fSVictor Duicu static int mcp9982_read(struct device *dev, enum hwmon_sensor_types type, u32 attr, int channel,
363*e2fe950fSVictor Duicu 			long *val)
364*e2fe950fSVictor Duicu {
365*e2fe950fSVictor Duicu 	struct mcp9982_priv *priv = dev_get_drvdata(dev);
366*e2fe950fSVictor Duicu 	unsigned int reg_high, reg_low, hyst, reg_status;
367*e2fe950fSVictor Duicu 	int ret;
368*e2fe950fSVictor Duicu 	u8 addr;
369*e2fe950fSVictor Duicu 
370*e2fe950fSVictor Duicu 	/*
371*e2fe950fSVictor Duicu 	 * In Standby State the conversion cycle must be initated manually in
372*e2fe950fSVictor Duicu 	 * order to read fresh temperature values and the status of the alarms.
373*e2fe950fSVictor Duicu 	 */
374*e2fe950fSVictor Duicu 	if (!priv->run_state) {
375*e2fe950fSVictor Duicu 		switch (type) {
376*e2fe950fSVictor Duicu 		case hwmon_temp:
377*e2fe950fSVictor Duicu 			switch (attr) {
378*e2fe950fSVictor Duicu 			case hwmon_temp_input:
379*e2fe950fSVictor Duicu 			case hwmon_temp_max_alarm:
380*e2fe950fSVictor Duicu 			case hwmon_temp_min_alarm:
381*e2fe950fSVictor Duicu 			case hwmon_temp_crit_alarm:
382*e2fe950fSVictor Duicu 				ret = regmap_write(priv->regmap, MCP9982_ONE_SHOT_ADDR, 1);
383*e2fe950fSVictor Duicu 				if (ret)
384*e2fe950fSVictor Duicu 					return ret;
385*e2fe950fSVictor Duicu 				/*
386*e2fe950fSVictor Duicu 				 * When the device is in Standby mode, 125 ms need
387*e2fe950fSVictor Duicu 				 * to pass from writing in One Shot register before
388*e2fe950fSVictor Duicu 				 * the conversion cycle begins.
389*e2fe950fSVictor Duicu 				 */
390*e2fe950fSVictor Duicu 				usleep_range(MCP9982_WAKE_UP_TIME_US, MCP9982_WAKE_UP_TIME_MAX_US);
391*e2fe950fSVictor Duicu 				ret = regmap_read_poll_timeout
392*e2fe950fSVictor Duicu 					       (priv->regmap, MCP9982_STATUS_ADDR,
393*e2fe950fSVictor Duicu 					       reg_status, !(reg_status & MCP9982_STATUS_BUSY),
394*e2fe950fSVictor Duicu 					       MCP9982_WAKE_UP_TIME_US,
395*e2fe950fSVictor Duicu 					       MCP9982_WAKE_UP_TIME_US * 10);
396*e2fe950fSVictor Duicu 				break;
397*e2fe950fSVictor Duicu 			}
398*e2fe950fSVictor Duicu 			break;
399*e2fe950fSVictor Duicu 		default:
400*e2fe950fSVictor Duicu 			break;
401*e2fe950fSVictor Duicu 		}
402*e2fe950fSVictor Duicu 	}
403*e2fe950fSVictor Duicu 
404*e2fe950fSVictor Duicu 	switch (type) {
405*e2fe950fSVictor Duicu 	case hwmon_temp:
406*e2fe950fSVictor Duicu 		switch (attr) {
407*e2fe950fSVictor Duicu 		case hwmon_temp_input:
408*e2fe950fSVictor Duicu 			/*
409*e2fe950fSVictor Duicu 			 * The only areas of memory that support SMBus block read are 80h->89h
410*e2fe950fSVictor Duicu 			 * (temperature memory block) and 90h->97h(status memory block).
411*e2fe950fSVictor Duicu 			 * In this context the read operation uses SMBus protocol and the first
412*e2fe950fSVictor Duicu 			 * value returned will be the number of addresses that can be read.
413*e2fe950fSVictor Duicu 			 * Temperature memory block is 10 bytes long and status memory block is 8
414*e2fe950fSVictor Duicu 			 * bytes long.
415*e2fe950fSVictor Duicu 			 *
416*e2fe950fSVictor Duicu 			 * Depending on the read instruction used, the chip behaves differently:
417*e2fe950fSVictor Duicu 			 * - regmap_bulk_read() when applied to the temperature memory block
418*e2fe950fSVictor Duicu 			 * (80h->89h), the chip replies with SMBus block read, including count,
419*e2fe950fSVictor Duicu 			 * additionally to the high and the low bytes. This function cannot be
420*e2fe950fSVictor Duicu 			 * applied on the memory region 00h->09h(memory area which does not support
421*e2fe950fSVictor Duicu 			 * block reads, returns wrong data) unless use_single_read is set in
422*e2fe950fSVictor Duicu 			 * regmap_config.
423*e2fe950fSVictor Duicu 			 *
424*e2fe950fSVictor Duicu 			 * - regmap_multi_reg_read() when applied to the 00h->09h area uses I2C
425*e2fe950fSVictor Duicu 			 * and returns only the high and low temperature bytes. When applied to
426*e2fe950fSVictor Duicu 			 * the temperature memory block (80h->89h) returns the count till the end of
427*e2fe950fSVictor Duicu 			 * the temperature memory block(aka SMBus count).
428*e2fe950fSVictor Duicu 			 *
429*e2fe950fSVictor Duicu 			 * - i2c_smbus_read_block_data() is not supported by all drivers.
430*e2fe950fSVictor Duicu 			 *
431*e2fe950fSVictor Duicu 			 * In order to keep consistency with reading limit memory region we will
432*e2fe950fSVictor Duicu 			 * use single byte I2C read.
433*e2fe950fSVictor Duicu 			 *
434*e2fe950fSVictor Duicu 			 * Low register is latched when high temperature register is read.
435*e2fe950fSVictor Duicu 			 */
436*e2fe950fSVictor Duicu 			ret = regmap_read(priv->regmap, MCP9982_HIGH_BYTE_ADDR(channel), &reg_high);
437*e2fe950fSVictor Duicu 			if (ret)
438*e2fe950fSVictor Duicu 				return ret;
439*e2fe950fSVictor Duicu 
440*e2fe950fSVictor Duicu 			ret = regmap_read(priv->regmap, MCP9982_HIGH_BYTE_ADDR(channel) + 1,
441*e2fe950fSVictor Duicu 					  &reg_low);
442*e2fe950fSVictor Duicu 			if (ret)
443*e2fe950fSVictor Duicu 				return ret;
444*e2fe950fSVictor Duicu 
445*e2fe950fSVictor Duicu 			*val = ((reg_high << 8) + reg_low) >> 5;
446*e2fe950fSVictor Duicu 			*val = (*val - (MCP9982_OFFSET << 3)) * 125;
447*e2fe950fSVictor Duicu 
448*e2fe950fSVictor Duicu 			return 0;
449*e2fe950fSVictor Duicu 		case hwmon_temp_max:
450*e2fe950fSVictor Duicu 			if (channel)
451*e2fe950fSVictor Duicu 				addr = MCP9982_EXT_HIGH_LIMIT_ADDR(channel);
452*e2fe950fSVictor Duicu 			else
453*e2fe950fSVictor Duicu 				addr = MCP9982_INTERNAL_HIGH_LIMIT_ADDR;
454*e2fe950fSVictor Duicu 
455*e2fe950fSVictor Duicu 			return mcp9982_read_limit(priv, addr, val);
456*e2fe950fSVictor Duicu 		case hwmon_temp_max_alarm:
457*e2fe950fSVictor Duicu 			*val = regmap_test_bits(priv->regmap, MCP9982_HIGH_LIMIT_STATUS_ADDR,
458*e2fe950fSVictor Duicu 						BIT(channel));
459*e2fe950fSVictor Duicu 			if (*val < 0)
460*e2fe950fSVictor Duicu 				return *val;
461*e2fe950fSVictor Duicu 
462*e2fe950fSVictor Duicu 			return 0;
463*e2fe950fSVictor Duicu 		case hwmon_temp_max_hyst:
464*e2fe950fSVictor Duicu 			if (channel)
465*e2fe950fSVictor Duicu 				addr = MCP9982_EXT_HIGH_LIMIT_ADDR(channel);
466*e2fe950fSVictor Duicu 			else
467*e2fe950fSVictor Duicu 				addr = MCP9982_INTERNAL_HIGH_LIMIT_ADDR;
468*e2fe950fSVictor Duicu 			ret = mcp9982_read_limit(priv, addr, val);
469*e2fe950fSVictor Duicu 			if (ret)
470*e2fe950fSVictor Duicu 				return ret;
471*e2fe950fSVictor Duicu 
472*e2fe950fSVictor Duicu 			ret = regmap_read(priv->regmap, MCP9982_HYS_ADDR, &hyst);
473*e2fe950fSVictor Duicu 			if (ret)
474*e2fe950fSVictor Duicu 				return ret;
475*e2fe950fSVictor Duicu 
476*e2fe950fSVictor Duicu 			*val -= hyst * 1000;
477*e2fe950fSVictor Duicu 
478*e2fe950fSVictor Duicu 			return 0;
479*e2fe950fSVictor Duicu 		case hwmon_temp_min:
480*e2fe950fSVictor Duicu 			if (channel)
481*e2fe950fSVictor Duicu 				addr = MCP9982_EXT_LOW_LIMIT_ADDR(channel);
482*e2fe950fSVictor Duicu 			else
483*e2fe950fSVictor Duicu 				addr = MCP9982_INTERNAL_LOW_LIMIT_ADDR;
484*e2fe950fSVictor Duicu 
485*e2fe950fSVictor Duicu 			return mcp9982_read_limit(priv, addr, val);
486*e2fe950fSVictor Duicu 		case hwmon_temp_min_alarm:
487*e2fe950fSVictor Duicu 			*val = regmap_test_bits(priv->regmap, MCP9982_LOW_LIMIT_STATUS_ADDR,
488*e2fe950fSVictor Duicu 						BIT(channel));
489*e2fe950fSVictor Duicu 			if (*val < 0)
490*e2fe950fSVictor Duicu 				return *val;
491*e2fe950fSVictor Duicu 
492*e2fe950fSVictor Duicu 			return 0;
493*e2fe950fSVictor Duicu 		case hwmon_temp_crit:
494*e2fe950fSVictor Duicu 			return mcp9982_read_limit(priv, MCP9982_THERM_LIMIT_ADDR(channel), val);
495*e2fe950fSVictor Duicu 		case hwmon_temp_crit_alarm:
496*e2fe950fSVictor Duicu 			*val = regmap_test_bits(priv->regmap, MCP9982_THERM_LIMIT_STATUS_ADDR,
497*e2fe950fSVictor Duicu 						BIT(channel));
498*e2fe950fSVictor Duicu 			if (*val < 0)
499*e2fe950fSVictor Duicu 				return *val;
500*e2fe950fSVictor Duicu 
501*e2fe950fSVictor Duicu 			return 0;
502*e2fe950fSVictor Duicu 		case hwmon_temp_crit_hyst:
503*e2fe950fSVictor Duicu 			ret = mcp9982_read_limit(priv, MCP9982_THERM_LIMIT_ADDR(channel), val);
504*e2fe950fSVictor Duicu 			if (ret)
505*e2fe950fSVictor Duicu 				return ret;
506*e2fe950fSVictor Duicu 
507*e2fe950fSVictor Duicu 			ret = regmap_read(priv->regmap, MCP9982_HYS_ADDR, &hyst);
508*e2fe950fSVictor Duicu 			if (ret)
509*e2fe950fSVictor Duicu 				return ret;
510*e2fe950fSVictor Duicu 
511*e2fe950fSVictor Duicu 			*val -= hyst * 1000;
512*e2fe950fSVictor Duicu 
513*e2fe950fSVictor Duicu 			return 0;
514*e2fe950fSVictor Duicu 		default:
515*e2fe950fSVictor Duicu 			return -EINVAL;
516*e2fe950fSVictor Duicu 		}
517*e2fe950fSVictor Duicu 	case hwmon_chip:
518*e2fe950fSVictor Duicu 		switch (attr) {
519*e2fe950fSVictor Duicu 		case hwmon_chip_update_interval:
520*e2fe950fSVictor Duicu 			*val = mcp9982_update_interval[priv->interval_idx];
521*e2fe950fSVictor Duicu 			return 0;
522*e2fe950fSVictor Duicu 		default:
523*e2fe950fSVictor Duicu 			return -EINVAL;
524*e2fe950fSVictor Duicu 		}
525*e2fe950fSVictor Duicu 	default:
526*e2fe950fSVictor Duicu 		return -EINVAL;
527*e2fe950fSVictor Duicu 	}
528*e2fe950fSVictor Duicu }
529*e2fe950fSVictor Duicu 
530*e2fe950fSVictor Duicu static int mcp9982_read_label(struct device *dev, enum hwmon_sensor_types type, u32 attr,
531*e2fe950fSVictor Duicu 			      int channel, const char **str)
532*e2fe950fSVictor Duicu {
533*e2fe950fSVictor Duicu 	struct mcp9982_priv *priv = dev_get_drvdata(dev);
534*e2fe950fSVictor Duicu 
535*e2fe950fSVictor Duicu 	switch (type) {
536*e2fe950fSVictor Duicu 	case hwmon_temp:
537*e2fe950fSVictor Duicu 		switch (attr) {
538*e2fe950fSVictor Duicu 		case hwmon_temp_label:
539*e2fe950fSVictor Duicu 			*str = priv->labels[channel];
540*e2fe950fSVictor Duicu 			return 0;
541*e2fe950fSVictor Duicu 		default:
542*e2fe950fSVictor Duicu 			return -EOPNOTSUPP;
543*e2fe950fSVictor Duicu 		}
544*e2fe950fSVictor Duicu 	default:
545*e2fe950fSVictor Duicu 		return -EOPNOTSUPP;
546*e2fe950fSVictor Duicu 	}
547*e2fe950fSVictor Duicu }
548*e2fe950fSVictor Duicu 
549*e2fe950fSVictor Duicu static int mcp9982_write_limit(struct mcp9982_priv *priv, u8 address, long val)
550*e2fe950fSVictor Duicu {
551*e2fe950fSVictor Duicu 	int ret;
552*e2fe950fSVictor Duicu 	unsigned int regh, regl;
553*e2fe950fSVictor Duicu 
554*e2fe950fSVictor Duicu 	switch (address) {
555*e2fe950fSVictor Duicu 	case MCP9982_INTERNAL_HIGH_LIMIT_ADDR:
556*e2fe950fSVictor Duicu 	case MCP9982_INTERNAL_LOW_LIMIT_ADDR:
557*e2fe950fSVictor Duicu 	case MCP9982_THERM_LIMIT_ADDR(0):
558*e2fe950fSVictor Duicu 	case MCP9982_THERM_LIMIT_ADDR(1):
559*e2fe950fSVictor Duicu 	case MCP9982_THERM_LIMIT_ADDR(2):
560*e2fe950fSVictor Duicu 	case MCP9982_THERM_LIMIT_ADDR(3):
561*e2fe950fSVictor Duicu 	case MCP9982_THERM_LIMIT_ADDR(4):
562*e2fe950fSVictor Duicu 		regh = DIV_ROUND_CLOSEST(val, 1000);
563*e2fe950fSVictor Duicu 		regh = clamp_val(regh, 0, 255);
564*e2fe950fSVictor Duicu 
565*e2fe950fSVictor Duicu 		return regmap_write(priv->regmap, address, regh);
566*e2fe950fSVictor Duicu 	case MCP9982_EXT_HIGH_LIMIT_ADDR(1):
567*e2fe950fSVictor Duicu 	case MCP9982_EXT_HIGH_LIMIT_ADDR(2):
568*e2fe950fSVictor Duicu 	case MCP9982_EXT_HIGH_LIMIT_ADDR(3):
569*e2fe950fSVictor Duicu 	case MCP9982_EXT_HIGH_LIMIT_ADDR(4):
570*e2fe950fSVictor Duicu 	case MCP9982_EXT_LOW_LIMIT_ADDR(1):
571*e2fe950fSVictor Duicu 	case MCP9982_EXT_LOW_LIMIT_ADDR(2):
572*e2fe950fSVictor Duicu 	case MCP9982_EXT_LOW_LIMIT_ADDR(3):
573*e2fe950fSVictor Duicu 	case MCP9982_EXT_LOW_LIMIT_ADDR(4):
574*e2fe950fSVictor Duicu 		val = DIV_ROUND_CLOSEST(val, 125);
575*e2fe950fSVictor Duicu 		regh = (val >> 3) & 0xff;
576*e2fe950fSVictor Duicu 		regl = (val & 0x07) << 5;
577*e2fe950fSVictor Duicu 		/* Block writing is not supported by the chip. */
578*e2fe950fSVictor Duicu 		ret = regmap_write(priv->regmap, address, regh);
579*e2fe950fSVictor Duicu 		if (ret)
580*e2fe950fSVictor Duicu 			return ret;
581*e2fe950fSVictor Duicu 
582*e2fe950fSVictor Duicu 		return regmap_write(priv->regmap, address + 1, regl);
583*e2fe950fSVictor Duicu 	default:
584*e2fe950fSVictor Duicu 		return -EINVAL;
585*e2fe950fSVictor Duicu 	}
586*e2fe950fSVictor Duicu }
587*e2fe950fSVictor Duicu 
588*e2fe950fSVictor Duicu static int mcp9982_write_hyst(struct mcp9982_priv *priv, int channel, long val)
589*e2fe950fSVictor Duicu {
590*e2fe950fSVictor Duicu 	int hyst, ret;
591*e2fe950fSVictor Duicu 	int limit;
592*e2fe950fSVictor Duicu 
593*e2fe950fSVictor Duicu 	val = DIV_ROUND_CLOSEST(val, 1000);
594*e2fe950fSVictor Duicu 	val = clamp_val(val, 0, 255);
595*e2fe950fSVictor Duicu 
596*e2fe950fSVictor Duicu 	/* Therm register is 8 bits and so it keeps only the integer part of the temperature. */
597*e2fe950fSVictor Duicu 	ret = regmap_read(priv->regmap, MCP9982_THERM_LIMIT_ADDR(channel), &limit);
598*e2fe950fSVictor Duicu 	if (ret)
599*e2fe950fSVictor Duicu 		return ret;
600*e2fe950fSVictor Duicu 
601*e2fe950fSVictor Duicu 	hyst = clamp_val(limit - val, 0, 255);
602*e2fe950fSVictor Duicu 
603*e2fe950fSVictor Duicu 	return regmap_write(priv->regmap, MCP9982_HYS_ADDR, hyst);
604*e2fe950fSVictor Duicu }
605*e2fe950fSVictor Duicu 
606*e2fe950fSVictor Duicu static int mcp9982_write(struct device *dev, enum hwmon_sensor_types type, u32 attr, int channel,
607*e2fe950fSVictor Duicu 			 long val)
608*e2fe950fSVictor Duicu {
609*e2fe950fSVictor Duicu 	struct mcp9982_priv *priv = dev_get_drvdata(dev);
610*e2fe950fSVictor Duicu 	unsigned int idx;
611*e2fe950fSVictor Duicu 	u8 addr;
612*e2fe950fSVictor Duicu 
613*e2fe950fSVictor Duicu 	switch (type) {
614*e2fe950fSVictor Duicu 	case hwmon_chip:
615*e2fe950fSVictor Duicu 		switch (attr) {
616*e2fe950fSVictor Duicu 		case hwmon_chip_update_interval:
617*e2fe950fSVictor Duicu 
618*e2fe950fSVictor Duicu 			/*
619*e2fe950fSVictor Duicu 			 * For MCP998XD and MCP9933D update interval
620*e2fe950fSVictor Duicu 			 * can't be longer than 1 second.
621*e2fe950fSVictor Duicu 			 */
622*e2fe950fSVictor Duicu 			if (priv->chip->hw_thermal_shutdown)
623*e2fe950fSVictor Duicu 				val = clamp_val(val, 0, 1000);
624*e2fe950fSVictor Duicu 
625*e2fe950fSVictor Duicu 			idx = find_closest_descending(val, mcp9982_update_interval,
626*e2fe950fSVictor Duicu 						      ARRAY_SIZE(mcp9982_update_interval));
627*e2fe950fSVictor Duicu 			priv->interval_idx = idx;
628*e2fe950fSVictor Duicu 
629*e2fe950fSVictor Duicu 			return regmap_write(priv->regmap, MCP9982_CONV_ADDR, idx);
630*e2fe950fSVictor Duicu 		default:
631*e2fe950fSVictor Duicu 			return -EINVAL;
632*e2fe950fSVictor Duicu 		}
633*e2fe950fSVictor Duicu 	case hwmon_temp:
634*e2fe950fSVictor Duicu 		val = clamp_val(val, -64000, 191875);
635*e2fe950fSVictor Duicu 		val = val + (MCP9982_OFFSET * 1000);
636*e2fe950fSVictor Duicu 		switch (attr) {
637*e2fe950fSVictor Duicu 		case hwmon_temp_max:
638*e2fe950fSVictor Duicu 			if (channel)
639*e2fe950fSVictor Duicu 				addr = MCP9982_EXT_HIGH_LIMIT_ADDR(channel);
640*e2fe950fSVictor Duicu 			else
641*e2fe950fSVictor Duicu 				addr = MCP9982_INTERNAL_HIGH_LIMIT_ADDR;
642*e2fe950fSVictor Duicu 
643*e2fe950fSVictor Duicu 			return mcp9982_write_limit(priv, addr, val);
644*e2fe950fSVictor Duicu 		case hwmon_temp_min:
645*e2fe950fSVictor Duicu 			if (channel)
646*e2fe950fSVictor Duicu 				addr = MCP9982_EXT_LOW_LIMIT_ADDR(channel);
647*e2fe950fSVictor Duicu 			else
648*e2fe950fSVictor Duicu 				addr = MCP9982_INTERNAL_LOW_LIMIT_ADDR;
649*e2fe950fSVictor Duicu 
650*e2fe950fSVictor Duicu 			return mcp9982_write_limit(priv, addr, val);
651*e2fe950fSVictor Duicu 		case hwmon_temp_crit:
652*e2fe950fSVictor Duicu 			return mcp9982_write_limit(priv, MCP9982_THERM_LIMIT_ADDR(channel), val);
653*e2fe950fSVictor Duicu 		case hwmon_temp_crit_hyst:
654*e2fe950fSVictor Duicu 			return mcp9982_write_hyst(priv, channel, val);
655*e2fe950fSVictor Duicu 		default:
656*e2fe950fSVictor Duicu 			return -EINVAL;
657*e2fe950fSVictor Duicu 		}
658*e2fe950fSVictor Duicu 	default:
659*e2fe950fSVictor Duicu 		return -EINVAL;
660*e2fe950fSVictor Duicu 	}
661*e2fe950fSVictor Duicu }
662*e2fe950fSVictor Duicu 
663*e2fe950fSVictor Duicu static umode_t mcp9982_is_visible(const void *_data, enum hwmon_sensor_types type, u32 attr,
664*e2fe950fSVictor Duicu 				  int channel)
665*e2fe950fSVictor Duicu {
666*e2fe950fSVictor Duicu 	const struct mcp9982_priv *priv = _data;
667*e2fe950fSVictor Duicu 
668*e2fe950fSVictor Duicu 	if (!test_bit(channel, &priv->enabled_channel_mask))
669*e2fe950fSVictor Duicu 		return 0;
670*e2fe950fSVictor Duicu 
671*e2fe950fSVictor Duicu 	switch (type) {
672*e2fe950fSVictor Duicu 	case hwmon_temp:
673*e2fe950fSVictor Duicu 		switch (attr) {
674*e2fe950fSVictor Duicu 		case hwmon_temp_label:
675*e2fe950fSVictor Duicu 			if (priv->labels[channel])
676*e2fe950fSVictor Duicu 				return 0444;
677*e2fe950fSVictor Duicu 			else
678*e2fe950fSVictor Duicu 				return 0;
679*e2fe950fSVictor Duicu 		case hwmon_temp_input:
680*e2fe950fSVictor Duicu 		case hwmon_temp_min_alarm:
681*e2fe950fSVictor Duicu 		case hwmon_temp_max_alarm:
682*e2fe950fSVictor Duicu 		case hwmon_temp_max_hyst:
683*e2fe950fSVictor Duicu 		case hwmon_temp_crit_alarm:
684*e2fe950fSVictor Duicu 			return 0444;
685*e2fe950fSVictor Duicu 		case hwmon_temp_min:
686*e2fe950fSVictor Duicu 		case hwmon_temp_max:
687*e2fe950fSVictor Duicu 		case hwmon_temp_crit:
688*e2fe950fSVictor Duicu 		case hwmon_temp_crit_hyst:
689*e2fe950fSVictor Duicu 			return 0644;
690*e2fe950fSVictor Duicu 		default:
691*e2fe950fSVictor Duicu 			return 0;
692*e2fe950fSVictor Duicu 		}
693*e2fe950fSVictor Duicu 	case hwmon_chip:
694*e2fe950fSVictor Duicu 		switch (attr) {
695*e2fe950fSVictor Duicu 		case hwmon_chip_update_interval:
696*e2fe950fSVictor Duicu 			return 0644;
697*e2fe950fSVictor Duicu 		default:
698*e2fe950fSVictor Duicu 			return 0;
699*e2fe950fSVictor Duicu 		}
700*e2fe950fSVictor Duicu 	default:
701*e2fe950fSVictor Duicu 		return 0;
702*e2fe950fSVictor Duicu 	}
703*e2fe950fSVictor Duicu }
704*e2fe950fSVictor Duicu 
705*e2fe950fSVictor Duicu static const struct hwmon_ops mcp9982_hwmon_ops = {
706*e2fe950fSVictor Duicu 	.is_visible = mcp9982_is_visible,
707*e2fe950fSVictor Duicu 	.read = mcp9982_read,
708*e2fe950fSVictor Duicu 	.read_string = mcp9982_read_label,
709*e2fe950fSVictor Duicu 	.write = mcp9982_write,
710*e2fe950fSVictor Duicu };
711*e2fe950fSVictor Duicu 
712*e2fe950fSVictor Duicu static int mcp9982_init(struct device *dev, struct mcp9982_priv *priv)
713*e2fe950fSVictor Duicu {
714*e2fe950fSVictor Duicu 	long high_limit, low_limit;
715*e2fe950fSVictor Duicu 	unsigned int i;
716*e2fe950fSVictor Duicu 	int ret;
717*e2fe950fSVictor Duicu 	u8 val;
718*e2fe950fSVictor Duicu 
719*e2fe950fSVictor Duicu 	/* Chips 82/83 and 82D/83D do not support anti-parallel diode mode. */
720*e2fe950fSVictor Duicu 	if (!priv->chip->allow_apdd && priv->apdd_enable == 1)
721*e2fe950fSVictor Duicu 		return dev_err_probe(dev, -EINVAL, "Incorrect setting of APDD.\n");
722*e2fe950fSVictor Duicu 
723*e2fe950fSVictor Duicu 	/* Chips with "D" work only in Run state. */
724*e2fe950fSVictor Duicu 	if (priv->chip->hw_thermal_shutdown && !priv->run_state)
725*e2fe950fSVictor Duicu 		return dev_err_probe(dev, -EINVAL, "Incorrect setting of Power State.\n");
726*e2fe950fSVictor Duicu 
727*e2fe950fSVictor Duicu 	/* All chips with "D" in the name must have RECD12 enabled. */
728*e2fe950fSVictor Duicu 	if (priv->chip->hw_thermal_shutdown && !priv->recd12_enable)
729*e2fe950fSVictor Duicu 		return dev_err_probe(dev, -EINVAL, "Incorrect setting of RECD12.\n");
730*e2fe950fSVictor Duicu 	/* Chips 83D/84D/85D must have RECD34 enabled. */
731*e2fe950fSVictor Duicu 	if (priv->chip->hw_thermal_shutdown)
732*e2fe950fSVictor Duicu 		if ((priv->chip->has_recd34 && !priv->recd34_enable))
733*e2fe950fSVictor Duicu 			return dev_err_probe(dev, -EINVAL, "Incorrect setting of RECD34.\n");
734*e2fe950fSVictor Duicu 
735*e2fe950fSVictor Duicu 	/*
736*e2fe950fSVictor Duicu 	 * Set default values in registers.
737*e2fe950fSVictor Duicu 	 * APDD, RECD12 and RECD34 are active on 0.
738*e2fe950fSVictor Duicu 	 */
739*e2fe950fSVictor Duicu 	val = FIELD_PREP(MCP9982_CFG_MSKAL, 1) |
740*e2fe950fSVictor Duicu 	      FIELD_PREP(MCP9982_CFG_RS, !priv->run_state) |
741*e2fe950fSVictor Duicu 	      FIELD_PREP(MCP9982_CFG_ATTHM, 1) |
742*e2fe950fSVictor Duicu 	      FIELD_PREP(MCP9982_CFG_RECD12, !priv->recd12_enable) |
743*e2fe950fSVictor Duicu 	      FIELD_PREP(MCP9982_CFG_RECD34, !priv->recd34_enable) |
744*e2fe950fSVictor Duicu 	      FIELD_PREP(MCP9982_CFG_RANGE, 1) | FIELD_PREP(MCP9982_CFG_DA_ENA, 0) |
745*e2fe950fSVictor Duicu 	      FIELD_PREP(MCP9982_CFG_APDD, !priv->apdd_enable);
746*e2fe950fSVictor Duicu 
747*e2fe950fSVictor Duicu 	ret = regmap_write(priv->regmap, MCP9982_CFG_ADDR, val);
748*e2fe950fSVictor Duicu 	if (ret)
749*e2fe950fSVictor Duicu 		return ret;
750*e2fe950fSVictor Duicu 
751*e2fe950fSVictor Duicu 	/*
752*e2fe950fSVictor Duicu 	 * Read initial value from register.
753*e2fe950fSVictor Duicu 	 * The convert register utilises only 4 out of 8 bits.
754*e2fe950fSVictor Duicu 	 * Numerical values 0->10 set their respective update intervals,
755*e2fe950fSVictor Duicu 	 * while numerical values 11->15 default to 1 second.
756*e2fe950fSVictor Duicu 	 */
757*e2fe950fSVictor Duicu 	ret = regmap_read(priv->regmap, MCP9982_CONV_ADDR, &priv->interval_idx);
758*e2fe950fSVictor Duicu 	if (ret)
759*e2fe950fSVictor Duicu 		return ret;
760*e2fe950fSVictor Duicu 	if (priv->interval_idx >= 11)
761*e2fe950fSVictor Duicu 		priv->interval_idx = 4;
762*e2fe950fSVictor Duicu 
763*e2fe950fSVictor Duicu 	ret = regmap_write(priv->regmap, MCP9982_HYS_ADDR, MCP9982_DEFAULT_HYS_VAL);
764*e2fe950fSVictor Duicu 	if (ret)
765*e2fe950fSVictor Duicu 		return ret;
766*e2fe950fSVictor Duicu 
767*e2fe950fSVictor Duicu 	ret = regmap_write(priv->regmap, MCP9982_CONSEC_ALRT_ADDR, MCP9982_DEFAULT_CONSEC_ALRT_VAL);
768*e2fe950fSVictor Duicu 	if (ret)
769*e2fe950fSVictor Duicu 		return ret;
770*e2fe950fSVictor Duicu 
771*e2fe950fSVictor Duicu 	ret = regmap_write(priv->regmap, MCP9982_ALRT_CFG_ADDR, 0);
772*e2fe950fSVictor Duicu 	if (ret)
773*e2fe950fSVictor Duicu 		return ret;
774*e2fe950fSVictor Duicu 
775*e2fe950fSVictor Duicu 	ret = regmap_write(priv->regmap, MCP9982_RUNNING_AVG_ADDR, 0);
776*e2fe950fSVictor Duicu 	if (ret)
777*e2fe950fSVictor Duicu 		return ret;
778*e2fe950fSVictor Duicu 
779*e2fe950fSVictor Duicu 	ret = regmap_write(priv->regmap, MCP9982_HOTTEST_CFG_ADDR, 0);
780*e2fe950fSVictor Duicu 	if (ret)
781*e2fe950fSVictor Duicu 		return ret;
782*e2fe950fSVictor Duicu 
783*e2fe950fSVictor Duicu 	/*
784*e2fe950fSVictor Duicu 	 * Only external channels 1 and 2 support beta compensation.
785*e2fe950fSVictor Duicu 	 * Set beta auto-detection.
786*e2fe950fSVictor Duicu 	 */
787*e2fe950fSVictor Duicu 	for (i = 1; i < 3; i++)
788*e2fe950fSVictor Duicu 		if (test_bit(i, &priv->enabled_channel_mask)) {
789*e2fe950fSVictor Duicu 			ret = regmap_write(priv->regmap, MCP9982_EXT_BETA_CFG_ADDR(i),
790*e2fe950fSVictor Duicu 					   MCP9982_BETA_AUTODETECT);
791*e2fe950fSVictor Duicu 			if (ret)
792*e2fe950fSVictor Duicu 				return ret;
793*e2fe950fSVictor Duicu 		}
794*e2fe950fSVictor Duicu 
795*e2fe950fSVictor Duicu 	high_limit = MCP9982_HIGH_LIMIT_DEFAULT + (MCP9982_OFFSET * 1000);
796*e2fe950fSVictor Duicu 	low_limit = MCP9982_LOW_LIMIT_DEFAULT + (MCP9982_OFFSET * 1000);
797*e2fe950fSVictor Duicu 
798*e2fe950fSVictor Duicu 	/* Set default values for internal channel limits. */
799*e2fe950fSVictor Duicu 	if (test_bit(0, &priv->enabled_channel_mask)) {
800*e2fe950fSVictor Duicu 		ret = mcp9982_write_limit(priv, MCP9982_INTERNAL_HIGH_LIMIT_ADDR, high_limit);
801*e2fe950fSVictor Duicu 		if (ret)
802*e2fe950fSVictor Duicu 			return ret;
803*e2fe950fSVictor Duicu 
804*e2fe950fSVictor Duicu 		ret = mcp9982_write_limit(priv, MCP9982_INTERNAL_LOW_LIMIT_ADDR, low_limit);
805*e2fe950fSVictor Duicu 		if (ret)
806*e2fe950fSVictor Duicu 			return ret;
807*e2fe950fSVictor Duicu 
808*e2fe950fSVictor Duicu 		ret = mcp9982_write_limit(priv, MCP9982_THERM_LIMIT_ADDR(0), high_limit);
809*e2fe950fSVictor Duicu 		if (ret)
810*e2fe950fSVictor Duicu 			return ret;
811*e2fe950fSVictor Duicu 	}
812*e2fe950fSVictor Duicu 
813*e2fe950fSVictor Duicu 	/* Set ideality factor and limits to default for external channels. */
814*e2fe950fSVictor Duicu 	for (i = 1; i < MCP9982_MAX_NUM_CHANNELS; i++)
815*e2fe950fSVictor Duicu 		if (test_bit(i, &priv->enabled_channel_mask)) {
816*e2fe950fSVictor Duicu 			ret = regmap_write(priv->regmap, MCP9982_EXT_IDEAL_ADDR(i),
817*e2fe950fSVictor Duicu 					   MCP9982_IDEALITY_DEFAULT);
818*e2fe950fSVictor Duicu 			if (ret)
819*e2fe950fSVictor Duicu 				return ret;
820*e2fe950fSVictor Duicu 
821*e2fe950fSVictor Duicu 			ret = mcp9982_write_limit(priv, MCP9982_EXT_HIGH_LIMIT_ADDR(i), high_limit);
822*e2fe950fSVictor Duicu 			if (ret)
823*e2fe950fSVictor Duicu 				return ret;
824*e2fe950fSVictor Duicu 
825*e2fe950fSVictor Duicu 			ret = mcp9982_write_limit(priv, MCP9982_EXT_LOW_LIMIT_ADDR(i), low_limit);
826*e2fe950fSVictor Duicu 			if (ret)
827*e2fe950fSVictor Duicu 				return ret;
828*e2fe950fSVictor Duicu 
829*e2fe950fSVictor Duicu 			ret = mcp9982_write_limit(priv, MCP9982_THERM_LIMIT_ADDR(i), high_limit);
830*e2fe950fSVictor Duicu 			if (ret)
831*e2fe950fSVictor Duicu 				return ret;
832*e2fe950fSVictor Duicu 		}
833*e2fe950fSVictor Duicu 
834*e2fe950fSVictor Duicu 	return 0;
835*e2fe950fSVictor Duicu }
836*e2fe950fSVictor Duicu 
837*e2fe950fSVictor Duicu static int mcp9982_parse_fw_config(struct device *dev, int device_nr_channels)
838*e2fe950fSVictor Duicu {
839*e2fe950fSVictor Duicu 	struct mcp9982_priv *priv = dev_get_drvdata(dev);
840*e2fe950fSVictor Duicu 	unsigned int reg_nr;
841*e2fe950fSVictor Duicu 	int ret;
842*e2fe950fSVictor Duicu 
843*e2fe950fSVictor Duicu 	/* Initialise internal channel( which is always present ). */
844*e2fe950fSVictor Duicu 	priv->labels[0] = "internal diode";
845*e2fe950fSVictor Duicu 	priv->enabled_channel_mask = 1;
846*e2fe950fSVictor Duicu 
847*e2fe950fSVictor Duicu 	/* Default values to work on systems without devicetree or firmware nodes. */
848*e2fe950fSVictor Duicu 	if (!dev_fwnode(dev)) {
849*e2fe950fSVictor Duicu 		priv->num_channels = device_nr_channels;
850*e2fe950fSVictor Duicu 		priv->enabled_channel_mask = BIT(priv->num_channels) - 1;
851*e2fe950fSVictor Duicu 		priv->apdd_enable = false;
852*e2fe950fSVictor Duicu 		priv->recd12_enable = true;
853*e2fe950fSVictor Duicu 		priv->recd34_enable = true;
854*e2fe950fSVictor Duicu 		priv->run_state = true;
855*e2fe950fSVictor Duicu 		return 0;
856*e2fe950fSVictor Duicu 	}
857*e2fe950fSVictor Duicu 
858*e2fe950fSVictor Duicu 	priv->apdd_enable =
859*e2fe950fSVictor Duicu 		device_property_read_bool(dev, "microchip,enable-anti-parallel");
860*e2fe950fSVictor Duicu 
861*e2fe950fSVictor Duicu 	priv->recd12_enable =
862*e2fe950fSVictor Duicu 		device_property_read_bool(dev, "microchip,parasitic-res-on-channel1-2");
863*e2fe950fSVictor Duicu 
864*e2fe950fSVictor Duicu 	priv->recd34_enable =
865*e2fe950fSVictor Duicu 		device_property_read_bool(dev, "microchip,parasitic-res-on-channel3-4");
866*e2fe950fSVictor Duicu 
867*e2fe950fSVictor Duicu 	priv->run_state =
868*e2fe950fSVictor Duicu 		device_property_read_bool(dev, "microchip,power-state");
869*e2fe950fSVictor Duicu 
870*e2fe950fSVictor Duicu 	priv->num_channels = device_get_child_node_count(dev) + 1;
871*e2fe950fSVictor Duicu 
872*e2fe950fSVictor Duicu 	if (priv->num_channels > device_nr_channels)
873*e2fe950fSVictor Duicu 		return dev_err_probe(dev, -EINVAL,
874*e2fe950fSVictor Duicu 				     "More channels than the chip supports.\n");
875*e2fe950fSVictor Duicu 
876*e2fe950fSVictor Duicu 	/* Read information about the external channels. */
877*e2fe950fSVictor Duicu 	device_for_each_named_child_node_scoped(dev, child, "channel") {
878*e2fe950fSVictor Duicu 		reg_nr = 0;
879*e2fe950fSVictor Duicu 		ret = fwnode_property_read_u32(child, "reg", &reg_nr);
880*e2fe950fSVictor Duicu 		if (ret || !reg_nr || reg_nr >= device_nr_channels)
881*e2fe950fSVictor Duicu 			return dev_err_probe(dev, -EINVAL,
882*e2fe950fSVictor Duicu 			  "Channel reg is incorrectly set.\n");
883*e2fe950fSVictor Duicu 
884*e2fe950fSVictor Duicu 		fwnode_property_read_string(child, "label", &priv->labels[reg_nr]);
885*e2fe950fSVictor Duicu 		set_bit(reg_nr, &priv->enabled_channel_mask);
886*e2fe950fSVictor Duicu 	}
887*e2fe950fSVictor Duicu 
888*e2fe950fSVictor Duicu 	return 0;
889*e2fe950fSVictor Duicu }
890*e2fe950fSVictor Duicu 
891*e2fe950fSVictor Duicu static const struct hwmon_chip_info mcp998x_chip_info = {
892*e2fe950fSVictor Duicu 	.ops = &mcp9982_hwmon_ops,
893*e2fe950fSVictor Duicu 	.info = mcp9985_info,
894*e2fe950fSVictor Duicu };
895*e2fe950fSVictor Duicu 
896*e2fe950fSVictor Duicu static int mcp9982_probe(struct i2c_client *client)
897*e2fe950fSVictor Duicu {
898*e2fe950fSVictor Duicu 	const struct mcp9982_features *chip;
899*e2fe950fSVictor Duicu 	struct device *dev = &client->dev;
900*e2fe950fSVictor Duicu 	struct mcp9982_priv *priv;
901*e2fe950fSVictor Duicu 	struct device *hwmon_dev;
902*e2fe950fSVictor Duicu 	int ret;
903*e2fe950fSVictor Duicu 
904*e2fe950fSVictor Duicu 	priv = devm_kzalloc(dev, sizeof(struct mcp9982_priv), GFP_KERNEL);
905*e2fe950fSVictor Duicu 	if (!priv)
906*e2fe950fSVictor Duicu 		return -ENOMEM;
907*e2fe950fSVictor Duicu 
908*e2fe950fSVictor Duicu 	priv->regmap = devm_regmap_init_i2c(client, &mcp9982_regmap_config);
909*e2fe950fSVictor Duicu 
910*e2fe950fSVictor Duicu 	if (IS_ERR(priv->regmap))
911*e2fe950fSVictor Duicu 		return dev_err_probe(dev, PTR_ERR(priv->regmap),
912*e2fe950fSVictor Duicu 				     "Cannot initialize register map.\n");
913*e2fe950fSVictor Duicu 
914*e2fe950fSVictor Duicu 	dev_set_drvdata(dev, priv);
915*e2fe950fSVictor Duicu 
916*e2fe950fSVictor Duicu 	chip = i2c_get_match_data(client);
917*e2fe950fSVictor Duicu 	if (!chip)
918*e2fe950fSVictor Duicu 		return -EINVAL;
919*e2fe950fSVictor Duicu 	priv->chip = chip;
920*e2fe950fSVictor Duicu 
921*e2fe950fSVictor Duicu 	ret = mcp9982_parse_fw_config(dev, chip->phys_channels);
922*e2fe950fSVictor Duicu 	if (ret)
923*e2fe950fSVictor Duicu 		return ret;
924*e2fe950fSVictor Duicu 
925*e2fe950fSVictor Duicu 	ret = mcp9982_init(dev, priv);
926*e2fe950fSVictor Duicu 	if (ret)
927*e2fe950fSVictor Duicu 		return ret;
928*e2fe950fSVictor Duicu 
929*e2fe950fSVictor Duicu 	hwmon_dev = devm_hwmon_device_register_with_info(dev, chip->name, priv,
930*e2fe950fSVictor Duicu 							 &mcp998x_chip_info, NULL);
931*e2fe950fSVictor Duicu 
932*e2fe950fSVictor Duicu 	return PTR_ERR_OR_ZERO(hwmon_dev);
933*e2fe950fSVictor Duicu }
934*e2fe950fSVictor Duicu 
935*e2fe950fSVictor Duicu static const struct i2c_device_id mcp9982_id[] = {
936*e2fe950fSVictor Duicu 	{ .name = "mcp9933", .driver_data = (kernel_ulong_t)&mcp9933_chip_config },
937*e2fe950fSVictor Duicu 	{ .name = "mcp9933d", .driver_data = (kernel_ulong_t)&mcp9933d_chip_config },
938*e2fe950fSVictor Duicu 	{ .name = "mcp9982", .driver_data = (kernel_ulong_t)&mcp9982_chip_config },
939*e2fe950fSVictor Duicu 	{ .name = "mcp9982d", .driver_data = (kernel_ulong_t)&mcp9982d_chip_config },
940*e2fe950fSVictor Duicu 	{ .name = "mcp9983", .driver_data = (kernel_ulong_t)&mcp9983_chip_config },
941*e2fe950fSVictor Duicu 	{ .name = "mcp9983d", .driver_data = (kernel_ulong_t)&mcp9983d_chip_config },
942*e2fe950fSVictor Duicu 	{ .name = "mcp9984", .driver_data = (kernel_ulong_t)&mcp9984_chip_config },
943*e2fe950fSVictor Duicu 	{ .name = "mcp9984d", .driver_data = (kernel_ulong_t)&mcp9984d_chip_config },
944*e2fe950fSVictor Duicu 	{ .name = "mcp9985", .driver_data = (kernel_ulong_t)&mcp9985_chip_config },
945*e2fe950fSVictor Duicu 	{ .name = "mcp9985d", .driver_data = (kernel_ulong_t)&mcp9985d_chip_config },
946*e2fe950fSVictor Duicu 	{ }
947*e2fe950fSVictor Duicu };
948*e2fe950fSVictor Duicu MODULE_DEVICE_TABLE(i2c, mcp9982_id);
949*e2fe950fSVictor Duicu 
950*e2fe950fSVictor Duicu static const struct of_device_id mcp9982_of_match[] = {
951*e2fe950fSVictor Duicu 	{
952*e2fe950fSVictor Duicu 		.compatible = "microchip,mcp9933",
953*e2fe950fSVictor Duicu 		.data = &mcp9933_chip_config,
954*e2fe950fSVictor Duicu 	}, {
955*e2fe950fSVictor Duicu 		.compatible = "microchip,mcp9933d",
956*e2fe950fSVictor Duicu 		.data = &mcp9933d_chip_config,
957*e2fe950fSVictor Duicu 	}, {
958*e2fe950fSVictor Duicu 		.compatible = "microchip,mcp9982",
959*e2fe950fSVictor Duicu 		.data = &mcp9982_chip_config,
960*e2fe950fSVictor Duicu 	}, {
961*e2fe950fSVictor Duicu 		.compatible = "microchip,mcp9982d",
962*e2fe950fSVictor Duicu 		.data = &mcp9982d_chip_config,
963*e2fe950fSVictor Duicu 	}, {
964*e2fe950fSVictor Duicu 		.compatible = "microchip,mcp9983",
965*e2fe950fSVictor Duicu 		.data = &mcp9983_chip_config,
966*e2fe950fSVictor Duicu 	}, {
967*e2fe950fSVictor Duicu 		.compatible = "microchip,mcp9983d",
968*e2fe950fSVictor Duicu 		.data = &mcp9983d_chip_config,
969*e2fe950fSVictor Duicu 	}, {
970*e2fe950fSVictor Duicu 		.compatible = "microchip,mcp9984",
971*e2fe950fSVictor Duicu 		.data = &mcp9984_chip_config,
972*e2fe950fSVictor Duicu 	}, {
973*e2fe950fSVictor Duicu 		.compatible = "microchip,mcp9984d",
974*e2fe950fSVictor Duicu 		.data = &mcp9984d_chip_config,
975*e2fe950fSVictor Duicu 	}, {
976*e2fe950fSVictor Duicu 		.compatible = "microchip,mcp9985",
977*e2fe950fSVictor Duicu 		.data = &mcp9985_chip_config,
978*e2fe950fSVictor Duicu 	}, {
979*e2fe950fSVictor Duicu 		.compatible = "microchip,mcp9985d",
980*e2fe950fSVictor Duicu 		.data = &mcp9985d_chip_config,
981*e2fe950fSVictor Duicu 	},
982*e2fe950fSVictor Duicu 	{ }
983*e2fe950fSVictor Duicu };
984*e2fe950fSVictor Duicu MODULE_DEVICE_TABLE(of, mcp9982_of_match);
985*e2fe950fSVictor Duicu 
986*e2fe950fSVictor Duicu static struct i2c_driver mcp9982_driver = {
987*e2fe950fSVictor Duicu 	.driver	 = {
988*e2fe950fSVictor Duicu 		.name = "mcp9982",
989*e2fe950fSVictor Duicu 		.of_match_table = mcp9982_of_match,
990*e2fe950fSVictor Duicu 	},
991*e2fe950fSVictor Duicu 	.probe = mcp9982_probe,
992*e2fe950fSVictor Duicu 	.id_table = mcp9982_id,
993*e2fe950fSVictor Duicu };
994*e2fe950fSVictor Duicu module_i2c_driver(mcp9982_driver);
995*e2fe950fSVictor Duicu 
996*e2fe950fSVictor Duicu MODULE_AUTHOR("Victor Duicu <victor.duicu@microchip.com>");
997*e2fe950fSVictor Duicu MODULE_DESCRIPTION("MCP998X/33 and MCP998XD/33D Multichannel Automotive Temperature Monitor Driver");
998*e2fe950fSVictor Duicu MODULE_LICENSE("GPL");
999