xref: /linux/drivers/hwmon/chipcap2.c (revision 546b928da0427b0d6c663cbb992bd7bfa9ac7971)
1 // SPDX-License-Identifier: GPL-2.0+
2 /*
3  * cc2.c - Support for the Amphenol ChipCap 2 relative humidity, temperature sensor
4  *
5  * Part numbers supported:
6  * CC2D23, CC2D23S, CC2D25, CC2D25S, CC2D33, CC2D33S, CC2D35, CC2D35S
7  *
8  * Author: Javier Carrasco <javier.carrasco.cruz@gmail.com>
9  *
10  * Datasheet and application notes:
11  * https://www.amphenol-sensors.com/en/telaire/humidity/527-humidity-sensors/3095-chipcap-2
12  */
13 
14 #include <linux/bitfield.h>
15 #include <linux/bits.h>
16 #include <linux/cleanup.h>
17 #include <linux/completion.h>
18 #include <linux/delay.h>
19 #include <linux/hwmon.h>
20 #include <linux/i2c.h>
21 #include <linux/interrupt.h>
22 #include <linux/irq.h>
23 #include <linux/module.h>
24 #include <linux/regulator/consumer.h>
25 #include <linux/mod_devicetable.h>
26 #include <linux/property.h>
27 
28 #define CC2_START_CM			0xA0
29 #define CC2_START_NOM			0x80
30 #define CC2_R_ALARM_H_ON		0x18
31 #define CC2_R_ALARM_H_OFF		0x19
32 #define CC2_R_ALARM_L_ON		0x1A
33 #define CC2_R_ALARM_L_OFF		0x1B
34 #define CC2_RW_OFFSET			0x40
35 #define CC2_W_ALARM_H_ON		(CC2_R_ALARM_H_ON + CC2_RW_OFFSET)
36 #define CC2_W_ALARM_H_OFF		(CC2_R_ALARM_H_OFF + CC2_RW_OFFSET)
37 #define CC2_W_ALARM_L_ON		(CC2_R_ALARM_L_ON + CC2_RW_OFFSET)
38 #define CC2_W_ALARM_L_OFF		(CC2_R_ALARM_L_OFF + CC2_RW_OFFSET)
39 
40 #define CC2_STATUS_FIELD		GENMASK(7, 6)
41 #define CC2_STATUS_VALID_DATA		0x00
42 #define CC2_STATUS_STALE_DATA		0x01
43 #define CC2_STATUS_CMD_MODE		0x02
44 
45 #define CC2_RESPONSE_FIELD		GENMASK(1, 0)
46 #define CC2_RESPONSE_BUSY		0x00
47 #define CC2_RESPONSE_ACK		0x01
48 #define CC2_RESPONSE_NACK		0x02
49 
50 #define CC2_ERR_CORR_EEPROM		BIT(2)
51 #define CC2_ERR_UNCORR_EEPROM		BIT(3)
52 #define CC2_ERR_RAM_PARITY		BIT(4)
53 #define CC2_ERR_CONFIG_LOAD		BIT(5)
54 
55 #define CC2_EEPROM_SIZE			10
56 #define CC2_EEPROM_DATA_LEN		3
57 #define CC2_MEASUREMENT_DATA_LEN	4
58 
59 #define CC2_RH_DATA_FIELD		GENMASK(13, 0)
60 
61 /* ensure clean off -> on transitions */
62 #define CC2_POWER_CYCLE_MS		80
63 
64 #define CC2_STARTUP_TO_DATA_MS		55
65 #define CC2_RESP_START_CM_US		100
66 #define CC2_RESP_EEPROM_R_US		100
67 #define CC2_RESP_EEPROM_W_MS		12
68 #define CC2_STARTUP_TIME_US		1250
69 
70 #define CC2_RH_MAX			(100 * 1000U)
71 
72 #define CC2_CM_RETRIES			5
73 
74 struct cc2_rh_alarm_info {
75 	bool low_alarm;
76 	bool high_alarm;
77 	bool low_alarm_visible;
78 	bool high_alarm_visible;
79 };
80 
81 struct cc2_data {
82 	struct cc2_rh_alarm_info rh_alarm;
83 	struct completion complete;
84 	struct device *hwmon;
85 	struct i2c_client *client;
86 	struct regulator *regulator;
87 	const char *name;
88 	const char *label;
89 	int irq_ready;
90 	int irq_low;
91 	int irq_high;
92 	bool process_irqs;
93 };
94 
95 /* %RH as a per cent mille from a register value */
cc2_rh_convert(u16 data)96 static long cc2_rh_convert(u16 data)
97 {
98 	unsigned long tmp = (data & CC2_RH_DATA_FIELD) * CC2_RH_MAX;
99 
100 	return tmp / ((1 << 14) - 1);
101 }
102 
103 /* convert %RH to a register value */
cc2_rh_to_reg(long data)104 static u16 cc2_rh_to_reg(long data)
105 {
106 	return data * ((1 << 14) - 1) / CC2_RH_MAX;
107 }
108 
109 /* temperature in milli degrees celsius from a register value */
cc2_temp_convert(u16 data)110 static long cc2_temp_convert(u16 data)
111 {
112 	unsigned long tmp = ((data >> 2) * 165 * 1000U) / ((1 << 14) - 1);
113 
114 	return tmp - 40 * 1000U;
115 }
116 
cc2_enable(struct cc2_data * data)117 static int cc2_enable(struct cc2_data *data)
118 {
119 	int ret;
120 
121 	/* exclusive regulator, check in case a disable failed */
122 	if (regulator_is_enabled(data->regulator))
123 		return 0;
124 
125 	/* clear any pending completion */
126 	try_wait_for_completion(&data->complete);
127 
128 	ret = regulator_enable(data->regulator);
129 	if (ret < 0)
130 		return ret;
131 
132 	usleep_range(CC2_STARTUP_TIME_US, CC2_STARTUP_TIME_US + 125);
133 
134 	data->process_irqs = true;
135 
136 	return 0;
137 }
138 
cc2_disable(struct cc2_data * data)139 static void cc2_disable(struct cc2_data *data)
140 {
141 	int err;
142 
143 	/* ignore alarms triggered by voltage toggling when powering up */
144 	data->process_irqs = false;
145 
146 	/* exclusive regulator, check in case an enable failed */
147 	if (regulator_is_enabled(data->regulator)) {
148 		err = regulator_disable(data->regulator);
149 		if (err)
150 			dev_dbg(&data->client->dev, "Failed to disable device");
151 	}
152 }
153 
cc2_cmd_response_diagnostic(struct device * dev,u8 status)154 static int cc2_cmd_response_diagnostic(struct device *dev, u8 status)
155 {
156 	int resp;
157 
158 	if (FIELD_GET(CC2_STATUS_FIELD, status) != CC2_STATUS_CMD_MODE) {
159 		dev_dbg(dev, "Command sent out of command window\n");
160 		return -ETIMEDOUT;
161 	}
162 
163 	resp = FIELD_GET(CC2_RESPONSE_FIELD, status);
164 	switch (resp) {
165 	case CC2_RESPONSE_ACK:
166 		return 0;
167 	case CC2_RESPONSE_BUSY:
168 		return -EBUSY;
169 	case CC2_RESPONSE_NACK:
170 		if (resp & CC2_ERR_CORR_EEPROM)
171 			dev_dbg(dev, "Command failed: corrected EEPROM\n");
172 		if (resp & CC2_ERR_UNCORR_EEPROM)
173 			dev_dbg(dev, "Command failed: uncorrected EEPROM\n");
174 		if (resp & CC2_ERR_RAM_PARITY)
175 			dev_dbg(dev, "Command failed: RAM parity\n");
176 		if (resp & CC2_ERR_RAM_PARITY)
177 			dev_dbg(dev, "Command failed: configuration error\n");
178 		return -ENODATA;
179 	default:
180 		dev_dbg(dev, "Unknown command reply\n");
181 		return -EINVAL;
182 	}
183 }
184 
cc2_read_command_status(struct i2c_client * client)185 static int cc2_read_command_status(struct i2c_client *client)
186 {
187 	u8 status;
188 	int ret;
189 
190 	ret = i2c_master_recv(client, &status, 1);
191 	if (ret != 1) {
192 		ret = ret < 0 ? ret : -EIO;
193 		return ret;
194 	}
195 
196 	return cc2_cmd_response_diagnostic(&client->dev, status);
197 }
198 
199 /*
200  * The command mode is only accessible after sending the START_CM command in the
201  * first 10 ms after power-up. Only in case the command window is missed,
202  * CC2_CM_RETRIES retries are attempted before giving up and returning an error.
203  */
cc2_command_mode_start(struct cc2_data * data)204 static int cc2_command_mode_start(struct cc2_data *data)
205 {
206 	unsigned long timeout;
207 	int i, ret;
208 
209 	for (i = 0; i < CC2_CM_RETRIES; i++) {
210 		ret = cc2_enable(data);
211 		if (ret < 0)
212 			return ret;
213 
214 		ret = i2c_smbus_write_word_data(data->client, CC2_START_CM, 0);
215 		if (ret < 0)
216 			return ret;
217 
218 		if (data->irq_ready > 0) {
219 			timeout = usecs_to_jiffies(2 * CC2_RESP_START_CM_US);
220 			ret = wait_for_completion_timeout(&data->complete,
221 							  timeout);
222 			if (!ret)
223 				return -ETIMEDOUT;
224 		} else {
225 			usleep_range(CC2_RESP_START_CM_US,
226 				     2 * CC2_RESP_START_CM_US);
227 		}
228 		ret = cc2_read_command_status(data->client);
229 		if (ret != -ETIMEDOUT || i == CC2_CM_RETRIES)
230 			break;
231 
232 		/* command window missed, prepare for a retry */
233 		cc2_disable(data);
234 		msleep(CC2_POWER_CYCLE_MS);
235 	}
236 
237 	return ret;
238 }
239 
240 /* Sending a Start_NOM command finishes the command mode immediately with no
241  * reply and the device enters normal operation mode
242  */
cc2_command_mode_finish(struct cc2_data * data)243 static int cc2_command_mode_finish(struct cc2_data *data)
244 {
245 	int ret;
246 
247 	ret = i2c_smbus_write_word_data(data->client, CC2_START_NOM, 0);
248 	if (ret < 0)
249 		return ret;
250 
251 	return 0;
252 }
253 
cc2_write_reg(struct cc2_data * data,u8 reg,u16 val)254 static int cc2_write_reg(struct cc2_data *data, u8 reg, u16 val)
255 {
256 	unsigned long timeout;
257 	int ret;
258 
259 	ret = cc2_command_mode_start(data);
260 	if (ret < 0)
261 		goto disable;
262 
263 	cpu_to_be16s(&val);
264 	ret = i2c_smbus_write_word_data(data->client, reg, val);
265 	if (ret < 0)
266 		goto disable;
267 
268 	if (data->irq_ready > 0) {
269 		timeout = msecs_to_jiffies(2 * CC2_RESP_EEPROM_W_MS);
270 		ret = wait_for_completion_timeout(&data->complete, timeout);
271 		if (!ret) {
272 			ret = -ETIMEDOUT;
273 			goto disable;
274 		}
275 	} else {
276 		msleep(CC2_RESP_EEPROM_W_MS);
277 	}
278 
279 	ret = cc2_read_command_status(data->client);
280 
281 disable:
282 	cc2_disable(data);
283 
284 	return ret;
285 }
286 
cc2_read_reg(struct cc2_data * data,u8 reg,u16 * val)287 static int cc2_read_reg(struct cc2_data *data, u8 reg, u16 *val)
288 {
289 	u8 buf[CC2_EEPROM_DATA_LEN];
290 	unsigned long timeout;
291 	int ret;
292 
293 	ret = cc2_command_mode_start(data);
294 	if (ret < 0)
295 		return ret;
296 
297 	ret = i2c_smbus_write_word_data(data->client, reg, 0);
298 	if (ret < 0)
299 		return ret;
300 
301 	if (data->irq_ready > 0) {
302 		timeout = usecs_to_jiffies(2 * CC2_RESP_EEPROM_R_US);
303 		ret = wait_for_completion_timeout(&data->complete, timeout);
304 		if (!ret)
305 			return -ETIMEDOUT;
306 
307 	} else {
308 		usleep_range(CC2_RESP_EEPROM_R_US, CC2_RESP_EEPROM_R_US + 10);
309 	}
310 	ret = i2c_master_recv(data->client, buf, CC2_EEPROM_DATA_LEN);
311 	if (ret != CC2_EEPROM_DATA_LEN)
312 		return ret < 0 ? ret : -EIO;
313 
314 	*val = be16_to_cpup((__be16 *)&buf[1]);
315 
316 	return cc2_read_command_status(data->client);
317 }
318 
cc2_get_reg_val(struct cc2_data * data,u8 reg,long * val)319 static int cc2_get_reg_val(struct cc2_data *data, u8 reg, long *val)
320 {
321 	u16 reg_val;
322 	int ret;
323 
324 	ret = cc2_read_reg(data, reg, &reg_val);
325 	if (!ret)
326 		*val = cc2_rh_convert(reg_val);
327 
328 	cc2_disable(data);
329 
330 	return ret;
331 }
332 
cc2_data_fetch(struct i2c_client * client,enum hwmon_sensor_types type,long * val)333 static int cc2_data_fetch(struct i2c_client *client,
334 			  enum hwmon_sensor_types type, long *val)
335 {
336 	u8 data[CC2_MEASUREMENT_DATA_LEN];
337 	u8 status;
338 	int ret;
339 
340 	ret = i2c_master_recv(client, data, CC2_MEASUREMENT_DATA_LEN);
341 	if (ret != CC2_MEASUREMENT_DATA_LEN) {
342 		ret = ret < 0 ? ret : -EIO;
343 		return ret;
344 	}
345 	status = FIELD_GET(CC2_STATUS_FIELD, data[0]);
346 	if (status == CC2_STATUS_STALE_DATA)
347 		return -EBUSY;
348 
349 	if (status != CC2_STATUS_VALID_DATA)
350 		return -EIO;
351 
352 	switch (type) {
353 	case hwmon_humidity:
354 		*val = cc2_rh_convert(be16_to_cpup((__be16 *)&data[0]));
355 		break;
356 	case hwmon_temp:
357 		*val = cc2_temp_convert(be16_to_cpup((__be16 *)&data[2]));
358 		break;
359 	default:
360 		return -EINVAL;
361 	}
362 
363 	return 0;
364 }
365 
cc2_read_measurement(struct cc2_data * data,enum hwmon_sensor_types type,long * val)366 static int cc2_read_measurement(struct cc2_data *data,
367 				enum hwmon_sensor_types type, long *val)
368 {
369 	unsigned long timeout;
370 	int ret;
371 
372 	if (data->irq_ready > 0) {
373 		timeout = msecs_to_jiffies(CC2_STARTUP_TO_DATA_MS * 2);
374 		ret = wait_for_completion_timeout(&data->complete, timeout);
375 		if (!ret)
376 			return -ETIMEDOUT;
377 
378 	} else {
379 		msleep(CC2_STARTUP_TO_DATA_MS);
380 	}
381 
382 	ret = cc2_data_fetch(data->client, type, val);
383 
384 	return ret;
385 }
386 
387 /*
388  * A measurement requires enabling the device, waiting for the automatic
389  * measurement to finish, reading the measurement data and disabling the device
390  * again.
391  */
cc2_measurement(struct cc2_data * data,enum hwmon_sensor_types type,long * val)392 static int cc2_measurement(struct cc2_data *data, enum hwmon_sensor_types type,
393 			   long *val)
394 {
395 	int ret;
396 
397 	ret = cc2_enable(data);
398 	if (ret)
399 		return ret;
400 
401 	ret = cc2_read_measurement(data, type, val);
402 
403 	cc2_disable(data);
404 
405 	return ret;
406 }
407 
408 /*
409  * In order to check alarm status, the corresponding ALARM_OFF (hysteresis)
410  * register must be read and a new measurement must be carried out to trigger
411  * the alarm signals. Given that the device carries out a measurement after
412  * exiting the command mode, there is no need to force two power-up sequences.
413  * Instead, a NOM command is sent and the device is disabled after the
414  * measurement is read.
415  */
cc2_read_hyst_and_measure(struct cc2_data * data,u8 reg,long * hyst,long * measurement)416 static int cc2_read_hyst_and_measure(struct cc2_data *data, u8 reg,
417 				     long *hyst, long *measurement)
418 {
419 	u16 reg_val;
420 	int ret;
421 
422 	ret = cc2_read_reg(data, reg, &reg_val);
423 	if (ret)
424 		goto disable;
425 
426 	*hyst = cc2_rh_convert(reg_val);
427 
428 	ret = cc2_command_mode_finish(data);
429 	if (ret)
430 		goto disable;
431 
432 	ret = cc2_read_measurement(data, hwmon_humidity, measurement);
433 
434 disable:
435 	cc2_disable(data);
436 
437 	return ret;
438 }
439 
cc2_is_visible(const void * data,enum hwmon_sensor_types type,u32 attr,int channel)440 static umode_t cc2_is_visible(const void *data, enum hwmon_sensor_types type,
441 			      u32 attr, int channel)
442 {
443 	const struct cc2_data *cc2 = data;
444 
445 	switch (type) {
446 	case hwmon_humidity:
447 		switch (attr) {
448 		case hwmon_humidity_input:
449 			return 0444;
450 		case hwmon_humidity_label:
451 			return cc2->label ? 0444 : 0;
452 		case hwmon_humidity_min_alarm:
453 			return cc2->rh_alarm.low_alarm_visible ? 0444 : 0;
454 		case hwmon_humidity_max_alarm:
455 			return cc2->rh_alarm.high_alarm_visible ? 0444 : 0;
456 		case hwmon_humidity_min:
457 		case hwmon_humidity_min_hyst:
458 			return cc2->rh_alarm.low_alarm_visible ? 0644 : 0;
459 		case hwmon_humidity_max:
460 		case hwmon_humidity_max_hyst:
461 			return cc2->rh_alarm.high_alarm_visible ? 0644 : 0;
462 		default:
463 			return 0;
464 		}
465 	case hwmon_temp:
466 		switch (attr) {
467 		case hwmon_temp_input:
468 			return 0444;
469 		case hwmon_temp_label:
470 			return cc2->label ? 0444 : 0;
471 		default:
472 			return 0;
473 		}
474 	default:
475 		break;
476 	}
477 
478 	return 0;
479 }
480 
cc2_ready_interrupt(int irq,void * data)481 static irqreturn_t cc2_ready_interrupt(int irq, void *data)
482 {
483 	struct cc2_data *cc2 = data;
484 
485 	if (cc2->process_irqs)
486 		complete(&cc2->complete);
487 
488 	return IRQ_HANDLED;
489 }
490 
cc2_low_interrupt(int irq,void * data)491 static irqreturn_t cc2_low_interrupt(int irq, void *data)
492 {
493 	struct cc2_data *cc2 = data;
494 
495 	if (cc2->process_irqs) {
496 		hwmon_notify_event(cc2->hwmon, hwmon_humidity,
497 				   hwmon_humidity_min_alarm, 0);
498 		cc2->rh_alarm.low_alarm = true;
499 	}
500 
501 	return IRQ_HANDLED;
502 }
503 
cc2_high_interrupt(int irq,void * data)504 static irqreturn_t cc2_high_interrupt(int irq, void *data)
505 {
506 	struct cc2_data *cc2 = data;
507 
508 	if (cc2->process_irqs) {
509 		hwmon_notify_event(cc2->hwmon, hwmon_humidity,
510 				   hwmon_humidity_max_alarm, 0);
511 		cc2->rh_alarm.high_alarm = true;
512 	}
513 
514 	return IRQ_HANDLED;
515 }
516 
cc2_humidity_min_alarm_status(struct cc2_data * data,long * val)517 static int cc2_humidity_min_alarm_status(struct cc2_data *data, long *val)
518 {
519 	long measurement, min_hyst;
520 	int ret;
521 
522 	ret = cc2_read_hyst_and_measure(data, CC2_R_ALARM_L_OFF, &min_hyst,
523 					&measurement);
524 	if (ret < 0)
525 		return ret;
526 
527 	if (data->rh_alarm.low_alarm) {
528 		*val = (measurement < min_hyst) ? 1 : 0;
529 		data->rh_alarm.low_alarm = *val;
530 	} else {
531 		*val = 0;
532 	}
533 
534 	return 0;
535 }
536 
cc2_humidity_max_alarm_status(struct cc2_data * data,long * val)537 static int cc2_humidity_max_alarm_status(struct cc2_data *data, long *val)
538 {
539 	long measurement, max_hyst;
540 	int ret;
541 
542 	ret = cc2_read_hyst_and_measure(data, CC2_R_ALARM_H_OFF, &max_hyst,
543 					&measurement);
544 	if (ret < 0)
545 		return ret;
546 
547 	if (data->rh_alarm.high_alarm) {
548 		*val = (measurement > max_hyst) ? 1 : 0;
549 		data->rh_alarm.high_alarm = *val;
550 	} else {
551 		*val = 0;
552 	}
553 
554 	return 0;
555 }
556 
cc2_read_string(struct device * dev,enum hwmon_sensor_types type,u32 attr,int channel,const char ** str)557 static int cc2_read_string(struct device *dev, enum hwmon_sensor_types type,
558 			   u32 attr, int channel, const char **str)
559 {
560 	struct cc2_data *data = dev_get_drvdata(dev);
561 
562 	*str = data->label;
563 
564 	return 0;
565 }
566 
cc2_read(struct device * dev,enum hwmon_sensor_types type,u32 attr,int channel,long * val)567 static int cc2_read(struct device *dev, enum hwmon_sensor_types type, u32 attr,
568 		    int channel, long *val)
569 {
570 	struct cc2_data *data = dev_get_drvdata(dev);
571 
572 	switch (type) {
573 	case hwmon_temp:
574 		return cc2_measurement(data, type, val);
575 	case hwmon_humidity:
576 		switch (attr) {
577 		case hwmon_humidity_input:
578 			return cc2_measurement(data, type, val);
579 		case hwmon_humidity_min:
580 			return cc2_get_reg_val(data, CC2_R_ALARM_L_ON, val);
581 		case hwmon_humidity_min_hyst:
582 			return cc2_get_reg_val(data, CC2_R_ALARM_L_OFF, val);
583 		case hwmon_humidity_max:
584 			return cc2_get_reg_val(data, CC2_R_ALARM_H_ON, val);
585 		case hwmon_humidity_max_hyst:
586 			return cc2_get_reg_val(data, CC2_R_ALARM_H_OFF, val);
587 		case hwmon_humidity_min_alarm:
588 			return cc2_humidity_min_alarm_status(data, val);
589 		case hwmon_humidity_max_alarm:
590 			return cc2_humidity_max_alarm_status(data, val);
591 		default:
592 			return -EOPNOTSUPP;
593 		}
594 	default:
595 		return -EOPNOTSUPP;
596 	}
597 }
598 
cc2_write(struct device * dev,enum hwmon_sensor_types type,u32 attr,int channel,long val)599 static int cc2_write(struct device *dev, enum hwmon_sensor_types type, u32 attr,
600 		     int channel, long val)
601 {
602 	struct cc2_data *data = dev_get_drvdata(dev);
603 	u16 arg;
604 	u8 cmd;
605 
606 	if (type != hwmon_humidity)
607 		return -EOPNOTSUPP;
608 
609 	if (val < 0 || val > CC2_RH_MAX)
610 		return -EINVAL;
611 
612 	switch (attr) {
613 	case hwmon_humidity_min:
614 		cmd = CC2_W_ALARM_L_ON;
615 		arg = cc2_rh_to_reg(val);
616 		return cc2_write_reg(data, cmd, arg);
617 	case hwmon_humidity_min_hyst:
618 		cmd = CC2_W_ALARM_L_OFF;
619 		arg = cc2_rh_to_reg(val);
620 		return cc2_write_reg(data, cmd, arg);
621 	case hwmon_humidity_max:
622 		cmd = CC2_W_ALARM_H_ON;
623 		arg = cc2_rh_to_reg(val);
624 		return cc2_write_reg(data, cmd, arg);
625 	case hwmon_humidity_max_hyst:
626 		cmd = CC2_W_ALARM_H_OFF;
627 		arg = cc2_rh_to_reg(val);
628 		return cc2_write_reg(data, cmd, arg);
629 	default:
630 		return -EOPNOTSUPP;
631 	}
632 }
633 
cc2_request_ready_irq(struct cc2_data * data,struct device * dev)634 static int cc2_request_ready_irq(struct cc2_data *data, struct device *dev)
635 {
636 	int ret = 0;
637 
638 	data->irq_ready = fwnode_irq_get_byname(dev_fwnode(dev), "ready");
639 	if (data->irq_ready > 0) {
640 		init_completion(&data->complete);
641 		ret = devm_request_threaded_irq(dev, data->irq_ready, NULL,
642 						cc2_ready_interrupt,
643 						IRQF_ONESHOT |
644 						IRQF_TRIGGER_RISING,
645 						dev_name(dev), data);
646 	}
647 
648 	return ret;
649 }
650 
cc2_request_alarm_irqs(struct cc2_data * data,struct device * dev)651 static int cc2_request_alarm_irqs(struct cc2_data *data, struct device *dev)
652 {
653 	int ret = 0;
654 
655 	data->irq_low = fwnode_irq_get_byname(dev_fwnode(dev), "low");
656 	if (data->irq_low > 0) {
657 		ret = devm_request_threaded_irq(dev, data->irq_low, NULL,
658 						cc2_low_interrupt,
659 						IRQF_ONESHOT |
660 						IRQF_TRIGGER_RISING,
661 						dev_name(dev), data);
662 		if (ret)
663 			return ret;
664 
665 		data->rh_alarm.low_alarm_visible = true;
666 	}
667 
668 	data->irq_high = fwnode_irq_get_byname(dev_fwnode(dev), "high");
669 	if (data->irq_high > 0) {
670 		ret = devm_request_threaded_irq(dev, data->irq_high, NULL,
671 						cc2_high_interrupt,
672 						IRQF_ONESHOT |
673 						IRQF_TRIGGER_RISING,
674 						dev_name(dev), data);
675 		if (ret)
676 			return ret;
677 
678 		data->rh_alarm.high_alarm_visible = true;
679 	}
680 
681 	return ret;
682 }
683 
684 static const struct hwmon_channel_info *cc2_info[] = {
685 	HWMON_CHANNEL_INFO(temp, HWMON_T_INPUT | HWMON_T_LABEL),
686 	HWMON_CHANNEL_INFO(humidity, HWMON_H_INPUT | HWMON_H_LABEL |
687 			   HWMON_H_MIN | HWMON_H_MAX |
688 			   HWMON_H_MIN_HYST | HWMON_H_MAX_HYST |
689 			   HWMON_H_MIN_ALARM | HWMON_H_MAX_ALARM),
690 	NULL
691 };
692 
693 static const struct hwmon_ops cc2_hwmon_ops = {
694 	.is_visible = cc2_is_visible,
695 	.read = cc2_read,
696 	.read_string = cc2_read_string,
697 	.write = cc2_write,
698 };
699 
700 static const struct hwmon_chip_info cc2_chip_info = {
701 	.ops = &cc2_hwmon_ops,
702 	.info = cc2_info,
703 };
704 
cc2_probe(struct i2c_client * client)705 static int cc2_probe(struct i2c_client *client)
706 {
707 	struct cc2_data *data;
708 	struct device *dev = &client->dev;
709 	int ret;
710 
711 	if (!i2c_check_functionality(client->adapter, I2C_FUNC_I2C))
712 		return -EOPNOTSUPP;
713 
714 	data = devm_kzalloc(dev, sizeof(*data), GFP_KERNEL);
715 	if (!data)
716 		return -ENOMEM;
717 
718 	i2c_set_clientdata(client, data);
719 
720 	data->client = client;
721 
722 	data->regulator = devm_regulator_get_exclusive(dev, "vdd");
723 	if (IS_ERR(data->regulator))
724 		return dev_err_probe(dev, PTR_ERR(data->regulator),
725 				     "Failed to get regulator\n");
726 
727 	device_property_read_string(dev, "label", &data->label);
728 
729 	ret = cc2_request_ready_irq(data, dev);
730 	if (ret)
731 		return dev_err_probe(dev, ret, "Failed to request ready irq\n");
732 
733 	ret = cc2_request_alarm_irqs(data, dev);
734 	if (ret)
735 		return dev_err_probe(dev, ret, "Failed to request alarm irqs\n");
736 
737 	data->hwmon = devm_hwmon_device_register_with_info(dev, client->name,
738 							   data, &cc2_chip_info,
739 							   NULL);
740 	if (IS_ERR(data->hwmon))
741 		return dev_err_probe(dev, PTR_ERR(data->hwmon),
742 				     "Failed to register hwmon device\n");
743 
744 	return 0;
745 }
746 
cc2_remove(struct i2c_client * client)747 static void cc2_remove(struct i2c_client *client)
748 {
749 	struct cc2_data *data = i2c_get_clientdata(client);
750 
751 	cc2_disable(data);
752 }
753 
754 static const struct i2c_device_id cc2_id[] = {
755 	{ .name = "cc2d23" },
756 	{ .name = "cc2d23s" },
757 	{ .name = "cc2d25" },
758 	{ .name = "cc2d25s" },
759 	{ .name = "cc2d33" },
760 	{ .name = "cc2d33s" },
761 	{ .name = "cc2d35" },
762 	{ .name = "cc2d35s" },
763 	{ }
764 };
765 MODULE_DEVICE_TABLE(i2c, cc2_id);
766 
767 static const struct of_device_id cc2_of_match[] = {
768 	{ .compatible = "amphenol,cc2d23" },
769 	{ .compatible = "amphenol,cc2d23s" },
770 	{ .compatible = "amphenol,cc2d25" },
771 	{ .compatible = "amphenol,cc2d25s" },
772 	{ .compatible = "amphenol,cc2d33" },
773 	{ .compatible = "amphenol,cc2d33s" },
774 	{ .compatible = "amphenol,cc2d35" },
775 	{ .compatible = "amphenol,cc2d35s" },
776 	{ },
777 };
778 MODULE_DEVICE_TABLE(of, cc2_of_match);
779 
780 static struct i2c_driver cc2_driver = {
781 	.driver = {
782 		.name	= "cc2d23",
783 		.of_match_table = cc2_of_match,
784 	},
785 	.probe		= cc2_probe,
786 	.remove		= cc2_remove,
787 	.id_table = cc2_id,
788 };
789 module_i2c_driver(cc2_driver);
790 
791 MODULE_AUTHOR("Javier Carrasco <javier.carrasco.cruz@gamil.com>");
792 MODULE_DESCRIPTION("Amphenol ChipCap 2 humidity and temperature sensor driver");
793 MODULE_LICENSE("GPL");
794