xref: /OK3568_Linux_fs/kernel/drivers/hwmon/pmbus/max31785.c (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1*4882a593Smuzhiyun // SPDX-License-Identifier: GPL-2.0-or-later
2*4882a593Smuzhiyun /*
3*4882a593Smuzhiyun  * Copyright (C) 2017 IBM Corp.
4*4882a593Smuzhiyun  */
5*4882a593Smuzhiyun 
6*4882a593Smuzhiyun #include <linux/kernel.h>
7*4882a593Smuzhiyun #include <linux/module.h>
8*4882a593Smuzhiyun #include <linux/init.h>
9*4882a593Smuzhiyun #include <linux/err.h>
10*4882a593Smuzhiyun #include <linux/i2c.h>
11*4882a593Smuzhiyun #include "pmbus.h"
12*4882a593Smuzhiyun 
13*4882a593Smuzhiyun enum max31785_regs {
14*4882a593Smuzhiyun 	MFR_REVISION		= 0x9b,
15*4882a593Smuzhiyun 	MFR_FAN_CONFIG		= 0xf1,
16*4882a593Smuzhiyun };
17*4882a593Smuzhiyun 
18*4882a593Smuzhiyun #define MAX31785			0x3030
19*4882a593Smuzhiyun #define MAX31785A			0x3040
20*4882a593Smuzhiyun 
21*4882a593Smuzhiyun #define MFR_FAN_CONFIG_DUAL_TACH	BIT(12)
22*4882a593Smuzhiyun 
23*4882a593Smuzhiyun #define MAX31785_NR_PAGES		23
24*4882a593Smuzhiyun #define MAX31785_NR_FAN_PAGES		6
25*4882a593Smuzhiyun 
max31785_read_byte_data(struct i2c_client * client,int page,int reg)26*4882a593Smuzhiyun static int max31785_read_byte_data(struct i2c_client *client, int page,
27*4882a593Smuzhiyun 				   int reg)
28*4882a593Smuzhiyun {
29*4882a593Smuzhiyun 	if (page < MAX31785_NR_PAGES)
30*4882a593Smuzhiyun 		return -ENODATA;
31*4882a593Smuzhiyun 
32*4882a593Smuzhiyun 	switch (reg) {
33*4882a593Smuzhiyun 	case PMBUS_VOUT_MODE:
34*4882a593Smuzhiyun 		return -ENOTSUPP;
35*4882a593Smuzhiyun 	case PMBUS_FAN_CONFIG_12:
36*4882a593Smuzhiyun 		return pmbus_read_byte_data(client, page - MAX31785_NR_PAGES,
37*4882a593Smuzhiyun 					    reg);
38*4882a593Smuzhiyun 	}
39*4882a593Smuzhiyun 
40*4882a593Smuzhiyun 	return -ENODATA;
41*4882a593Smuzhiyun }
42*4882a593Smuzhiyun 
max31785_write_byte(struct i2c_client * client,int page,u8 value)43*4882a593Smuzhiyun static int max31785_write_byte(struct i2c_client *client, int page, u8 value)
44*4882a593Smuzhiyun {
45*4882a593Smuzhiyun 	if (page < MAX31785_NR_PAGES)
46*4882a593Smuzhiyun 		return -ENODATA;
47*4882a593Smuzhiyun 
48*4882a593Smuzhiyun 	return -ENOTSUPP;
49*4882a593Smuzhiyun }
50*4882a593Smuzhiyun 
max31785_read_long_data(struct i2c_client * client,int page,int reg,u32 * data)51*4882a593Smuzhiyun static int max31785_read_long_data(struct i2c_client *client, int page,
52*4882a593Smuzhiyun 				   int reg, u32 *data)
53*4882a593Smuzhiyun {
54*4882a593Smuzhiyun 	unsigned char cmdbuf[1];
55*4882a593Smuzhiyun 	unsigned char rspbuf[4];
56*4882a593Smuzhiyun 	int rc;
57*4882a593Smuzhiyun 
58*4882a593Smuzhiyun 	struct i2c_msg msg[2] = {
59*4882a593Smuzhiyun 		{
60*4882a593Smuzhiyun 			.addr = client->addr,
61*4882a593Smuzhiyun 			.flags = 0,
62*4882a593Smuzhiyun 			.len = sizeof(cmdbuf),
63*4882a593Smuzhiyun 			.buf = cmdbuf,
64*4882a593Smuzhiyun 		},
65*4882a593Smuzhiyun 		{
66*4882a593Smuzhiyun 			.addr = client->addr,
67*4882a593Smuzhiyun 			.flags = I2C_M_RD,
68*4882a593Smuzhiyun 			.len = sizeof(rspbuf),
69*4882a593Smuzhiyun 			.buf = rspbuf,
70*4882a593Smuzhiyun 		},
71*4882a593Smuzhiyun 	};
72*4882a593Smuzhiyun 
73*4882a593Smuzhiyun 	cmdbuf[0] = reg;
74*4882a593Smuzhiyun 
75*4882a593Smuzhiyun 	rc = pmbus_set_page(client, page, 0xff);
76*4882a593Smuzhiyun 	if (rc < 0)
77*4882a593Smuzhiyun 		return rc;
78*4882a593Smuzhiyun 
79*4882a593Smuzhiyun 	rc = i2c_transfer(client->adapter, msg, ARRAY_SIZE(msg));
80*4882a593Smuzhiyun 	if (rc < 0)
81*4882a593Smuzhiyun 		return rc;
82*4882a593Smuzhiyun 
83*4882a593Smuzhiyun 	*data = (rspbuf[0] << (0 * 8)) | (rspbuf[1] << (1 * 8)) |
84*4882a593Smuzhiyun 		(rspbuf[2] << (2 * 8)) | (rspbuf[3] << (3 * 8));
85*4882a593Smuzhiyun 
86*4882a593Smuzhiyun 	return rc;
87*4882a593Smuzhiyun }
88*4882a593Smuzhiyun 
max31785_get_pwm(struct i2c_client * client,int page)89*4882a593Smuzhiyun static int max31785_get_pwm(struct i2c_client *client, int page)
90*4882a593Smuzhiyun {
91*4882a593Smuzhiyun 	int rv;
92*4882a593Smuzhiyun 
93*4882a593Smuzhiyun 	rv = pmbus_get_fan_rate_device(client, page, 0, percent);
94*4882a593Smuzhiyun 	if (rv < 0)
95*4882a593Smuzhiyun 		return rv;
96*4882a593Smuzhiyun 	else if (rv >= 0x8000)
97*4882a593Smuzhiyun 		return 0;
98*4882a593Smuzhiyun 	else if (rv >= 0x2711)
99*4882a593Smuzhiyun 		return 0x2710;
100*4882a593Smuzhiyun 
101*4882a593Smuzhiyun 	return rv;
102*4882a593Smuzhiyun }
103*4882a593Smuzhiyun 
max31785_get_pwm_mode(struct i2c_client * client,int page)104*4882a593Smuzhiyun static int max31785_get_pwm_mode(struct i2c_client *client, int page)
105*4882a593Smuzhiyun {
106*4882a593Smuzhiyun 	int config;
107*4882a593Smuzhiyun 	int command;
108*4882a593Smuzhiyun 
109*4882a593Smuzhiyun 	config = pmbus_read_byte_data(client, page, PMBUS_FAN_CONFIG_12);
110*4882a593Smuzhiyun 	if (config < 0)
111*4882a593Smuzhiyun 		return config;
112*4882a593Smuzhiyun 
113*4882a593Smuzhiyun 	command = pmbus_read_word_data(client, page, 0xff, PMBUS_FAN_COMMAND_1);
114*4882a593Smuzhiyun 	if (command < 0)
115*4882a593Smuzhiyun 		return command;
116*4882a593Smuzhiyun 
117*4882a593Smuzhiyun 	if (config & PB_FAN_1_RPM)
118*4882a593Smuzhiyun 		return (command >= 0x8000) ? 3 : 2;
119*4882a593Smuzhiyun 
120*4882a593Smuzhiyun 	if (command >= 0x8000)
121*4882a593Smuzhiyun 		return 3;
122*4882a593Smuzhiyun 	else if (command >= 0x2711)
123*4882a593Smuzhiyun 		return 0;
124*4882a593Smuzhiyun 
125*4882a593Smuzhiyun 	return 1;
126*4882a593Smuzhiyun }
127*4882a593Smuzhiyun 
max31785_read_word_data(struct i2c_client * client,int page,int phase,int reg)128*4882a593Smuzhiyun static int max31785_read_word_data(struct i2c_client *client, int page,
129*4882a593Smuzhiyun 				   int phase, int reg)
130*4882a593Smuzhiyun {
131*4882a593Smuzhiyun 	u32 val;
132*4882a593Smuzhiyun 	int rv;
133*4882a593Smuzhiyun 
134*4882a593Smuzhiyun 	switch (reg) {
135*4882a593Smuzhiyun 	case PMBUS_READ_FAN_SPEED_1:
136*4882a593Smuzhiyun 		if (page < MAX31785_NR_PAGES)
137*4882a593Smuzhiyun 			return -ENODATA;
138*4882a593Smuzhiyun 
139*4882a593Smuzhiyun 		rv = max31785_read_long_data(client, page - MAX31785_NR_PAGES,
140*4882a593Smuzhiyun 					     reg, &val);
141*4882a593Smuzhiyun 		if (rv < 0)
142*4882a593Smuzhiyun 			return rv;
143*4882a593Smuzhiyun 
144*4882a593Smuzhiyun 		rv = (val >> 16) & 0xffff;
145*4882a593Smuzhiyun 		break;
146*4882a593Smuzhiyun 	case PMBUS_FAN_COMMAND_1:
147*4882a593Smuzhiyun 		/*
148*4882a593Smuzhiyun 		 * PMBUS_FAN_COMMAND_x is probed to judge whether or not to
149*4882a593Smuzhiyun 		 * expose fan control registers.
150*4882a593Smuzhiyun 		 *
151*4882a593Smuzhiyun 		 * Don't expose fan_target attribute for virtual pages.
152*4882a593Smuzhiyun 		 */
153*4882a593Smuzhiyun 		rv = (page >= MAX31785_NR_PAGES) ? -ENOTSUPP : -ENODATA;
154*4882a593Smuzhiyun 		break;
155*4882a593Smuzhiyun 	case PMBUS_VIRT_PWM_1:
156*4882a593Smuzhiyun 		rv = max31785_get_pwm(client, page);
157*4882a593Smuzhiyun 		break;
158*4882a593Smuzhiyun 	case PMBUS_VIRT_PWM_ENABLE_1:
159*4882a593Smuzhiyun 		rv = max31785_get_pwm_mode(client, page);
160*4882a593Smuzhiyun 		break;
161*4882a593Smuzhiyun 	default:
162*4882a593Smuzhiyun 		rv = -ENODATA;
163*4882a593Smuzhiyun 		break;
164*4882a593Smuzhiyun 	}
165*4882a593Smuzhiyun 
166*4882a593Smuzhiyun 	return rv;
167*4882a593Smuzhiyun }
168*4882a593Smuzhiyun 
max31785_scale_pwm(u32 sensor_val)169*4882a593Smuzhiyun static inline u32 max31785_scale_pwm(u32 sensor_val)
170*4882a593Smuzhiyun {
171*4882a593Smuzhiyun 	/*
172*4882a593Smuzhiyun 	 * The datasheet describes the accepted value range for manual PWM as
173*4882a593Smuzhiyun 	 * [0, 0x2710], while the hwmon pwmX sysfs interface accepts values in
174*4882a593Smuzhiyun 	 * [0, 255]. The MAX31785 uses DIRECT mode to scale the FAN_COMMAND
175*4882a593Smuzhiyun 	 * registers and in PWM mode the coefficients are m=1, b=0, R=2. The
176*4882a593Smuzhiyun 	 * important observation here is that 0x2710 == 10000 == 100 * 100.
177*4882a593Smuzhiyun 	 *
178*4882a593Smuzhiyun 	 * R=2 (== 10^2 == 100) accounts for scaling the value provided at the
179*4882a593Smuzhiyun 	 * sysfs interface into the required hardware resolution, but it does
180*4882a593Smuzhiyun 	 * not yet yield a value that we can write to the device (this initial
181*4882a593Smuzhiyun 	 * scaling is handled by pmbus_data2reg()). Multiplying by 100 below
182*4882a593Smuzhiyun 	 * translates the parameter value into the percentage units required by
183*4882a593Smuzhiyun 	 * PMBus, and then we scale back by 255 as required by the hwmon pwmX
184*4882a593Smuzhiyun 	 * interface to yield the percentage value at the appropriate
185*4882a593Smuzhiyun 	 * resolution for hardware.
186*4882a593Smuzhiyun 	 */
187*4882a593Smuzhiyun 	return (sensor_val * 100) / 255;
188*4882a593Smuzhiyun }
189*4882a593Smuzhiyun 
max31785_pwm_enable(struct i2c_client * client,int page,u16 word)190*4882a593Smuzhiyun static int max31785_pwm_enable(struct i2c_client *client, int page,
191*4882a593Smuzhiyun 				    u16 word)
192*4882a593Smuzhiyun {
193*4882a593Smuzhiyun 	int config = 0;
194*4882a593Smuzhiyun 	int rate;
195*4882a593Smuzhiyun 
196*4882a593Smuzhiyun 	switch (word) {
197*4882a593Smuzhiyun 	case 0:
198*4882a593Smuzhiyun 		rate = 0x7fff;
199*4882a593Smuzhiyun 		break;
200*4882a593Smuzhiyun 	case 1:
201*4882a593Smuzhiyun 		rate = pmbus_get_fan_rate_cached(client, page, 0, percent);
202*4882a593Smuzhiyun 		if (rate < 0)
203*4882a593Smuzhiyun 			return rate;
204*4882a593Smuzhiyun 		rate = max31785_scale_pwm(rate);
205*4882a593Smuzhiyun 		break;
206*4882a593Smuzhiyun 	case 2:
207*4882a593Smuzhiyun 		config = PB_FAN_1_RPM;
208*4882a593Smuzhiyun 		rate = pmbus_get_fan_rate_cached(client, page, 0, rpm);
209*4882a593Smuzhiyun 		if (rate < 0)
210*4882a593Smuzhiyun 			return rate;
211*4882a593Smuzhiyun 		break;
212*4882a593Smuzhiyun 	case 3:
213*4882a593Smuzhiyun 		rate = 0xffff;
214*4882a593Smuzhiyun 		break;
215*4882a593Smuzhiyun 	default:
216*4882a593Smuzhiyun 		return -EINVAL;
217*4882a593Smuzhiyun 	}
218*4882a593Smuzhiyun 
219*4882a593Smuzhiyun 	return pmbus_update_fan(client, page, 0, config, PB_FAN_1_RPM, rate);
220*4882a593Smuzhiyun }
221*4882a593Smuzhiyun 
max31785_write_word_data(struct i2c_client * client,int page,int reg,u16 word)222*4882a593Smuzhiyun static int max31785_write_word_data(struct i2c_client *client, int page,
223*4882a593Smuzhiyun 				    int reg, u16 word)
224*4882a593Smuzhiyun {
225*4882a593Smuzhiyun 	switch (reg) {
226*4882a593Smuzhiyun 	case PMBUS_VIRT_PWM_1:
227*4882a593Smuzhiyun 		return pmbus_update_fan(client, page, 0, 0, PB_FAN_1_RPM,
228*4882a593Smuzhiyun 					max31785_scale_pwm(word));
229*4882a593Smuzhiyun 	case PMBUS_VIRT_PWM_ENABLE_1:
230*4882a593Smuzhiyun 		return max31785_pwm_enable(client, page, word);
231*4882a593Smuzhiyun 	default:
232*4882a593Smuzhiyun 		break;
233*4882a593Smuzhiyun 	}
234*4882a593Smuzhiyun 
235*4882a593Smuzhiyun 	return -ENODATA;
236*4882a593Smuzhiyun }
237*4882a593Smuzhiyun 
238*4882a593Smuzhiyun #define MAX31785_FAN_FUNCS \
239*4882a593Smuzhiyun 	(PMBUS_HAVE_FAN12 | PMBUS_HAVE_STATUS_FAN12 | PMBUS_HAVE_PWM12)
240*4882a593Smuzhiyun 
241*4882a593Smuzhiyun #define MAX31785_TEMP_FUNCS \
242*4882a593Smuzhiyun 	(PMBUS_HAVE_TEMP | PMBUS_HAVE_STATUS_TEMP)
243*4882a593Smuzhiyun 
244*4882a593Smuzhiyun #define MAX31785_VOUT_FUNCS \
245*4882a593Smuzhiyun 	(PMBUS_HAVE_VOUT | PMBUS_HAVE_STATUS_VOUT)
246*4882a593Smuzhiyun 
247*4882a593Smuzhiyun static const struct pmbus_driver_info max31785_info = {
248*4882a593Smuzhiyun 	.pages = MAX31785_NR_PAGES,
249*4882a593Smuzhiyun 
250*4882a593Smuzhiyun 	.write_word_data = max31785_write_word_data,
251*4882a593Smuzhiyun 	.read_byte_data = max31785_read_byte_data,
252*4882a593Smuzhiyun 	.read_word_data = max31785_read_word_data,
253*4882a593Smuzhiyun 	.write_byte = max31785_write_byte,
254*4882a593Smuzhiyun 
255*4882a593Smuzhiyun 	/* RPM */
256*4882a593Smuzhiyun 	.format[PSC_FAN] = direct,
257*4882a593Smuzhiyun 	.m[PSC_FAN] = 1,
258*4882a593Smuzhiyun 	.b[PSC_FAN] = 0,
259*4882a593Smuzhiyun 	.R[PSC_FAN] = 0,
260*4882a593Smuzhiyun 	/* PWM */
261*4882a593Smuzhiyun 	.format[PSC_PWM] = direct,
262*4882a593Smuzhiyun 	.m[PSC_PWM] = 1,
263*4882a593Smuzhiyun 	.b[PSC_PWM] = 0,
264*4882a593Smuzhiyun 	.R[PSC_PWM] = 2,
265*4882a593Smuzhiyun 	.func[0] = MAX31785_FAN_FUNCS,
266*4882a593Smuzhiyun 	.func[1] = MAX31785_FAN_FUNCS,
267*4882a593Smuzhiyun 	.func[2] = MAX31785_FAN_FUNCS,
268*4882a593Smuzhiyun 	.func[3] = MAX31785_FAN_FUNCS,
269*4882a593Smuzhiyun 	.func[4] = MAX31785_FAN_FUNCS,
270*4882a593Smuzhiyun 	.func[5] = MAX31785_FAN_FUNCS,
271*4882a593Smuzhiyun 
272*4882a593Smuzhiyun 	.format[PSC_TEMPERATURE] = direct,
273*4882a593Smuzhiyun 	.m[PSC_TEMPERATURE] = 1,
274*4882a593Smuzhiyun 	.b[PSC_TEMPERATURE] = 0,
275*4882a593Smuzhiyun 	.R[PSC_TEMPERATURE] = 2,
276*4882a593Smuzhiyun 	.func[6]  = MAX31785_TEMP_FUNCS,
277*4882a593Smuzhiyun 	.func[7]  = MAX31785_TEMP_FUNCS,
278*4882a593Smuzhiyun 	.func[8]  = MAX31785_TEMP_FUNCS,
279*4882a593Smuzhiyun 	.func[9]  = MAX31785_TEMP_FUNCS,
280*4882a593Smuzhiyun 	.func[10] = MAX31785_TEMP_FUNCS,
281*4882a593Smuzhiyun 	.func[11] = MAX31785_TEMP_FUNCS,
282*4882a593Smuzhiyun 	.func[12] = MAX31785_TEMP_FUNCS,
283*4882a593Smuzhiyun 	.func[13] = MAX31785_TEMP_FUNCS,
284*4882a593Smuzhiyun 	.func[14] = MAX31785_TEMP_FUNCS,
285*4882a593Smuzhiyun 	.func[15] = MAX31785_TEMP_FUNCS,
286*4882a593Smuzhiyun 	.func[16] = MAX31785_TEMP_FUNCS,
287*4882a593Smuzhiyun 
288*4882a593Smuzhiyun 	.format[PSC_VOLTAGE_OUT] = direct,
289*4882a593Smuzhiyun 	.m[PSC_VOLTAGE_OUT] = 1,
290*4882a593Smuzhiyun 	.b[PSC_VOLTAGE_OUT] = 0,
291*4882a593Smuzhiyun 	.R[PSC_VOLTAGE_OUT] = 0,
292*4882a593Smuzhiyun 	.func[17] = MAX31785_VOUT_FUNCS,
293*4882a593Smuzhiyun 	.func[18] = MAX31785_VOUT_FUNCS,
294*4882a593Smuzhiyun 	.func[19] = MAX31785_VOUT_FUNCS,
295*4882a593Smuzhiyun 	.func[20] = MAX31785_VOUT_FUNCS,
296*4882a593Smuzhiyun 	.func[21] = MAX31785_VOUT_FUNCS,
297*4882a593Smuzhiyun 	.func[22] = MAX31785_VOUT_FUNCS,
298*4882a593Smuzhiyun };
299*4882a593Smuzhiyun 
max31785_configure_dual_tach(struct i2c_client * client,struct pmbus_driver_info * info)300*4882a593Smuzhiyun static int max31785_configure_dual_tach(struct i2c_client *client,
301*4882a593Smuzhiyun 					struct pmbus_driver_info *info)
302*4882a593Smuzhiyun {
303*4882a593Smuzhiyun 	int ret;
304*4882a593Smuzhiyun 	int i;
305*4882a593Smuzhiyun 
306*4882a593Smuzhiyun 	for (i = 0; i < MAX31785_NR_FAN_PAGES; i++) {
307*4882a593Smuzhiyun 		ret = i2c_smbus_write_byte_data(client, PMBUS_PAGE, i);
308*4882a593Smuzhiyun 		if (ret < 0)
309*4882a593Smuzhiyun 			return ret;
310*4882a593Smuzhiyun 
311*4882a593Smuzhiyun 		ret = i2c_smbus_read_word_data(client, MFR_FAN_CONFIG);
312*4882a593Smuzhiyun 		if (ret < 0)
313*4882a593Smuzhiyun 			return ret;
314*4882a593Smuzhiyun 
315*4882a593Smuzhiyun 		if (ret & MFR_FAN_CONFIG_DUAL_TACH) {
316*4882a593Smuzhiyun 			int virtual = MAX31785_NR_PAGES + i;
317*4882a593Smuzhiyun 
318*4882a593Smuzhiyun 			info->pages = virtual + 1;
319*4882a593Smuzhiyun 			info->func[virtual] |= PMBUS_HAVE_FAN12;
320*4882a593Smuzhiyun 			info->func[virtual] |= PMBUS_PAGE_VIRTUAL;
321*4882a593Smuzhiyun 		}
322*4882a593Smuzhiyun 	}
323*4882a593Smuzhiyun 
324*4882a593Smuzhiyun 	return 0;
325*4882a593Smuzhiyun }
326*4882a593Smuzhiyun 
max31785_probe(struct i2c_client * client)327*4882a593Smuzhiyun static int max31785_probe(struct i2c_client *client)
328*4882a593Smuzhiyun {
329*4882a593Smuzhiyun 	struct device *dev = &client->dev;
330*4882a593Smuzhiyun 	struct pmbus_driver_info *info;
331*4882a593Smuzhiyun 	bool dual_tach = false;
332*4882a593Smuzhiyun 	s64 ret;
333*4882a593Smuzhiyun 
334*4882a593Smuzhiyun 	if (!i2c_check_functionality(client->adapter,
335*4882a593Smuzhiyun 				     I2C_FUNC_SMBUS_BYTE_DATA |
336*4882a593Smuzhiyun 				     I2C_FUNC_SMBUS_WORD_DATA))
337*4882a593Smuzhiyun 		return -ENODEV;
338*4882a593Smuzhiyun 
339*4882a593Smuzhiyun 	info = devm_kzalloc(dev, sizeof(struct pmbus_driver_info), GFP_KERNEL);
340*4882a593Smuzhiyun 	if (!info)
341*4882a593Smuzhiyun 		return -ENOMEM;
342*4882a593Smuzhiyun 
343*4882a593Smuzhiyun 	*info = max31785_info;
344*4882a593Smuzhiyun 
345*4882a593Smuzhiyun 	ret = i2c_smbus_write_byte_data(client, PMBUS_PAGE, 255);
346*4882a593Smuzhiyun 	if (ret < 0)
347*4882a593Smuzhiyun 		return ret;
348*4882a593Smuzhiyun 
349*4882a593Smuzhiyun 	ret = i2c_smbus_read_word_data(client, MFR_REVISION);
350*4882a593Smuzhiyun 	if (ret < 0)
351*4882a593Smuzhiyun 		return ret;
352*4882a593Smuzhiyun 
353*4882a593Smuzhiyun 	if (ret == MAX31785A) {
354*4882a593Smuzhiyun 		dual_tach = true;
355*4882a593Smuzhiyun 	} else if (ret == MAX31785) {
356*4882a593Smuzhiyun 		if (!strcmp("max31785a", client->name))
357*4882a593Smuzhiyun 			dev_warn(dev, "Expected max3175a, found max31785: cannot provide secondary tachometer readings\n");
358*4882a593Smuzhiyun 	} else {
359*4882a593Smuzhiyun 		return -ENODEV;
360*4882a593Smuzhiyun 	}
361*4882a593Smuzhiyun 
362*4882a593Smuzhiyun 	if (dual_tach) {
363*4882a593Smuzhiyun 		ret = max31785_configure_dual_tach(client, info);
364*4882a593Smuzhiyun 		if (ret < 0)
365*4882a593Smuzhiyun 			return ret;
366*4882a593Smuzhiyun 	}
367*4882a593Smuzhiyun 
368*4882a593Smuzhiyun 	return pmbus_do_probe(client, info);
369*4882a593Smuzhiyun }
370*4882a593Smuzhiyun 
371*4882a593Smuzhiyun static const struct i2c_device_id max31785_id[] = {
372*4882a593Smuzhiyun 	{ "max31785", 0 },
373*4882a593Smuzhiyun 	{ "max31785a", 0 },
374*4882a593Smuzhiyun 	{ },
375*4882a593Smuzhiyun };
376*4882a593Smuzhiyun 
377*4882a593Smuzhiyun MODULE_DEVICE_TABLE(i2c, max31785_id);
378*4882a593Smuzhiyun 
379*4882a593Smuzhiyun static const struct of_device_id max31785_of_match[] = {
380*4882a593Smuzhiyun 	{ .compatible = "maxim,max31785" },
381*4882a593Smuzhiyun 	{ .compatible = "maxim,max31785a" },
382*4882a593Smuzhiyun 	{ },
383*4882a593Smuzhiyun };
384*4882a593Smuzhiyun 
385*4882a593Smuzhiyun MODULE_DEVICE_TABLE(of, max31785_of_match);
386*4882a593Smuzhiyun 
387*4882a593Smuzhiyun static struct i2c_driver max31785_driver = {
388*4882a593Smuzhiyun 	.driver = {
389*4882a593Smuzhiyun 		.name = "max31785",
390*4882a593Smuzhiyun 		.of_match_table = max31785_of_match,
391*4882a593Smuzhiyun 	},
392*4882a593Smuzhiyun 	.probe_new = max31785_probe,
393*4882a593Smuzhiyun 	.remove = pmbus_do_remove,
394*4882a593Smuzhiyun 	.id_table = max31785_id,
395*4882a593Smuzhiyun };
396*4882a593Smuzhiyun 
397*4882a593Smuzhiyun module_i2c_driver(max31785_driver);
398*4882a593Smuzhiyun 
399*4882a593Smuzhiyun MODULE_AUTHOR("Andrew Jeffery <andrew@aj.id.au>");
400*4882a593Smuzhiyun MODULE_DESCRIPTION("PMBus driver for the Maxim MAX31785");
401*4882a593Smuzhiyun MODULE_LICENSE("GPL");
402