static void synaptics_rmi4_apen_reset(struct synaptics_rmi4_data *rmi4_data) { if (!apen) { synaptics_rmi4_apen_init(rmi4_data); return; } apen_lift(); apen_scan_pdt(); apen_set_params(); return; }
static int synaptics_rmi4_apen_init(struct synaptics_rmi4_data *rmi4_data) { int retval; if (apen) { dev_dbg(rmi4_data->pdev->dev.parent, "%s: Handle already exists\n", __func__); return 0; } apen = kzalloc(sizeof(*apen), GFP_KERNEL); if (!apen) { dev_err(rmi4_data->pdev->dev.parent, "%s: Failed to alloc mem for apen\n", __func__); retval = -ENOMEM; goto exit; } apen->apen_data = kzalloc(sizeof(*(apen->apen_data)), GFP_KERNEL); if (!apen->apen_data) { dev_err(rmi4_data->pdev->dev.parent, "%s: Failed to alloc mem for apen_data\n", __func__); retval = -ENOMEM; goto exit_free_apen; } apen->rmi4_data = rmi4_data; retval = apen_scan_pdt(); if (retval < 0) goto exit_free_apen_data; apen->apen_dev = input_allocate_device(); if (apen->apen_dev == NULL) { dev_err(rmi4_data->pdev->dev.parent, "%s: Failed to allocate active pen device\n", __func__); retval = -ENOMEM; goto exit_free_apen_data; } apen->apen_dev->name = ACTIVE_PEN_DRIVER_NAME; apen->apen_dev->phys = APEN_PHYS_NAME; apen->apen_dev->id.product = SYNAPTICS_DSX_DRIVER_PRODUCT; apen->apen_dev->id.version = SYNAPTICS_DSX_DRIVER_VERSION; apen->apen_dev->dev.parent = rmi4_data->pdev->dev.parent; input_set_drvdata(apen->apen_dev, rmi4_data); set_bit(EV_KEY, apen->apen_dev->evbit); set_bit(EV_ABS, apen->apen_dev->evbit); set_bit(BTN_TOUCH, apen->apen_dev->keybit); set_bit(BTN_TOOL_PEN, apen->apen_dev->keybit); set_bit(BTN_TOOL_RUBBER, apen->apen_dev->keybit); set_bit(BTN_STYLUS, apen->apen_dev->keybit); #ifdef INPUT_PROP_DIRECT set_bit(INPUT_PROP_DIRECT, apen->apen_dev->propbit); #endif apen_set_params(); retval = input_register_device(apen->apen_dev); if (retval) { dev_err(rmi4_data->pdev->dev.parent, "%s: Failed to register active pen device\n", __func__); goto exit_free_input_device; } return 0; exit_free_input_device: input_free_device(apen->apen_dev); exit_free_apen_data: kfree(apen->apen_data); exit_free_apen: kfree(apen); apen = NULL; exit: return retval; }