hc
2024-01-03 2f7c68cb55ecb7331f2381deb497c27155f32faf
kernel/drivers/input/misc/iqs269a.c
....@@ -9,6 +9,7 @@
99 * axial sliders presented by the device.
1010 */
1111
12
+#include <linux/completion.h>
1213 #include <linux/delay.h>
1314 #include <linux/device.h>
1415 #include <linux/err.h>
....@@ -96,8 +97,6 @@
9697 #define IQS269_MISC_B_TRACKING_UI_ENABLE BIT(4)
9798 #define IQS269_MISC_B_FILT_STR_SLIDER GENMASK(1, 0)
9899
99
-#define IQS269_CHx_SETTINGS 0x8C
100
-
101100 #define IQS269_CHx_ENG_A_MEAS_CAP_SIZE BIT(15)
102101 #define IQS269_CHx_ENG_A_RX_GND_INACTIVE BIT(13)
103102 #define IQS269_CHx_ENG_A_LOCAL_CAP_SIZE BIT(12)
....@@ -146,14 +145,7 @@
146145 #define IQS269_NUM_CH 8
147146 #define IQS269_NUM_SL 2
148147
149
-#define IQS269_ATI_POLL_SLEEP_US (iqs269->delay_mult * 10000)
150
-#define IQS269_ATI_POLL_TIMEOUT_US (iqs269->delay_mult * 500000)
151
-#define IQS269_ATI_STABLE_DELAY_MS (iqs269->delay_mult * 150)
152
-
153
-#define IQS269_PWR_MODE_POLL_SLEEP_US IQS269_ATI_POLL_SLEEP_US
154
-#define IQS269_PWR_MODE_POLL_TIMEOUT_US IQS269_ATI_POLL_TIMEOUT_US
155
-
156
-#define iqs269_irq_wait() usleep_range(100, 150)
148
+#define iqs269_irq_wait() usleep_range(200, 250)
157149
158150 enum iqs269_local_cap_size {
159151 IQS269_LOCAL_CAP_SIZE_0,
....@@ -245,6 +237,18 @@
245237 u8 padding;
246238 } __packed;
247239
240
+struct iqs269_ch_reg {
241
+ u8 rx_enable;
242
+ u8 tx_enable;
243
+ __be16 engine_a;
244
+ __be16 engine_b;
245
+ __be16 ati_comp;
246
+ u8 thresh[3];
247
+ u8 hyst;
248
+ u8 assoc_select;
249
+ u8 assoc_weight;
250
+} __packed;
251
+
248252 struct iqs269_sys_reg {
249253 __be16 general;
250254 u8 active;
....@@ -266,18 +270,7 @@
266270 u8 timeout_swipe;
267271 u8 thresh_swipe;
268272 u8 redo_ati;
269
-} __packed;
270
-
271
-struct iqs269_ch_reg {
272
- u8 rx_enable;
273
- u8 tx_enable;
274
- __be16 engine_a;
275
- __be16 engine_b;
276
- __be16 ati_comp;
277
- u8 thresh[3];
278
- u8 hyst;
279
- u8 assoc_select;
280
- u8 assoc_weight;
273
+ struct iqs269_ch_reg ch_reg[IQS269_NUM_CH];
281274 } __packed;
282275
283276 struct iqs269_flags {
....@@ -292,13 +285,11 @@
292285 struct regmap *regmap;
293286 struct mutex lock;
294287 struct iqs269_switch_desc switches[ARRAY_SIZE(iqs269_events)];
295
- struct iqs269_ch_reg ch_reg[IQS269_NUM_CH];
296288 struct iqs269_sys_reg sys_reg;
289
+ struct completion ati_done;
297290 struct input_dev *keypad;
298291 struct input_dev *slider[IQS269_NUM_SL];
299292 unsigned int keycode[ARRAY_SIZE(iqs269_events) * IQS269_NUM_CH];
300
- unsigned int suspend_mode;
301
- unsigned int delay_mult;
302293 unsigned int ch_num;
303294 bool hall_enable;
304295 bool ati_current;
....@@ -307,6 +298,7 @@
307298 static int iqs269_ati_mode_set(struct iqs269_private *iqs269,
308299 unsigned int ch_num, unsigned int mode)
309300 {
301
+ struct iqs269_ch_reg *ch_reg = iqs269->sys_reg.ch_reg;
310302 u16 engine_a;
311303
312304 if (ch_num >= IQS269_NUM_CH)
....@@ -317,12 +309,12 @@
317309
318310 mutex_lock(&iqs269->lock);
319311
320
- engine_a = be16_to_cpu(iqs269->ch_reg[ch_num].engine_a);
312
+ engine_a = be16_to_cpu(ch_reg[ch_num].engine_a);
321313
322314 engine_a &= ~IQS269_CHx_ENG_A_ATI_MODE_MASK;
323315 engine_a |= (mode << IQS269_CHx_ENG_A_ATI_MODE_SHIFT);
324316
325
- iqs269->ch_reg[ch_num].engine_a = cpu_to_be16(engine_a);
317
+ ch_reg[ch_num].engine_a = cpu_to_be16(engine_a);
326318 iqs269->ati_current = false;
327319
328320 mutex_unlock(&iqs269->lock);
....@@ -333,13 +325,14 @@
333325 static int iqs269_ati_mode_get(struct iqs269_private *iqs269,
334326 unsigned int ch_num, unsigned int *mode)
335327 {
328
+ struct iqs269_ch_reg *ch_reg = iqs269->sys_reg.ch_reg;
336329 u16 engine_a;
337330
338331 if (ch_num >= IQS269_NUM_CH)
339332 return -EINVAL;
340333
341334 mutex_lock(&iqs269->lock);
342
- engine_a = be16_to_cpu(iqs269->ch_reg[ch_num].engine_a);
335
+ engine_a = be16_to_cpu(ch_reg[ch_num].engine_a);
343336 mutex_unlock(&iqs269->lock);
344337
345338 engine_a &= IQS269_CHx_ENG_A_ATI_MODE_MASK;
....@@ -351,6 +344,7 @@
351344 static int iqs269_ati_base_set(struct iqs269_private *iqs269,
352345 unsigned int ch_num, unsigned int base)
353346 {
347
+ struct iqs269_ch_reg *ch_reg = iqs269->sys_reg.ch_reg;
354348 u16 engine_b;
355349
356350 if (ch_num >= IQS269_NUM_CH)
....@@ -379,12 +373,12 @@
379373
380374 mutex_lock(&iqs269->lock);
381375
382
- engine_b = be16_to_cpu(iqs269->ch_reg[ch_num].engine_b);
376
+ engine_b = be16_to_cpu(ch_reg[ch_num].engine_b);
383377
384378 engine_b &= ~IQS269_CHx_ENG_B_ATI_BASE_MASK;
385379 engine_b |= base;
386380
387
- iqs269->ch_reg[ch_num].engine_b = cpu_to_be16(engine_b);
381
+ ch_reg[ch_num].engine_b = cpu_to_be16(engine_b);
388382 iqs269->ati_current = false;
389383
390384 mutex_unlock(&iqs269->lock);
....@@ -395,13 +389,14 @@
395389 static int iqs269_ati_base_get(struct iqs269_private *iqs269,
396390 unsigned int ch_num, unsigned int *base)
397391 {
392
+ struct iqs269_ch_reg *ch_reg = iqs269->sys_reg.ch_reg;
398393 u16 engine_b;
399394
400395 if (ch_num >= IQS269_NUM_CH)
401396 return -EINVAL;
402397
403398 mutex_lock(&iqs269->lock);
404
- engine_b = be16_to_cpu(iqs269->ch_reg[ch_num].engine_b);
399
+ engine_b = be16_to_cpu(ch_reg[ch_num].engine_b);
405400 mutex_unlock(&iqs269->lock);
406401
407402 switch (engine_b & IQS269_CHx_ENG_B_ATI_BASE_MASK) {
....@@ -429,6 +424,7 @@
429424 static int iqs269_ati_target_set(struct iqs269_private *iqs269,
430425 unsigned int ch_num, unsigned int target)
431426 {
427
+ struct iqs269_ch_reg *ch_reg = iqs269->sys_reg.ch_reg;
432428 u16 engine_b;
433429
434430 if (ch_num >= IQS269_NUM_CH)
....@@ -439,12 +435,12 @@
439435
440436 mutex_lock(&iqs269->lock);
441437
442
- engine_b = be16_to_cpu(iqs269->ch_reg[ch_num].engine_b);
438
+ engine_b = be16_to_cpu(ch_reg[ch_num].engine_b);
443439
444440 engine_b &= ~IQS269_CHx_ENG_B_ATI_TARGET_MASK;
445441 engine_b |= target / 32;
446442
447
- iqs269->ch_reg[ch_num].engine_b = cpu_to_be16(engine_b);
443
+ ch_reg[ch_num].engine_b = cpu_to_be16(engine_b);
448444 iqs269->ati_current = false;
449445
450446 mutex_unlock(&iqs269->lock);
....@@ -455,13 +451,14 @@
455451 static int iqs269_ati_target_get(struct iqs269_private *iqs269,
456452 unsigned int ch_num, unsigned int *target)
457453 {
454
+ struct iqs269_ch_reg *ch_reg = iqs269->sys_reg.ch_reg;
458455 u16 engine_b;
459456
460457 if (ch_num >= IQS269_NUM_CH)
461458 return -EINVAL;
462459
463460 mutex_lock(&iqs269->lock);
464
- engine_b = be16_to_cpu(iqs269->ch_reg[ch_num].engine_b);
461
+ engine_b = be16_to_cpu(ch_reg[ch_num].engine_b);
465462 mutex_unlock(&iqs269->lock);
466463
467464 *target = (engine_b & IQS269_CHx_ENG_B_ATI_TARGET_MASK) * 32;
....@@ -531,13 +528,7 @@
531528 if (fwnode_property_present(ch_node, "azoteq,slider1-select"))
532529 iqs269->sys_reg.slider_select[1] |= BIT(reg);
533530
534
- ch_reg = &iqs269->ch_reg[reg];
535
-
536
- error = regmap_raw_read(iqs269->regmap,
537
- IQS269_CHx_SETTINGS + reg * sizeof(*ch_reg) / 2,
538
- ch_reg, sizeof(*ch_reg));
539
- if (error)
540
- return error;
531
+ ch_reg = &iqs269->sys_reg.ch_reg[reg];
541532
542533 error = iqs269_parse_mask(ch_node, "azoteq,rx-enable",
543534 &ch_reg->rx_enable);
....@@ -694,6 +685,7 @@
694685 dev_err(&client->dev,
695686 "Invalid channel %u threshold: %u\n",
696687 reg, val);
688
+ fwnode_handle_put(ev_node);
697689 return -EINVAL;
698690 }
699691
....@@ -707,6 +699,7 @@
707699 dev_err(&client->dev,
708700 "Invalid channel %u hysteresis: %u\n",
709701 reg, val);
702
+ fwnode_handle_put(ev_node);
710703 return -EINVAL;
711704 }
712705
....@@ -721,8 +714,16 @@
721714 }
722715 }
723716
724
- if (fwnode_property_read_u32(ev_node, "linux,code", &val))
717
+ error = fwnode_property_read_u32(ev_node, "linux,code", &val);
718
+ fwnode_handle_put(ev_node);
719
+ if (error == -EINVAL) {
725720 continue;
721
+ } else if (error) {
722
+ dev_err(&client->dev,
723
+ "Failed to read channel %u code: %d\n", reg,
724
+ error);
725
+ return error;
726
+ }
726727
727728 switch (reg) {
728729 case IQS269_CHx_HALL_ACTIVE:
....@@ -758,17 +759,6 @@
758759
759760 iqs269->hall_enable = device_property_present(&client->dev,
760761 "azoteq,hall-enable");
761
-
762
- if (!device_property_read_u32(&client->dev, "azoteq,suspend-mode",
763
- &val)) {
764
- if (val > IQS269_SYS_SETTINGS_PWR_MODE_MAX) {
765
- dev_err(&client->dev, "Invalid suspend mode: %u\n",
766
- val);
767
- return -EINVAL;
768
- }
769
-
770
- iqs269->suspend_mode = val;
771
- }
772762
773763 error = regmap_raw_read(iqs269->regmap, IQS269_SYS_SETTINGS, sys_reg,
774764 sizeof(*sys_reg));
....@@ -980,13 +970,8 @@
980970
981971 general = be16_to_cpu(sys_reg->general);
982972
983
- if (device_property_present(&client->dev, "azoteq,clk-div")) {
973
+ if (device_property_present(&client->dev, "azoteq,clk-div"))
984974 general |= IQS269_SYS_SETTINGS_CLK_DIV;
985
- iqs269->delay_mult = 4;
986
- } else {
987
- general &= ~IQS269_SYS_SETTINGS_CLK_DIV;
988
- iqs269->delay_mult = 1;
989
- }
990975
991976 /*
992977 * Configure the device to automatically switch between normal and low-
....@@ -996,6 +981,17 @@
996981 general &= ~IQS269_SYS_SETTINGS_ULP_AUTO;
997982 general &= ~IQS269_SYS_SETTINGS_DIS_AUTO;
998983 general &= ~IQS269_SYS_SETTINGS_PWR_MODE_MASK;
984
+
985
+ if (!device_property_read_u32(&client->dev, "azoteq,suspend-mode",
986
+ &val)) {
987
+ if (val > IQS269_SYS_SETTINGS_PWR_MODE_MAX) {
988
+ dev_err(&client->dev, "Invalid suspend mode: %u\n",
989
+ val);
990
+ return -EINVAL;
991
+ }
992
+
993
+ general |= (val << IQS269_SYS_SETTINGS_PWR_MODE_SHIFT);
994
+ }
999995
1000996 if (!device_property_read_u32(&client->dev, "azoteq,ulp-update",
1001997 &val)) {
....@@ -1032,10 +1028,7 @@
10321028
10331029 static int iqs269_dev_init(struct iqs269_private *iqs269)
10341030 {
1035
- struct iqs269_sys_reg *sys_reg = &iqs269->sys_reg;
1036
- struct iqs269_ch_reg *ch_reg;
1037
- unsigned int val;
1038
- int error, i;
1031
+ int error;
10391032
10401033 mutex_lock(&iqs269->lock);
10411034
....@@ -1045,38 +1038,17 @@
10451038 if (error)
10461039 goto err_mutex;
10471040
1048
- for (i = 0; i < IQS269_NUM_CH; i++) {
1049
- if (!(sys_reg->active & BIT(i)))
1050
- continue;
1051
-
1052
- ch_reg = &iqs269->ch_reg[i];
1053
-
1054
- error = regmap_raw_write(iqs269->regmap,
1055
- IQS269_CHx_SETTINGS + i *
1056
- sizeof(*ch_reg) / 2, ch_reg,
1057
- sizeof(*ch_reg));
1058
- if (error)
1059
- goto err_mutex;
1060
- }
1041
+ error = regmap_raw_write(iqs269->regmap, IQS269_SYS_SETTINGS,
1042
+ &iqs269->sys_reg, sizeof(iqs269->sys_reg));
1043
+ if (error)
1044
+ goto err_mutex;
10611045
10621046 /*
1063
- * The REDO-ATI and ATI channel selection fields must be written in the
1064
- * same block write, so every field between registers 0x80 through 0x8B
1065
- * (inclusive) must be written as well.
1047
+ * The following delay gives the device time to deassert its RDY output
1048
+ * so as to prevent an interrupt from being serviced prematurely.
10661049 */
1067
- error = regmap_raw_write(iqs269->regmap, IQS269_SYS_SETTINGS, sys_reg,
1068
- sizeof(*sys_reg));
1069
- if (error)
1070
- goto err_mutex;
1050
+ usleep_range(2000, 2100);
10711051
1072
- error = regmap_read_poll_timeout(iqs269->regmap, IQS269_SYS_FLAGS, val,
1073
- !(val & IQS269_SYS_FLAGS_IN_ATI),
1074
- IQS269_ATI_POLL_SLEEP_US,
1075
- IQS269_ATI_POLL_TIMEOUT_US);
1076
- if (error)
1077
- goto err_mutex;
1078
-
1079
- msleep(IQS269_ATI_STABLE_DELAY_MS);
10801052 iqs269->ati_current = true;
10811053
10821054 err_mutex:
....@@ -1088,10 +1060,8 @@
10881060 static int iqs269_input_init(struct iqs269_private *iqs269)
10891061 {
10901062 struct i2c_client *client = iqs269->client;
1091
- struct iqs269_flags flags;
10921063 unsigned int sw_code, keycode;
10931064 int error, i, j;
1094
- u8 dir_mask, state;
10951065
10961066 iqs269->keypad = devm_input_allocate_device(&client->dev);
10971067 if (!iqs269->keypad)
....@@ -1104,23 +1074,7 @@
11041074 iqs269->keypad->name = "iqs269a_keypad";
11051075 iqs269->keypad->id.bustype = BUS_I2C;
11061076
1107
- if (iqs269->hall_enable) {
1108
- error = regmap_raw_read(iqs269->regmap, IQS269_SYS_FLAGS,
1109
- &flags, sizeof(flags));
1110
- if (error) {
1111
- dev_err(&client->dev,
1112
- "Failed to read initial status: %d\n", error);
1113
- return error;
1114
- }
1115
- }
1116
-
11171077 for (i = 0; i < ARRAY_SIZE(iqs269_events); i++) {
1118
- dir_mask = flags.states[IQS269_ST_OFFS_DIR];
1119
- if (!iqs269_events[i].dir_up)
1120
- dir_mask = ~dir_mask;
1121
-
1122
- state = flags.states[iqs269_events[i].st_offs] & dir_mask;
1123
-
11241078 sw_code = iqs269->switches[i].code;
11251079
11261080 for (j = 0; j < IQS269_NUM_CH; j++) {
....@@ -1133,13 +1087,9 @@
11331087 switch (j) {
11341088 case IQS269_CHx_HALL_ACTIVE:
11351089 if (iqs269->hall_enable &&
1136
- iqs269->switches[i].enabled) {
1090
+ iqs269->switches[i].enabled)
11371091 input_set_capability(iqs269->keypad,
11381092 EV_SW, sw_code);
1139
- input_report_switch(iqs269->keypad,
1140
- sw_code,
1141
- state & BIT(j));
1142
- }
11431093 fallthrough;
11441094
11451095 case IQS269_CHx_HALL_INACTIVE:
....@@ -1153,14 +1103,6 @@
11531103 EV_KEY, keycode);
11541104 }
11551105 }
1156
- }
1157
-
1158
- input_sync(iqs269->keypad);
1159
-
1160
- error = input_register_device(iqs269->keypad);
1161
- if (error) {
1162
- dev_err(&client->dev, "Failed to register keypad: %d\n", error);
1163
- return error;
11641106 }
11651107
11661108 for (i = 0; i < IQS269_NUM_SL; i++) {
....@@ -1221,6 +1163,9 @@
12211163
12221164 return error;
12231165 }
1166
+
1167
+ if (be16_to_cpu(flags.system) & IQS269_SYS_FLAGS_IN_ATI)
1168
+ return 0;
12241169
12251170 error = regmap_raw_read(iqs269->regmap, IQS269_SLIDER_X, slider_x,
12261171 sizeof(slider_x));
....@@ -1284,6 +1229,12 @@
12841229
12851230 input_sync(iqs269->keypad);
12861231
1232
+ /*
1233
+ * The following completion signals that ATI has finished, any initial
1234
+ * switch states have been reported and the keypad can be registered.
1235
+ */
1236
+ complete_all(&iqs269->ati_done);
1237
+
12871238 return 0;
12881239 }
12891240
....@@ -1315,6 +1266,9 @@
13151266 if (!iqs269->ati_current || iqs269->hall_enable)
13161267 return -EPERM;
13171268
1269
+ if (!completion_done(&iqs269->ati_done))
1270
+ return -EBUSY;
1271
+
13181272 /*
13191273 * Unsolicited I2C communication prompts the device to assert its RDY
13201274 * pin, so disable the interrupt line until the operation is finished
....@@ -1339,6 +1293,7 @@
13391293 struct device_attribute *attr, char *buf)
13401294 {
13411295 struct iqs269_private *iqs269 = dev_get_drvdata(dev);
1296
+ struct iqs269_ch_reg *ch_reg = iqs269->sys_reg.ch_reg;
13421297 struct i2c_client *client = iqs269->client;
13431298 unsigned int val;
13441299 int error;
....@@ -1353,8 +1308,8 @@
13531308 if (error)
13541309 return error;
13551310
1356
- switch (iqs269->ch_reg[IQS269_CHx_HALL_ACTIVE].rx_enable &
1357
- iqs269->ch_reg[IQS269_CHx_HALL_INACTIVE].rx_enable) {
1311
+ switch (ch_reg[IQS269_CHx_HALL_ACTIVE].rx_enable &
1312
+ ch_reg[IQS269_CHx_HALL_INACTIVE].rx_enable) {
13581313 case IQS269_HALL_PAD_R:
13591314 val &= IQS269_CAL_DATA_A_HALL_BIN_R_MASK;
13601315 val >>= IQS269_CAL_DATA_A_HALL_BIN_R_SHIFT;
....@@ -1434,9 +1389,10 @@
14341389 struct device_attribute *attr, char *buf)
14351390 {
14361391 struct iqs269_private *iqs269 = dev_get_drvdata(dev);
1392
+ struct iqs269_ch_reg *ch_reg = iqs269->sys_reg.ch_reg;
14371393
14381394 return scnprintf(buf, PAGE_SIZE, "%u\n",
1439
- iqs269->ch_reg[iqs269->ch_num].rx_enable);
1395
+ ch_reg[iqs269->ch_num].rx_enable);
14401396 }
14411397
14421398 static ssize_t rx_enable_store(struct device *dev,
....@@ -1444,6 +1400,7 @@
14441400 size_t count)
14451401 {
14461402 struct iqs269_private *iqs269 = dev_get_drvdata(dev);
1403
+ struct iqs269_ch_reg *ch_reg = iqs269->sys_reg.ch_reg;
14471404 unsigned int val;
14481405 int error;
14491406
....@@ -1456,7 +1413,7 @@
14561413
14571414 mutex_lock(&iqs269->lock);
14581415
1459
- iqs269->ch_reg[iqs269->ch_num].rx_enable = val;
1416
+ ch_reg[iqs269->ch_num].rx_enable = val;
14601417 iqs269->ati_current = false;
14611418
14621419 mutex_unlock(&iqs269->lock);
....@@ -1568,7 +1525,9 @@
15681525 {
15691526 struct iqs269_private *iqs269 = dev_get_drvdata(dev);
15701527
1571
- return scnprintf(buf, PAGE_SIZE, "%u\n", iqs269->ati_current);
1528
+ return scnprintf(buf, PAGE_SIZE, "%u\n",
1529
+ iqs269->ati_current &&
1530
+ completion_done(&iqs269->ati_done));
15721531 }
15731532
15741533 static ssize_t ati_trigger_store(struct device *dev,
....@@ -1588,6 +1547,7 @@
15881547 return count;
15891548
15901549 disable_irq(client->irq);
1550
+ reinit_completion(&iqs269->ati_done);
15911551
15921552 error = iqs269_dev_init(iqs269);
15931553
....@@ -1596,6 +1556,10 @@
15961556
15971557 if (error)
15981558 return error;
1559
+
1560
+ if (!wait_for_completion_timeout(&iqs269->ati_done,
1561
+ msecs_to_jiffies(2000)))
1562
+ return -ETIMEDOUT;
15991563
16001564 return count;
16011565 }
....@@ -1655,6 +1619,7 @@
16551619 }
16561620
16571621 mutex_init(&iqs269->lock);
1622
+ init_completion(&iqs269->ati_done);
16581623
16591624 error = regmap_raw_read(iqs269->regmap, IQS269_VER_INFO, &ver_info,
16601625 sizeof(ver_info));
....@@ -1690,6 +1655,22 @@
16901655 return error;
16911656 }
16921657
1658
+ if (!wait_for_completion_timeout(&iqs269->ati_done,
1659
+ msecs_to_jiffies(2000))) {
1660
+ dev_err(&client->dev, "Failed to complete ATI\n");
1661
+ return -ETIMEDOUT;
1662
+ }
1663
+
1664
+ /*
1665
+ * The keypad may include one or more switches and is not registered
1666
+ * until ATI is complete and the initial switch states are read.
1667
+ */
1668
+ error = input_register_device(iqs269->keypad);
1669
+ if (error) {
1670
+ dev_err(&client->dev, "Failed to register keypad: %d\n", error);
1671
+ return error;
1672
+ }
1673
+
16931674 error = devm_device_add_group(&client->dev, &iqs269_attr_group);
16941675 if (error)
16951676 dev_err(&client->dev, "Failed to add attributes: %d\n", error);
....@@ -1697,59 +1678,30 @@
16971678 return error;
16981679 }
16991680
1681
+static u16 iqs269_general_get(struct iqs269_private *iqs269)
1682
+{
1683
+ u16 general = be16_to_cpu(iqs269->sys_reg.general);
1684
+
1685
+ general &= ~IQS269_SYS_SETTINGS_REDO_ATI;
1686
+ general &= ~IQS269_SYS_SETTINGS_ACK_RESET;
1687
+
1688
+ return general | IQS269_SYS_SETTINGS_DIS_AUTO;
1689
+}
1690
+
17001691 static int __maybe_unused iqs269_suspend(struct device *dev)
17011692 {
17021693 struct iqs269_private *iqs269 = dev_get_drvdata(dev);
17031694 struct i2c_client *client = iqs269->client;
1704
- unsigned int val;
17051695 int error;
1696
+ u16 general = iqs269_general_get(iqs269);
17061697
1707
- if (!iqs269->suspend_mode)
1698
+ if (!(general & IQS269_SYS_SETTINGS_PWR_MODE_MASK))
17081699 return 0;
17091700
17101701 disable_irq(client->irq);
17111702
1712
- /*
1713
- * Automatic power mode switching must be disabled before the device is
1714
- * forced into any particular power mode. In this case, the device will
1715
- * transition into normal-power mode.
1716
- */
1717
- error = regmap_update_bits(iqs269->regmap, IQS269_SYS_SETTINGS,
1718
- IQS269_SYS_SETTINGS_DIS_AUTO, ~0);
1719
- if (error)
1720
- goto err_irq;
1703
+ error = regmap_write(iqs269->regmap, IQS269_SYS_SETTINGS, general);
17211704
1722
- /*
1723
- * The following check ensures the device has completed its transition
1724
- * into normal-power mode before a manual mode switch is performed.
1725
- */
1726
- error = regmap_read_poll_timeout(iqs269->regmap, IQS269_SYS_FLAGS, val,
1727
- !(val & IQS269_SYS_FLAGS_PWR_MODE_MASK),
1728
- IQS269_PWR_MODE_POLL_SLEEP_US,
1729
- IQS269_PWR_MODE_POLL_TIMEOUT_US);
1730
- if (error)
1731
- goto err_irq;
1732
-
1733
- error = regmap_update_bits(iqs269->regmap, IQS269_SYS_SETTINGS,
1734
- IQS269_SYS_SETTINGS_PWR_MODE_MASK,
1735
- iqs269->suspend_mode <<
1736
- IQS269_SYS_SETTINGS_PWR_MODE_SHIFT);
1737
- if (error)
1738
- goto err_irq;
1739
-
1740
- /*
1741
- * This last check ensures the device has completed its transition into
1742
- * the desired power mode to prevent any spurious interrupts from being
1743
- * triggered after iqs269_suspend has already returned.
1744
- */
1745
- error = regmap_read_poll_timeout(iqs269->regmap, IQS269_SYS_FLAGS, val,
1746
- (val & IQS269_SYS_FLAGS_PWR_MODE_MASK)
1747
- == (iqs269->suspend_mode <<
1748
- IQS269_SYS_FLAGS_PWR_MODE_SHIFT),
1749
- IQS269_PWR_MODE_POLL_SLEEP_US,
1750
- IQS269_PWR_MODE_POLL_TIMEOUT_US);
1751
-
1752
-err_irq:
17531705 iqs269_irq_wait();
17541706 enable_irq(client->irq);
17551707
....@@ -1760,43 +1712,20 @@
17601712 {
17611713 struct iqs269_private *iqs269 = dev_get_drvdata(dev);
17621714 struct i2c_client *client = iqs269->client;
1763
- unsigned int val;
17641715 int error;
1716
+ u16 general = iqs269_general_get(iqs269);
17651717
1766
- if (!iqs269->suspend_mode)
1718
+ if (!(general & IQS269_SYS_SETTINGS_PWR_MODE_MASK))
17671719 return 0;
17681720
17691721 disable_irq(client->irq);
17701722
1771
- error = regmap_update_bits(iqs269->regmap, IQS269_SYS_SETTINGS,
1772
- IQS269_SYS_SETTINGS_PWR_MODE_MASK, 0);
1773
- if (error)
1774
- goto err_irq;
1723
+ error = regmap_write(iqs269->regmap, IQS269_SYS_SETTINGS,
1724
+ general & ~IQS269_SYS_SETTINGS_PWR_MODE_MASK);
1725
+ if (!error)
1726
+ error = regmap_write(iqs269->regmap, IQS269_SYS_SETTINGS,
1727
+ general & ~IQS269_SYS_SETTINGS_DIS_AUTO);
17751728
1776
- /*
1777
- * This check ensures the device has returned to normal-power mode
1778
- * before automatic power mode switching is re-enabled.
1779
- */
1780
- error = regmap_read_poll_timeout(iqs269->regmap, IQS269_SYS_FLAGS, val,
1781
- !(val & IQS269_SYS_FLAGS_PWR_MODE_MASK),
1782
- IQS269_PWR_MODE_POLL_SLEEP_US,
1783
- IQS269_PWR_MODE_POLL_TIMEOUT_US);
1784
- if (error)
1785
- goto err_irq;
1786
-
1787
- error = regmap_update_bits(iqs269->regmap, IQS269_SYS_SETTINGS,
1788
- IQS269_SYS_SETTINGS_DIS_AUTO, 0);
1789
- if (error)
1790
- goto err_irq;
1791
-
1792
- /*
1793
- * This step reports any events that may have been "swallowed" as a
1794
- * result of polling PWR_MODE (which automatically acknowledges any
1795
- * pending interrupts).
1796
- */
1797
- error = iqs269_report(iqs269);
1798
-
1799
-err_irq:
18001729 iqs269_irq_wait();
18011730 enable_irq(client->irq);
18021731