xref: /linux/drivers/hwmon/emc1812.c (revision 9611c0ce215a66770ccbe5c126bf57ba8c31bcad)
1*54b15c59SMarius Cristea // SPDX-License-Identifier: GPL-2.0+
2*54b15c59SMarius Cristea /*
3*54b15c59SMarius Cristea  * HWMON driver for Microchip EMC1812/13/14/15/33 Multichannel high-accuracy
4*54b15c59SMarius Cristea  * 2-wire low-voltage remote diode temperature monitor family.
5*54b15c59SMarius Cristea  *
6*54b15c59SMarius Cristea  * Copyright (C) 2026 Microchip Technology Inc. and its subsidiaries
7*54b15c59SMarius Cristea  *
8*54b15c59SMarius Cristea  * Author: Marius Cristea <marius.cristea@microchip.com>
9*54b15c59SMarius Cristea  *
10*54b15c59SMarius Cristea  * Datasheet can be found here:
11*54b15c59SMarius Cristea  * https://ww1.microchip.com/downloads/aemDocuments/documents/MSLD/ProductDocuments/DataSheets/EMC1812-3-4-5-33-Data-Sheet-DS20005751.pdf
12*54b15c59SMarius Cristea  */
13*54b15c59SMarius Cristea 
14*54b15c59SMarius Cristea #include <linux/bitfield.h>
15*54b15c59SMarius Cristea #include <linux/bitops.h>
16*54b15c59SMarius Cristea #include <linux/bits.h>
17*54b15c59SMarius Cristea #include <linux/delay.h>
18*54b15c59SMarius Cristea #include <linux/err.h>
19*54b15c59SMarius Cristea #include <linux/hwmon.h>
20*54b15c59SMarius Cristea #include <linux/i2c.h>
21*54b15c59SMarius Cristea #include <linux/kernel.h>
22*54b15c59SMarius Cristea #include <linux/math64.h>
23*54b15c59SMarius Cristea #include <linux/property.h>
24*54b15c59SMarius Cristea #include <linux/regmap.h>
25*54b15c59SMarius Cristea #include <linux/string.h>
26*54b15c59SMarius Cristea #include <linux/units.h>
27*54b15c59SMarius Cristea #include <linux/util_macros.h>
28*54b15c59SMarius Cristea 
29*54b15c59SMarius Cristea /* EMC1812 Registers Addresses */
30*54b15c59SMarius Cristea #define EMC1812_STATUS_ADDR				0x02
31*54b15c59SMarius Cristea #define EMC1812_CONFIG_LO_ADDR				0x03
32*54b15c59SMarius Cristea 
33*54b15c59SMarius Cristea #define EMC1812_CFG_ADDR				0x09
34*54b15c59SMarius Cristea #define EMC1812_CONV_ADDR				0x0A
35*54b15c59SMarius Cristea #define EMC1812_INT_DIODE_HIGH_LIMIT_ADDR		0x0B
36*54b15c59SMarius Cristea #define EMC1812_INT_DIODE_LOW_LIMIT_ADDR		0x0C
37*54b15c59SMarius Cristea #define EMC1812_EXT1_HIGH_LIMIT_HIGH_BYTE_ADDR		0x0D
38*54b15c59SMarius Cristea #define EMC1812_EXT1_LOW_LIMIT_HIGH_BYTE_ADDR		0x0E
39*54b15c59SMarius Cristea #define EMC1812_ONE_SHOT_ADDR				0x0F
40*54b15c59SMarius Cristea 
41*54b15c59SMarius Cristea #define EMC1812_EXT1_HIGH_LIMIT_LOW_BYTE_ADDR		0x13
42*54b15c59SMarius Cristea #define EMC1812_EXT1_LOW_LIMIT_LOW_BYTE_ADDR		0x14
43*54b15c59SMarius Cristea #define EMC1812_EXT2_HIGH_LIMIT_HIGH_BYTE_ADDR		0x15
44*54b15c59SMarius Cristea #define EMC1812_EXT2_LOW_LIMIT_HIGH_BYTE_ADDR		0x16
45*54b15c59SMarius Cristea #define EMC1812_EXT2_HIGH_LIMIT_LOW_BYTE_ADDR		0x17
46*54b15c59SMarius Cristea #define EMC1812_EXT2_LOW_LIMIT_LOW_BYTE_ADDR		0x18
47*54b15c59SMarius Cristea #define EMC1812_EXT1_THERM_LIMIT_ADDR			0x19
48*54b15c59SMarius Cristea #define EMC1812_EXT2_THERM_LIMIT_ADDR			0x1A
49*54b15c59SMarius Cristea #define EMC1812_EXT_DIODE_FAULT_STATUS_ADDR		0x1B
50*54b15c59SMarius Cristea 
51*54b15c59SMarius Cristea #define EMC1812_DIODE_FAULT_MASK_ADDR			0x1F
52*54b15c59SMarius Cristea #define EMC1812_INT_DIODE_THERM_LIMIT_ADDR		0x20
53*54b15c59SMarius Cristea #define EMC1812_THRM_HYS_ADDR				0x21
54*54b15c59SMarius Cristea #define EMC1812_CONSEC_ALERT_ADDR			0x22
55*54b15c59SMarius Cristea 
56*54b15c59SMarius Cristea #define EMC1812_EXT1_BETA_CONFIG_ADDR			0x25
57*54b15c59SMarius Cristea #define EMC1812_EXT2_BETA_CONFIG_ADDR			0x26
58*54b15c59SMarius Cristea #define EMC1812_EXT1_IDEALITY_FACTOR_ADDR		0x27
59*54b15c59SMarius Cristea #define EMC1812_EXT2_IDEALITY_FACTOR_ADDR		0x28
60*54b15c59SMarius Cristea 
61*54b15c59SMarius Cristea #define EMC1812_EXT3_HIGH_LIMIT_HIGH_BYTE_ADDR		0x2C
62*54b15c59SMarius Cristea #define EMC1812_EXT3_LOW_LIMIT_HIGH_BYTE_ADDR		0x2D
63*54b15c59SMarius Cristea #define EMC1812_EXT3_HIGH_LIMIT_LOW_BYTE_ADDR		0x2E
64*54b15c59SMarius Cristea #define EMC1812_EXT3_LOW_LIMIT_LOW_BYTE_ADDR		0x2F
65*54b15c59SMarius Cristea #define EMC1812_EXT3_THERM_LIMIT_ADDR			0x30
66*54b15c59SMarius Cristea #define EMC1812_EXT3_IDEALITY_FACTOR_ADDR		0x31
67*54b15c59SMarius Cristea 
68*54b15c59SMarius Cristea #define EMC1812_EXT4_HIGH_LIMIT_HIGH_BYTE_ADDR		0x34
69*54b15c59SMarius Cristea #define EMC1812_EXT4_LOW_LIMIT_HIGH_BYTE_ADDR		0x35
70*54b15c59SMarius Cristea #define EMC1812_EXT4_HIGH_LIMIT_LOW_BYTE_ADDR		0x36
71*54b15c59SMarius Cristea #define EMC1812_EXT4_LOW_LIMIT_LOW_BYTE_ADDR		0x37
72*54b15c59SMarius Cristea #define EMC1812_EXT4_THERM_LIMIT_ADDR			0x38
73*54b15c59SMarius Cristea #define EMC1812_EXT4_IDEALITY_FACTOR_ADDR		0x39
74*54b15c59SMarius Cristea #define EMC1812_HIGH_LIMIT_STATUS_ADDR			0x3A
75*54b15c59SMarius Cristea #define EMC1812_LOW_LIMIT_STATUS_ADDR			0x3B
76*54b15c59SMarius Cristea #define EMC1812_THERM_LIMIT_STATUS_ADDR			0x3C
77*54b15c59SMarius Cristea #define EMC1812_ROC_GAIN_ADDR				0x3D
78*54b15c59SMarius Cristea #define EMC1812_ROC_CONFIG_ADDR				0x3E
79*54b15c59SMarius Cristea #define EMC1812_ROC_STATUS_ADDR				0x3F
80*54b15c59SMarius Cristea #define EMC1812_R1_RESH_ADDR				0x40
81*54b15c59SMarius Cristea #define EMC1812_R1_LIMH_ADDR				0x41
82*54b15c59SMarius Cristea #define EMC1812_R1_LIML_ADDR				0x42
83*54b15c59SMarius Cristea #define EMC1812_R1_SMPL_ADDR				0x43
84*54b15c59SMarius Cristea #define EMC1812_R2_RESH_ADDR				0x44
85*54b15c59SMarius Cristea #define EMC1812_R2_3_RESL_ADDR				0x45
86*54b15c59SMarius Cristea #define EMC1812_R2_LIMH_ADDR				0x46
87*54b15c59SMarius Cristea #define EMC1812_R2_LIML_ADDR				0x47
88*54b15c59SMarius Cristea #define EMC1812_R2_SMPL_ADDR				0x48
89*54b15c59SMarius Cristea #define EMC1812_PER_MAXTH_1_ADDR			0x49
90*54b15c59SMarius Cristea #define EMC1812_PER_MAXT1L_ADDR				0x4A
91*54b15c59SMarius Cristea #define EMC1812_PER_MAXTH_2_ADDR			0x4B
92*54b15c59SMarius Cristea #define EMC1812_PER_MAXT2_3L_ADDR			0x4C
93*54b15c59SMarius Cristea #define EMC1812_GBL_MAXT1H_ADDR				0x4D
94*54b15c59SMarius Cristea #define EMC1812_GBL_MAXT1L_ADDR				0x4E
95*54b15c59SMarius Cristea #define EMC1812_GBL_MAXT2H_ADDR				0x4F
96*54b15c59SMarius Cristea #define EMC1812_GBL_MAXT2L_ADDR				0x50
97*54b15c59SMarius Cristea #define EMC1812_FILTER_SEL_ADDR				0x51
98*54b15c59SMarius Cristea 
99*54b15c59SMarius Cristea #define EMC1812_INT_HIGH_BYTE_ADDR		0x60
100*54b15c59SMarius Cristea #define EMC1812_INT_LOW_BYTE_ADDR		0x61
101*54b15c59SMarius Cristea #define EMC1812_EXT1_HIGH_BYTE_ADDR		0x62
102*54b15c59SMarius Cristea #define EMC1812_EXT1_LOW_BYTE_ADDR		0x63
103*54b15c59SMarius Cristea #define EMC1812_EXT2_HIGH_BYTE_ADDR		0x64
104*54b15c59SMarius Cristea #define EMC1812_EXT2_LOW_BYTE_ADDR		0x65
105*54b15c59SMarius Cristea #define EMC1812_EXT3_HIGH_BYTE_ADDR		0x66
106*54b15c59SMarius Cristea #define EMC1812_EXT3_LOW_BYTE_ADDR		0x67
107*54b15c59SMarius Cristea #define EMC1812_EXT4_HIGH_BYTE_ADDR		0x68
108*54b15c59SMarius Cristea #define EMC1812_EXT4_LOW_BYTE_ADDR		0x69
109*54b15c59SMarius Cristea #define EMC1812_HOTTEST_DIODE_HIGH_BYTE_ADDR	0x6A
110*54b15c59SMarius Cristea #define EMC1812_HOTTEST_DIODE_LOW_BYTE_ADDR	0x6B
111*54b15c59SMarius Cristea #define EMC1812_HOTTEST_STATUS_ADDR		0x6C
112*54b15c59SMarius Cristea #define EMC1812_HOTTEST_CFG_ADDR		0x6D
113*54b15c59SMarius Cristea 
114*54b15c59SMarius Cristea #define EMC1812_PRODUCT_ID_ADDR		0xFD
115*54b15c59SMarius Cristea #define EMC1812_MANUFACTURER_ID_ADDR	0xFE
116*54b15c59SMarius Cristea #define EMC1812_REVISION_ADDR		0xFF
117*54b15c59SMarius Cristea 
118*54b15c59SMarius Cristea /* EMC1812 Config Bits */
119*54b15c59SMarius Cristea #define EMC1812_CFG_MSKAL		BIT(7)
120*54b15c59SMarius Cristea #define EMC1812_CFG_RS			BIT(6)
121*54b15c59SMarius Cristea #define EMC1812_CFG_ATTHM		BIT(5)
122*54b15c59SMarius Cristea #define EMC1812_CFG_RECD12		BIT(4)
123*54b15c59SMarius Cristea #define EMC1812_CFG_RECD34		BIT(3)
124*54b15c59SMarius Cristea #define EMC1812_CFG_RANGE		BIT(2)
125*54b15c59SMarius Cristea #define EMC1812_CFG_DA_ENA		BIT(1)
126*54b15c59SMarius Cristea #define EMC1812_CFG_APDD		BIT(0)
127*54b15c59SMarius Cristea 
128*54b15c59SMarius Cristea /* EMC1812 Status Bits */
129*54b15c59SMarius Cristea #define EMC1812_STATUS_ROCF		BIT(7)
130*54b15c59SMarius Cristea #define EMC1812_STATUS_HOTCHG		BIT(6)
131*54b15c59SMarius Cristea #define EMC1812_STATUS_BUSY		BIT(5)
132*54b15c59SMarius Cristea #define EMC1812_STATUS_HIGH		BIT(4)
133*54b15c59SMarius Cristea #define EMC1812_STATUS_LOW		BIT(3)
134*54b15c59SMarius Cristea #define EMC1812_STATUS_FAULT		BIT(2)
135*54b15c59SMarius Cristea #define EMC1812_STATUS_ETHRM		BIT(1)
136*54b15c59SMarius Cristea #define EMC1812_STATUS_ITHRM		BIT(0)
137*54b15c59SMarius Cristea 
138*54b15c59SMarius Cristea #define EMC1812_BETA_LOCK_VAL		0x0F
139*54b15c59SMarius Cristea 
140*54b15c59SMarius Cristea #define EMC1812_TEMP_CH_ADDR(index)	(EMC1812_INT_HIGH_BYTE_ADDR + 2 * (index))
141*54b15c59SMarius Cristea 
142*54b15c59SMarius Cristea #define EMC1812_FILTER_MASK_LEN		2
143*54b15c59SMarius Cristea 
144*54b15c59SMarius Cristea #define EMC1812_PID			0x81
145*54b15c59SMarius Cristea #define EMC1813_PID			0x87
146*54b15c59SMarius Cristea #define EMC1814_PID			0x84
147*54b15c59SMarius Cristea #define EMC1815_PID			0x85
148*54b15c59SMarius Cristea #define EMC1833_PID			0x83
149*54b15c59SMarius Cristea 
150*54b15c59SMarius Cristea /* The maximum number of channels a member of the family can have */
151*54b15c59SMarius Cristea #define EMC1812_MAX_NUM_CHANNELS		5
152*54b15c59SMarius Cristea #define EMC1812_TEMP_OFFSET			64
153*54b15c59SMarius Cristea 
154*54b15c59SMarius Cristea #define EMC1812_DEFAULT_IDEALITY_FACTOR		0x12
155*54b15c59SMarius Cristea 
156*54b15c59SMarius Cristea /* Constants and default values */
157*54b15c59SMarius Cristea #define EMC1812_HIGH_LIMIT_DEFAULT		(85 + EMC1812_TEMP_OFFSET)
158*54b15c59SMarius Cristea 
159*54b15c59SMarius Cristea #define EMC1812_TEMP_MASK (HWMON_T_INPUT | HWMON_T_MIN | HWMON_T_MAX | \
160*54b15c59SMarius Cristea 			   HWMON_T_CRIT | HWMON_T_MAX_HYST | HWMON_T_CRIT_HYST | \
161*54b15c59SMarius Cristea 			   HWMON_T_MIN_ALARM | HWMON_T_MAX_ALARM | \
162*54b15c59SMarius Cristea 			   HWMON_T_CRIT_ALARM | HWMON_T_LABEL)
163*54b15c59SMarius Cristea 
164*54b15c59SMarius Cristea static const struct hwmon_channel_info * const emc1812_info[] = {
165*54b15c59SMarius Cristea 	HWMON_CHANNEL_INFO(chip, HWMON_C_UPDATE_INTERVAL),
166*54b15c59SMarius Cristea 	HWMON_CHANNEL_INFO(temp,
167*54b15c59SMarius Cristea 			   EMC1812_TEMP_MASK,
168*54b15c59SMarius Cristea 			   EMC1812_TEMP_MASK | HWMON_T_FAULT,
169*54b15c59SMarius Cristea 			   EMC1812_TEMP_MASK | HWMON_T_FAULT,
170*54b15c59SMarius Cristea 			   EMC1812_TEMP_MASK | HWMON_T_FAULT,
171*54b15c59SMarius Cristea 			   EMC1812_TEMP_MASK | HWMON_T_FAULT),
172*54b15c59SMarius Cristea 	NULL
173*54b15c59SMarius Cristea };
174*54b15c59SMarius Cristea 
175*54b15c59SMarius Cristea /**
176*54b15c59SMarius Cristea  * struct emc1812_features - features of a emc1812 instance
177*54b15c59SMarius Cristea  * @name:		chip's name
178*54b15c59SMarius Cristea  * @phys_channels:	number of physical channels supported by the chip
179*54b15c59SMarius Cristea  * @has_ext2_beta_reg:	the EXT2_BETA register is available on the chip
180*54b15c59SMarius Cristea  */
181*54b15c59SMarius Cristea struct emc1812_features {
182*54b15c59SMarius Cristea 	const char	*name;
183*54b15c59SMarius Cristea 	u8		phys_channels;
184*54b15c59SMarius Cristea 	bool		has_ext2_beta_reg;
185*54b15c59SMarius Cristea };
186*54b15c59SMarius Cristea 
187*54b15c59SMarius Cristea static const struct emc1812_features emc1833_chip_config = {
188*54b15c59SMarius Cristea 	.name = "emc1833",
189*54b15c59SMarius Cristea 	.phys_channels = 3,
190*54b15c59SMarius Cristea 	.has_ext2_beta_reg = true,
191*54b15c59SMarius Cristea };
192*54b15c59SMarius Cristea 
193*54b15c59SMarius Cristea static const struct emc1812_features emc1812_chip_config = {
194*54b15c59SMarius Cristea 	.name = "emc1812",
195*54b15c59SMarius Cristea 	.phys_channels = 2,
196*54b15c59SMarius Cristea 	.has_ext2_beta_reg = false,
197*54b15c59SMarius Cristea };
198*54b15c59SMarius Cristea 
199*54b15c59SMarius Cristea static const struct emc1812_features emc1813_chip_config = {
200*54b15c59SMarius Cristea 	.name = "emc1813",
201*54b15c59SMarius Cristea 	.phys_channels = 3,
202*54b15c59SMarius Cristea 	.has_ext2_beta_reg = true,
203*54b15c59SMarius Cristea };
204*54b15c59SMarius Cristea 
205*54b15c59SMarius Cristea static const struct emc1812_features emc1814_chip_config = {
206*54b15c59SMarius Cristea 	.name = "emc1814",
207*54b15c59SMarius Cristea 	.phys_channels = 4,
208*54b15c59SMarius Cristea 	.has_ext2_beta_reg = false,
209*54b15c59SMarius Cristea };
210*54b15c59SMarius Cristea 
211*54b15c59SMarius Cristea static const struct emc1812_features emc1815_chip_config = {
212*54b15c59SMarius Cristea 	.name = "emc1815",
213*54b15c59SMarius Cristea 	.phys_channels = 5,
214*54b15c59SMarius Cristea 	.has_ext2_beta_reg = false,
215*54b15c59SMarius Cristea };
216*54b15c59SMarius Cristea 
217*54b15c59SMarius Cristea enum emc1812_limit_type {temp_min, temp_max};
218*54b15c59SMarius Cristea 
219*54b15c59SMarius Cristea static const u8 emc1812_temp_map[] = {
220*54b15c59SMarius Cristea 	[hwmon_temp_min] = temp_min,
221*54b15c59SMarius Cristea 	[hwmon_temp_max] = temp_max,
222*54b15c59SMarius Cristea };
223*54b15c59SMarius Cristea 
224*54b15c59SMarius Cristea static const u8 emc1812_ideality_regs[] = {
225*54b15c59SMarius Cristea 	[0] = 0xff,
226*54b15c59SMarius Cristea 	[1] = EMC1812_EXT1_IDEALITY_FACTOR_ADDR,
227*54b15c59SMarius Cristea 	[2] = EMC1812_EXT2_IDEALITY_FACTOR_ADDR,
228*54b15c59SMarius Cristea 	[3] = EMC1812_EXT3_IDEALITY_FACTOR_ADDR,
229*54b15c59SMarius Cristea 	[4] = EMC1812_EXT4_IDEALITY_FACTOR_ADDR,
230*54b15c59SMarius Cristea };
231*54b15c59SMarius Cristea 
232*54b15c59SMarius Cristea static const u8 emc1812_temp_crit_regs[] = {
233*54b15c59SMarius Cristea 	[0] = EMC1812_INT_DIODE_THERM_LIMIT_ADDR,
234*54b15c59SMarius Cristea 	[1] = EMC1812_EXT1_THERM_LIMIT_ADDR,
235*54b15c59SMarius Cristea 	[2] = EMC1812_EXT2_THERM_LIMIT_ADDR,
236*54b15c59SMarius Cristea 	[3] = EMC1812_EXT3_THERM_LIMIT_ADDR,
237*54b15c59SMarius Cristea 	[4] = EMC1812_EXT4_THERM_LIMIT_ADDR,
238*54b15c59SMarius Cristea };
239*54b15c59SMarius Cristea 
240*54b15c59SMarius Cristea static const u8 emc1812_limit_regs[][2] = {
241*54b15c59SMarius Cristea 	[0] = {
242*54b15c59SMarius Cristea 		[temp_min] = EMC1812_INT_DIODE_LOW_LIMIT_ADDR,
243*54b15c59SMarius Cristea 		[temp_max] = EMC1812_INT_DIODE_HIGH_LIMIT_ADDR,
244*54b15c59SMarius Cristea 	},
245*54b15c59SMarius Cristea 	[1] = {
246*54b15c59SMarius Cristea 		[temp_min] = EMC1812_EXT1_LOW_LIMIT_HIGH_BYTE_ADDR,
247*54b15c59SMarius Cristea 		[temp_max] = EMC1812_EXT1_HIGH_LIMIT_HIGH_BYTE_ADDR,
248*54b15c59SMarius Cristea 	},
249*54b15c59SMarius Cristea 	[2] = {
250*54b15c59SMarius Cristea 		[temp_min] = EMC1812_EXT2_LOW_LIMIT_HIGH_BYTE_ADDR,
251*54b15c59SMarius Cristea 		[temp_max] = EMC1812_EXT2_HIGH_LIMIT_HIGH_BYTE_ADDR,
252*54b15c59SMarius Cristea 	},
253*54b15c59SMarius Cristea 	[3] = {
254*54b15c59SMarius Cristea 		[temp_min] = EMC1812_EXT3_LOW_LIMIT_HIGH_BYTE_ADDR,
255*54b15c59SMarius Cristea 		[temp_max] = EMC1812_EXT3_HIGH_LIMIT_HIGH_BYTE_ADDR,
256*54b15c59SMarius Cristea 	},
257*54b15c59SMarius Cristea 	[4] = {
258*54b15c59SMarius Cristea 		[temp_min] = EMC1812_EXT4_LOW_LIMIT_HIGH_BYTE_ADDR,
259*54b15c59SMarius Cristea 		[temp_max] = EMC1812_EXT4_HIGH_LIMIT_HIGH_BYTE_ADDR,
260*54b15c59SMarius Cristea 	},
261*54b15c59SMarius Cristea };
262*54b15c59SMarius Cristea 
263*54b15c59SMarius Cristea static const u8 emc1812_limit_regs_low[][2] = {
264*54b15c59SMarius Cristea 	[0] = {
265*54b15c59SMarius Cristea 		[temp_min] = 0xff,
266*54b15c59SMarius Cristea 		[temp_max] = 0xff,
267*54b15c59SMarius Cristea 	},
268*54b15c59SMarius Cristea 	[1] = {
269*54b15c59SMarius Cristea 		[temp_min] = EMC1812_EXT1_LOW_LIMIT_LOW_BYTE_ADDR,
270*54b15c59SMarius Cristea 		[temp_max] = EMC1812_EXT1_HIGH_LIMIT_LOW_BYTE_ADDR,
271*54b15c59SMarius Cristea 	},
272*54b15c59SMarius Cristea 	[2] = {
273*54b15c59SMarius Cristea 		[temp_min] = EMC1812_EXT2_LOW_LIMIT_LOW_BYTE_ADDR,
274*54b15c59SMarius Cristea 		[temp_max] = EMC1812_EXT2_HIGH_LIMIT_LOW_BYTE_ADDR,
275*54b15c59SMarius Cristea 	},
276*54b15c59SMarius Cristea 	[3] = {
277*54b15c59SMarius Cristea 		[temp_min] = EMC1812_EXT3_LOW_LIMIT_LOW_BYTE_ADDR,
278*54b15c59SMarius Cristea 		[temp_max] = EMC1812_EXT3_HIGH_LIMIT_LOW_BYTE_ADDR,
279*54b15c59SMarius Cristea 	},
280*54b15c59SMarius Cristea 	[4] = {
281*54b15c59SMarius Cristea 		[temp_min] = EMC1812_EXT4_LOW_LIMIT_LOW_BYTE_ADDR,
282*54b15c59SMarius Cristea 		[temp_max] = EMC1812_EXT4_HIGH_LIMIT_LOW_BYTE_ADDR,
283*54b15c59SMarius Cristea 	},
284*54b15c59SMarius Cristea };
285*54b15c59SMarius Cristea 
286*54b15c59SMarius Cristea /* Lookup table for temperature conversion times in msec */
287*54b15c59SMarius Cristea static const u16 emc1812_conv_time[] = {
288*54b15c59SMarius Cristea 	16000, 8000, 4000, 2000, 1000, 500, 250, 125, 62, 31, 16
289*54b15c59SMarius Cristea };
290*54b15c59SMarius Cristea 
291*54b15c59SMarius Cristea /**
292*54b15c59SMarius Cristea  * struct emc1812_data - information about chip parameters
293*54b15c59SMarius Cristea  * @labels:		labels of the channels
294*54b15c59SMarius Cristea  * @active_ch_mask:	active channels
295*54b15c59SMarius Cristea  * @chip:		pointer to structure holding chip features
296*54b15c59SMarius Cristea  * @regmap:		device register map
297*54b15c59SMarius Cristea  * @recd34_en:		state of Resistance Error Correction (REC) on channels 3 and 4
298*54b15c59SMarius Cristea  * @recd12_en:		state of Resistance Error Correction (REC) on channels 1 and 2
299*54b15c59SMarius Cristea  * @apdd_en:		state of anti-parallel diode mode
300*54b15c59SMarius Cristea  */
301*54b15c59SMarius Cristea struct emc1812_data {
302*54b15c59SMarius Cristea 	const char *labels[EMC1812_MAX_NUM_CHANNELS];
303*54b15c59SMarius Cristea 	unsigned long active_ch_mask;
304*54b15c59SMarius Cristea 	const struct emc1812_features *chip;
305*54b15c59SMarius Cristea 	struct regmap *regmap;
306*54b15c59SMarius Cristea 	bool recd34_en;
307*54b15c59SMarius Cristea 	bool recd12_en;
308*54b15c59SMarius Cristea 	bool apdd_en;
309*54b15c59SMarius Cristea };
310*54b15c59SMarius Cristea 
311*54b15c59SMarius Cristea /* emc1812 regmap configuration */
312*54b15c59SMarius Cristea static const struct regmap_range emc1812_regmap_writable_ranges[] = {
313*54b15c59SMarius Cristea 	regmap_reg_range(EMC1812_CFG_ADDR, EMC1812_ONE_SHOT_ADDR),
314*54b15c59SMarius Cristea 	regmap_reg_range(EMC1812_EXT1_HIGH_LIMIT_LOW_BYTE_ADDR, EMC1812_EXT2_THERM_LIMIT_ADDR),
315*54b15c59SMarius Cristea 	regmap_reg_range(EMC1812_DIODE_FAULT_MASK_ADDR, EMC1812_CONSEC_ALERT_ADDR),
316*54b15c59SMarius Cristea 	regmap_reg_range(EMC1812_EXT1_BETA_CONFIG_ADDR, EMC1812_EXT4_IDEALITY_FACTOR_ADDR),
317*54b15c59SMarius Cristea 	regmap_reg_range(EMC1812_ROC_GAIN_ADDR, EMC1812_ROC_CONFIG_ADDR),
318*54b15c59SMarius Cristea 	regmap_reg_range(EMC1812_R1_LIMH_ADDR, EMC1812_R1_SMPL_ADDR),
319*54b15c59SMarius Cristea 	regmap_reg_range(EMC1812_R2_LIMH_ADDR, EMC1812_R2_SMPL_ADDR),
320*54b15c59SMarius Cristea 	regmap_reg_range(EMC1812_FILTER_SEL_ADDR, EMC1812_FILTER_SEL_ADDR),
321*54b15c59SMarius Cristea 	regmap_reg_range(EMC1812_HOTTEST_CFG_ADDR, EMC1812_HOTTEST_CFG_ADDR),
322*54b15c59SMarius Cristea };
323*54b15c59SMarius Cristea 
324*54b15c59SMarius Cristea static const struct regmap_access_table emc1812_regmap_wr_table = {
325*54b15c59SMarius Cristea 	.yes_ranges = emc1812_regmap_writable_ranges,
326*54b15c59SMarius Cristea 	.n_yes_ranges = ARRAY_SIZE(emc1812_regmap_writable_ranges),
327*54b15c59SMarius Cristea };
328*54b15c59SMarius Cristea 
329*54b15c59SMarius Cristea static const struct regmap_range emc1812_regmap_rd_ranges[] = {
330*54b15c59SMarius Cristea 	regmap_reg_range(EMC1812_STATUS_ADDR, EMC1812_CONFIG_LO_ADDR),
331*54b15c59SMarius Cristea 	regmap_reg_range(EMC1812_CFG_ADDR, EMC1812_ONE_SHOT_ADDR),
332*54b15c59SMarius Cristea 	regmap_reg_range(EMC1812_EXT1_HIGH_LIMIT_LOW_BYTE_ADDR,
333*54b15c59SMarius Cristea 			 EMC1812_EXT_DIODE_FAULT_STATUS_ADDR),
334*54b15c59SMarius Cristea 	regmap_reg_range(EMC1812_DIODE_FAULT_MASK_ADDR, EMC1812_CONSEC_ALERT_ADDR),
335*54b15c59SMarius Cristea 	regmap_reg_range(EMC1812_EXT1_BETA_CONFIG_ADDR, EMC1812_FILTER_SEL_ADDR),
336*54b15c59SMarius Cristea 	regmap_reg_range(EMC1812_INT_HIGH_BYTE_ADDR, EMC1812_HOTTEST_CFG_ADDR),
337*54b15c59SMarius Cristea 	regmap_reg_range(EMC1812_PRODUCT_ID_ADDR, EMC1812_REVISION_ADDR),
338*54b15c59SMarius Cristea };
339*54b15c59SMarius Cristea 
340*54b15c59SMarius Cristea static const struct regmap_access_table emc1812_regmap_rd_table = {
341*54b15c59SMarius Cristea 	.yes_ranges = emc1812_regmap_rd_ranges,
342*54b15c59SMarius Cristea 	.n_yes_ranges = ARRAY_SIZE(emc1812_regmap_rd_ranges),
343*54b15c59SMarius Cristea };
344*54b15c59SMarius Cristea 
345*54b15c59SMarius Cristea static bool emc1812_is_volatile_reg(struct device *dev, unsigned int reg)
346*54b15c59SMarius Cristea {
347*54b15c59SMarius Cristea 	switch (reg) {
348*54b15c59SMarius Cristea 	case EMC1812_STATUS_ADDR:
349*54b15c59SMarius Cristea 	case EMC1812_EXT_DIODE_FAULT_STATUS_ADDR:
350*54b15c59SMarius Cristea 	case EMC1812_DIODE_FAULT_MASK_ADDR:
351*54b15c59SMarius Cristea 	case EMC1812_EXT1_BETA_CONFIG_ADDR:
352*54b15c59SMarius Cristea 	case EMC1812_EXT2_BETA_CONFIG_ADDR:
353*54b15c59SMarius Cristea 	case EMC1812_HIGH_LIMIT_STATUS_ADDR:
354*54b15c59SMarius Cristea 	case EMC1812_LOW_LIMIT_STATUS_ADDR:
355*54b15c59SMarius Cristea 	case EMC1812_THERM_LIMIT_STATUS_ADDR:
356*54b15c59SMarius Cristea 	case EMC1812_ROC_STATUS_ADDR:
357*54b15c59SMarius Cristea 	case EMC1812_PER_MAXTH_1_ADDR:
358*54b15c59SMarius Cristea 	case EMC1812_PER_MAXT1L_ADDR:
359*54b15c59SMarius Cristea 	case EMC1812_PER_MAXTH_2_ADDR:
360*54b15c59SMarius Cristea 	case EMC1812_PER_MAXT2_3L_ADDR:
361*54b15c59SMarius Cristea 	case EMC1812_GBL_MAXT1H_ADDR:
362*54b15c59SMarius Cristea 	case EMC1812_GBL_MAXT1L_ADDR:
363*54b15c59SMarius Cristea 	case EMC1812_GBL_MAXT2H_ADDR:
364*54b15c59SMarius Cristea 	case EMC1812_GBL_MAXT2L_ADDR:
365*54b15c59SMarius Cristea 	case EMC1812_INT_HIGH_BYTE_ADDR:
366*54b15c59SMarius Cristea 	case EMC1812_INT_LOW_BYTE_ADDR:
367*54b15c59SMarius Cristea 	case EMC1812_EXT1_HIGH_BYTE_ADDR:
368*54b15c59SMarius Cristea 	case EMC1812_EXT1_LOW_BYTE_ADDR:
369*54b15c59SMarius Cristea 	case EMC1812_EXT2_HIGH_BYTE_ADDR:
370*54b15c59SMarius Cristea 	case EMC1812_EXT2_LOW_BYTE_ADDR:
371*54b15c59SMarius Cristea 	case EMC1812_EXT3_HIGH_BYTE_ADDR:
372*54b15c59SMarius Cristea 	case EMC1812_EXT3_LOW_BYTE_ADDR:
373*54b15c59SMarius Cristea 	case EMC1812_EXT4_HIGH_BYTE_ADDR:
374*54b15c59SMarius Cristea 	case EMC1812_EXT4_LOW_BYTE_ADDR:
375*54b15c59SMarius Cristea 	case EMC1812_HOTTEST_DIODE_HIGH_BYTE_ADDR:
376*54b15c59SMarius Cristea 	case EMC1812_HOTTEST_DIODE_LOW_BYTE_ADDR:
377*54b15c59SMarius Cristea 	case EMC1812_HOTTEST_STATUS_ADDR:
378*54b15c59SMarius Cristea 		return true;
379*54b15c59SMarius Cristea 	default:
380*54b15c59SMarius Cristea 		return false;
381*54b15c59SMarius Cristea 	}
382*54b15c59SMarius Cristea }
383*54b15c59SMarius Cristea 
384*54b15c59SMarius Cristea static const struct regmap_config emc1812_regmap_config = {
385*54b15c59SMarius Cristea 	.reg_bits = 8,
386*54b15c59SMarius Cristea 	.val_bits = 8,
387*54b15c59SMarius Cristea 	.rd_table = &emc1812_regmap_rd_table,
388*54b15c59SMarius Cristea 	.wr_table = &emc1812_regmap_wr_table,
389*54b15c59SMarius Cristea 	.volatile_reg = emc1812_is_volatile_reg,
390*54b15c59SMarius Cristea 	.max_register = EMC1812_REVISION_ADDR,
391*54b15c59SMarius Cristea 	.cache_type = REGCACHE_MAPLE,
392*54b15c59SMarius Cristea };
393*54b15c59SMarius Cristea 
394*54b15c59SMarius Cristea static umode_t emc1812_is_visible(const void *_data, enum hwmon_sensor_types type,
395*54b15c59SMarius Cristea 				  u32 attr, int channel)
396*54b15c59SMarius Cristea {
397*54b15c59SMarius Cristea 	const struct emc1812_data *data = _data;
398*54b15c59SMarius Cristea 
399*54b15c59SMarius Cristea 	switch (type) {
400*54b15c59SMarius Cristea 	case hwmon_temp:
401*54b15c59SMarius Cristea 		/* Don't show channels which are not enabled */
402*54b15c59SMarius Cristea 		if (!(data->active_ch_mask & BIT(channel)))
403*54b15c59SMarius Cristea 			return 0;
404*54b15c59SMarius Cristea 
405*54b15c59SMarius Cristea 		switch (attr) {
406*54b15c59SMarius Cristea 		case hwmon_temp_min:
407*54b15c59SMarius Cristea 		case hwmon_temp_max:
408*54b15c59SMarius Cristea 		case hwmon_temp_crit:
409*54b15c59SMarius Cristea 		case hwmon_temp_crit_hyst:
410*54b15c59SMarius Cristea 			return 0644;
411*54b15c59SMarius Cristea 		case hwmon_temp_crit_alarm:
412*54b15c59SMarius Cristea 		case hwmon_temp_input:
413*54b15c59SMarius Cristea 		case hwmon_temp_fault:
414*54b15c59SMarius Cristea 		case hwmon_temp_max_alarm:
415*54b15c59SMarius Cristea 		case hwmon_temp_max_hyst:
416*54b15c59SMarius Cristea 		case hwmon_temp_min_alarm:
417*54b15c59SMarius Cristea 			return 0444;
418*54b15c59SMarius Cristea 		case hwmon_temp_label:
419*54b15c59SMarius Cristea 			if (data->labels[channel])
420*54b15c59SMarius Cristea 				return 0444;
421*54b15c59SMarius Cristea 			return 0;
422*54b15c59SMarius Cristea 		default:
423*54b15c59SMarius Cristea 			return 0;
424*54b15c59SMarius Cristea 		}
425*54b15c59SMarius Cristea 	case hwmon_chip:
426*54b15c59SMarius Cristea 		switch (attr) {
427*54b15c59SMarius Cristea 		case hwmon_chip_update_interval:
428*54b15c59SMarius Cristea 			return 0644;
429*54b15c59SMarius Cristea 		default:
430*54b15c59SMarius Cristea 			return 0;
431*54b15c59SMarius Cristea 		}
432*54b15c59SMarius Cristea 	default:
433*54b15c59SMarius Cristea 		return 0;
434*54b15c59SMarius Cristea 	}
435*54b15c59SMarius Cristea };
436*54b15c59SMarius Cristea 
437*54b15c59SMarius Cristea static int emc1812_get_temp(struct emc1812_data *data, int channel, long *val)
438*54b15c59SMarius Cristea {
439*54b15c59SMarius Cristea 	__be16 tmp_be16;
440*54b15c59SMarius Cristea 	int ret;
441*54b15c59SMarius Cristea 
442*54b15c59SMarius Cristea 	ret = regmap_bulk_read(data->regmap, EMC1812_TEMP_CH_ADDR(channel),
443*54b15c59SMarius Cristea 			       &tmp_be16, sizeof(tmp_be16));
444*54b15c59SMarius Cristea 	if (ret)
445*54b15c59SMarius Cristea 		return ret;
446*54b15c59SMarius Cristea 
447*54b15c59SMarius Cristea 	/* Range is always -64 to 191.875°C */
448*54b15c59SMarius Cristea 	*val = ((be16_to_cpu(tmp_be16) >> 5) - (EMC1812_TEMP_OFFSET << 3)) * 125;
449*54b15c59SMarius Cristea 
450*54b15c59SMarius Cristea 	return 0;
451*54b15c59SMarius Cristea }
452*54b15c59SMarius Cristea 
453*54b15c59SMarius Cristea static int emc1812_get_crit_limit_temp(struct emc1812_data *data, int channel, long *val)
454*54b15c59SMarius Cristea {
455*54b15c59SMarius Cristea 	unsigned int tmp;
456*54b15c59SMarius Cristea 	int ret;
457*54b15c59SMarius Cristea 
458*54b15c59SMarius Cristea 	/* Critical register is 8bits long and keeps only integer part of temperature */
459*54b15c59SMarius Cristea 	ret = regmap_read(data->regmap, emc1812_temp_crit_regs[channel], &tmp);
460*54b15c59SMarius Cristea 	if (ret)
461*54b15c59SMarius Cristea 		return ret;
462*54b15c59SMarius Cristea 
463*54b15c59SMarius Cristea 	*val = tmp;
464*54b15c59SMarius Cristea 	/* Range is always -64 to 191°C */
465*54b15c59SMarius Cristea 	*val = (*val - EMC1812_TEMP_OFFSET) * 1000;
466*54b15c59SMarius Cristea 
467*54b15c59SMarius Cristea 	return 0;
468*54b15c59SMarius Cristea }
469*54b15c59SMarius Cristea 
470*54b15c59SMarius Cristea static int emc1812_get_limit_temp(struct emc1812_data *data, int ch,
471*54b15c59SMarius Cristea 				  enum emc1812_limit_type type, long *val)
472*54b15c59SMarius Cristea {
473*54b15c59SMarius Cristea 	unsigned int regvalh;
474*54b15c59SMarius Cristea 	unsigned int regvall = 0;
475*54b15c59SMarius Cristea 	int ret;
476*54b15c59SMarius Cristea 
477*54b15c59SMarius Cristea 	ret = regmap_read(data->regmap, emc1812_limit_regs[ch][type], &regvalh);
478*54b15c59SMarius Cristea 	if (ret < 0)
479*54b15c59SMarius Cristea 		return ret;
480*54b15c59SMarius Cristea 
481*54b15c59SMarius Cristea 	if (ch) {
482*54b15c59SMarius Cristea 		ret = regmap_read(data->regmap, emc1812_limit_regs_low[ch][type], &regvall);
483*54b15c59SMarius Cristea 		if (ret < 0)
484*54b15c59SMarius Cristea 			return ret;
485*54b15c59SMarius Cristea 	}
486*54b15c59SMarius Cristea 
487*54b15c59SMarius Cristea 	/* Range is always -64 to 191.875°C */
488*54b15c59SMarius Cristea 	*val = ((regvalh << 3) | (regvall >> 5));
489*54b15c59SMarius Cristea 	*val = (*val - (EMC1812_TEMP_OFFSET << 3)) * 125;
490*54b15c59SMarius Cristea 
491*54b15c59SMarius Cristea 	return 0;
492*54b15c59SMarius Cristea }
493*54b15c59SMarius Cristea 
494*54b15c59SMarius Cristea static int emc1812_read_reg(struct device *dev, struct emc1812_data *data, u32 attr,
495*54b15c59SMarius Cristea 			    int channel, long *val)
496*54b15c59SMarius Cristea {
497*54b15c59SMarius Cristea 	unsigned int hyst;
498*54b15c59SMarius Cristea 	int ret;
499*54b15c59SMarius Cristea 
500*54b15c59SMarius Cristea 	switch (attr) {
501*54b15c59SMarius Cristea 	case hwmon_temp_min:
502*54b15c59SMarius Cristea 	case hwmon_temp_max:
503*54b15c59SMarius Cristea 		return emc1812_get_limit_temp(data, channel, emc1812_temp_map[attr], val);
504*54b15c59SMarius Cristea 	case hwmon_temp_crit:
505*54b15c59SMarius Cristea 		return emc1812_get_crit_limit_temp(data, channel, val);
506*54b15c59SMarius Cristea 	case hwmon_temp_input:
507*54b15c59SMarius Cristea 		return emc1812_get_temp(data, channel, val);
508*54b15c59SMarius Cristea 	case hwmon_temp_max_hyst:
509*54b15c59SMarius Cristea 		ret = emc1812_get_limit_temp(data, channel, temp_max, val);
510*54b15c59SMarius Cristea 		if (ret < 0)
511*54b15c59SMarius Cristea 			return ret;
512*54b15c59SMarius Cristea 
513*54b15c59SMarius Cristea 		ret = regmap_read(data->regmap, EMC1812_THRM_HYS_ADDR, &hyst);
514*54b15c59SMarius Cristea 		if (ret < 0)
515*54b15c59SMarius Cristea 			return ret;
516*54b15c59SMarius Cristea 
517*54b15c59SMarius Cristea 		*val -= (long)hyst * 1000;
518*54b15c59SMarius Cristea 
519*54b15c59SMarius Cristea 		return 0;
520*54b15c59SMarius Cristea 	case hwmon_temp_crit_hyst:
521*54b15c59SMarius Cristea 		ret = emc1812_get_crit_limit_temp(data, channel, val);
522*54b15c59SMarius Cristea 		if (ret < 0)
523*54b15c59SMarius Cristea 			return ret;
524*54b15c59SMarius Cristea 
525*54b15c59SMarius Cristea 		ret = regmap_read(data->regmap, EMC1812_THRM_HYS_ADDR, &hyst);
526*54b15c59SMarius Cristea 		if (ret < 0)
527*54b15c59SMarius Cristea 			return ret;
528*54b15c59SMarius Cristea 
529*54b15c59SMarius Cristea 		*val -= (long)hyst * 1000;
530*54b15c59SMarius Cristea 
531*54b15c59SMarius Cristea 		return 0;
532*54b15c59SMarius Cristea 	case hwmon_temp_min_alarm:
533*54b15c59SMarius Cristea 		*val = regmap_test_bits(data->regmap, EMC1812_LOW_LIMIT_STATUS_ADDR,
534*54b15c59SMarius Cristea 					BIT(channel));
535*54b15c59SMarius Cristea 		if (*val < 0)
536*54b15c59SMarius Cristea 			return *val;
537*54b15c59SMarius Cristea 
538*54b15c59SMarius Cristea 		return 0;
539*54b15c59SMarius Cristea 	case hwmon_temp_max_alarm:
540*54b15c59SMarius Cristea 		*val = regmap_test_bits(data->regmap, EMC1812_HIGH_LIMIT_STATUS_ADDR,
541*54b15c59SMarius Cristea 					BIT(channel));
542*54b15c59SMarius Cristea 		if (*val < 0)
543*54b15c59SMarius Cristea 			return *val;
544*54b15c59SMarius Cristea 
545*54b15c59SMarius Cristea 		return 0;
546*54b15c59SMarius Cristea 	case hwmon_temp_crit_alarm:
547*54b15c59SMarius Cristea 		*val = regmap_test_bits(data->regmap, EMC1812_THERM_LIMIT_STATUS_ADDR,
548*54b15c59SMarius Cristea 					BIT(channel));
549*54b15c59SMarius Cristea 		if (*val < 0)
550*54b15c59SMarius Cristea 			return *val;
551*54b15c59SMarius Cristea 
552*54b15c59SMarius Cristea 		return 0;
553*54b15c59SMarius Cristea 	case hwmon_temp_fault:
554*54b15c59SMarius Cristea 		*val = regmap_test_bits(data->regmap, EMC1812_EXT_DIODE_FAULT_STATUS_ADDR,
555*54b15c59SMarius Cristea 					BIT(channel));
556*54b15c59SMarius Cristea 		if (*val < 0)
557*54b15c59SMarius Cristea 			return *val;
558*54b15c59SMarius Cristea 
559*54b15c59SMarius Cristea 		return 0;
560*54b15c59SMarius Cristea 	default:
561*54b15c59SMarius Cristea 		return -EOPNOTSUPP;
562*54b15c59SMarius Cristea 	}
563*54b15c59SMarius Cristea }
564*54b15c59SMarius Cristea 
565*54b15c59SMarius Cristea static int emc1812_read(struct device *dev, enum hwmon_sensor_types type, u32 attr,
566*54b15c59SMarius Cristea 			int channel, long *val)
567*54b15c59SMarius Cristea {
568*54b15c59SMarius Cristea 	struct emc1812_data *data = dev_get_drvdata(dev);
569*54b15c59SMarius Cristea 	unsigned int convrate;
570*54b15c59SMarius Cristea 	int ret;
571*54b15c59SMarius Cristea 
572*54b15c59SMarius Cristea 	switch (type) {
573*54b15c59SMarius Cristea 	case hwmon_temp:
574*54b15c59SMarius Cristea 		return emc1812_read_reg(dev, data, attr, channel, val);
575*54b15c59SMarius Cristea 	case hwmon_chip:
576*54b15c59SMarius Cristea 		switch (attr) {
577*54b15c59SMarius Cristea 		case hwmon_chip_update_interval:
578*54b15c59SMarius Cristea 			ret = regmap_read(data->regmap, EMC1812_CONV_ADDR, &convrate);
579*54b15c59SMarius Cristea 			if (ret < 0)
580*54b15c59SMarius Cristea 				return ret;
581*54b15c59SMarius Cristea 
582*54b15c59SMarius Cristea 			if (convrate > 10)
583*54b15c59SMarius Cristea 				convrate = 4;
584*54b15c59SMarius Cristea 
585*54b15c59SMarius Cristea 			*val = DIV_ROUND_CLOSEST(16000, 1 << convrate);
586*54b15c59SMarius Cristea 			return 0;
587*54b15c59SMarius Cristea 		default:
588*54b15c59SMarius Cristea 			return -EOPNOTSUPP;
589*54b15c59SMarius Cristea 		}
590*54b15c59SMarius Cristea 	default:
591*54b15c59SMarius Cristea 		return -EOPNOTSUPP;
592*54b15c59SMarius Cristea 	}
593*54b15c59SMarius Cristea }
594*54b15c59SMarius Cristea 
595*54b15c59SMarius Cristea static int emc1812_read_string(struct device *dev, enum hwmon_sensor_types type,
596*54b15c59SMarius Cristea 			       u32 attr, int channel, const char **str)
597*54b15c59SMarius Cristea {
598*54b15c59SMarius Cristea 	struct emc1812_data *data = dev_get_drvdata(dev);
599*54b15c59SMarius Cristea 
600*54b15c59SMarius Cristea 	if (channel >= data->chip->phys_channels)
601*54b15c59SMarius Cristea 		return -EOPNOTSUPP;
602*54b15c59SMarius Cristea 
603*54b15c59SMarius Cristea 	switch (type) {
604*54b15c59SMarius Cristea 	case hwmon_temp:
605*54b15c59SMarius Cristea 		switch (attr) {
606*54b15c59SMarius Cristea 		case hwmon_temp_label:
607*54b15c59SMarius Cristea 			*str = data->labels[channel];
608*54b15c59SMarius Cristea 			return 0;
609*54b15c59SMarius Cristea 		default:
610*54b15c59SMarius Cristea 			return -EOPNOTSUPP;
611*54b15c59SMarius Cristea 		}
612*54b15c59SMarius Cristea 	default:
613*54b15c59SMarius Cristea 		return -EOPNOTSUPP;
614*54b15c59SMarius Cristea 	}
615*54b15c59SMarius Cristea }
616*54b15c59SMarius Cristea 
617*54b15c59SMarius Cristea static int emc1812_set_hyst(struct emc1812_data *data, int channel, int val)
618*54b15c59SMarius Cristea {
619*54b15c59SMarius Cristea 	unsigned int limit;
620*54b15c59SMarius Cristea 	int hyst, ret;
621*54b15c59SMarius Cristea 
622*54b15c59SMarius Cristea 	/* Critical register is 8bits long and keeps only integer part of temperature */
623*54b15c59SMarius Cristea 	ret = regmap_read(data->regmap, emc1812_temp_crit_regs[channel], &limit);
624*54b15c59SMarius Cristea 	if (ret)
625*54b15c59SMarius Cristea 		return ret;
626*54b15c59SMarius Cristea 
627*54b15c59SMarius Cristea 	hyst = clamp_val((int)limit - val, 0, 255);
628*54b15c59SMarius Cristea 
629*54b15c59SMarius Cristea 	ret = regmap_write(data->regmap, EMC1812_THRM_HYS_ADDR, hyst);
630*54b15c59SMarius Cristea 
631*54b15c59SMarius Cristea 	return ret;
632*54b15c59SMarius Cristea }
633*54b15c59SMarius Cristea 
634*54b15c59SMarius Cristea static int emc1812_set_temp(struct emc1812_data *data, int channel,
635*54b15c59SMarius Cristea 			    enum emc1812_limit_type map, int val)
636*54b15c59SMarius Cristea {
637*54b15c59SMarius Cristea 	unsigned int valh, vall;
638*54b15c59SMarius Cristea 	u8 regh, regl;
639*54b15c59SMarius Cristea 	int ret;
640*54b15c59SMarius Cristea 
641*54b15c59SMarius Cristea 	regh = emc1812_limit_regs[channel][map];
642*54b15c59SMarius Cristea 	regl = emc1812_limit_regs_low[channel][map];
643*54b15c59SMarius Cristea 
644*54b15c59SMarius Cristea 	if (channel) {
645*54b15c59SMarius Cristea 		val = DIV_ROUND_CLOSEST(val, 125);
646*54b15c59SMarius Cristea 		valh = (val >> 3) & 0xff;
647*54b15c59SMarius Cristea 		vall = (val & 0x07) << 5;
648*54b15c59SMarius Cristea 	} else {
649*54b15c59SMarius Cristea 		/* Temperature limit for internal channel is stored on 8bits */
650*54b15c59SMarius Cristea 		valh = DIV_ROUND_CLOSEST(val, 1000);
651*54b15c59SMarius Cristea 		valh = clamp_val(valh, 0, 255);
652*54b15c59SMarius Cristea 	}
653*54b15c59SMarius Cristea 
654*54b15c59SMarius Cristea 	ret = regmap_write(data->regmap, regh, valh);
655*54b15c59SMarius Cristea 	if (ret < 0)
656*54b15c59SMarius Cristea 		return ret;
657*54b15c59SMarius Cristea 
658*54b15c59SMarius Cristea 	if (channel)
659*54b15c59SMarius Cristea 		ret = regmap_write(data->regmap, regl, vall);
660*54b15c59SMarius Cristea 
661*54b15c59SMarius Cristea 	return ret;
662*54b15c59SMarius Cristea }
663*54b15c59SMarius Cristea 
664*54b15c59SMarius Cristea static int emc1812_write(struct device *dev, enum hwmon_sensor_types type, u32 attr,
665*54b15c59SMarius Cristea 			 int channel, long val)
666*54b15c59SMarius Cristea {
667*54b15c59SMarius Cristea 	struct emc1812_data *data = dev_get_drvdata(dev);
668*54b15c59SMarius Cristea 	unsigned int interval, tmp;
669*54b15c59SMarius Cristea 
670*54b15c59SMarius Cristea 	switch (type) {
671*54b15c59SMarius Cristea 	case hwmon_temp:
672*54b15c59SMarius Cristea 		/* Range should be -64000 to 191875°C + (EMC1812_TEMP_OFFSET * 1000) */
673*54b15c59SMarius Cristea 		val = clamp_val(val, -64000, 191875);
674*54b15c59SMarius Cristea 		val = val + (EMC1812_TEMP_OFFSET * 1000);
675*54b15c59SMarius Cristea 
676*54b15c59SMarius Cristea 		switch (attr) {
677*54b15c59SMarius Cristea 		case hwmon_temp_min:
678*54b15c59SMarius Cristea 		case hwmon_temp_max:
679*54b15c59SMarius Cristea 			return emc1812_set_temp(data, channel, emc1812_temp_map[attr], val);
680*54b15c59SMarius Cristea 		case hwmon_temp_crit:
681*54b15c59SMarius Cristea 			/* Critical temperature limit is stored on 8bits */
682*54b15c59SMarius Cristea 			val = DIV_ROUND_CLOSEST(val, 1000);
683*54b15c59SMarius Cristea 			tmp = clamp_val(val, 0, 255);
684*54b15c59SMarius Cristea 			return regmap_write(data->regmap, emc1812_temp_crit_regs[channel], tmp);
685*54b15c59SMarius Cristea 		case hwmon_temp_crit_hyst:
686*54b15c59SMarius Cristea 			/* Critical temperature hysteresis is stored on 8bits */
687*54b15c59SMarius Cristea 			val = DIV_ROUND_CLOSEST(val, 1000);
688*54b15c59SMarius Cristea 			tmp = clamp_val(val, 0, 255);
689*54b15c59SMarius Cristea 			return emc1812_set_hyst(data, channel, tmp);
690*54b15c59SMarius Cristea 		default:
691*54b15c59SMarius Cristea 			return -EOPNOTSUPP;
692*54b15c59SMarius Cristea 		}
693*54b15c59SMarius Cristea 	case hwmon_chip:
694*54b15c59SMarius Cristea 		switch (attr) {
695*54b15c59SMarius Cristea 		case hwmon_chip_update_interval:
696*54b15c59SMarius Cristea 			interval = clamp_val(val, 0, 16000);
697*54b15c59SMarius Cristea 			tmp = find_closest_descending(interval, emc1812_conv_time,
698*54b15c59SMarius Cristea 						      ARRAY_SIZE(emc1812_conv_time));
699*54b15c59SMarius Cristea 			return regmap_write(data->regmap, EMC1812_CONV_ADDR, tmp);
700*54b15c59SMarius Cristea 		default:
701*54b15c59SMarius Cristea 			return -EOPNOTSUPP;
702*54b15c59SMarius Cristea 		}
703*54b15c59SMarius Cristea 	default:
704*54b15c59SMarius Cristea 		return -EOPNOTSUPP;
705*54b15c59SMarius Cristea 	}
706*54b15c59SMarius Cristea }
707*54b15c59SMarius Cristea 
708*54b15c59SMarius Cristea static int emc1812_init(struct emc1812_data *priv)
709*54b15c59SMarius Cristea {
710*54b15c59SMarius Cristea 	int i, ret;
711*54b15c59SMarius Cristea 	u8 val;
712*54b15c59SMarius Cristea 
713*54b15c59SMarius Cristea 	ret = regmap_write(priv->regmap, EMC1812_THRM_HYS_ADDR, 0x0A);
714*54b15c59SMarius Cristea 	if (ret)
715*54b15c59SMarius Cristea 		return ret;
716*54b15c59SMarius Cristea 
717*54b15c59SMarius Cristea 	ret = regmap_write(priv->regmap, EMC1812_CONSEC_ALERT_ADDR, 0x70);
718*54b15c59SMarius Cristea 	if (ret)
719*54b15c59SMarius Cristea 		return ret;
720*54b15c59SMarius Cristea 
721*54b15c59SMarius Cristea 	ret = regmap_write(priv->regmap, EMC1812_FILTER_SEL_ADDR, 0);
722*54b15c59SMarius Cristea 	if (ret)
723*54b15c59SMarius Cristea 		return ret;
724*54b15c59SMarius Cristea 
725*54b15c59SMarius Cristea 	ret = regmap_write(priv->regmap, EMC1812_HOTTEST_CFG_ADDR, 0);
726*54b15c59SMarius Cristea 	if (ret)
727*54b15c59SMarius Cristea 		return ret;
728*54b15c59SMarius Cristea 
729*54b15c59SMarius Cristea 	/* Enables the beta compensation factor auto-detection function for beta1 and beta2 */
730*54b15c59SMarius Cristea 	ret = regmap_write(priv->regmap, EMC1812_EXT1_BETA_CONFIG_ADDR,
731*54b15c59SMarius Cristea 			   EMC1812_BETA_LOCK_VAL);
732*54b15c59SMarius Cristea 	if (ret)
733*54b15c59SMarius Cristea 		return ret;
734*54b15c59SMarius Cristea 
735*54b15c59SMarius Cristea 	if (priv->chip->has_ext2_beta_reg) {
736*54b15c59SMarius Cristea 		ret = regmap_write(priv->regmap, EMC1812_EXT2_BETA_CONFIG_ADDR,
737*54b15c59SMarius Cristea 				   EMC1812_BETA_LOCK_VAL);
738*54b15c59SMarius Cristea 		if (ret)
739*54b15c59SMarius Cristea 			return ret;
740*54b15c59SMarius Cristea 	}
741*54b15c59SMarius Cristea 
742*54b15c59SMarius Cristea 	for (i = 0; i < priv->chip->phys_channels; i++) {
743*54b15c59SMarius Cristea 		if (!test_bit(i, &priv->active_ch_mask))
744*54b15c59SMarius Cristea 			continue;
745*54b15c59SMarius Cristea 
746*54b15c59SMarius Cristea 		/* Update the max temperature limit for extended temperature range. */
747*54b15c59SMarius Cristea 		ret = emc1812_set_temp(priv, i, emc1812_temp_map[hwmon_temp_max],
748*54b15c59SMarius Cristea 				       EMC1812_HIGH_LIMIT_DEFAULT * 1000);
749*54b15c59SMarius Cristea 		if (ret)
750*54b15c59SMarius Cristea 			return ret;
751*54b15c59SMarius Cristea 
752*54b15c59SMarius Cristea 		/* Update the critical temperature limit for extended temperature range. */
753*54b15c59SMarius Cristea 		ret = regmap_write(priv->regmap, emc1812_temp_crit_regs[i],
754*54b15c59SMarius Cristea 				   EMC1812_HIGH_LIMIT_DEFAULT);
755*54b15c59SMarius Cristea 		if (ret)
756*54b15c59SMarius Cristea 			return ret;
757*54b15c59SMarius Cristea 
758*54b15c59SMarius Cristea 		/* Set the ideality factor */
759*54b15c59SMarius Cristea 		if (i > 0) {
760*54b15c59SMarius Cristea 			ret = regmap_write(priv->regmap, emc1812_ideality_regs[i],
761*54b15c59SMarius Cristea 					   EMC1812_DEFAULT_IDEALITY_FACTOR);
762*54b15c59SMarius Cristea 			if (ret)
763*54b15c59SMarius Cristea 				return ret;
764*54b15c59SMarius Cristea 		}
765*54b15c59SMarius Cristea 	}
766*54b15c59SMarius Cristea 
767*54b15c59SMarius Cristea 	/*
768*54b15c59SMarius Cristea 	 * Set default values in registers. APDD, RECD12 and RECD34 are active on 0.
769*54b15c59SMarius Cristea 	 * Set the device to be in Run (Active) state and converting on all
770*54b15c59SMarius Cristea 	 * channels.
771*54b15c59SMarius Cristea 	 * Don't change conversion rate. After reset, default is 4 conversions/seconds.
772*54b15c59SMarius Cristea 	 * The temperature measurement range is -64°C to +191.875°C.
773*54b15c59SMarius Cristea 	 * Set ALERT/THERM2 pin to be in comparator mode (When the ALERT/THERM2 pin is
774*54b15c59SMarius Cristea 	 * asserted in comparator mode, the corresponding High Limit Status bits are set.
775*54b15c59SMarius Cristea 	 * Reading these bits does not clear them until the ALERT/THERM2 pin is deasserted.
776*54b15c59SMarius Cristea 	 * Once the ALERT/THERM2 pin is deasserted, the status bits are automatically
777*54b15c59SMarius Cristea 	 * cleared.).
778*54b15c59SMarius Cristea 	 */
779*54b15c59SMarius Cristea 	val = FIELD_PREP(EMC1812_CFG_MSKAL, 0) |
780*54b15c59SMarius Cristea 	      FIELD_PREP(EMC1812_CFG_RS, 0) |
781*54b15c59SMarius Cristea 	      FIELD_PREP(EMC1812_CFG_ATTHM, 1) |
782*54b15c59SMarius Cristea 	      FIELD_PREP(EMC1812_CFG_RECD12, !priv->recd12_en) |
783*54b15c59SMarius Cristea 	      FIELD_PREP(EMC1812_CFG_RECD34, !priv->recd34_en) |
784*54b15c59SMarius Cristea 	      FIELD_PREP(EMC1812_CFG_RANGE, 1) |
785*54b15c59SMarius Cristea 	      FIELD_PREP(EMC1812_CFG_DA_ENA, 0) |
786*54b15c59SMarius Cristea 	      FIELD_PREP(EMC1812_CFG_APDD, !priv->apdd_en);
787*54b15c59SMarius Cristea 
788*54b15c59SMarius Cristea 	return regmap_write(priv->regmap, EMC1812_CFG_ADDR, val);
789*54b15c59SMarius Cristea }
790*54b15c59SMarius Cristea 
791*54b15c59SMarius Cristea static int emc1812_parse_fw_config(struct emc1812_data *data, struct device *dev)
792*54b15c59SMarius Cristea {
793*54b15c59SMarius Cristea 	unsigned int reg_nr = 0;
794*54b15c59SMarius Cristea 	int ret;
795*54b15c59SMarius Cristea 
796*54b15c59SMarius Cristea 	/* To be able to load the driver in case we don't have device tree */
797*54b15c59SMarius Cristea 	if (!dev_fwnode(dev)) {
798*54b15c59SMarius Cristea 		data->active_ch_mask = BIT(data->chip->phys_channels) - 1;
799*54b15c59SMarius Cristea 		return 0;
800*54b15c59SMarius Cristea 	}
801*54b15c59SMarius Cristea 
802*54b15c59SMarius Cristea 	data->apdd_en = device_property_read_bool(dev, "microchip,enable-anti-parallel");
803*54b15c59SMarius Cristea 	data->recd12_en = device_property_read_bool(dev, "microchip,parasitic-res-on-channel1-2");
804*54b15c59SMarius Cristea 	data->recd34_en = device_property_read_bool(dev, "microchip,parasitic-res-on-channel3-4");
805*54b15c59SMarius Cristea 
806*54b15c59SMarius Cristea 	/* Internal temperature channel is always active */
807*54b15c59SMarius Cristea 	data->labels[reg_nr] = "internal_diode";
808*54b15c59SMarius Cristea 	set_bit(reg_nr, &data->active_ch_mask);
809*54b15c59SMarius Cristea 
810*54b15c59SMarius Cristea 	device_for_each_child_node_scoped(dev, child) {
811*54b15c59SMarius Cristea 		ret = fwnode_property_read_u32(child, "reg", &reg_nr);
812*54b15c59SMarius Cristea 		if (ret || reg_nr >= data->chip->phys_channels)
813*54b15c59SMarius Cristea 			return dev_err_probe(dev, -EINVAL,
814*54b15c59SMarius Cristea 					     "The index is higher then the chip supports\n");
815*54b15c59SMarius Cristea 		/* Mark channel as active */
816*54b15c59SMarius Cristea 		set_bit(reg_nr, &data->active_ch_mask);
817*54b15c59SMarius Cristea 
818*54b15c59SMarius Cristea 		fwnode_property_read_string(child, "label", &data->labels[reg_nr]);
819*54b15c59SMarius Cristea 	}
820*54b15c59SMarius Cristea 
821*54b15c59SMarius Cristea 	return 0;
822*54b15c59SMarius Cristea }
823*54b15c59SMarius Cristea 
824*54b15c59SMarius Cristea static int emc1812_chip_identify(struct emc1812_data *data, struct i2c_client *client)
825*54b15c59SMarius Cristea {
826*54b15c59SMarius Cristea 	const struct emc1812_features *chip;
827*54b15c59SMarius Cristea 	struct device *dev = &client->dev;
828*54b15c59SMarius Cristea 	unsigned int tmp;
829*54b15c59SMarius Cristea 	int ret;
830*54b15c59SMarius Cristea 
831*54b15c59SMarius Cristea 	ret = regmap_read(data->regmap, EMC1812_PRODUCT_ID_ADDR, &tmp);
832*54b15c59SMarius Cristea 	if (ret)
833*54b15c59SMarius Cristea 		return ret;
834*54b15c59SMarius Cristea 
835*54b15c59SMarius Cristea 	switch (tmp) {
836*54b15c59SMarius Cristea 	case EMC1812_PID:
837*54b15c59SMarius Cristea 		data->chip = &emc1812_chip_config;
838*54b15c59SMarius Cristea 		break;
839*54b15c59SMarius Cristea 	case EMC1813_PID:
840*54b15c59SMarius Cristea 		data->chip = &emc1813_chip_config;
841*54b15c59SMarius Cristea 		break;
842*54b15c59SMarius Cristea 	case EMC1814_PID:
843*54b15c59SMarius Cristea 		data->chip = &emc1814_chip_config;
844*54b15c59SMarius Cristea 		break;
845*54b15c59SMarius Cristea 	case EMC1815_PID:
846*54b15c59SMarius Cristea 		data->chip = &emc1815_chip_config;
847*54b15c59SMarius Cristea 		break;
848*54b15c59SMarius Cristea 	case EMC1833_PID:
849*54b15c59SMarius Cristea 		data->chip = &emc1833_chip_config;
850*54b15c59SMarius Cristea 		break;
851*54b15c59SMarius Cristea 	default:
852*54b15c59SMarius Cristea 		/*
853*54b15c59SMarius Cristea 		 * If failed to identify the hardware based on internal registers,
854*54b15c59SMarius Cristea 		 * try using fallback compatible in device tree to deal with some
855*54b15c59SMarius Cristea 		 * newer part number.
856*54b15c59SMarius Cristea 		 */
857*54b15c59SMarius Cristea 		chip = i2c_get_match_data(client);
858*54b15c59SMarius Cristea 		if (!chip)
859*54b15c59SMarius Cristea 			return -ENODEV;
860*54b15c59SMarius Cristea 
861*54b15c59SMarius Cristea 		dev_warn(dev, "Unrecognized hardware ID 0x%x, using %s from devicetree data\n",
862*54b15c59SMarius Cristea 			 tmp, chip->name);
863*54b15c59SMarius Cristea 
864*54b15c59SMarius Cristea 		data->chip = chip;
865*54b15c59SMarius Cristea 
866*54b15c59SMarius Cristea 		return 0;
867*54b15c59SMarius Cristea 	}
868*54b15c59SMarius Cristea 
869*54b15c59SMarius Cristea 	return 0;
870*54b15c59SMarius Cristea }
871*54b15c59SMarius Cristea 
872*54b15c59SMarius Cristea static const struct hwmon_ops emc1812_ops = {
873*54b15c59SMarius Cristea 	.is_visible = emc1812_is_visible,
874*54b15c59SMarius Cristea 	.read = emc1812_read,
875*54b15c59SMarius Cristea 	.read_string = emc1812_read_string,
876*54b15c59SMarius Cristea 	.write = emc1812_write,
877*54b15c59SMarius Cristea };
878*54b15c59SMarius Cristea 
879*54b15c59SMarius Cristea static const struct hwmon_chip_info emc1812_chip_info = {
880*54b15c59SMarius Cristea 	.ops = &emc1812_ops,
881*54b15c59SMarius Cristea 	.info = emc1812_info,
882*54b15c59SMarius Cristea };
883*54b15c59SMarius Cristea 
884*54b15c59SMarius Cristea static int emc1812_probe(struct i2c_client *client)
885*54b15c59SMarius Cristea {
886*54b15c59SMarius Cristea 	struct device *dev = &client->dev;
887*54b15c59SMarius Cristea 	struct emc1812_data *data;
888*54b15c59SMarius Cristea 	struct device *hwmon_dev;
889*54b15c59SMarius Cristea 	int ret;
890*54b15c59SMarius Cristea 
891*54b15c59SMarius Cristea 	data = devm_kzalloc(dev, sizeof(*data), GFP_KERNEL);
892*54b15c59SMarius Cristea 	if (!data)
893*54b15c59SMarius Cristea 		return -ENOMEM;
894*54b15c59SMarius Cristea 
895*54b15c59SMarius Cristea 	data->regmap = devm_regmap_init_i2c(client, &emc1812_regmap_config);
896*54b15c59SMarius Cristea 	if (IS_ERR(data->regmap))
897*54b15c59SMarius Cristea 		return dev_err_probe(dev, PTR_ERR(data->regmap),
898*54b15c59SMarius Cristea 				     "Cannot initialize register map\n");
899*54b15c59SMarius Cristea 
900*54b15c59SMarius Cristea 	ret = emc1812_chip_identify(data, client);
901*54b15c59SMarius Cristea 	if (ret)
902*54b15c59SMarius Cristea 		return dev_err_probe(dev, ret, "Chip identification fails\n");
903*54b15c59SMarius Cristea 
904*54b15c59SMarius Cristea 	ret = emc1812_parse_fw_config(data, dev);
905*54b15c59SMarius Cristea 	if (ret)
906*54b15c59SMarius Cristea 		return ret;
907*54b15c59SMarius Cristea 
908*54b15c59SMarius Cristea 	ret = emc1812_init(data);
909*54b15c59SMarius Cristea 	if (ret)
910*54b15c59SMarius Cristea 		return dev_err_probe(dev, ret, "Cannot initialize device\n");
911*54b15c59SMarius Cristea 
912*54b15c59SMarius Cristea 	hwmon_dev = devm_hwmon_device_register_with_info(dev, client->name, data,
913*54b15c59SMarius Cristea 							 &emc1812_chip_info, NULL);
914*54b15c59SMarius Cristea 
915*54b15c59SMarius Cristea 	return PTR_ERR_OR_ZERO(hwmon_dev);
916*54b15c59SMarius Cristea }
917*54b15c59SMarius Cristea 
918*54b15c59SMarius Cristea static const struct i2c_device_id emc1812_id[] = {
919*54b15c59SMarius Cristea 	{ .name = "emc1812", .driver_data = (kernel_ulong_t)&emc1812_chip_config },
920*54b15c59SMarius Cristea 	{ .name = "emc1813", .driver_data = (kernel_ulong_t)&emc1813_chip_config },
921*54b15c59SMarius Cristea 	{ .name = "emc1814", .driver_data = (kernel_ulong_t)&emc1814_chip_config },
922*54b15c59SMarius Cristea 	{ .name = "emc1815", .driver_data = (kernel_ulong_t)&emc1815_chip_config },
923*54b15c59SMarius Cristea 	{ .name = "emc1833", .driver_data = (kernel_ulong_t)&emc1833_chip_config },
924*54b15c59SMarius Cristea 	{ }
925*54b15c59SMarius Cristea };
926*54b15c59SMarius Cristea MODULE_DEVICE_TABLE(i2c, emc1812_id);
927*54b15c59SMarius Cristea 
928*54b15c59SMarius Cristea static const struct of_device_id emc1812_of_match[] = {
929*54b15c59SMarius Cristea 	{
930*54b15c59SMarius Cristea 		.compatible = "microchip,emc1812",
931*54b15c59SMarius Cristea 		.data = &emc1812_chip_config
932*54b15c59SMarius Cristea 	},
933*54b15c59SMarius Cristea 	{
934*54b15c59SMarius Cristea 		.compatible = "microchip,emc1813",
935*54b15c59SMarius Cristea 		.data = &emc1813_chip_config
936*54b15c59SMarius Cristea 	},
937*54b15c59SMarius Cristea 	{
938*54b15c59SMarius Cristea 		.compatible = "microchip,emc1814",
939*54b15c59SMarius Cristea 		.data = &emc1814_chip_config
940*54b15c59SMarius Cristea 	},
941*54b15c59SMarius Cristea 	{
942*54b15c59SMarius Cristea 		.compatible = "microchip,emc1815",
943*54b15c59SMarius Cristea 		.data = &emc1815_chip_config
944*54b15c59SMarius Cristea 	},
945*54b15c59SMarius Cristea 	{
946*54b15c59SMarius Cristea 		.compatible = "microchip,emc1833",
947*54b15c59SMarius Cristea 		.data = &emc1833_chip_config
948*54b15c59SMarius Cristea 	},
949*54b15c59SMarius Cristea 	{ }
950*54b15c59SMarius Cristea };
951*54b15c59SMarius Cristea MODULE_DEVICE_TABLE(of, emc1812_of_match);
952*54b15c59SMarius Cristea 
953*54b15c59SMarius Cristea static struct i2c_driver emc1812_driver = {
954*54b15c59SMarius Cristea 	.driver	 = {
955*54b15c59SMarius Cristea 		.name = "emc1812",
956*54b15c59SMarius Cristea 		.of_match_table = emc1812_of_match,
957*54b15c59SMarius Cristea 	},
958*54b15c59SMarius Cristea 	.probe = emc1812_probe,
959*54b15c59SMarius Cristea 	.id_table = emc1812_id,
960*54b15c59SMarius Cristea };
961*54b15c59SMarius Cristea module_i2c_driver(emc1812_driver);
962*54b15c59SMarius Cristea 
963*54b15c59SMarius Cristea MODULE_AUTHOR("Marius Cristea <marius.cristea@microchip.com>");
964*54b15c59SMarius Cristea MODULE_DESCRIPTION("EMC1812/13/14/15/33 high-accuracy remote diode temperature monitor Driver");
965*54b15c59SMarius Cristea MODULE_LICENSE("GPL");
966