9
9
* axial sliders presented by the device.
10
10
*/
11
11
12
+ #include <linux/bits.h>
12
13
#include <linux/completion.h>
13
14
#include <linux/delay.h>
14
15
#include <linux/device.h>
26
27
27
28
#define IQS269_VER_INFO 0x00
28
29
#define IQS269_VER_INFO_PROD_NUM 0x4F
30
+ #define IQS269_VER_INFO_FW_NUM_2 0x03
31
+ #define IQS269_VER_INFO_FW_NUM_3 0x10
29
32
30
33
#define IQS269_SYS_FLAGS 0x02
31
34
#define IQS269_SYS_FLAGS_SHOW_RESET BIT(15)
53
56
#define IQS269_SYS_SETTINGS_ULP_UPDATE_MASK GENMASK(10, 8)
54
57
#define IQS269_SYS_SETTINGS_ULP_UPDATE_SHIFT 8
55
58
#define IQS269_SYS_SETTINGS_ULP_UPDATE_MAX 7
59
+ #define IQS269_SYS_SETTINGS_SLIDER_SWIPE BIT(7)
56
60
#define IQS269_SYS_SETTINGS_RESEED_OFFSET BIT(6)
57
61
#define IQS269_SYS_SETTINGS_EVENT_MODE BIT(5)
58
62
#define IQS269_SYS_SETTINGS_EVENT_MODE_LP BIT(4)
69
73
#define IQS269_FILT_STR_MAX 3
70
74
71
75
#define IQS269_EVENT_MASK_SYS BIT(6)
76
+ #define IQS269_EVENT_MASK_GESTURE BIT(3)
72
77
#define IQS269_EVENT_MASK_DEEP BIT(2)
73
78
#define IQS269_EVENT_MASK_TOUCH BIT(1)
74
79
#define IQS269_EVENT_MASK_PROX BIT(0)
97
102
#define IQS269_MISC_B_TRACKING_UI_ENABLE BIT(4)
98
103
#define IQS269_MISC_B_FILT_STR_SLIDER GENMASK(1, 0)
99
104
105
+ #define IQS269_TIMEOUT_TAP_MS_MAX 4080
106
+ #define IQS269_TIMEOUT_SWIPE_MS_MAX 4080
107
+ #define IQS269_THRESH_SWIPE_MAX 255
108
+
100
109
#define IQS269_CHx_ENG_A_MEAS_CAP_SIZE BIT(15)
101
110
#define IQS269_CHx_ENG_A_RX_GND_INACTIVE BIT(13)
102
111
#define IQS269_CHx_ENG_A_LOCAL_CAP_SIZE BIT(12)
@@ -175,6 +184,20 @@ enum iqs269_event_id {
175
184
IQS269_EVENT_DEEP_UP ,
176
185
};
177
186
187
+ enum iqs269_slider_id {
188
+ IQS269_SLIDER_NONE ,
189
+ IQS269_SLIDER_KEY ,
190
+ IQS269_SLIDER_RAW ,
191
+ };
192
+
193
+ enum iqs269_gesture_id {
194
+ IQS269_GESTURE_TAP ,
195
+ IQS269_GESTURE_HOLD ,
196
+ IQS269_GESTURE_FLICK_POS ,
197
+ IQS269_GESTURE_FLICK_NEG ,
198
+ IQS269_NUM_GESTURES ,
199
+ };
200
+
178
201
struct iqs269_switch_desc {
179
202
unsigned int code ;
180
203
bool enabled ;
@@ -234,7 +257,7 @@ struct iqs269_ver_info {
234
257
u8 prod_num ;
235
258
u8 sw_num ;
236
259
u8 hw_num ;
237
- u8 padding ;
260
+ u8 fw_num ;
238
261
} __packed ;
239
262
240
263
struct iqs269_ch_reg {
@@ -285,16 +308,33 @@ struct iqs269_private {
285
308
struct regmap * regmap ;
286
309
struct mutex lock ;
287
310
struct iqs269_switch_desc switches [ARRAY_SIZE (iqs269_events )];
311
+ struct iqs269_ver_info ver_info ;
288
312
struct iqs269_sys_reg sys_reg ;
289
313
struct completion ati_done ;
290
314
struct input_dev * keypad ;
291
315
struct input_dev * slider [IQS269_NUM_SL ];
292
316
unsigned int keycode [ARRAY_SIZE (iqs269_events ) * IQS269_NUM_CH ];
317
+ unsigned int sl_code [IQS269_NUM_SL ][IQS269_NUM_GESTURES ];
293
318
unsigned int ch_num ;
294
319
bool hall_enable ;
295
320
bool ati_current ;
296
321
};
297
322
323
+ static enum iqs269_slider_id iqs269_slider_type (struct iqs269_private * iqs269 ,
324
+ int slider_num )
325
+ {
326
+ int i ;
327
+
328
+ if (!iqs269 -> sys_reg .slider_select [slider_num ])
329
+ return IQS269_SLIDER_NONE ;
330
+
331
+ for (i = 0 ; i < IQS269_NUM_GESTURES ; i ++ )
332
+ if (iqs269 -> sl_code [slider_num ][i ] != KEY_RESERVED )
333
+ return IQS269_SLIDER_KEY ;
334
+
335
+ return IQS269_SLIDER_RAW ;
336
+ }
337
+
298
338
static int iqs269_ati_mode_set (struct iqs269_private * iqs269 ,
299
339
unsigned int ch_num , unsigned int mode )
300
340
{
@@ -1004,6 +1044,76 @@ static int iqs269_parse_prop(struct iqs269_private *iqs269)
1004
1044
general |= (val << IQS269_SYS_SETTINGS_ULP_UPDATE_SHIFT );
1005
1045
}
1006
1046
1047
+ if (device_property_present (& client -> dev , "linux,keycodes" )) {
1048
+ int scale = 1 ;
1049
+ int count = device_property_count_u32 (& client -> dev ,
1050
+ "linux,keycodes" );
1051
+ if (count > IQS269_NUM_GESTURES * IQS269_NUM_SL ) {
1052
+ dev_err (& client -> dev , "Too many keycodes present\n" );
1053
+ return - EINVAL ;
1054
+ } else if (count < 0 ) {
1055
+ dev_err (& client -> dev , "Failed to count keycodes: %d\n" ,
1056
+ count );
1057
+ return count ;
1058
+ }
1059
+
1060
+ error = device_property_read_u32_array (& client -> dev ,
1061
+ "linux,keycodes" ,
1062
+ * iqs269 -> sl_code , count );
1063
+ if (error ) {
1064
+ dev_err (& client -> dev , "Failed to read keycodes: %d\n" ,
1065
+ error );
1066
+ return error ;
1067
+ }
1068
+
1069
+ if (device_property_present (& client -> dev ,
1070
+ "azoteq,gesture-swipe" ))
1071
+ general |= IQS269_SYS_SETTINGS_SLIDER_SWIPE ;
1072
+
1073
+ /*
1074
+ * Early revisions of silicon use a more granular step size for
1075
+ * tap and swipe gesture timeouts; scale them appropriately.
1076
+ */
1077
+ if (iqs269 -> ver_info .fw_num < IQS269_VER_INFO_FW_NUM_3 )
1078
+ scale = 4 ;
1079
+
1080
+ if (!device_property_read_u32 (& client -> dev ,
1081
+ "azoteq,timeout-tap-ms" , & val )) {
1082
+ if (val > IQS269_TIMEOUT_TAP_MS_MAX / scale ) {
1083
+ dev_err (& client -> dev , "Invalid timeout: %u\n" ,
1084
+ val );
1085
+ return - EINVAL ;
1086
+ }
1087
+
1088
+ sys_reg -> timeout_tap = val / (16 / scale );
1089
+ }
1090
+
1091
+ if (!device_property_read_u32 (& client -> dev ,
1092
+ "azoteq,timeout-swipe-ms" ,
1093
+ & val )) {
1094
+ if (val > IQS269_TIMEOUT_SWIPE_MS_MAX / scale ) {
1095
+ dev_err (& client -> dev , "Invalid timeout: %u\n" ,
1096
+ val );
1097
+ return - EINVAL ;
1098
+ }
1099
+
1100
+ sys_reg -> timeout_swipe = val / (16 / scale );
1101
+ }
1102
+
1103
+ if (!device_property_read_u32 (& client -> dev ,
1104
+ "azoteq,thresh-swipe" , & val )) {
1105
+ if (val > IQS269_THRESH_SWIPE_MAX ) {
1106
+ dev_err (& client -> dev , "Invalid threshold: %u\n" ,
1107
+ val );
1108
+ return - EINVAL ;
1109
+ }
1110
+
1111
+ sys_reg -> thresh_swipe = val ;
1112
+ }
1113
+
1114
+ sys_reg -> event_mask &= ~IQS269_EVENT_MASK_GESTURE ;
1115
+ }
1116
+
1007
1117
general &= ~IQS269_SYS_SETTINGS_RESEED_OFFSET ;
1008
1118
if (device_property_present (& client -> dev , "azoteq,reseed-offset" ))
1009
1119
general |= IQS269_SYS_SETTINGS_RESEED_OFFSET ;
@@ -1012,10 +1122,11 @@ static int iqs269_parse_prop(struct iqs269_private *iqs269)
1012
1122
1013
1123
/*
1014
1124
* As per the datasheet, enable streaming during normal-power mode if
1015
- * either slider is in use . In that case, the device returns to event
1016
- * mode during low-power mode.
1125
+ * raw coordinates will be read from either slider . In that case, the
1126
+ * device returns to event mode during low-power mode.
1017
1127
*/
1018
- if (sys_reg -> slider_select [0 ] || sys_reg -> slider_select [1 ])
1128
+ if (iqs269_slider_type (iqs269 , 0 ) == IQS269_SLIDER_RAW ||
1129
+ iqs269_slider_type (iqs269 , 1 ) == IQS269_SLIDER_RAW )
1019
1130
general |= IQS269_SYS_SETTINGS_EVENT_MODE_LP ;
1020
1131
1021
1132
general |= IQS269_SYS_SETTINGS_REDO_ATI ;
@@ -1106,19 +1217,37 @@ static int iqs269_input_init(struct iqs269_private *iqs269)
1106
1217
}
1107
1218
1108
1219
for (i = 0 ; i < IQS269_NUM_SL ; i ++ ) {
1109
- if (! iqs269 -> sys_reg . slider_select [ i ] )
1220
+ if (iqs269_slider_type ( iqs269 , i ) == IQS269_SLIDER_NONE )
1110
1221
continue ;
1111
1222
1112
1223
iqs269 -> slider [i ] = devm_input_allocate_device (& client -> dev );
1113
1224
if (!iqs269 -> slider [i ])
1114
1225
return - ENOMEM ;
1115
1226
1227
+ iqs269 -> slider [i ]-> keycodemax = ARRAY_SIZE (iqs269 -> sl_code [i ]);
1228
+ iqs269 -> slider [i ]-> keycode = iqs269 -> sl_code [i ];
1229
+ iqs269 -> slider [i ]-> keycodesize = sizeof (* * iqs269 -> sl_code );
1230
+
1116
1231
iqs269 -> slider [i ]-> name = i ? "iqs269a_slider_1"
1117
1232
: "iqs269a_slider_0" ;
1118
1233
iqs269 -> slider [i ]-> id .bustype = BUS_I2C ;
1119
1234
1120
- input_set_capability (iqs269 -> slider [i ], EV_KEY , BTN_TOUCH );
1121
- input_set_abs_params (iqs269 -> slider [i ], ABS_X , 0 , 255 , 0 , 0 );
1235
+ for (j = 0 ; j < IQS269_NUM_GESTURES ; j ++ )
1236
+ if (iqs269 -> sl_code [i ][j ] != KEY_RESERVED )
1237
+ input_set_capability (iqs269 -> slider [i ], EV_KEY ,
1238
+ iqs269 -> sl_code [i ][j ]);
1239
+
1240
+ /*
1241
+ * Present the slider as a narrow trackpad if one or more chan-
1242
+ * nels have been selected to participate, but no gestures have
1243
+ * been mapped to a keycode.
1244
+ */
1245
+ if (iqs269_slider_type (iqs269 , i ) == IQS269_SLIDER_RAW ) {
1246
+ input_set_capability (iqs269 -> slider [i ],
1247
+ EV_KEY , BTN_TOUCH );
1248
+ input_set_abs_params (iqs269 -> slider [i ],
1249
+ ABS_X , 0 , 255 , 0 , 0 );
1250
+ }
1122
1251
1123
1252
error = input_register_device (iqs269 -> slider [i ]);
1124
1253
if (error ) {
@@ -1167,28 +1296,62 @@ static int iqs269_report(struct iqs269_private *iqs269)
1167
1296
if (be16_to_cpu (flags .system ) & IQS269_SYS_FLAGS_IN_ATI )
1168
1297
return 0 ;
1169
1298
1170
- error = regmap_raw_read (iqs269 -> regmap , IQS269_SLIDER_X , slider_x ,
1171
- sizeof (slider_x ));
1172
- if (error ) {
1173
- dev_err (& client -> dev , "Failed to read slider position: %d\n" ,
1174
- error );
1175
- return error ;
1299
+ if (iqs269_slider_type (iqs269 , 0 ) == IQS269_SLIDER_RAW ||
1300
+ iqs269_slider_type (iqs269 , 1 ) == IQS269_SLIDER_RAW ) {
1301
+ error = regmap_raw_read (iqs269 -> regmap , IQS269_SLIDER_X ,
1302
+ slider_x , sizeof (slider_x ));
1303
+ if (error ) {
1304
+ dev_err (& client -> dev ,
1305
+ "Failed to read slider position: %d\n" , error );
1306
+ return error ;
1307
+ }
1176
1308
}
1177
1309
1178
1310
for (i = 0 ; i < IQS269_NUM_SL ; i ++ ) {
1179
- if (!iqs269 -> sys_reg .slider_select [i ])
1311
+ flags .gesture >>= (i * IQS269_NUM_GESTURES );
1312
+
1313
+ switch (iqs269_slider_type (iqs269 , i )) {
1314
+ case IQS269_SLIDER_NONE :
1180
1315
continue ;
1181
1316
1182
- /*
1183
- * Report BTN_TOUCH if any channel that participates in the
1184
- * slider is in a state of touch.
1185
- */
1186
- if (flags .states [IQS269_ST_OFFS_TOUCH ] &
1187
- iqs269 -> sys_reg .slider_select [i ]) {
1188
- input_report_key (iqs269 -> slider [i ], BTN_TOUCH , 1 );
1189
- input_report_abs (iqs269 -> slider [i ], ABS_X , slider_x [i ]);
1190
- } else {
1191
- input_report_key (iqs269 -> slider [i ], BTN_TOUCH , 0 );
1317
+ case IQS269_SLIDER_KEY :
1318
+ for (j = 0 ; j < IQS269_NUM_GESTURES ; j ++ )
1319
+ input_report_key (iqs269 -> slider [i ],
1320
+ iqs269 -> sl_code [i ][j ],
1321
+ flags .gesture & BIT (j ));
1322
+
1323
+ if (!(flags .gesture & (BIT (IQS269_GESTURE_FLICK_NEG ) |
1324
+ BIT (IQS269_GESTURE_FLICK_POS ) |
1325
+ BIT (IQS269_GESTURE_TAP ))))
1326
+ break ;
1327
+
1328
+ input_sync (iqs269 -> slider [i ]);
1329
+
1330
+ /*
1331
+ * Momentary gestures are followed by a complementary
1332
+ * release cycle so as to emulate a full keystroke.
1333
+ */
1334
+ for (j = 0 ; j < IQS269_NUM_GESTURES ; j ++ )
1335
+ if (j != IQS269_GESTURE_HOLD )
1336
+ input_report_key (iqs269 -> slider [i ],
1337
+ iqs269 -> sl_code [i ][j ],
1338
+ 0 );
1339
+ break ;
1340
+
1341
+ case IQS269_SLIDER_RAW :
1342
+ /*
1343
+ * The slider is considered to be in a state of touch
1344
+ * if any selected channels are in a state of touch.
1345
+ */
1346
+ state = flags .states [IQS269_ST_OFFS_TOUCH ];
1347
+ state &= iqs269 -> sys_reg .slider_select [i ];
1348
+
1349
+ input_report_key (iqs269 -> slider [i ], BTN_TOUCH , state );
1350
+
1351
+ if (state )
1352
+ input_report_abs (iqs269 -> slider [i ],
1353
+ ABS_X , slider_x [i ]);
1354
+ break ;
1192
1355
}
1193
1356
1194
1357
input_sync (iqs269 -> slider [i ]);
@@ -1595,7 +1758,6 @@ static const struct regmap_config iqs269_regmap_config = {
1595
1758
1596
1759
static int iqs269_probe (struct i2c_client * client )
1597
1760
{
1598
- struct iqs269_ver_info ver_info ;
1599
1761
struct iqs269_private * iqs269 ;
1600
1762
int error ;
1601
1763
@@ -1617,14 +1779,14 @@ static int iqs269_probe(struct i2c_client *client)
1617
1779
mutex_init (& iqs269 -> lock );
1618
1780
init_completion (& iqs269 -> ati_done );
1619
1781
1620
- error = regmap_raw_read (iqs269 -> regmap , IQS269_VER_INFO , & ver_info ,
1621
- sizeof (ver_info ));
1782
+ error = regmap_raw_read (iqs269 -> regmap , IQS269_VER_INFO ,
1783
+ & iqs269 -> ver_info , sizeof (iqs269 -> ver_info ));
1622
1784
if (error )
1623
1785
return error ;
1624
1786
1625
- if (ver_info .prod_num != IQS269_VER_INFO_PROD_NUM ) {
1787
+ if (iqs269 -> ver_info .prod_num != IQS269_VER_INFO_PROD_NUM ) {
1626
1788
dev_err (& client -> dev , "Unrecognized product number: 0x%02X\n" ,
1627
- ver_info .prod_num );
1789
+ iqs269 -> ver_info .prod_num );
1628
1790
return - EINVAL ;
1629
1791
}
1630
1792
0 commit comments