rmi_f11.c (9095bf25ea08135a5b74875dd0e3eeaddc4218a0) rmi_f11.c (24d28e4f1271cb2f91613dada8f2acccd00eff56)
1/*
2 * Copyright (c) 2011-2015 Synaptics Incorporated
3 * Copyright (c) 2011 Unixphere
4 *
5 * This program is free software; you can redistribute it and/or modify it
6 * under the terms of the GNU General Public License version 2 as published by
7 * the Free Software Foundation.
8 */

--- 556 unchanged lines hidden (view full) ---

565
566static inline u8 rmi_f11_parse_finger_state(const u8 *f_state, u8 n_finger)
567{
568 return (f_state[n_finger / 4] >> (2 * (n_finger % 4))) &
569 FINGER_STATE_MASK;
570}
571
572static void rmi_f11_finger_handler(struct f11_data *f11,
1/*
2 * Copyright (c) 2011-2015 Synaptics Incorporated
3 * Copyright (c) 2011 Unixphere
4 *
5 * This program is free software; you can redistribute it and/or modify it
6 * under the terms of the GNU General Public License version 2 as published by
7 * the Free Software Foundation.
8 */

--- 556 unchanged lines hidden (view full) ---

565
566static inline u8 rmi_f11_parse_finger_state(const u8 *f_state, u8 n_finger)
567{
568 return (f_state[n_finger / 4] >> (2 * (n_finger % 4))) &
569 FINGER_STATE_MASK;
570}
571
572static void rmi_f11_finger_handler(struct f11_data *f11,
573 struct rmi_2d_sensor *sensor,
574 unsigned long *irq_bits, int num_irq_regs,
575 int size)
573 struct rmi_2d_sensor *sensor, int size)
576{
577 const u8 *f_state = f11->data.f_state;
578 u8 finger_state;
579 u8 i;
580 int abs_fingers;
581 int rel_fingers;
582 int abs_size = sensor->nbr_fingers * RMI_F11_ABS_BYTES;
583
574{
575 const u8 *f_state = f11->data.f_state;
576 u8 finger_state;
577 u8 i;
578 int abs_fingers;
579 int rel_fingers;
580 int abs_size = sensor->nbr_fingers * RMI_F11_ABS_BYTES;
581
584 int abs_bits = bitmap_and(f11->result_bits, irq_bits, f11->abs_mask,
585 num_irq_regs * 8);
586 int rel_bits = bitmap_and(f11->result_bits, irq_bits, f11->rel_mask,
587 num_irq_regs * 8);
588
589 if (abs_bits) {
582 if (sensor->report_abs) {
590 if (abs_size > size)
591 abs_fingers = size / RMI_F11_ABS_BYTES;
592 else
593 abs_fingers = sensor->nbr_fingers;
594
595 for (i = 0; i < abs_fingers; i++) {
596 /* Possible of having 4 fingers per f_state register */
597 finger_state = rmi_f11_parse_finger_state(f_state, i);
598 if (finger_state == F11_RESERVED) {
599 pr_err("Invalid finger state[%d]: 0x%02x", i,
600 finger_state);
601 continue;
602 }
603
604 rmi_f11_abs_pos_process(f11, sensor, &sensor->objs[i],
605 finger_state, i);
606 }
583 if (abs_size > size)
584 abs_fingers = size / RMI_F11_ABS_BYTES;
585 else
586 abs_fingers = sensor->nbr_fingers;
587
588 for (i = 0; i < abs_fingers; i++) {
589 /* Possible of having 4 fingers per f_state register */
590 finger_state = rmi_f11_parse_finger_state(f_state, i);
591 if (finger_state == F11_RESERVED) {
592 pr_err("Invalid finger state[%d]: 0x%02x", i,
593 finger_state);
594 continue;
595 }
596
597 rmi_f11_abs_pos_process(f11, sensor, &sensor->objs[i],
598 finger_state, i);
599 }
607 }
608
600
609 if (rel_bits) {
610 if ((abs_size + sensor->nbr_fingers * RMI_F11_REL_BYTES) > size)
611 rel_fingers = (size - abs_size) / RMI_F11_REL_BYTES;
612 else
613 rel_fingers = sensor->nbr_fingers;
614
615 for (i = 0; i < rel_fingers; i++)
616 rmi_f11_rel_pos_report(f11, i);
617 }
618
619 if (abs_bits) {
620 /*
621 * the absolute part is made in 2 parts to allow the kernel
622 * tracking to take place.
623 */
624 if (sensor->kernel_tracking)
625 input_mt_assign_slots(sensor->input,
626 sensor->tracking_slots,
627 sensor->tracking_pos,

--- 5 unchanged lines hidden (view full) ---

633 if (finger_state == F11_RESERVED)
634 /* no need to send twice the error */
635 continue;
636
637 rmi_2d_sensor_abs_report(sensor, &sensor->objs[i], i);
638 }
639
640 input_mt_sync_frame(sensor->input);
601 /*
602 * the absolute part is made in 2 parts to allow the kernel
603 * tracking to take place.
604 */
605 if (sensor->kernel_tracking)
606 input_mt_assign_slots(sensor->input,
607 sensor->tracking_slots,
608 sensor->tracking_pos,

--- 5 unchanged lines hidden (view full) ---

614 if (finger_state == F11_RESERVED)
615 /* no need to send twice the error */
616 continue;
617
618 rmi_2d_sensor_abs_report(sensor, &sensor->objs[i], i);
619 }
620
621 input_mt_sync_frame(sensor->input);
622 } else if (sensor->report_rel) {
623 if ((abs_size + sensor->nbr_fingers * RMI_F11_REL_BYTES) > size)
624 rel_fingers = (size - abs_size) / RMI_F11_REL_BYTES;
625 else
626 rel_fingers = sensor->nbr_fingers;
627
628 for (i = 0; i < rel_fingers; i++)
629 rmi_f11_rel_pos_report(f11, i);
641 }
630 }
631
642}
643
644static int f11_2d_construct_data(struct f11_data *f11)
645{
646 struct rmi_2d_sensor *sensor = &f11->sensor;
647 struct f11_2d_sensor_queries *query = &f11->sens_query;
648 struct f11_2d_data *data = &f11->data;
649 int i;

--- 620 unchanged lines hidden (view full) ---

1270 rc = f11_write_control_regs(fn, &f11->sens_query,
1271 &f11->dev_controls, fn->fd.query_base_addr);
1272 if (rc < 0)
1273 return rc;
1274
1275 return 0;
1276}
1277
632}
633
634static int f11_2d_construct_data(struct f11_data *f11)
635{
636 struct rmi_2d_sensor *sensor = &f11->sensor;
637 struct f11_2d_sensor_queries *query = &f11->sens_query;
638 struct f11_2d_data *data = &f11->data;
639 int i;

--- 620 unchanged lines hidden (view full) ---

1260 rc = f11_write_control_regs(fn, &f11->sens_query,
1261 &f11->dev_controls, fn->fd.query_base_addr);
1262 if (rc < 0)
1263 return rc;
1264
1265 return 0;
1266}
1267
1278static int rmi_f11_attention(struct rmi_function *fn, unsigned long *irq_bits)
1268static irqreturn_t rmi_f11_attention(int irq, void *ctx)
1279{
1269{
1270 struct rmi_function *fn = ctx;
1280 struct rmi_device *rmi_dev = fn->rmi_dev;
1281 struct rmi_driver_data *drvdata = dev_get_drvdata(&rmi_dev->dev);
1282 struct f11_data *f11 = dev_get_drvdata(&fn->dev);
1283 u16 data_base_addr = fn->fd.data_base_addr;
1284 int error;
1285 int valid_bytes = f11->sensor.pkt_size;
1286
1287 if (drvdata->attn_data.data) {

--- 9 unchanged lines hidden (view full) ---

1297 valid_bytes);
1298 drvdata->attn_data.data += f11->sensor.attn_size;
1299 drvdata->attn_data.size -= f11->sensor.attn_size;
1300 } else {
1301 error = rmi_read_block(rmi_dev,
1302 data_base_addr, f11->sensor.data_pkt,
1303 f11->sensor.pkt_size);
1304 if (error < 0)
1271 struct rmi_device *rmi_dev = fn->rmi_dev;
1272 struct rmi_driver_data *drvdata = dev_get_drvdata(&rmi_dev->dev);
1273 struct f11_data *f11 = dev_get_drvdata(&fn->dev);
1274 u16 data_base_addr = fn->fd.data_base_addr;
1275 int error;
1276 int valid_bytes = f11->sensor.pkt_size;
1277
1278 if (drvdata->attn_data.data) {

--- 9 unchanged lines hidden (view full) ---

1288 valid_bytes);
1289 drvdata->attn_data.data += f11->sensor.attn_size;
1290 drvdata->attn_data.size -= f11->sensor.attn_size;
1291 } else {
1292 error = rmi_read_block(rmi_dev,
1293 data_base_addr, f11->sensor.data_pkt,
1294 f11->sensor.pkt_size);
1295 if (error < 0)
1305 return error;
1296 return IRQ_RETVAL(error);
1306 }
1307
1297 }
1298
1308 rmi_f11_finger_handler(f11, &f11->sensor, irq_bits,
1309 drvdata->num_of_irq_regs, valid_bytes);
1299 rmi_f11_finger_handler(f11, &f11->sensor, valid_bytes);
1310
1300
1311 return 0;
1301 return IRQ_HANDLED;
1312}
1313
1314static int rmi_f11_resume(struct rmi_function *fn)
1315{
1316 struct f11_data *f11 = dev_get_drvdata(&fn->dev);
1317 int error;
1318
1319 rmi_dbg(RMI_DEBUG_FN, &fn->dev, "Resuming...\n");

--- 44 unchanged lines hidden ---
1302}
1303
1304static int rmi_f11_resume(struct rmi_function *fn)
1305{
1306 struct f11_data *f11 = dev_get_drvdata(&fn->dev);
1307 int error;
1308
1309 rmi_dbg(RMI_DEBUG_FN, &fn->dev, "Resuming...\n");

--- 44 unchanged lines hidden ---