0001
0002
0003
0004
0005
0006
0007 #include <linux/kernel.h>
0008 #include <linux/delay.h>
0009 #include <linux/device.h>
0010 #include <linux/input.h>
0011 #include <linux/input/mt.h>
0012 #include <linux/rmi.h>
0013 #include <linux/slab.h>
0014 #include <linux/of.h>
0015 #include "rmi_driver.h"
0016 #include "rmi_2d_sensor.h"
0017
0018 #define F11_MAX_NUM_OF_FINGERS 10
0019 #define F11_MAX_NUM_OF_TOUCH_SHAPES 16
0020
0021 #define FINGER_STATE_MASK 0x03
0022
0023 #define F11_CTRL_SENSOR_MAX_X_POS_OFFSET 6
0024 #define F11_CTRL_SENSOR_MAX_Y_POS_OFFSET 8
0025
0026 #define DEFAULT_XY_MAX 9999
0027 #define DEFAULT_MAX_ABS_MT_PRESSURE 255
0028 #define DEFAULT_MAX_ABS_MT_TOUCH 15
0029 #define DEFAULT_MAX_ABS_MT_ORIENTATION 1
0030 #define DEFAULT_MIN_ABS_MT_TRACKING_ID 1
0031 #define DEFAULT_MAX_ABS_MT_TRACKING_ID 10
0032
0033
0034
0035
0036
0037
0038
0039
0040
0041
0042
0043
0044
0045
0046
0047
0048
0049
0050
0051
0052
0053
0054
0055
0056
0057
0058
0059
0060
0061
0062
0063 #define DMAX 10
0064
0065
0066
0067
0068
0069 #define RMI_F11_REZERO 0x01
0070
0071 #define RMI_F11_HAS_QUERY9 (1 << 3)
0072 #define RMI_F11_HAS_QUERY11 (1 << 4)
0073 #define RMI_F11_HAS_QUERY12 (1 << 5)
0074 #define RMI_F11_HAS_QUERY27 (1 << 6)
0075 #define RMI_F11_HAS_QUERY28 (1 << 7)
0076
0077
0078
0079 #define RMI_F11_NR_FINGERS_MASK 0x07
0080 #define RMI_F11_HAS_REL (1 << 3)
0081 #define RMI_F11_HAS_ABS (1 << 4)
0082 #define RMI_F11_HAS_GESTURES (1 << 5)
0083 #define RMI_F11_HAS_SENSITIVITY_ADJ (1 << 6)
0084 #define RMI_F11_CONFIGURABLE (1 << 7)
0085
0086
0087 #define RMI_F11_NR_ELECTRODES_MASK 0x7F
0088
0089
0090
0091 #define RMI_F11_ABS_DATA_SIZE_MASK 0x03
0092 #define RMI_F11_HAS_ANCHORED_FINGER (1 << 2)
0093 #define RMI_F11_HAS_ADJ_HYST (1 << 3)
0094 #define RMI_F11_HAS_DRIBBLE (1 << 4)
0095 #define RMI_F11_HAS_BENDING_CORRECTION (1 << 5)
0096 #define RMI_F11_HAS_LARGE_OBJECT_SUPPRESSION (1 << 6)
0097 #define RMI_F11_HAS_JITTER_FILTER (1 << 7)
0098
0099
0100 #define RMI_F11_HAS_SINGLE_TAP (1 << 0)
0101 #define RMI_F11_HAS_TAP_AND_HOLD (1 << 1)
0102 #define RMI_F11_HAS_DOUBLE_TAP (1 << 2)
0103 #define RMI_F11_HAS_EARLY_TAP (1 << 3)
0104 #define RMI_F11_HAS_FLICK (1 << 4)
0105 #define RMI_F11_HAS_PRESS (1 << 5)
0106 #define RMI_F11_HAS_PINCH (1 << 6)
0107 #define RMI_F11_HAS_CHIRAL (1 << 7)
0108
0109
0110 #define RMI_F11_HAS_PALM_DET (1 << 0)
0111 #define RMI_F11_HAS_ROTATE (1 << 1)
0112 #define RMI_F11_HAS_TOUCH_SHAPES (1 << 2)
0113 #define RMI_F11_HAS_SCROLL_ZONES (1 << 3)
0114 #define RMI_F11_HAS_INDIVIDUAL_SCROLL_ZONES (1 << 4)
0115 #define RMI_F11_HAS_MF_SCROLL (1 << 5)
0116 #define RMI_F11_HAS_MF_EDGE_MOTION (1 << 6)
0117 #define RMI_F11_HAS_MF_SCROLL_INERTIA (1 << 7)
0118
0119
0120 #define RMI_F11_HAS_PEN (1 << 0)
0121 #define RMI_F11_HAS_PROXIMITY (1 << 1)
0122 #define RMI_F11_HAS_PALM_DET_SENSITIVITY (1 << 2)
0123 #define RMI_F11_HAS_SUPPRESS_ON_PALM_DETECT (1 << 3)
0124 #define RMI_F11_HAS_TWO_PEN_THRESHOLDS (1 << 4)
0125 #define RMI_F11_HAS_CONTACT_GEOMETRY (1 << 5)
0126 #define RMI_F11_HAS_PEN_HOVER_DISCRIMINATION (1 << 6)
0127 #define RMI_F11_HAS_PEN_FILTERS (1 << 7)
0128
0129
0130 #define RMI_F11_NR_TOUCH_SHAPES_MASK 0x1F
0131
0132
0133
0134 #define RMI_F11_HAS_Z_TUNING (1 << 0)
0135 #define RMI_F11_HAS_ALGORITHM_SELECTION (1 << 1)
0136 #define RMI_F11_HAS_W_TUNING (1 << 2)
0137 #define RMI_F11_HAS_PITCH_INFO (1 << 3)
0138 #define RMI_F11_HAS_FINGER_SIZE (1 << 4)
0139 #define RMI_F11_HAS_SEGMENTATION_AGGRESSIVENESS (1 << 5)
0140 #define RMI_F11_HAS_XY_CLIP (1 << 6)
0141 #define RMI_F11_HAS_DRUMMING_FILTER (1 << 7)
0142
0143
0144
0145 #define RMI_F11_HAS_GAPLESS_FINGER (1 << 0)
0146 #define RMI_F11_HAS_GAPLESS_FINGER_TUNING (1 << 1)
0147 #define RMI_F11_HAS_8BIT_W (1 << 2)
0148 #define RMI_F11_HAS_ADJUSTABLE_MAPPING (1 << 3)
0149 #define RMI_F11_HAS_INFO2 (1 << 4)
0150 #define RMI_F11_HAS_PHYSICAL_PROPS (1 << 5)
0151 #define RMI_F11_HAS_FINGER_LIMIT (1 << 6)
0152 #define RMI_F11_HAS_LINEAR_COEFF (1 << 7)
0153
0154
0155
0156 #define RMI_F11_JITTER_WINDOW_MASK 0x1F
0157 #define RMI_F11_JITTER_FILTER_MASK 0x60
0158 #define RMI_F11_JITTER_FILTER_SHIFT 5
0159
0160
0161 #define RMI_F11_LIGHT_CONTROL_MASK 0x03
0162 #define RMI_F11_IS_CLEAR (1 << 2)
0163 #define RMI_F11_CLICKPAD_PROPS_MASK 0x18
0164 #define RMI_F11_CLICKPAD_PROPS_SHIFT 3
0165 #define RMI_F11_MOUSE_BUTTONS_MASK 0x60
0166 #define RMI_F11_MOUSE_BUTTONS_SHIFT 5
0167 #define RMI_F11_HAS_ADVANCED_GESTURES (1 << 7)
0168
0169 #define RMI_F11_QUERY_SIZE 4
0170 #define RMI_F11_QUERY_GESTURE_SIZE 2
0171
0172 #define F11_LIGHT_CTL_NONE 0x00
0173 #define F11_LUXPAD 0x01
0174 #define F11_DUAL_MODE 0x02
0175
0176 #define F11_NOT_CLICKPAD 0x00
0177 #define F11_HINGED_CLICKPAD 0x01
0178 #define F11_UNIFORM_CLICKPAD 0x02
0179
0180
0181
0182
0183
0184
0185
0186
0187
0188
0189
0190
0191
0192
0193
0194
0195
0196
0197
0198
0199
0200
0201
0202
0203
0204
0205
0206
0207
0208
0209
0210
0211
0212
0213
0214
0215
0216
0217
0218
0219
0220
0221
0222
0223
0224
0225
0226
0227
0228
0229
0230
0231
0232
0233
0234
0235
0236
0237
0238
0239
0240
0241
0242
0243
0244
0245
0246
0247
0248
0249
0250
0251
0252
0253
0254
0255
0256
0257
0258
0259
0260
0261
0262
0263
0264
0265
0266
0267
0268
0269
0270
0271
0272
0273
0274
0275
0276
0277
0278
0279
0280
0281
0282
0283
0284
0285
0286
0287
0288
0289
0290
0291
0292
0293
0294
0295
0296
0297
0298
0299
0300
0301
0302
0303
0304
0305
0306
0307
0308
0309
0310
0311
0312
0313
0314
0315
0316
0317
0318
0319
0320
0321
0322
0323
0324
0325
0326
0327
0328
0329
0330
0331
0332
0333 struct f11_2d_sensor_queries {
0334
0335 u8 nr_fingers;
0336 bool has_rel;
0337 bool has_abs;
0338 bool has_gestures;
0339 bool has_sensitivity_adjust;
0340 bool configurable;
0341
0342
0343 u8 nr_x_electrodes;
0344
0345
0346 u8 nr_y_electrodes;
0347
0348
0349 u8 max_electrodes;
0350
0351
0352 u8 abs_data_size;
0353 bool has_anchored_finger;
0354 bool has_adj_hyst;
0355 bool has_dribble;
0356 bool has_bending_correction;
0357 bool has_large_object_suppression;
0358 bool has_jitter_filter;
0359
0360 u8 f11_2d_query6;
0361
0362
0363 bool has_single_tap;
0364 bool has_tap_n_hold;
0365 bool has_double_tap;
0366 bool has_early_tap;
0367 bool has_flick;
0368 bool has_press;
0369 bool has_pinch;
0370 bool has_chiral;
0371
0372 bool query7_nonzero;
0373
0374
0375 bool has_palm_det;
0376 bool has_rotate;
0377 bool has_touch_shapes;
0378 bool has_scroll_zones;
0379 bool has_individual_scroll_zones;
0380 bool has_mf_scroll;
0381 bool has_mf_edge_motion;
0382 bool has_mf_scroll_inertia;
0383
0384 bool query8_nonzero;
0385
0386
0387 bool has_pen;
0388 bool has_proximity;
0389 bool has_palm_det_sensitivity;
0390 bool has_suppress_on_palm_detect;
0391 bool has_two_pen_thresholds;
0392 bool has_contact_geometry;
0393 bool has_pen_hover_discrimination;
0394 bool has_pen_filters;
0395
0396
0397 u8 nr_touch_shapes;
0398
0399
0400 bool has_z_tuning;
0401 bool has_algorithm_selection;
0402 bool has_w_tuning;
0403 bool has_pitch_info;
0404 bool has_finger_size;
0405 bool has_segmentation_aggressiveness;
0406 bool has_XY_clip;
0407 bool has_drumming_filter;
0408
0409
0410 bool has_gapless_finger;
0411 bool has_gapless_finger_tuning;
0412 bool has_8bit_w;
0413 bool has_adjustable_mapping;
0414 bool has_info2;
0415 bool has_physical_props;
0416 bool has_finger_limit;
0417 bool has_linear_coeff_2;
0418
0419
0420 u8 jitter_window_size;
0421 u8 jitter_filter_type;
0422
0423
0424 u8 light_control;
0425 bool is_clear;
0426 u8 clickpad_props;
0427 u8 mouse_buttons;
0428 bool has_advanced_gestures;
0429
0430
0431 u16 x_sensor_size_mm;
0432 u16 y_sensor_size_mm;
0433 };
0434
0435
0436 #define RMI_F11_REPORT_MODE_MASK 0x07
0437 #define RMI_F11_REPORT_MODE_CONTINUOUS (0 << 0)
0438 #define RMI_F11_REPORT_MODE_REDUCED (1 << 0)
0439 #define RMI_F11_REPORT_MODE_FS_CHANGE (2 << 0)
0440 #define RMI_F11_REPORT_MODE_FP_CHANGE (3 << 0)
0441 #define RMI_F11_ABS_POS_FILT (1 << 3)
0442 #define RMI_F11_REL_POS_FILT (1 << 4)
0443 #define RMI_F11_REL_BALLISTICS (1 << 5)
0444 #define RMI_F11_DRIBBLE (1 << 6)
0445 #define RMI_F11_REPORT_BEYOND_CLIP (1 << 7)
0446
0447
0448 #define RMI_F11_PALM_DETECT_THRESH_MASK 0x0F
0449 #define RMI_F11_MOTION_SENSITIVITY_MASK 0x30
0450 #define RMI_F11_MANUAL_TRACKING (1 << 6)
0451 #define RMI_F11_MANUAL_TRACKED_FINGER (1 << 7)
0452
0453 #define RMI_F11_DELTA_X_THRESHOLD 2
0454 #define RMI_F11_DELTA_Y_THRESHOLD 3
0455
0456 #define RMI_F11_CTRL_REG_COUNT 12
0457
0458 struct f11_2d_ctrl {
0459 u8 ctrl0_11[RMI_F11_CTRL_REG_COUNT];
0460 u16 ctrl0_11_address;
0461 };
0462
0463 #define RMI_F11_ABS_BYTES 5
0464 #define RMI_F11_REL_BYTES 2
0465
0466
0467
0468 #define RMI_F11_SINGLE_TAP (1 << 0)
0469 #define RMI_F11_TAP_AND_HOLD (1 << 1)
0470 #define RMI_F11_DOUBLE_TAP (1 << 2)
0471 #define RMI_F11_EARLY_TAP (1 << 3)
0472 #define RMI_F11_FLICK (1 << 4)
0473 #define RMI_F11_PRESS (1 << 5)
0474 #define RMI_F11_PINCH (1 << 6)
0475
0476
0477
0478 #define RMI_F11_PALM_DETECT (1 << 0)
0479 #define RMI_F11_ROTATE (1 << 1)
0480 #define RMI_F11_SHAPE (1 << 2)
0481 #define RMI_F11_SCROLLZONE (1 << 3)
0482 #define RMI_F11_GESTURE_FINGER_COUNT_MASK 0x70
0483
0484
0485
0486
0487
0488
0489
0490
0491
0492
0493
0494
0495
0496
0497 struct f11_2d_data {
0498 u8 *f_state;
0499 u8 *abs_pos;
0500 s8 *rel_pos;
0501 u8 *gest_1;
0502 u8 *gest_2;
0503 s8 *pinch;
0504 u8 *flick;
0505 u8 *rotate;
0506 u8 *shapes;
0507 s8 *multi_scroll;
0508 s8 *scroll_zones;
0509 };
0510
0511
0512
0513
0514
0515
0516
0517
0518
0519
0520
0521
0522
0523 struct f11_data {
0524 bool has_query9;
0525 bool has_query11;
0526 bool has_query12;
0527 bool has_query27;
0528 bool has_query28;
0529 bool has_acm;
0530 struct f11_2d_ctrl dev_controls;
0531 struct mutex dev_controls_mutex;
0532 u16 rezero_wait_ms;
0533 struct rmi_2d_sensor sensor;
0534 struct f11_2d_sensor_queries sens_query;
0535 struct f11_2d_data data;
0536 struct rmi_2d_sensor_platform_data sensor_pdata;
0537 unsigned long *abs_mask;
0538 unsigned long *rel_mask;
0539 };
0540
0541 enum f11_finger_state {
0542 F11_NO_FINGER = 0x00,
0543 F11_PRESENT = 0x01,
0544 F11_INACCURATE = 0x02,
0545 F11_RESERVED = 0x03
0546 };
0547
0548 static void rmi_f11_rel_pos_report(struct f11_data *f11, u8 n_finger)
0549 {
0550 struct rmi_2d_sensor *sensor = &f11->sensor;
0551 struct f11_2d_data *data = &f11->data;
0552 s8 x, y;
0553
0554 x = data->rel_pos[n_finger * RMI_F11_REL_BYTES];
0555 y = data->rel_pos[n_finger * RMI_F11_REL_BYTES + 1];
0556
0557 rmi_2d_sensor_rel_report(sensor, x, y);
0558 }
0559
0560 static void rmi_f11_abs_pos_process(struct f11_data *f11,
0561 struct rmi_2d_sensor *sensor,
0562 struct rmi_2d_sensor_abs_object *obj,
0563 enum f11_finger_state finger_state,
0564 u8 n_finger)
0565 {
0566 struct f11_2d_data *data = &f11->data;
0567 u8 *pos_data = &data->abs_pos[n_finger * RMI_F11_ABS_BYTES];
0568 int tool_type = MT_TOOL_FINGER;
0569
0570 switch (finger_state) {
0571 case F11_PRESENT:
0572 obj->type = RMI_2D_OBJECT_FINGER;
0573 break;
0574 default:
0575 obj->type = RMI_2D_OBJECT_NONE;
0576 }
0577
0578 obj->mt_tool = tool_type;
0579 obj->x = (pos_data[0] << 4) | (pos_data[2] & 0x0F);
0580 obj->y = (pos_data[1] << 4) | (pos_data[2] >> 4);
0581 obj->z = pos_data[4];
0582 obj->wx = pos_data[3] & 0x0f;
0583 obj->wy = pos_data[3] >> 4;
0584
0585 rmi_2d_sensor_abs_process(sensor, obj, n_finger);
0586 }
0587
0588 static inline u8 rmi_f11_parse_finger_state(const u8 *f_state, u8 n_finger)
0589 {
0590 return (f_state[n_finger / 4] >> (2 * (n_finger % 4))) &
0591 FINGER_STATE_MASK;
0592 }
0593
0594 static void rmi_f11_finger_handler(struct f11_data *f11,
0595 struct rmi_2d_sensor *sensor, int size)
0596 {
0597 const u8 *f_state = f11->data.f_state;
0598 u8 finger_state;
0599 u8 i;
0600 int abs_fingers;
0601 int rel_fingers;
0602 int abs_size = sensor->nbr_fingers * RMI_F11_ABS_BYTES;
0603
0604 if (sensor->report_abs) {
0605 if (abs_size > size)
0606 abs_fingers = size / RMI_F11_ABS_BYTES;
0607 else
0608 abs_fingers = sensor->nbr_fingers;
0609
0610 for (i = 0; i < abs_fingers; i++) {
0611
0612 finger_state = rmi_f11_parse_finger_state(f_state, i);
0613 if (finger_state == F11_RESERVED) {
0614 pr_err("Invalid finger state[%d]: 0x%02x", i,
0615 finger_state);
0616 continue;
0617 }
0618
0619 rmi_f11_abs_pos_process(f11, sensor, &sensor->objs[i],
0620 finger_state, i);
0621 }
0622
0623
0624
0625
0626
0627 if (sensor->kernel_tracking)
0628 input_mt_assign_slots(sensor->input,
0629 sensor->tracking_slots,
0630 sensor->tracking_pos,
0631 sensor->nbr_fingers,
0632 sensor->dmax);
0633
0634 for (i = 0; i < abs_fingers; i++) {
0635 finger_state = rmi_f11_parse_finger_state(f_state, i);
0636 if (finger_state == F11_RESERVED)
0637
0638 continue;
0639
0640 rmi_2d_sensor_abs_report(sensor, &sensor->objs[i], i);
0641 }
0642
0643 input_mt_sync_frame(sensor->input);
0644 } else if (sensor->report_rel) {
0645 if ((abs_size + sensor->nbr_fingers * RMI_F11_REL_BYTES) > size)
0646 rel_fingers = (size - abs_size) / RMI_F11_REL_BYTES;
0647 else
0648 rel_fingers = sensor->nbr_fingers;
0649
0650 for (i = 0; i < rel_fingers; i++)
0651 rmi_f11_rel_pos_report(f11, i);
0652 }
0653
0654 }
0655
0656 static int f11_2d_construct_data(struct f11_data *f11)
0657 {
0658 struct rmi_2d_sensor *sensor = &f11->sensor;
0659 struct f11_2d_sensor_queries *query = &f11->sens_query;
0660 struct f11_2d_data *data = &f11->data;
0661 int i;
0662
0663 sensor->nbr_fingers = (query->nr_fingers == 5 ? 10 :
0664 query->nr_fingers + 1);
0665
0666 sensor->pkt_size = DIV_ROUND_UP(sensor->nbr_fingers, 4);
0667
0668 if (query->has_abs) {
0669 sensor->pkt_size += (sensor->nbr_fingers * 5);
0670 sensor->attn_size = sensor->pkt_size;
0671 }
0672
0673 if (query->has_rel)
0674 sensor->pkt_size += (sensor->nbr_fingers * 2);
0675
0676
0677 if (query->query7_nonzero)
0678 sensor->pkt_size += sizeof(u8);
0679
0680
0681 if (query->query7_nonzero || query->query8_nonzero)
0682 sensor->pkt_size += sizeof(u8);
0683
0684 if (query->has_pinch || query->has_flick || query->has_rotate) {
0685 sensor->pkt_size += 3;
0686 if (!query->has_flick)
0687 sensor->pkt_size--;
0688 if (!query->has_rotate)
0689 sensor->pkt_size--;
0690 }
0691
0692 if (query->has_touch_shapes)
0693 sensor->pkt_size +=
0694 DIV_ROUND_UP(query->nr_touch_shapes + 1, 8);
0695
0696 sensor->data_pkt = devm_kzalloc(&sensor->fn->dev, sensor->pkt_size,
0697 GFP_KERNEL);
0698 if (!sensor->data_pkt)
0699 return -ENOMEM;
0700
0701 data->f_state = sensor->data_pkt;
0702 i = DIV_ROUND_UP(sensor->nbr_fingers, 4);
0703
0704 if (query->has_abs) {
0705 data->abs_pos = &sensor->data_pkt[i];
0706 i += (sensor->nbr_fingers * RMI_F11_ABS_BYTES);
0707 }
0708
0709 if (query->has_rel) {
0710 data->rel_pos = &sensor->data_pkt[i];
0711 i += (sensor->nbr_fingers * RMI_F11_REL_BYTES);
0712 }
0713
0714 if (query->query7_nonzero) {
0715 data->gest_1 = &sensor->data_pkt[i];
0716 i++;
0717 }
0718
0719 if (query->query7_nonzero || query->query8_nonzero) {
0720 data->gest_2 = &sensor->data_pkt[i];
0721 i++;
0722 }
0723
0724 if (query->has_pinch) {
0725 data->pinch = &sensor->data_pkt[i];
0726 i++;
0727 }
0728
0729 if (query->has_flick) {
0730 if (query->has_pinch) {
0731 data->flick = data->pinch;
0732 i += 2;
0733 } else {
0734 data->flick = &sensor->data_pkt[i];
0735 i += 3;
0736 }
0737 }
0738
0739 if (query->has_rotate) {
0740 if (query->has_flick) {
0741 data->rotate = data->flick + 1;
0742 } else {
0743 data->rotate = &sensor->data_pkt[i];
0744 i += 2;
0745 }
0746 }
0747
0748 if (query->has_touch_shapes)
0749 data->shapes = &sensor->data_pkt[i];
0750
0751 return 0;
0752 }
0753
0754 static int f11_read_control_regs(struct rmi_function *fn,
0755 struct f11_2d_ctrl *ctrl, u16 ctrl_base_addr) {
0756 struct rmi_device *rmi_dev = fn->rmi_dev;
0757 int error = 0;
0758
0759 ctrl->ctrl0_11_address = ctrl_base_addr;
0760 error = rmi_read_block(rmi_dev, ctrl_base_addr, ctrl->ctrl0_11,
0761 RMI_F11_CTRL_REG_COUNT);
0762 if (error < 0) {
0763 dev_err(&fn->dev, "Failed to read ctrl0, code: %d.\n", error);
0764 return error;
0765 }
0766
0767 return 0;
0768 }
0769
0770 static int f11_write_control_regs(struct rmi_function *fn,
0771 struct f11_2d_sensor_queries *query,
0772 struct f11_2d_ctrl *ctrl,
0773 u16 ctrl_base_addr)
0774 {
0775 struct rmi_device *rmi_dev = fn->rmi_dev;
0776 int error;
0777
0778 error = rmi_write_block(rmi_dev, ctrl_base_addr, ctrl->ctrl0_11,
0779 RMI_F11_CTRL_REG_COUNT);
0780 if (error < 0)
0781 return error;
0782
0783 return 0;
0784 }
0785
0786 static int rmi_f11_get_query_parameters(struct rmi_device *rmi_dev,
0787 struct f11_data *f11,
0788 struct f11_2d_sensor_queries *sensor_query,
0789 u16 query_base_addr)
0790 {
0791 int query_size;
0792 int rc;
0793 u8 query_buf[RMI_F11_QUERY_SIZE];
0794 bool has_query36 = false;
0795
0796 rc = rmi_read_block(rmi_dev, query_base_addr, query_buf,
0797 RMI_F11_QUERY_SIZE);
0798 if (rc < 0)
0799 return rc;
0800
0801 sensor_query->nr_fingers = query_buf[0] & RMI_F11_NR_FINGERS_MASK;
0802 sensor_query->has_rel = !!(query_buf[0] & RMI_F11_HAS_REL);
0803 sensor_query->has_abs = !!(query_buf[0] & RMI_F11_HAS_ABS);
0804 sensor_query->has_gestures = !!(query_buf[0] & RMI_F11_HAS_GESTURES);
0805 sensor_query->has_sensitivity_adjust =
0806 !!(query_buf[0] & RMI_F11_HAS_SENSITIVITY_ADJ);
0807 sensor_query->configurable = !!(query_buf[0] & RMI_F11_CONFIGURABLE);
0808
0809 sensor_query->nr_x_electrodes =
0810 query_buf[1] & RMI_F11_NR_ELECTRODES_MASK;
0811 sensor_query->nr_y_electrodes =
0812 query_buf[2] & RMI_F11_NR_ELECTRODES_MASK;
0813 sensor_query->max_electrodes =
0814 query_buf[3] & RMI_F11_NR_ELECTRODES_MASK;
0815
0816 query_size = RMI_F11_QUERY_SIZE;
0817
0818 if (sensor_query->has_abs) {
0819 rc = rmi_read(rmi_dev, query_base_addr + query_size, query_buf);
0820 if (rc < 0)
0821 return rc;
0822
0823 sensor_query->abs_data_size =
0824 query_buf[0] & RMI_F11_ABS_DATA_SIZE_MASK;
0825 sensor_query->has_anchored_finger =
0826 !!(query_buf[0] & RMI_F11_HAS_ANCHORED_FINGER);
0827 sensor_query->has_adj_hyst =
0828 !!(query_buf[0] & RMI_F11_HAS_ADJ_HYST);
0829 sensor_query->has_dribble =
0830 !!(query_buf[0] & RMI_F11_HAS_DRIBBLE);
0831 sensor_query->has_bending_correction =
0832 !!(query_buf[0] & RMI_F11_HAS_BENDING_CORRECTION);
0833 sensor_query->has_large_object_suppression =
0834 !!(query_buf[0] & RMI_F11_HAS_LARGE_OBJECT_SUPPRESSION);
0835 sensor_query->has_jitter_filter =
0836 !!(query_buf[0] & RMI_F11_HAS_JITTER_FILTER);
0837 query_size++;
0838 }
0839
0840 if (sensor_query->has_rel) {
0841 rc = rmi_read(rmi_dev, query_base_addr + query_size,
0842 &sensor_query->f11_2d_query6);
0843 if (rc < 0)
0844 return rc;
0845 query_size++;
0846 }
0847
0848 if (sensor_query->has_gestures) {
0849 rc = rmi_read_block(rmi_dev, query_base_addr + query_size,
0850 query_buf, RMI_F11_QUERY_GESTURE_SIZE);
0851 if (rc < 0)
0852 return rc;
0853
0854 sensor_query->has_single_tap =
0855 !!(query_buf[0] & RMI_F11_HAS_SINGLE_TAP);
0856 sensor_query->has_tap_n_hold =
0857 !!(query_buf[0] & RMI_F11_HAS_TAP_AND_HOLD);
0858 sensor_query->has_double_tap =
0859 !!(query_buf[0] & RMI_F11_HAS_DOUBLE_TAP);
0860 sensor_query->has_early_tap =
0861 !!(query_buf[0] & RMI_F11_HAS_EARLY_TAP);
0862 sensor_query->has_flick =
0863 !!(query_buf[0] & RMI_F11_HAS_FLICK);
0864 sensor_query->has_press =
0865 !!(query_buf[0] & RMI_F11_HAS_PRESS);
0866 sensor_query->has_pinch =
0867 !!(query_buf[0] & RMI_F11_HAS_PINCH);
0868 sensor_query->has_chiral =
0869 !!(query_buf[0] & RMI_F11_HAS_CHIRAL);
0870
0871
0872 sensor_query->has_palm_det =
0873 !!(query_buf[1] & RMI_F11_HAS_PALM_DET);
0874 sensor_query->has_rotate =
0875 !!(query_buf[1] & RMI_F11_HAS_ROTATE);
0876 sensor_query->has_touch_shapes =
0877 !!(query_buf[1] & RMI_F11_HAS_TOUCH_SHAPES);
0878 sensor_query->has_scroll_zones =
0879 !!(query_buf[1] & RMI_F11_HAS_SCROLL_ZONES);
0880 sensor_query->has_individual_scroll_zones =
0881 !!(query_buf[1] & RMI_F11_HAS_INDIVIDUAL_SCROLL_ZONES);
0882 sensor_query->has_mf_scroll =
0883 !!(query_buf[1] & RMI_F11_HAS_MF_SCROLL);
0884 sensor_query->has_mf_edge_motion =
0885 !!(query_buf[1] & RMI_F11_HAS_MF_EDGE_MOTION);
0886 sensor_query->has_mf_scroll_inertia =
0887 !!(query_buf[1] & RMI_F11_HAS_MF_SCROLL_INERTIA);
0888
0889 sensor_query->query7_nonzero = !!(query_buf[0]);
0890 sensor_query->query8_nonzero = !!(query_buf[1]);
0891
0892 query_size += 2;
0893 }
0894
0895 if (f11->has_query9) {
0896 rc = rmi_read(rmi_dev, query_base_addr + query_size, query_buf);
0897 if (rc < 0)
0898 return rc;
0899
0900 sensor_query->has_pen =
0901 !!(query_buf[0] & RMI_F11_HAS_PEN);
0902 sensor_query->has_proximity =
0903 !!(query_buf[0] & RMI_F11_HAS_PROXIMITY);
0904 sensor_query->has_palm_det_sensitivity =
0905 !!(query_buf[0] & RMI_F11_HAS_PALM_DET_SENSITIVITY);
0906 sensor_query->has_suppress_on_palm_detect =
0907 !!(query_buf[0] & RMI_F11_HAS_SUPPRESS_ON_PALM_DETECT);
0908 sensor_query->has_two_pen_thresholds =
0909 !!(query_buf[0] & RMI_F11_HAS_TWO_PEN_THRESHOLDS);
0910 sensor_query->has_contact_geometry =
0911 !!(query_buf[0] & RMI_F11_HAS_CONTACT_GEOMETRY);
0912 sensor_query->has_pen_hover_discrimination =
0913 !!(query_buf[0] & RMI_F11_HAS_PEN_HOVER_DISCRIMINATION);
0914 sensor_query->has_pen_filters =
0915 !!(query_buf[0] & RMI_F11_HAS_PEN_FILTERS);
0916
0917 query_size++;
0918 }
0919
0920 if (sensor_query->has_touch_shapes) {
0921 rc = rmi_read(rmi_dev, query_base_addr + query_size, query_buf);
0922 if (rc < 0)
0923 return rc;
0924
0925 sensor_query->nr_touch_shapes = query_buf[0] &
0926 RMI_F11_NR_TOUCH_SHAPES_MASK;
0927
0928 query_size++;
0929 }
0930
0931 if (f11->has_query11) {
0932 rc = rmi_read(rmi_dev, query_base_addr + query_size, query_buf);
0933 if (rc < 0)
0934 return rc;
0935
0936 sensor_query->has_z_tuning =
0937 !!(query_buf[0] & RMI_F11_HAS_Z_TUNING);
0938 sensor_query->has_algorithm_selection =
0939 !!(query_buf[0] & RMI_F11_HAS_ALGORITHM_SELECTION);
0940 sensor_query->has_w_tuning =
0941 !!(query_buf[0] & RMI_F11_HAS_W_TUNING);
0942 sensor_query->has_pitch_info =
0943 !!(query_buf[0] & RMI_F11_HAS_PITCH_INFO);
0944 sensor_query->has_finger_size =
0945 !!(query_buf[0] & RMI_F11_HAS_FINGER_SIZE);
0946 sensor_query->has_segmentation_aggressiveness =
0947 !!(query_buf[0] &
0948 RMI_F11_HAS_SEGMENTATION_AGGRESSIVENESS);
0949 sensor_query->has_XY_clip =
0950 !!(query_buf[0] & RMI_F11_HAS_XY_CLIP);
0951 sensor_query->has_drumming_filter =
0952 !!(query_buf[0] & RMI_F11_HAS_DRUMMING_FILTER);
0953
0954 query_size++;
0955 }
0956
0957 if (f11->has_query12) {
0958 rc = rmi_read(rmi_dev, query_base_addr + query_size, query_buf);
0959 if (rc < 0)
0960 return rc;
0961
0962 sensor_query->has_gapless_finger =
0963 !!(query_buf[0] & RMI_F11_HAS_GAPLESS_FINGER);
0964 sensor_query->has_gapless_finger_tuning =
0965 !!(query_buf[0] & RMI_F11_HAS_GAPLESS_FINGER_TUNING);
0966 sensor_query->has_8bit_w =
0967 !!(query_buf[0] & RMI_F11_HAS_8BIT_W);
0968 sensor_query->has_adjustable_mapping =
0969 !!(query_buf[0] & RMI_F11_HAS_ADJUSTABLE_MAPPING);
0970 sensor_query->has_info2 =
0971 !!(query_buf[0] & RMI_F11_HAS_INFO2);
0972 sensor_query->has_physical_props =
0973 !!(query_buf[0] & RMI_F11_HAS_PHYSICAL_PROPS);
0974 sensor_query->has_finger_limit =
0975 !!(query_buf[0] & RMI_F11_HAS_FINGER_LIMIT);
0976 sensor_query->has_linear_coeff_2 =
0977 !!(query_buf[0] & RMI_F11_HAS_LINEAR_COEFF);
0978
0979 query_size++;
0980 }
0981
0982 if (sensor_query->has_jitter_filter) {
0983 rc = rmi_read(rmi_dev, query_base_addr + query_size, query_buf);
0984 if (rc < 0)
0985 return rc;
0986
0987 sensor_query->jitter_window_size = query_buf[0] &
0988 RMI_F11_JITTER_WINDOW_MASK;
0989 sensor_query->jitter_filter_type = (query_buf[0] &
0990 RMI_F11_JITTER_FILTER_MASK) >>
0991 RMI_F11_JITTER_FILTER_SHIFT;
0992
0993 query_size++;
0994 }
0995
0996 if (sensor_query->has_info2) {
0997 rc = rmi_read(rmi_dev, query_base_addr + query_size, query_buf);
0998 if (rc < 0)
0999 return rc;
1000
1001 sensor_query->light_control =
1002 query_buf[0] & RMI_F11_LIGHT_CONTROL_MASK;
1003 sensor_query->is_clear =
1004 !!(query_buf[0] & RMI_F11_IS_CLEAR);
1005 sensor_query->clickpad_props =
1006 (query_buf[0] & RMI_F11_CLICKPAD_PROPS_MASK) >>
1007 RMI_F11_CLICKPAD_PROPS_SHIFT;
1008 sensor_query->mouse_buttons =
1009 (query_buf[0] & RMI_F11_MOUSE_BUTTONS_MASK) >>
1010 RMI_F11_MOUSE_BUTTONS_SHIFT;
1011 sensor_query->has_advanced_gestures =
1012 !!(query_buf[0] & RMI_F11_HAS_ADVANCED_GESTURES);
1013
1014 query_size++;
1015 }
1016
1017 if (sensor_query->has_physical_props) {
1018 rc = rmi_read_block(rmi_dev, query_base_addr
1019 + query_size, query_buf, 4);
1020 if (rc < 0)
1021 return rc;
1022
1023 sensor_query->x_sensor_size_mm =
1024 (query_buf[0] | (query_buf[1] << 8)) / 10;
1025 sensor_query->y_sensor_size_mm =
1026 (query_buf[2] | (query_buf[3] << 8)) / 10;
1027
1028
1029
1030
1031
1032 query_size += 12;
1033 }
1034
1035 if (f11->has_query27)
1036 ++query_size;
1037
1038 if (f11->has_query28) {
1039 rc = rmi_read(rmi_dev, query_base_addr + query_size,
1040 query_buf);
1041 if (rc < 0)
1042 return rc;
1043
1044 has_query36 = !!(query_buf[0] & BIT(6));
1045 }
1046
1047 if (has_query36) {
1048 query_size += 2;
1049 rc = rmi_read(rmi_dev, query_base_addr + query_size,
1050 query_buf);
1051 if (rc < 0)
1052 return rc;
1053
1054 if (!!(query_buf[0] & BIT(5)))
1055 f11->has_acm = true;
1056 }
1057
1058 return query_size;
1059 }
1060
1061 static int rmi_f11_initialize(struct rmi_function *fn)
1062 {
1063 struct rmi_device *rmi_dev = fn->rmi_dev;
1064 struct f11_data *f11;
1065 struct f11_2d_ctrl *ctrl;
1066 u8 query_offset;
1067 u16 query_base_addr;
1068 u16 control_base_addr;
1069 u16 max_x_pos, max_y_pos;
1070 int rc;
1071 const struct rmi_device_platform_data *pdata =
1072 rmi_get_platform_data(rmi_dev);
1073 struct rmi_driver_data *drvdata = dev_get_drvdata(&rmi_dev->dev);
1074 struct rmi_2d_sensor *sensor;
1075 u8 buf;
1076 int mask_size;
1077
1078 rmi_dbg(RMI_DEBUG_FN, &fn->dev, "Initializing F11 values.\n");
1079
1080 mask_size = BITS_TO_LONGS(drvdata->irq_count) * sizeof(unsigned long);
1081
1082
1083
1084
1085 f11 = devm_kzalloc(&fn->dev, sizeof(struct f11_data) + mask_size * 2,
1086 GFP_KERNEL);
1087 if (!f11)
1088 return -ENOMEM;
1089
1090 if (fn->dev.of_node) {
1091 rc = rmi_2d_sensor_of_probe(&fn->dev, &f11->sensor_pdata);
1092 if (rc)
1093 return rc;
1094 } else {
1095 f11->sensor_pdata = pdata->sensor_pdata;
1096 }
1097
1098 f11->rezero_wait_ms = f11->sensor_pdata.rezero_wait;
1099
1100 f11->abs_mask = (unsigned long *)((char *)f11
1101 + sizeof(struct f11_data));
1102 f11->rel_mask = (unsigned long *)((char *)f11
1103 + sizeof(struct f11_data) + mask_size);
1104
1105 set_bit(fn->irq_pos, f11->abs_mask);
1106 set_bit(fn->irq_pos + 1, f11->rel_mask);
1107
1108 query_base_addr = fn->fd.query_base_addr;
1109 control_base_addr = fn->fd.control_base_addr;
1110
1111 rc = rmi_read(rmi_dev, query_base_addr, &buf);
1112 if (rc < 0)
1113 return rc;
1114
1115 f11->has_query9 = !!(buf & RMI_F11_HAS_QUERY9);
1116 f11->has_query11 = !!(buf & RMI_F11_HAS_QUERY11);
1117 f11->has_query12 = !!(buf & RMI_F11_HAS_QUERY12);
1118 f11->has_query27 = !!(buf & RMI_F11_HAS_QUERY27);
1119 f11->has_query28 = !!(buf & RMI_F11_HAS_QUERY28);
1120
1121 query_offset = (query_base_addr + 1);
1122 sensor = &f11->sensor;
1123 sensor->fn = fn;
1124
1125 rc = rmi_f11_get_query_parameters(rmi_dev, f11,
1126 &f11->sens_query, query_offset);
1127 if (rc < 0)
1128 return rc;
1129 query_offset += rc;
1130
1131 rc = f11_read_control_regs(fn, &f11->dev_controls,
1132 control_base_addr);
1133 if (rc < 0) {
1134 dev_err(&fn->dev,
1135 "Failed to read F11 control params.\n");
1136 return rc;
1137 }
1138
1139 if (f11->sens_query.has_info2) {
1140 if (f11->sens_query.is_clear)
1141 f11->sensor.sensor_type = rmi_sensor_touchscreen;
1142 else
1143 f11->sensor.sensor_type = rmi_sensor_touchpad;
1144 }
1145
1146 sensor->report_abs = f11->sens_query.has_abs;
1147
1148 sensor->axis_align =
1149 f11->sensor_pdata.axis_align;
1150
1151 sensor->topbuttonpad = f11->sensor_pdata.topbuttonpad;
1152 sensor->kernel_tracking = f11->sensor_pdata.kernel_tracking;
1153 sensor->dmax = f11->sensor_pdata.dmax;
1154 sensor->dribble = f11->sensor_pdata.dribble;
1155 sensor->palm_detect = f11->sensor_pdata.palm_detect;
1156
1157 if (f11->sens_query.has_physical_props) {
1158 sensor->x_mm = f11->sens_query.x_sensor_size_mm;
1159 sensor->y_mm = f11->sens_query.y_sensor_size_mm;
1160 } else {
1161 sensor->x_mm = f11->sensor_pdata.x_mm;
1162 sensor->y_mm = f11->sensor_pdata.y_mm;
1163 }
1164
1165 if (sensor->sensor_type == rmi_sensor_default)
1166 sensor->sensor_type =
1167 f11->sensor_pdata.sensor_type;
1168
1169 sensor->report_abs = sensor->report_abs
1170 && !(f11->sensor_pdata.disable_report_mask
1171 & RMI_F11_DISABLE_ABS_REPORT);
1172
1173 if (!sensor->report_abs)
1174
1175
1176
1177
1178 sensor->report_rel = f11->sens_query.has_rel;
1179
1180 rc = rmi_read_block(rmi_dev,
1181 control_base_addr + F11_CTRL_SENSOR_MAX_X_POS_OFFSET,
1182 (u8 *)&max_x_pos, sizeof(max_x_pos));
1183 if (rc < 0)
1184 return rc;
1185
1186 rc = rmi_read_block(rmi_dev,
1187 control_base_addr + F11_CTRL_SENSOR_MAX_Y_POS_OFFSET,
1188 (u8 *)&max_y_pos, sizeof(max_y_pos));
1189 if (rc < 0)
1190 return rc;
1191
1192 sensor->max_x = max_x_pos;
1193 sensor->max_y = max_y_pos;
1194
1195 rc = f11_2d_construct_data(f11);
1196 if (rc < 0)
1197 return rc;
1198
1199 if (f11->has_acm)
1200 f11->sensor.attn_size += f11->sensor.nbr_fingers * 2;
1201
1202
1203 sensor->tracking_pos = devm_kcalloc(&fn->dev,
1204 sensor->nbr_fingers, sizeof(struct input_mt_pos),
1205 GFP_KERNEL);
1206 sensor->tracking_slots = devm_kcalloc(&fn->dev,
1207 sensor->nbr_fingers, sizeof(int), GFP_KERNEL);
1208 sensor->objs = devm_kcalloc(&fn->dev,
1209 sensor->nbr_fingers,
1210 sizeof(struct rmi_2d_sensor_abs_object),
1211 GFP_KERNEL);
1212 if (!sensor->tracking_pos || !sensor->tracking_slots || !sensor->objs)
1213 return -ENOMEM;
1214
1215 ctrl = &f11->dev_controls;
1216 if (sensor->axis_align.delta_x_threshold)
1217 ctrl->ctrl0_11[RMI_F11_DELTA_X_THRESHOLD] =
1218 sensor->axis_align.delta_x_threshold;
1219
1220 if (sensor->axis_align.delta_y_threshold)
1221 ctrl->ctrl0_11[RMI_F11_DELTA_Y_THRESHOLD] =
1222 sensor->axis_align.delta_y_threshold;
1223
1224
1225
1226
1227
1228 if (sensor->axis_align.delta_x_threshold ||
1229 sensor->axis_align.delta_y_threshold) {
1230 ctrl->ctrl0_11[0] &= ~RMI_F11_REPORT_MODE_MASK;
1231 ctrl->ctrl0_11[0] |= RMI_F11_REPORT_MODE_REDUCED;
1232 }
1233
1234 if (f11->sens_query.has_dribble) {
1235 switch (sensor->dribble) {
1236 case RMI_REG_STATE_OFF:
1237 ctrl->ctrl0_11[0] &= ~BIT(6);
1238 break;
1239 case RMI_REG_STATE_ON:
1240 ctrl->ctrl0_11[0] |= BIT(6);
1241 break;
1242 case RMI_REG_STATE_DEFAULT:
1243 default:
1244 break;
1245 }
1246 }
1247
1248 if (f11->sens_query.has_palm_det) {
1249 switch (sensor->palm_detect) {
1250 case RMI_REG_STATE_OFF:
1251 ctrl->ctrl0_11[11] &= ~BIT(0);
1252 break;
1253 case RMI_REG_STATE_ON:
1254 ctrl->ctrl0_11[11] |= BIT(0);
1255 break;
1256 case RMI_REG_STATE_DEFAULT:
1257 default:
1258 break;
1259 }
1260 }
1261
1262 rc = f11_write_control_regs(fn, &f11->sens_query,
1263 &f11->dev_controls, fn->fd.control_base_addr);
1264 if (rc)
1265 dev_warn(&fn->dev, "Failed to write control registers\n");
1266
1267 mutex_init(&f11->dev_controls_mutex);
1268
1269 dev_set_drvdata(&fn->dev, f11);
1270
1271 return 0;
1272 }
1273
1274 static int rmi_f11_config(struct rmi_function *fn)
1275 {
1276 struct f11_data *f11 = dev_get_drvdata(&fn->dev);
1277 struct rmi_driver *drv = fn->rmi_dev->driver;
1278 struct rmi_2d_sensor *sensor = &f11->sensor;
1279 int rc;
1280
1281 if (!sensor->report_abs)
1282 drv->clear_irq_bits(fn->rmi_dev, f11->abs_mask);
1283 else
1284 drv->set_irq_bits(fn->rmi_dev, f11->abs_mask);
1285
1286 if (!sensor->report_rel)
1287 drv->clear_irq_bits(fn->rmi_dev, f11->rel_mask);
1288 else
1289 drv->set_irq_bits(fn->rmi_dev, f11->rel_mask);
1290
1291 rc = f11_write_control_regs(fn, &f11->sens_query,
1292 &f11->dev_controls, fn->fd.query_base_addr);
1293 if (rc < 0)
1294 return rc;
1295
1296 return 0;
1297 }
1298
1299 static irqreturn_t rmi_f11_attention(int irq, void *ctx)
1300 {
1301 struct rmi_function *fn = ctx;
1302 struct rmi_device *rmi_dev = fn->rmi_dev;
1303 struct rmi_driver_data *drvdata = dev_get_drvdata(&rmi_dev->dev);
1304 struct f11_data *f11 = dev_get_drvdata(&fn->dev);
1305 u16 data_base_addr = fn->fd.data_base_addr;
1306 int error;
1307 int valid_bytes = f11->sensor.pkt_size;
1308
1309 if (drvdata->attn_data.data) {
1310
1311
1312
1313
1314 if (f11->sensor.attn_size > drvdata->attn_data.size)
1315 valid_bytes = drvdata->attn_data.size;
1316 else
1317 valid_bytes = f11->sensor.attn_size;
1318 memcpy(f11->sensor.data_pkt, drvdata->attn_data.data,
1319 valid_bytes);
1320 drvdata->attn_data.data += valid_bytes;
1321 drvdata->attn_data.size -= valid_bytes;
1322 } else {
1323 error = rmi_read_block(rmi_dev,
1324 data_base_addr, f11->sensor.data_pkt,
1325 f11->sensor.pkt_size);
1326 if (error < 0)
1327 return IRQ_RETVAL(error);
1328 }
1329
1330 rmi_f11_finger_handler(f11, &f11->sensor, valid_bytes);
1331
1332 return IRQ_HANDLED;
1333 }
1334
1335 static int rmi_f11_resume(struct rmi_function *fn)
1336 {
1337 struct f11_data *f11 = dev_get_drvdata(&fn->dev);
1338 int error;
1339
1340 rmi_dbg(RMI_DEBUG_FN, &fn->dev, "Resuming...\n");
1341 if (!f11->rezero_wait_ms)
1342 return 0;
1343
1344 mdelay(f11->rezero_wait_ms);
1345
1346 error = rmi_write(fn->rmi_dev, fn->fd.command_base_addr,
1347 RMI_F11_REZERO);
1348 if (error) {
1349 dev_err(&fn->dev,
1350 "%s: failed to issue rezero command, error = %d.",
1351 __func__, error);
1352 return error;
1353 }
1354
1355 return 0;
1356 }
1357
1358 static int rmi_f11_probe(struct rmi_function *fn)
1359 {
1360 int error;
1361 struct f11_data *f11;
1362
1363 error = rmi_f11_initialize(fn);
1364 if (error)
1365 return error;
1366
1367 f11 = dev_get_drvdata(&fn->dev);
1368 error = rmi_2d_sensor_configure_input(fn, &f11->sensor);
1369 if (error)
1370 return error;
1371
1372 return 0;
1373 }
1374
1375 struct rmi_function_handler rmi_f11_handler = {
1376 .driver = {
1377 .name = "rmi4_f11",
1378 },
1379 .func = 0x11,
1380 .probe = rmi_f11_probe,
1381 .config = rmi_f11_config,
1382 .attention = rmi_f11_attention,
1383 .resume = rmi_f11_resume,
1384 };