static int cyttsp4_debug_release(struct cyttsp4_device *ttsp) { struct device *dev = &ttsp->dev; struct cyttsp4_debug_data *dd = dev_get_drvdata(dev); int rc = 0; tp_log_debug( "%s\n", __func__); if (dev_get_drvdata(&ttsp->core->dev) == NULL) { tp_log_err( "%s: Unable to un-subscribe attention\n", __func__); goto cyttsp4_debug_release_exit; } /* Unsubscribe from attentions */ cyttsp4_unsubscribe_attention(ttsp, CY_ATTEN_IRQ, cyttsp4_debug_op_attention, CY_MODE_OPERATIONAL); cyttsp4_unsubscribe_attention(ttsp, CY_ATTEN_IRQ, cyttsp4_debug_cat_attention, CY_MODE_CAT); cyttsp4_unsubscribe_attention(ttsp, CY_ATTEN_STARTUP, cyttsp4_debug_startup_attention, 0); cyttsp4_debug_release_exit: pm_runtime_suspend(dev); pm_runtime_disable(dev); device_remove_file(dev, &dev_attr_int_count); dev_set_drvdata(dev, NULL); kfree(dd); return rc; }
static int cyttsp4_proximity_release(struct cyttsp4_device *ttsp) { struct device *dev = &ttsp->dev; struct cyttsp4_proximity_data *pd = dev_get_drvdata(dev); tp_log_debug("%s\n", __func__); if (pd->input_device_registered) { /* Disable proximity sensing */ mutex_lock(&pd->sysfs_lock); if (pd->enable_count) _cyttsp4_proximity_disable(pd, true); mutex_unlock(&pd->sysfs_lock); device_remove_file(dev, &dev_attr_enable); input_unregister_device(pd->input); } else { input_free_device(pd->input); cyttsp4_unsubscribe_attention(ttsp, CY_ATTEN_STARTUP, cyttsp4_setup_input_attention, 0); } pm_runtime_suspend(dev); pm_runtime_disable(dev); dev_set_drvdata(dev, NULL); kfree(pd); return 0; }
static int cyttsp4_debug_release(struct cyttsp4_device *ttsp) { struct device *dev = &ttsp->dev; struct cyttsp4_debug_data *dd = dev_get_drvdata(dev); int rc = 0; dev_dbg(dev, "%s\n", __func__); if (dev_get_drvdata(&ttsp->core->dev) == NULL) { dev_err(dev, "%s: Error, core driver does not exist. " "Unable to un-subscribe attention\n", __func__); goto cyttsp4_debug_release_exit; } rc = cyttsp4_unsubscribe_attention(ttsp, CY_ATTEN_IRQ, cyttsp4_debug_attention, CY_MODE_OPERATIONAL); if (rc < 0) { dev_err(dev, "%s: Error, " "could not un-subscribe attention\n", __func__); goto cyttsp4_debug_release_exit; } cyttsp4_debug_release_exit: pm_runtime_suspend(dev); pm_runtime_disable(dev); device_remove_file(dev, &dev_attr_int_count); dev_set_drvdata(dev, NULL); kfree(dd); return rc; }
static int cyttsp4_btn_release(struct cyttsp4_device *ttsp) { struct device *dev = &ttsp->dev; struct cyttsp4_btn_data *bd = dev_get_drvdata(dev); dev_dbg(dev, "%s\n", __func__); #ifdef CONFIG_HAS_EARLYSUSPEND /* * This check is to prevent pm_runtime usage_count drop below zero * because of removing the module while in suspended state */ if (bd->is_suspended) pm_runtime_get_noresume(dev); unregister_early_suspend(&bd->es); #endif if (bd->input_device_registered) { input_unregister_device(bd->input); } else { input_free_device(bd->input); cyttsp4_unsubscribe_attention(ttsp, CY_ATTEN_STARTUP, cyttsp4_setup_input_attention, 0); } pm_runtime_suspend(dev); pm_runtime_disable(dev); dev_set_drvdata(dev, NULL); kfree(bd); return 0; }
static void cyttsp4_btn_close(struct input_dev *input) { struct device *dev = input->dev.parent; struct cyttsp4_device *ttsp = container_of(dev, struct cyttsp4_device, dev); dev_dbg(dev, "%s\n", __func__); cyttsp4_unsubscribe_attention(ttsp, CY_ATTEN_IRQ, cyttsp4_btn_attention, CY_MODE_OPERATIONAL); cyttsp4_unsubscribe_attention(ttsp, CY_ATTEN_STARTUP, cyttsp4_startup_attention, 0); pm_runtime_put(dev); }
static int _cyttsp4_proximity_disable(struct cyttsp4_proximity_data *pd, bool force) { struct cyttsp4_device *ttsp = pd->ttsp; struct device *dev = &ttsp->dev; int rc = 0; tp_log_debug("%s\n", __func__); rc = cyttsp4_request_exclusive(ttsp, CY_PROXIMITY_REQUEST_EXCLUSIVE_TIMEOUT); if (rc < 0) { tp_log_err("%s: Error on request exclusive r=%d\n", __func__, rc); goto exit; } rc = cyttsp4_request_disable_scan_type(ttsp, CY_ST_PROXIMITY); if (rc < 0) { tp_log_err("%s: Error on request disable proximity scan r=%d\n", __func__, rc); goto exit_release; } exit_release: cyttsp4_release_exclusive(ttsp); exit: if (!rc || force) { cyttsp4_unsubscribe_attention(ttsp, CY_ATTEN_IRQ, cyttsp4_proximity_attention, CY_MODE_OPERATIONAL); cyttsp4_unsubscribe_attention(ttsp, CY_ATTEN_STARTUP, cyttsp4_startup_attention, 0); pm_runtime_put(dev); } return rc; }
static int cyttsp4_setup_input_attention(struct cyttsp4_device *ttsp) { struct device *dev = &ttsp->dev; struct cyttsp4_proximity_data *pd = dev_get_drvdata(dev); int rc; tp_log_debug("%s\n", __func__); pd->si = cyttsp4_request_sysinfo(ttsp); if (!pd->si) return -EINVAL; rc = cyttsp4_setup_input_device_and_sysfs(ttsp); cyttsp4_unsubscribe_attention(ttsp, CY_ATTEN_STARTUP, cyttsp4_setup_input_attention, 0); return rc; }
static int cyttsp4_setup_input_attention(struct cyttsp4_device *ttsp) { struct device *dev = &ttsp->dev; struct cyttsp4_btn_data *bd = dev_get_drvdata(dev); int rc; dev_vdbg(dev, "%s\n", __func__); bd->si = cyttsp4_request_sysinfo(ttsp); if (!bd->si) return -1; rc = cyttsp4_setup_input_device(ttsp); cyttsp4_unsubscribe_attention(ttsp, CY_ATTEN_STARTUP, cyttsp4_setup_input_attention, 0); return rc; }
static int cyttsp4_debug_probe(struct cyttsp4_device *ttsp) { struct device *dev = &ttsp->dev; struct cyttsp4_debug_data *dd; struct cyttsp4_debug_platform_data *pdata = dev_get_platdata(dev); int rc; tp_log_info( "%s: startup\n", __func__); tp_log_debug( "%s: debug on\n", __func__); tp_log_debug( "%s: verbose debug on\n", __func__); /* get context and debug print buffers */ dd = kzalloc(sizeof(*dd), GFP_KERNEL); if (dd == NULL) { tp_log_err( "%s: Error, kzalloc\n", __func__); rc = -ENOMEM; goto cyttsp4_debug_probe_alloc_failed; } rc = device_create_file(dev, &dev_attr_int_count); if (rc) { tp_log_err( "%s: Error, could not create int_count\n", __func__); goto cyttsp4_debug_probe_create_int_count_failed; } rc = device_create_file(dev, &dev_attr_formated_output); if (rc) { tp_log_err( "%s: Error, could not create formated_output\n", __func__); goto cyttsp4_debug_probe_create_formated_failed; } mutex_init(&dd->sysfs_lock); dd->ttsp = ttsp; dd->pdata = pdata; dev_set_drvdata(dev, dd); pm_runtime_enable(dev); dd->si = cyttsp4_request_sysinfo(ttsp); if (dd->si == NULL) { tp_log_err( "%s: Fail get sysinfo pointer from core\n", __func__); rc = -ENODEV; goto cyttsp4_debug_probe_sysinfo_failed; } rc = cyttsp4_subscribe_attention(ttsp, CY_ATTEN_IRQ, cyttsp4_debug_op_attention, CY_MODE_OPERATIONAL); if (rc < 0) { tp_log_err( "%s: Error, could not subscribe Operating mode attention cb\n", __func__); goto cyttsp4_debug_probe_subscribe_op_failed; } rc = cyttsp4_subscribe_attention(ttsp, CY_ATTEN_IRQ, cyttsp4_debug_cat_attention, CY_MODE_CAT); if (rc < 0) { tp_log_err( "%s: Error, could not subscribe CaT mode attention cb\n", __func__); goto cyttsp4_debug_probe_subscribe_cat_failed; } rc = cyttsp4_subscribe_attention(ttsp, CY_ATTEN_STARTUP, cyttsp4_debug_startup_attention, 0); if (rc < 0) { tp_log_err( "%s: Error, could not subscribe startup attention cb\n", __func__); goto cyttsp4_debug_probe_subscribe_startup_failed; } return 0; cyttsp4_debug_probe_subscribe_startup_failed: cyttsp4_unsubscribe_attention(ttsp, CY_ATTEN_IRQ, cyttsp4_debug_cat_attention, CY_MODE_CAT); cyttsp4_debug_probe_subscribe_cat_failed: cyttsp4_unsubscribe_attention(ttsp, CY_ATTEN_IRQ, cyttsp4_debug_op_attention, CY_MODE_OPERATIONAL); cyttsp4_debug_probe_subscribe_op_failed: cyttsp4_debug_probe_sysinfo_failed: pm_runtime_suspend(dev); pm_runtime_disable(dev); dev_set_drvdata(dev, NULL); device_remove_file(dev, &dev_attr_formated_output); cyttsp4_debug_probe_create_formated_failed: device_remove_file(dev, &dev_attr_int_count); cyttsp4_debug_probe_create_int_count_failed: kfree(dd); cyttsp4_debug_probe_alloc_failed: tp_log_err( "%s failed.\n", __func__); return rc; }