static int cyttsp5_device_access_release(struct cyttsp5_device *ttsp) { struct device *dev = &ttsp->dev; struct cyttsp5_device_access_data *dad = dev_get_drvdata(dev); pm_runtime_suspend(dev); pm_runtime_disable(dev); if (dad->sysfs_nodes_created) { device_remove_file(dev, &dev_attr_command); device_remove_file(dev, &dev_attr_status); device_remove_file(dev, &dev_attr_response); device_remove_file(dev, &dev_attr_responsestr); #ifdef CONFIG_TCMD device_remove_file(dev, &dev_attr_tcmdresponse); device_remove_file(dev, &dev_attr_tcmdresponsesize); device_remove_file(dev, &dev_attr_tcmdread_status); #endif #ifdef TTHE_TUNER_SUPPORT debugfs_remove(dad->tthe_get_panel_data_debugfs); #endif } else { cyttsp5_unsubscribe_attention(ttsp, CY_ATTEN_STARTUP, cyttsp5_setup_sysfs_attention, 0); } dev_set_drvdata(dev, NULL); kfree(dad); return 0; }
static int cyttsp5_debug_release(struct cyttsp5_device *ttsp) { struct device *dev = &ttsp->dev; struct cyttsp5_debug_data *dd = dev_get_drvdata(dev); int rc = 0; if (dev_get_drvdata(&ttsp->core->dev) == NULL) { dev_err(dev, "%s: Error, core driver does not exist\n", __func__); goto cyttsp5_debug_release_exit; } rc = cyttsp5_unsubscribe_attention(ttsp, CY_ATTEN_IRQ, cyttsp5_debug_attention, CY_MODE_OPERATIONAL); if (rc < 0) { dev_err(dev, "%s: Error, could not un-subscribe attention\n", __func__); goto cyttsp5_debug_release_exit; } cyttsp5_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 cyttsp5_setup_sysfs_attention(struct cyttsp5_device *ttsp) { struct device *dev = &ttsp->dev; struct cyttsp5_device_access_data *dad = dev_get_drvdata(dev); int rc = 0; dad->si = cyttsp5_request_sysinfo(ttsp); if (!dad->si) return -1; rc = cyttsp5_setup_sysfs(ttsp); cyttsp5_unsubscribe_attention(ttsp, CY_ATTEN_STARTUP, cyttsp5_setup_sysfs_attention, 0); return rc; }