static void synaptics_rmi4_prox_reset(struct synaptics_rmi4_data *rmi4_data) { if (!prox) { synaptics_rmi4_prox_init(rmi4_data); return; } prox_hover_finger_lift(); prox_scan_pdt(); prox_set_hover_finger_en(); prox_set_params(); return; }
static int synaptics_rmi4_prox_init(struct synaptics_rmi4_data *rmi4_data) { int retval; unsigned char attr_count; prox = kzalloc(sizeof(*prox), GFP_KERNEL); if (!prox) { dev_err(rmi4_data->pdev->dev.parent, "%s: Failed to alloc mem for prox\n", __func__); retval = -ENOMEM; goto exit; } prox->finger_data = kzalloc(sizeof(*(prox->finger_data)), GFP_KERNEL); if (!prox->finger_data) { dev_err(rmi4_data->pdev->dev.parent, "%s: Failed to alloc mem for finger_data\n", __func__); retval = -ENOMEM; goto exit_free_prox; } prox->rmi4_data = rmi4_data; retval = prox_scan_pdt(); if (retval < 0) goto exit_free_finger_data; prox->hover_finger_en = true; retval = prox_set_hover_finger_en(); if (retval < 0) return retval; prox->prox_dev = input_allocate_device(); if (prox->prox_dev == NULL) { dev_err(rmi4_data->pdev->dev.parent, "%s: Failed to allocate proximity device\n", __func__); retval = -ENOMEM; goto exit_free_finger_data; } prox->prox_dev->name = PLATFORM_DRIVER_NAME; prox->prox_dev->phys = PROX_PHYS_NAME; prox->prox_dev->id.product = SYNAPTICS_DSX_DRIVER_PRODUCT; prox->prox_dev->id.version = SYNAPTICS_DSX_DRIVER_VERSION; prox->prox_dev->dev.parent = rmi4_data->pdev->dev.parent; input_set_drvdata(prox->prox_dev, rmi4_data); set_bit(EV_KEY, prox->prox_dev->evbit); set_bit(EV_ABS, prox->prox_dev->evbit); set_bit(BTN_TOUCH, prox->prox_dev->keybit); set_bit(BTN_TOOL_FINGER, prox->prox_dev->keybit); #ifdef INPUT_PROP_DIRECT set_bit(INPUT_PROP_DIRECT, prox->prox_dev->propbit); #endif prox_set_params(); retval = input_register_device(prox->prox_dev); if (retval) { dev_err(rmi4_data->pdev->dev.parent, "%s: Failed to register proximity device\n", __func__); goto exit_free_input_device; } for (attr_count = 0; attr_count < ARRAY_SIZE(attrs); attr_count++) { retval = sysfs_create_file(&rmi4_data->input_dev->dev.kobj, &attrs[attr_count].attr); if (retval < 0) { dev_err(rmi4_data->pdev->dev.parent, "%s: Failed to create sysfs attributes\n", __func__); goto exit_free_sysfs; } } return 0; exit_free_sysfs: for (attr_count--; attr_count >= 0; attr_count--) { sysfs_remove_file(&rmi4_data->input_dev->dev.kobj, &attrs[attr_count].attr); } input_unregister_device(prox->prox_dev); prox->prox_dev = NULL; exit_free_input_device: if (prox->prox_dev) input_free_device(prox->prox_dev); exit_free_finger_data: kfree(prox->finger_data); exit_free_prox: kfree(prox); prox = NULL; exit: return retval; }