xref: /linux/drivers/mfd/iqs62x.c (revision d195c39052d1da278a00a6744ce59c383b67b191)
1 // SPDX-License-Identifier: GPL-2.0+
2 /*
3  * Azoteq IQS620A/621/622/624/625 Multi-Function Sensors
4  *
5  * Copyright (C) 2019 Jeff LaBundy <jeff@labundy.com>
6  *
7  * These devices rely on application-specific register settings and calibration
8  * data developed in and exported from a suite of GUIs offered by the vendor. A
9  * separate tool converts the GUIs' ASCII-based output into a standard firmware
10  * file parsed by the driver.
11  *
12  * Link to datasheets and GUIs: https://www.azoteq.com/
13  *
14  * Link to conversion tool: https://github.com/jlabundy/iqs62x-h2bin.git
15  */
16 
17 #include <linux/completion.h>
18 #include <linux/delay.h>
19 #include <linux/device.h>
20 #include <linux/err.h>
21 #include <linux/firmware.h>
22 #include <linux/i2c.h>
23 #include <linux/interrupt.h>
24 #include <linux/kernel.h>
25 #include <linux/list.h>
26 #include <linux/mfd/core.h>
27 #include <linux/mfd/iqs62x.h>
28 #include <linux/module.h>
29 #include <linux/notifier.h>
30 #include <linux/of_device.h>
31 #include <linux/property.h>
32 #include <linux/regmap.h>
33 #include <linux/slab.h>
34 #include <asm/unaligned.h>
35 
36 #define IQS62X_PROD_NUM				0x00
37 
38 #define IQS62X_SYS_FLAGS			0x10
39 #define IQS62X_SYS_FLAGS_IN_ATI			BIT(2)
40 
41 #define IQS620_HALL_FLAGS			0x16
42 #define IQS621_HALL_FLAGS			0x19
43 #define IQS622_HALL_FLAGS			IQS621_HALL_FLAGS
44 
45 #define IQS624_INTERVAL_NUM			0x18
46 #define IQS625_INTERVAL_NUM			0x12
47 
48 #define IQS622_PROX_SETTINGS_4			0x48
49 #define IQS620_PROX_SETTINGS_4			0x50
50 #define IQS620_PROX_SETTINGS_4_SAR_EN		BIT(7)
51 
52 #define IQS621_ALS_CAL_DIV_LUX			0x82
53 #define IQS621_ALS_CAL_DIV_IR			0x83
54 
55 #define IQS620_TEMP_CAL_MULT			0xC2
56 #define IQS620_TEMP_CAL_DIV			0xC3
57 #define IQS620_TEMP_CAL_OFFS			0xC4
58 
59 #define IQS62X_SYS_SETTINGS			0xD0
60 #define IQS62X_SYS_SETTINGS_SOFT_RESET		BIT(7)
61 #define IQS62X_SYS_SETTINGS_ACK_RESET		BIT(6)
62 #define IQS62X_SYS_SETTINGS_EVENT_MODE		BIT(5)
63 #define IQS62X_SYS_SETTINGS_CLK_DIV		BIT(4)
64 #define IQS62X_SYS_SETTINGS_REDO_ATI		BIT(1)
65 
66 #define IQS62X_PWR_SETTINGS			0xD2
67 #define IQS62X_PWR_SETTINGS_DIS_AUTO		BIT(5)
68 #define IQS62X_PWR_SETTINGS_PWR_MODE_MASK	(BIT(4) | BIT(3))
69 #define IQS62X_PWR_SETTINGS_PWR_MODE_HALT	(BIT(4) | BIT(3))
70 #define IQS62X_PWR_SETTINGS_PWR_MODE_NORM	0
71 
72 #define IQS62X_OTP_CMD				0xF0
73 #define IQS62X_OTP_CMD_FG3			0x13
74 #define IQS62X_OTP_DATA				0xF1
75 #define IQS62X_MAX_REG				0xFF
76 
77 #define IQS62X_HALL_CAL_MASK			GENMASK(3, 0)
78 
79 #define IQS62X_FW_REC_TYPE_INFO			0
80 #define IQS62X_FW_REC_TYPE_PROD			1
81 #define IQS62X_FW_REC_TYPE_HALL			2
82 #define IQS62X_FW_REC_TYPE_MASK			3
83 #define IQS62X_FW_REC_TYPE_DATA			4
84 
85 #define IQS62X_ATI_POLL_SLEEP_US		10000
86 #define IQS62X_ATI_POLL_TIMEOUT_US		500000
87 #define IQS62X_ATI_STABLE_DELAY_MS		150
88 
89 struct iqs62x_fw_rec {
90 	u8 type;
91 	u8 addr;
92 	u8 len;
93 	u8 data;
94 } __packed;
95 
96 struct iqs62x_fw_blk {
97 	struct list_head list;
98 	u8 addr;
99 	u8 mask;
100 	u8 len;
101 	u8 data[];
102 };
103 
104 struct iqs62x_info {
105 	u8 prod_num;
106 	u8 sw_num;
107 	u8 hw_num;
108 } __packed;
109 
110 static int iqs62x_dev_init(struct iqs62x_core *iqs62x)
111 {
112 	struct iqs62x_fw_blk *fw_blk;
113 	unsigned int val;
114 	int ret;
115 	u8 clk_div = 1;
116 
117 	list_for_each_entry(fw_blk, &iqs62x->fw_blk_head, list) {
118 		if (fw_blk->mask)
119 			ret = regmap_update_bits(iqs62x->regmap, fw_blk->addr,
120 						 fw_blk->mask, *fw_blk->data);
121 		else
122 			ret = regmap_raw_write(iqs62x->regmap, fw_blk->addr,
123 					       fw_blk->data, fw_blk->len);
124 		if (ret)
125 			return ret;
126 	}
127 
128 	switch (iqs62x->dev_desc->prod_num) {
129 	case IQS620_PROD_NUM:
130 	case IQS622_PROD_NUM:
131 		ret = regmap_read(iqs62x->regmap,
132 				  iqs62x->dev_desc->prox_settings, &val);
133 		if (ret)
134 			return ret;
135 
136 		if (val & IQS620_PROX_SETTINGS_4_SAR_EN)
137 			iqs62x->ui_sel = IQS62X_UI_SAR1;
138 
139 		/* fall through */
140 
141 	case IQS621_PROD_NUM:
142 		ret = regmap_write(iqs62x->regmap, IQS620_GLBL_EVENT_MASK,
143 				   IQS620_GLBL_EVENT_MASK_PMU |
144 				   iqs62x->dev_desc->prox_mask |
145 				   iqs62x->dev_desc->sar_mask |
146 				   iqs62x->dev_desc->hall_mask |
147 				   iqs62x->dev_desc->hyst_mask |
148 				   iqs62x->dev_desc->temp_mask |
149 				   iqs62x->dev_desc->als_mask |
150 				   iqs62x->dev_desc->ir_mask);
151 		if (ret)
152 			return ret;
153 		break;
154 
155 	default:
156 		ret = regmap_write(iqs62x->regmap, IQS624_HALL_UI,
157 				   IQS624_HALL_UI_WHL_EVENT |
158 				   IQS624_HALL_UI_INT_EVENT |
159 				   IQS624_HALL_UI_AUTO_CAL);
160 		if (ret)
161 			return ret;
162 
163 		/*
164 		 * The IQS625 default interval divider is below the minimum
165 		 * permissible value, and the datasheet mandates that it is
166 		 * corrected during initialization (unless an updated value
167 		 * has already been provided by firmware).
168 		 *
169 		 * To protect against an unacceptably low user-entered value
170 		 * stored in the firmware, the same check is extended to the
171 		 * IQS624 as well.
172 		 */
173 		ret = regmap_read(iqs62x->regmap, IQS624_INTERVAL_DIV, &val);
174 		if (ret)
175 			return ret;
176 
177 		if (val >= iqs62x->dev_desc->interval_div)
178 			break;
179 
180 		ret = regmap_write(iqs62x->regmap, IQS624_INTERVAL_DIV,
181 				   iqs62x->dev_desc->interval_div);
182 		if (ret)
183 			return ret;
184 	}
185 
186 	ret = regmap_read(iqs62x->regmap, IQS62X_SYS_SETTINGS, &val);
187 	if (ret)
188 		return ret;
189 
190 	if (val & IQS62X_SYS_SETTINGS_CLK_DIV)
191 		clk_div = iqs62x->dev_desc->clk_div;
192 
193 	ret = regmap_write(iqs62x->regmap, IQS62X_SYS_SETTINGS, val |
194 			   IQS62X_SYS_SETTINGS_ACK_RESET |
195 			   IQS62X_SYS_SETTINGS_EVENT_MODE |
196 			   IQS62X_SYS_SETTINGS_REDO_ATI);
197 	if (ret)
198 		return ret;
199 
200 	ret = regmap_read_poll_timeout(iqs62x->regmap, IQS62X_SYS_FLAGS, val,
201 				       !(val & IQS62X_SYS_FLAGS_IN_ATI),
202 				       IQS62X_ATI_POLL_SLEEP_US,
203 				       IQS62X_ATI_POLL_TIMEOUT_US * clk_div);
204 	if (ret)
205 		return ret;
206 
207 	msleep(IQS62X_ATI_STABLE_DELAY_MS * clk_div);
208 
209 	return 0;
210 }
211 
212 static int iqs62x_firmware_parse(struct iqs62x_core *iqs62x,
213 				 const struct firmware *fw)
214 {
215 	struct i2c_client *client = iqs62x->client;
216 	struct iqs62x_fw_rec *fw_rec;
217 	struct iqs62x_fw_blk *fw_blk;
218 	unsigned int val;
219 	size_t pos = 0;
220 	int ret = 0;
221 	u8 mask, len, *data;
222 	u8 hall_cal_index = 0;
223 
224 	while (pos < fw->size) {
225 		if (pos + sizeof(*fw_rec) > fw->size) {
226 			ret = -EINVAL;
227 			break;
228 		}
229 		fw_rec = (struct iqs62x_fw_rec *)(fw->data + pos);
230 		pos += sizeof(*fw_rec);
231 
232 		if (pos + fw_rec->len - 1 > fw->size) {
233 			ret = -EINVAL;
234 			break;
235 		}
236 		pos += fw_rec->len - 1;
237 
238 		switch (fw_rec->type) {
239 		case IQS62X_FW_REC_TYPE_INFO:
240 			continue;
241 
242 		case IQS62X_FW_REC_TYPE_PROD:
243 			if (fw_rec->data == iqs62x->dev_desc->prod_num)
244 				continue;
245 
246 			dev_err(&client->dev,
247 				"Incompatible product number: 0x%02X\n",
248 				fw_rec->data);
249 			ret = -EINVAL;
250 			break;
251 
252 		case IQS62X_FW_REC_TYPE_HALL:
253 			if (!hall_cal_index) {
254 				ret = regmap_write(iqs62x->regmap,
255 						   IQS62X_OTP_CMD,
256 						   IQS62X_OTP_CMD_FG3);
257 				if (ret)
258 					break;
259 
260 				ret = regmap_read(iqs62x->regmap,
261 						  IQS62X_OTP_DATA, &val);
262 				if (ret)
263 					break;
264 
265 				hall_cal_index = val & IQS62X_HALL_CAL_MASK;
266 				if (!hall_cal_index) {
267 					dev_err(&client->dev,
268 						"Uncalibrated device\n");
269 					ret = -ENODATA;
270 					break;
271 				}
272 			}
273 
274 			if (hall_cal_index > fw_rec->len) {
275 				ret = -EINVAL;
276 				break;
277 			}
278 
279 			mask = 0;
280 			data = &fw_rec->data + hall_cal_index - 1;
281 			len = sizeof(*data);
282 			break;
283 
284 		case IQS62X_FW_REC_TYPE_MASK:
285 			if (fw_rec->len < (sizeof(mask) + sizeof(*data))) {
286 				ret = -EINVAL;
287 				break;
288 			}
289 
290 			mask = fw_rec->data;
291 			data = &fw_rec->data + sizeof(mask);
292 			len = sizeof(*data);
293 			break;
294 
295 		case IQS62X_FW_REC_TYPE_DATA:
296 			mask = 0;
297 			data = &fw_rec->data;
298 			len = fw_rec->len;
299 			break;
300 
301 		default:
302 			dev_err(&client->dev,
303 				"Unrecognized record type: 0x%02X\n",
304 				fw_rec->type);
305 			ret = -EINVAL;
306 		}
307 
308 		if (ret)
309 			break;
310 
311 		fw_blk = devm_kzalloc(&client->dev,
312 				      struct_size(fw_blk, data, len),
313 				      GFP_KERNEL);
314 		if (!fw_blk) {
315 			ret = -ENOMEM;
316 			break;
317 		}
318 
319 		fw_blk->addr = fw_rec->addr;
320 		fw_blk->mask = mask;
321 		fw_blk->len = len;
322 		memcpy(fw_blk->data, data, len);
323 
324 		list_add(&fw_blk->list, &iqs62x->fw_blk_head);
325 	}
326 
327 	release_firmware(fw);
328 
329 	return ret;
330 }
331 
332 const struct iqs62x_event_desc iqs62x_events[IQS62X_NUM_EVENTS] = {
333 	[IQS62X_EVENT_PROX_CH0_T] = {
334 		.reg	= IQS62X_EVENT_PROX,
335 		.mask	= BIT(4),
336 		.val	= BIT(4),
337 	},
338 	[IQS62X_EVENT_PROX_CH0_P] = {
339 		.reg	= IQS62X_EVENT_PROX,
340 		.mask	= BIT(0),
341 		.val	= BIT(0),
342 	},
343 	[IQS62X_EVENT_PROX_CH1_T] = {
344 		.reg	= IQS62X_EVENT_PROX,
345 		.mask	= BIT(5),
346 		.val	= BIT(5),
347 	},
348 	[IQS62X_EVENT_PROX_CH1_P] = {
349 		.reg	= IQS62X_EVENT_PROX,
350 		.mask	= BIT(1),
351 		.val	= BIT(1),
352 	},
353 	[IQS62X_EVENT_PROX_CH2_T] = {
354 		.reg	= IQS62X_EVENT_PROX,
355 		.mask	= BIT(6),
356 		.val	= BIT(6),
357 	},
358 	[IQS62X_EVENT_PROX_CH2_P] = {
359 		.reg	= IQS62X_EVENT_PROX,
360 		.mask	= BIT(2),
361 		.val	= BIT(2),
362 	},
363 	[IQS62X_EVENT_HYST_POS_T] = {
364 		.reg	= IQS62X_EVENT_HYST,
365 		.mask	= BIT(6) | BIT(7),
366 		.val	= BIT(6),
367 	},
368 	[IQS62X_EVENT_HYST_POS_P] = {
369 		.reg	= IQS62X_EVENT_HYST,
370 		.mask	= BIT(5) | BIT(7),
371 		.val	= BIT(5),
372 	},
373 	[IQS62X_EVENT_HYST_NEG_T] = {
374 		.reg	= IQS62X_EVENT_HYST,
375 		.mask	= BIT(6) | BIT(7),
376 		.val	= BIT(6) | BIT(7),
377 	},
378 	[IQS62X_EVENT_HYST_NEG_P] = {
379 		.reg	= IQS62X_EVENT_HYST,
380 		.mask	= BIT(5) | BIT(7),
381 		.val	= BIT(5) | BIT(7),
382 	},
383 	[IQS62X_EVENT_SAR1_ACT] = {
384 		.reg	= IQS62X_EVENT_HYST,
385 		.mask	= BIT(4),
386 		.val	= BIT(4),
387 	},
388 	[IQS62X_EVENT_SAR1_QRD] = {
389 		.reg	= IQS62X_EVENT_HYST,
390 		.mask	= BIT(2),
391 		.val	= BIT(2),
392 	},
393 	[IQS62X_EVENT_SAR1_MOVE] = {
394 		.reg	= IQS62X_EVENT_HYST,
395 		.mask	= BIT(1),
396 		.val	= BIT(1),
397 	},
398 	[IQS62X_EVENT_SAR1_HALT] = {
399 		.reg	= IQS62X_EVENT_HYST,
400 		.mask	= BIT(0),
401 		.val	= BIT(0),
402 	},
403 	[IQS62X_EVENT_WHEEL_UP] = {
404 		.reg	= IQS62X_EVENT_WHEEL,
405 		.mask	= BIT(7) | BIT(6),
406 		.val	= BIT(7),
407 	},
408 	[IQS62X_EVENT_WHEEL_DN] = {
409 		.reg	= IQS62X_EVENT_WHEEL,
410 		.mask	= BIT(7) | BIT(6),
411 		.val	= BIT(7) | BIT(6),
412 	},
413 	[IQS62X_EVENT_HALL_N_T] = {
414 		.reg	= IQS62X_EVENT_HALL,
415 		.mask	= BIT(2) | BIT(0),
416 		.val	= BIT(2),
417 	},
418 	[IQS62X_EVENT_HALL_N_P] = {
419 		.reg	= IQS62X_EVENT_HALL,
420 		.mask	= BIT(1) | BIT(0),
421 		.val	= BIT(1),
422 	},
423 	[IQS62X_EVENT_HALL_S_T] = {
424 		.reg	= IQS62X_EVENT_HALL,
425 		.mask	= BIT(2) | BIT(0),
426 		.val	= BIT(2) | BIT(0),
427 	},
428 	[IQS62X_EVENT_HALL_S_P] = {
429 		.reg	= IQS62X_EVENT_HALL,
430 		.mask	= BIT(1) | BIT(0),
431 		.val	= BIT(1) | BIT(0),
432 	},
433 	[IQS62X_EVENT_SYS_RESET] = {
434 		.reg	= IQS62X_EVENT_SYS,
435 		.mask	= BIT(7),
436 		.val	= BIT(7),
437 	},
438 };
439 EXPORT_SYMBOL_GPL(iqs62x_events);
440 
441 static irqreturn_t iqs62x_irq(int irq, void *context)
442 {
443 	struct iqs62x_core *iqs62x = context;
444 	struct i2c_client *client = iqs62x->client;
445 	struct iqs62x_event_data event_data;
446 	struct iqs62x_event_desc event_desc;
447 	enum iqs62x_event_reg event_reg;
448 	unsigned long event_flags = 0;
449 	int ret, i, j;
450 	u8 event_map[IQS62X_EVENT_SIZE];
451 
452 	/*
453 	 * The device asserts the RDY output to signal the beginning of a
454 	 * communication window, which is closed by an I2C stop condition.
455 	 * As such, all interrupt status is captured in a single read and
456 	 * broadcast to any interested sub-device drivers.
457 	 */
458 	ret = regmap_raw_read(iqs62x->regmap, IQS62X_SYS_FLAGS, event_map,
459 			      sizeof(event_map));
460 	if (ret) {
461 		dev_err(&client->dev, "Failed to read device status: %d\n",
462 			ret);
463 		return IRQ_NONE;
464 	}
465 
466 	for (i = 0; i < sizeof(event_map); i++) {
467 		event_reg = iqs62x->dev_desc->event_regs[iqs62x->ui_sel][i];
468 
469 		switch (event_reg) {
470 		case IQS62X_EVENT_UI_LO:
471 			event_data.ui_data = get_unaligned_le16(&event_map[i]);
472 
473 			/* fall through */
474 
475 		case IQS62X_EVENT_UI_HI:
476 		case IQS62X_EVENT_NONE:
477 			continue;
478 
479 		case IQS62X_EVENT_ALS:
480 			event_data.als_flags = event_map[i];
481 			continue;
482 
483 		case IQS62X_EVENT_IR:
484 			event_data.ir_flags = event_map[i];
485 			continue;
486 
487 		case IQS62X_EVENT_INTER:
488 			event_data.interval = event_map[i];
489 			continue;
490 
491 		case IQS62X_EVENT_HYST:
492 			event_map[i] <<= iqs62x->dev_desc->hyst_shift;
493 
494 			/* fall through */
495 
496 		case IQS62X_EVENT_WHEEL:
497 		case IQS62X_EVENT_HALL:
498 		case IQS62X_EVENT_PROX:
499 		case IQS62X_EVENT_SYS:
500 			break;
501 		}
502 
503 		for (j = 0; j < IQS62X_NUM_EVENTS; j++) {
504 			event_desc = iqs62x_events[j];
505 
506 			if (event_desc.reg != event_reg)
507 				continue;
508 
509 			if ((event_map[i] & event_desc.mask) == event_desc.val)
510 				event_flags |= BIT(j);
511 		}
512 	}
513 
514 	/*
515 	 * The device resets itself in response to the I2C master stalling
516 	 * communication past a fixed timeout. In this case, all registers
517 	 * are restored and any interested sub-device drivers are notified.
518 	 */
519 	if (event_flags & BIT(IQS62X_EVENT_SYS_RESET)) {
520 		dev_err(&client->dev, "Unexpected device reset\n");
521 
522 		ret = iqs62x_dev_init(iqs62x);
523 		if (ret) {
524 			dev_err(&client->dev,
525 				"Failed to re-initialize device: %d\n", ret);
526 			return IRQ_NONE;
527 		}
528 	}
529 
530 	ret = blocking_notifier_call_chain(&iqs62x->nh, event_flags,
531 					   &event_data);
532 	if (ret & NOTIFY_STOP_MASK)
533 		return IRQ_NONE;
534 
535 	/*
536 	 * Once the communication window is closed, a small delay is added to
537 	 * ensure the device's RDY output has been deasserted by the time the
538 	 * interrupt handler returns.
539 	 */
540 	usleep_range(50, 100);
541 
542 	return IRQ_HANDLED;
543 }
544 
545 static void iqs62x_firmware_load(const struct firmware *fw, void *context)
546 {
547 	struct iqs62x_core *iqs62x = context;
548 	struct i2c_client *client = iqs62x->client;
549 	int ret;
550 
551 	if (fw) {
552 		ret = iqs62x_firmware_parse(iqs62x, fw);
553 		if (ret) {
554 			dev_err(&client->dev, "Failed to parse firmware: %d\n",
555 				ret);
556 			goto err_out;
557 		}
558 	}
559 
560 	ret = iqs62x_dev_init(iqs62x);
561 	if (ret) {
562 		dev_err(&client->dev, "Failed to initialize device: %d\n", ret);
563 		goto err_out;
564 	}
565 
566 	ret = devm_request_threaded_irq(&client->dev, client->irq,
567 					NULL, iqs62x_irq, IRQF_ONESHOT,
568 					client->name, iqs62x);
569 	if (ret) {
570 		dev_err(&client->dev, "Failed to request IRQ: %d\n", ret);
571 		goto err_out;
572 	}
573 
574 	ret = devm_mfd_add_devices(&client->dev, PLATFORM_DEVID_NONE,
575 				   iqs62x->dev_desc->sub_devs,
576 				   iqs62x->dev_desc->num_sub_devs,
577 				   NULL, 0, NULL);
578 	if (ret)
579 		dev_err(&client->dev, "Failed to add sub-devices: %d\n", ret);
580 
581 err_out:
582 	complete_all(&iqs62x->fw_done);
583 }
584 
585 static const struct mfd_cell iqs620at_sub_devs[] = {
586 	{
587 		.name = "iqs62x-keys",
588 		.of_compatible = "azoteq,iqs620a-keys",
589 	},
590 	{
591 		.name = "iqs620a-pwm",
592 		.of_compatible = "azoteq,iqs620a-pwm",
593 	},
594 	{ .name = "iqs620at-temp", },
595 };
596 
597 static const struct mfd_cell iqs620a_sub_devs[] = {
598 	{
599 		.name = "iqs62x-keys",
600 		.of_compatible = "azoteq,iqs620a-keys",
601 	},
602 	{
603 		.name = "iqs620a-pwm",
604 		.of_compatible = "azoteq,iqs620a-pwm",
605 	},
606 };
607 
608 static const struct mfd_cell iqs621_sub_devs[] = {
609 	{
610 		.name = "iqs62x-keys",
611 		.of_compatible = "azoteq,iqs621-keys",
612 	},
613 	{ .name = "iqs621-als", },
614 };
615 
616 static const struct mfd_cell iqs622_sub_devs[] = {
617 	{
618 		.name = "iqs62x-keys",
619 		.of_compatible = "azoteq,iqs622-keys",
620 	},
621 	{ .name = "iqs621-als", },
622 };
623 
624 static const struct mfd_cell iqs624_sub_devs[] = {
625 	{
626 		.name = "iqs62x-keys",
627 		.of_compatible = "azoteq,iqs624-keys",
628 	},
629 	{ .name = "iqs624-pos", },
630 };
631 
632 static const struct mfd_cell iqs625_sub_devs[] = {
633 	{
634 		.name = "iqs62x-keys",
635 		.of_compatible = "azoteq,iqs625-keys",
636 	},
637 	{ .name = "iqs624-pos", },
638 };
639 
640 static const u8 iqs620at_cal_regs[] = {
641 	IQS620_TEMP_CAL_MULT,
642 	IQS620_TEMP_CAL_DIV,
643 	IQS620_TEMP_CAL_OFFS,
644 };
645 
646 static const u8 iqs621_cal_regs[] = {
647 	IQS621_ALS_CAL_DIV_LUX,
648 	IQS621_ALS_CAL_DIV_IR,
649 };
650 
651 static const enum iqs62x_event_reg iqs620a_event_regs[][IQS62X_EVENT_SIZE] = {
652 	[IQS62X_UI_PROX] = {
653 		IQS62X_EVENT_SYS,	/* 0x10 */
654 		IQS62X_EVENT_NONE,
655 		IQS62X_EVENT_PROX,	/* 0x12 */
656 		IQS62X_EVENT_HYST,	/* 0x13 */
657 		IQS62X_EVENT_NONE,
658 		IQS62X_EVENT_NONE,
659 		IQS62X_EVENT_HALL,	/* 0x16 */
660 		IQS62X_EVENT_NONE,
661 		IQS62X_EVENT_NONE,
662 		IQS62X_EVENT_NONE,
663 	},
664 	[IQS62X_UI_SAR1] = {
665 		IQS62X_EVENT_SYS,	/* 0x10 */
666 		IQS62X_EVENT_NONE,
667 		IQS62X_EVENT_NONE,
668 		IQS62X_EVENT_HYST,	/* 0x13 */
669 		IQS62X_EVENT_NONE,
670 		IQS62X_EVENT_NONE,
671 		IQS62X_EVENT_HALL,	/* 0x16 */
672 		IQS62X_EVENT_NONE,
673 		IQS62X_EVENT_NONE,
674 		IQS62X_EVENT_NONE,
675 	},
676 };
677 
678 static const enum iqs62x_event_reg iqs621_event_regs[][IQS62X_EVENT_SIZE] = {
679 	[IQS62X_UI_PROX] = {
680 		IQS62X_EVENT_SYS,	/* 0x10 */
681 		IQS62X_EVENT_NONE,
682 		IQS62X_EVENT_PROX,	/* 0x12 */
683 		IQS62X_EVENT_HYST,	/* 0x13 */
684 		IQS62X_EVENT_NONE,
685 		IQS62X_EVENT_NONE,
686 		IQS62X_EVENT_ALS,	/* 0x16 */
687 		IQS62X_EVENT_UI_LO,	/* 0x17 */
688 		IQS62X_EVENT_UI_HI,	/* 0x18 */
689 		IQS62X_EVENT_HALL,	/* 0x19 */
690 	},
691 };
692 
693 static const enum iqs62x_event_reg iqs622_event_regs[][IQS62X_EVENT_SIZE] = {
694 	[IQS62X_UI_PROX] = {
695 		IQS62X_EVENT_SYS,	/* 0x10 */
696 		IQS62X_EVENT_NONE,
697 		IQS62X_EVENT_PROX,	/* 0x12 */
698 		IQS62X_EVENT_NONE,
699 		IQS62X_EVENT_ALS,	/* 0x14 */
700 		IQS62X_EVENT_NONE,
701 		IQS62X_EVENT_IR,	/* 0x16 */
702 		IQS62X_EVENT_UI_LO,	/* 0x17 */
703 		IQS62X_EVENT_UI_HI,	/* 0x18 */
704 		IQS62X_EVENT_HALL,	/* 0x19 */
705 	},
706 	[IQS62X_UI_SAR1] = {
707 		IQS62X_EVENT_SYS,	/* 0x10 */
708 		IQS62X_EVENT_NONE,
709 		IQS62X_EVENT_NONE,
710 		IQS62X_EVENT_HYST,	/* 0x13 */
711 		IQS62X_EVENT_ALS,	/* 0x14 */
712 		IQS62X_EVENT_NONE,
713 		IQS62X_EVENT_IR,	/* 0x16 */
714 		IQS62X_EVENT_UI_LO,	/* 0x17 */
715 		IQS62X_EVENT_UI_HI,	/* 0x18 */
716 		IQS62X_EVENT_HALL,	/* 0x19 */
717 	},
718 };
719 
720 static const enum iqs62x_event_reg iqs624_event_regs[][IQS62X_EVENT_SIZE] = {
721 	[IQS62X_UI_PROX] = {
722 		IQS62X_EVENT_SYS,	/* 0x10 */
723 		IQS62X_EVENT_NONE,
724 		IQS62X_EVENT_PROX,	/* 0x12 */
725 		IQS62X_EVENT_NONE,
726 		IQS62X_EVENT_WHEEL,	/* 0x14 */
727 		IQS62X_EVENT_NONE,
728 		IQS62X_EVENT_UI_LO,	/* 0x16 */
729 		IQS62X_EVENT_UI_HI,	/* 0x17 */
730 		IQS62X_EVENT_INTER,	/* 0x18 */
731 		IQS62X_EVENT_NONE,
732 	},
733 };
734 
735 static const enum iqs62x_event_reg iqs625_event_regs[][IQS62X_EVENT_SIZE] = {
736 	[IQS62X_UI_PROX] = {
737 		IQS62X_EVENT_SYS,	/* 0x10 */
738 		IQS62X_EVENT_PROX,	/* 0x11 */
739 		IQS62X_EVENT_INTER,	/* 0x12 */
740 		IQS62X_EVENT_NONE,
741 		IQS62X_EVENT_NONE,
742 		IQS62X_EVENT_NONE,
743 		IQS62X_EVENT_NONE,
744 		IQS62X_EVENT_NONE,
745 		IQS62X_EVENT_NONE,
746 		IQS62X_EVENT_NONE,
747 	},
748 };
749 
750 static const struct iqs62x_dev_desc iqs62x_devs[] = {
751 	{
752 		.dev_name	= "iqs620at",
753 		.sub_devs	= iqs620at_sub_devs,
754 		.num_sub_devs	= ARRAY_SIZE(iqs620at_sub_devs),
755 
756 		.prod_num	= IQS620_PROD_NUM,
757 		.sw_num		= 0x08,
758 		.cal_regs	= iqs620at_cal_regs,
759 		.num_cal_regs	= ARRAY_SIZE(iqs620at_cal_regs),
760 
761 		.prox_mask	= BIT(0),
762 		.sar_mask	= BIT(1) | BIT(7),
763 		.hall_mask	= BIT(2),
764 		.hyst_mask	= BIT(3),
765 		.temp_mask	= BIT(4),
766 
767 		.prox_settings	= IQS620_PROX_SETTINGS_4,
768 		.hall_flags	= IQS620_HALL_FLAGS,
769 
770 		.clk_div	= 4,
771 		.fw_name	= "iqs620a.bin",
772 		.event_regs	= &iqs620a_event_regs[IQS62X_UI_PROX],
773 	},
774 	{
775 		.dev_name	= "iqs620a",
776 		.sub_devs	= iqs620a_sub_devs,
777 		.num_sub_devs	= ARRAY_SIZE(iqs620a_sub_devs),
778 
779 		.prod_num	= IQS620_PROD_NUM,
780 		.sw_num		= 0x08,
781 
782 		.prox_mask	= BIT(0),
783 		.sar_mask	= BIT(1) | BIT(7),
784 		.hall_mask	= BIT(2),
785 		.hyst_mask	= BIT(3),
786 		.temp_mask	= BIT(4),
787 
788 		.prox_settings	= IQS620_PROX_SETTINGS_4,
789 		.hall_flags	= IQS620_HALL_FLAGS,
790 
791 		.clk_div	= 4,
792 		.fw_name	= "iqs620a.bin",
793 		.event_regs	= &iqs620a_event_regs[IQS62X_UI_PROX],
794 	},
795 	{
796 		.dev_name	= "iqs621",
797 		.sub_devs	= iqs621_sub_devs,
798 		.num_sub_devs	= ARRAY_SIZE(iqs621_sub_devs),
799 
800 		.prod_num	= IQS621_PROD_NUM,
801 		.sw_num		= 0x09,
802 		.cal_regs	= iqs621_cal_regs,
803 		.num_cal_regs	= ARRAY_SIZE(iqs621_cal_regs),
804 
805 		.prox_mask	= BIT(0),
806 		.hall_mask	= BIT(1),
807 		.als_mask	= BIT(2),
808 		.hyst_mask	= BIT(3),
809 		.temp_mask	= BIT(4),
810 
811 		.als_flags	= IQS621_ALS_FLAGS,
812 		.hall_flags	= IQS621_HALL_FLAGS,
813 		.hyst_shift	= 5,
814 
815 		.clk_div	= 2,
816 		.fw_name	= "iqs621.bin",
817 		.event_regs	= &iqs621_event_regs[IQS62X_UI_PROX],
818 	},
819 	{
820 		.dev_name	= "iqs622",
821 		.sub_devs	= iqs622_sub_devs,
822 		.num_sub_devs	= ARRAY_SIZE(iqs622_sub_devs),
823 
824 		.prod_num	= IQS622_PROD_NUM,
825 		.sw_num		= 0x06,
826 
827 		.prox_mask	= BIT(0),
828 		.sar_mask	= BIT(1),
829 		.hall_mask	= BIT(2),
830 		.als_mask	= BIT(3),
831 		.ir_mask	= BIT(4),
832 
833 		.prox_settings	= IQS622_PROX_SETTINGS_4,
834 		.als_flags	= IQS622_ALS_FLAGS,
835 		.hall_flags	= IQS622_HALL_FLAGS,
836 
837 		.clk_div	= 2,
838 		.fw_name	= "iqs622.bin",
839 		.event_regs	= &iqs622_event_regs[IQS62X_UI_PROX],
840 	},
841 	{
842 		.dev_name	= "iqs624",
843 		.sub_devs	= iqs624_sub_devs,
844 		.num_sub_devs	= ARRAY_SIZE(iqs624_sub_devs),
845 
846 		.prod_num	= IQS624_PROD_NUM,
847 		.sw_num		= 0x0B,
848 
849 		.interval	= IQS624_INTERVAL_NUM,
850 		.interval_div	= 3,
851 
852 		.clk_div	= 2,
853 		.fw_name	= "iqs624.bin",
854 		.event_regs	= &iqs624_event_regs[IQS62X_UI_PROX],
855 	},
856 	{
857 		.dev_name	= "iqs625",
858 		.sub_devs	= iqs625_sub_devs,
859 		.num_sub_devs	= ARRAY_SIZE(iqs625_sub_devs),
860 
861 		.prod_num	= IQS625_PROD_NUM,
862 		.sw_num		= 0x0B,
863 
864 		.interval	= IQS625_INTERVAL_NUM,
865 		.interval_div	= 10,
866 
867 		.clk_div	= 2,
868 		.fw_name	= "iqs625.bin",
869 		.event_regs	= &iqs625_event_regs[IQS62X_UI_PROX],
870 	},
871 };
872 
873 static const struct regmap_config iqs62x_map_config = {
874 	.reg_bits = 8,
875 	.val_bits = 8,
876 	.max_register = IQS62X_MAX_REG,
877 };
878 
879 static int iqs62x_probe(struct i2c_client *client)
880 {
881 	struct iqs62x_core *iqs62x;
882 	struct iqs62x_info info;
883 	unsigned int val;
884 	int ret, i, j;
885 	u8 sw_num = 0;
886 	const char *fw_name = NULL;
887 
888 	iqs62x = devm_kzalloc(&client->dev, sizeof(*iqs62x), GFP_KERNEL);
889 	if (!iqs62x)
890 		return -ENOMEM;
891 
892 	i2c_set_clientdata(client, iqs62x);
893 	iqs62x->client = client;
894 
895 	BLOCKING_INIT_NOTIFIER_HEAD(&iqs62x->nh);
896 	INIT_LIST_HEAD(&iqs62x->fw_blk_head);
897 	init_completion(&iqs62x->fw_done);
898 
899 	iqs62x->regmap = devm_regmap_init_i2c(client, &iqs62x_map_config);
900 	if (IS_ERR(iqs62x->regmap)) {
901 		ret = PTR_ERR(iqs62x->regmap);
902 		dev_err(&client->dev, "Failed to initialize register map: %d\n",
903 			ret);
904 		return ret;
905 	}
906 
907 	ret = regmap_raw_read(iqs62x->regmap, IQS62X_PROD_NUM, &info,
908 			      sizeof(info));
909 	if (ret)
910 		return ret;
911 
912 	/*
913 	 * The following sequence validates the device's product and software
914 	 * numbers. It then determines if the device is factory-calibrated by
915 	 * checking for nonzero values in the device's designated calibration
916 	 * registers (if applicable). Depending on the device, the absence of
917 	 * calibration data indicates a reduced feature set or invalid device.
918 	 *
919 	 * For devices given in both calibrated and uncalibrated versions, the
920 	 * calibrated version (e.g. IQS620AT) appears first in the iqs62x_devs
921 	 * array. The uncalibrated version (e.g. IQS620A) appears next and has
922 	 * the same product and software numbers, but no calibration registers
923 	 * are specified.
924 	 */
925 	for (i = 0; i < ARRAY_SIZE(iqs62x_devs); i++) {
926 		if (info.prod_num != iqs62x_devs[i].prod_num)
927 			continue;
928 
929 		iqs62x->dev_desc = &iqs62x_devs[i];
930 
931 		if (info.sw_num < iqs62x->dev_desc->sw_num)
932 			continue;
933 
934 		sw_num = info.sw_num;
935 
936 		/*
937 		 * Read each of the device's designated calibration registers,
938 		 * if any, and exit from the inner loop early if any are equal
939 		 * to zero (indicating the device is uncalibrated). This could
940 		 * be acceptable depending on the device (e.g. IQS620A instead
941 		 * of IQS620AT).
942 		 */
943 		for (j = 0; j < iqs62x->dev_desc->num_cal_regs; j++) {
944 			ret = regmap_read(iqs62x->regmap,
945 					  iqs62x->dev_desc->cal_regs[j], &val);
946 			if (ret)
947 				return ret;
948 
949 			if (!val)
950 				break;
951 		}
952 
953 		/*
954 		 * If the number of nonzero values read from the device equals
955 		 * the number of designated calibration registers (which could
956 		 * be zero), exit from the outer loop early to signal that the
957 		 * device's product and software numbers match a known device,
958 		 * and the device is calibrated (if applicable).
959 		 */
960 		if (j == iqs62x->dev_desc->num_cal_regs)
961 			break;
962 	}
963 
964 	if (!iqs62x->dev_desc) {
965 		dev_err(&client->dev, "Unrecognized product number: 0x%02X\n",
966 			info.prod_num);
967 		return -EINVAL;
968 	}
969 
970 	if (!sw_num) {
971 		dev_err(&client->dev, "Unrecognized software number: 0x%02X\n",
972 			info.sw_num);
973 		return -EINVAL;
974 	}
975 
976 	if (i == ARRAY_SIZE(iqs62x_devs)) {
977 		dev_err(&client->dev, "Uncalibrated device\n");
978 		return -ENODATA;
979 	}
980 
981 	device_property_read_string(&client->dev, "firmware-name", &fw_name);
982 
983 	ret = request_firmware_nowait(THIS_MODULE, FW_ACTION_HOTPLUG,
984 				      fw_name ? : iqs62x->dev_desc->fw_name,
985 				      &client->dev, GFP_KERNEL, iqs62x,
986 				      iqs62x_firmware_load);
987 	if (ret)
988 		dev_err(&client->dev, "Failed to request firmware: %d\n", ret);
989 
990 	return ret;
991 }
992 
993 static int iqs62x_remove(struct i2c_client *client)
994 {
995 	struct iqs62x_core *iqs62x = i2c_get_clientdata(client);
996 
997 	wait_for_completion(&iqs62x->fw_done);
998 
999 	return 0;
1000 }
1001 
1002 static int __maybe_unused iqs62x_suspend(struct device *dev)
1003 {
1004 	struct iqs62x_core *iqs62x = dev_get_drvdata(dev);
1005 	int ret;
1006 
1007 	wait_for_completion(&iqs62x->fw_done);
1008 
1009 	/*
1010 	 * As per the datasheet, automatic mode switching must be disabled
1011 	 * before the device is placed in or taken out of halt mode.
1012 	 */
1013 	ret = regmap_update_bits(iqs62x->regmap, IQS62X_PWR_SETTINGS,
1014 				 IQS62X_PWR_SETTINGS_DIS_AUTO, 0xFF);
1015 	if (ret)
1016 		return ret;
1017 
1018 	return regmap_update_bits(iqs62x->regmap, IQS62X_PWR_SETTINGS,
1019 				  IQS62X_PWR_SETTINGS_PWR_MODE_MASK,
1020 				  IQS62X_PWR_SETTINGS_PWR_MODE_HALT);
1021 }
1022 
1023 static int __maybe_unused iqs62x_resume(struct device *dev)
1024 {
1025 	struct iqs62x_core *iqs62x = dev_get_drvdata(dev);
1026 	int ret;
1027 
1028 	ret = regmap_update_bits(iqs62x->regmap, IQS62X_PWR_SETTINGS,
1029 				 IQS62X_PWR_SETTINGS_PWR_MODE_MASK,
1030 				 IQS62X_PWR_SETTINGS_PWR_MODE_NORM);
1031 	if (ret)
1032 		return ret;
1033 
1034 	return regmap_update_bits(iqs62x->regmap, IQS62X_PWR_SETTINGS,
1035 				  IQS62X_PWR_SETTINGS_DIS_AUTO, 0);
1036 }
1037 
1038 static SIMPLE_DEV_PM_OPS(iqs62x_pm, iqs62x_suspend, iqs62x_resume);
1039 
1040 static const struct of_device_id iqs62x_of_match[] = {
1041 	{ .compatible = "azoteq,iqs620a" },
1042 	{ .compatible = "azoteq,iqs621" },
1043 	{ .compatible = "azoteq,iqs622" },
1044 	{ .compatible = "azoteq,iqs624" },
1045 	{ .compatible = "azoteq,iqs625" },
1046 	{ }
1047 };
1048 MODULE_DEVICE_TABLE(of, iqs62x_of_match);
1049 
1050 static struct i2c_driver iqs62x_i2c_driver = {
1051 	.driver = {
1052 		.name = "iqs62x",
1053 		.of_match_table = iqs62x_of_match,
1054 		.pm = &iqs62x_pm,
1055 	},
1056 	.probe_new = iqs62x_probe,
1057 	.remove = iqs62x_remove,
1058 };
1059 module_i2c_driver(iqs62x_i2c_driver);
1060 
1061 MODULE_AUTHOR("Jeff LaBundy <jeff@labundy.com>");
1062 MODULE_DESCRIPTION("Azoteq IQS620A/621/622/624/625 Multi-Function Sensors");
1063 MODULE_LICENSE("GPL");
1064