static int prox_set_hover_finger_en(void) { int retval; unsigned char object_report_enable; struct synaptics_rmi4_data *rmi4_data = prox->rmi4_data; retval = synaptics_rmi4_reg_read(rmi4_data, prox->hover_finger_en_addr, &object_report_enable, sizeof(object_report_enable)); if (retval < 0) { dev_err(rmi4_data->pdev->dev.parent, "%s: Failed to read from object report enable register\n", __func__); return retval; } if (prox->hover_finger_en) object_report_enable |= HOVERING_FINGER_EN; else object_report_enable &= ~HOVERING_FINGER_EN; retval = synaptics_rmi4_reg_write(rmi4_data, prox->hover_finger_en_addr, &object_report_enable, sizeof(object_report_enable)); if (retval < 0) { dev_err(rmi4_data->pdev->dev.parent, "%s: Failed to write to object report enable register\n", __func__); return retval; } return 0; }
static int apen_scan_pdt(void) { int retval; unsigned char ii; unsigned char page; unsigned char intr_count = 0; unsigned char intr_off; unsigned char intr_src; unsigned short addr; struct synaptics_rmi4_fn_desc fd; struct synaptics_rmi4_data *rmi4_data = apen->rmi4_data; for (page = 0; page < PAGES_TO_SERVICE; page++) { for (addr = PDT_START; addr > PDT_END; addr -= PDT_ENTRY_SIZE) { addr |= (page << 8); retval = synaptics_rmi4_reg_read(rmi4_data, addr, (unsigned char *)&fd, sizeof(fd)); if (retval < 0) return retval; addr &= ~(MASK_8BIT << 8); if (fd.fn_number) { dev_dbg(rmi4_data->pdev->dev.parent, "%s: Found F%02x\n", __func__, fd.fn_number); switch (fd.fn_number) { case SYNAPTICS_RMI4_F12: goto f12_found; break; } } else { break; } intr_count += fd.intr_src_count; } } dev_err(rmi4_data->pdev->dev.parent, "%s: Failed to find F12\n", __func__); return -EINVAL; f12_found: apen->query_base_addr = fd.query_base_addr | (page << 8); apen->control_base_addr = fd.ctrl_base_addr | (page << 8); apen->data_base_addr = fd.data_base_addr | (page << 8); apen->command_base_addr = fd.cmd_base_addr | (page << 8); retval = apen_reg_init(); if (retval < 0) { dev_err(rmi4_data->pdev->dev.parent, "%s: Failed to initialize active pen registers\n", __func__); return retval; } apen->intr_mask = 0; intr_src = fd.intr_src_count; intr_off = intr_count % 8; for (ii = intr_off; ii < (intr_src + intr_off); ii++) { apen->intr_mask |= 1 << ii; } rmi4_data->intr_mask[0] |= apen->intr_mask; addr = rmi4_data->f01_ctrl_base_addr + 1; retval = synaptics_rmi4_reg_write(rmi4_data, addr, &(rmi4_data->intr_mask[0]), sizeof(rmi4_data->intr_mask[0])); if (retval < 0) { dev_err(rmi4_data->pdev->dev.parent, "%s: Failed to set interrupt enable bit\n", __func__); return retval; } return 0; }