static int cyttsp5_device_access_probe(struct cyttsp5_device *ttsp) { struct device *dev = &ttsp->dev; struct cyttsp5_device_access_data *dad; struct cyttsp5_device_access_platform_data *pdata = dev_get_platdata(dev); int rc = 0; dad = kzalloc(sizeof(*dad), GFP_KERNEL); if (dad == NULL) { dev_err(dev, "%s: Error, kzalloc\n", __func__); rc = -ENOMEM; goto cyttsp5_device_access_probe_data_failed; } mutex_init(&dad->sysfs_lock); dad->ttsp = ttsp; dad->pdata = pdata; dev_set_drvdata(dev, dad); #ifdef TTHE_TUNER_SUPPORT mutex_init(&dad->debugfs_lock); dad->heatmap.num_element = 200; #endif pm_runtime_enable(dev); pm_runtime_get_sync(dev); /* get sysinfo */ dad->si = cyttsp5_request_sysinfo(ttsp); pm_runtime_put(dev); if (dad->si) { rc = cyttsp5_setup_sysfs(ttsp); if (rc) goto cyttsp5_device_access_setup_sysfs_failed; } else { dev_err(dev, "%s: Fail get sysinfo pointer from core p=%p\n", __func__, dad->si); cyttsp5_subscribe_attention(ttsp, CY_ATTEN_STARTUP, cyttsp5_setup_sysfs_attention, 0); } return 0; cyttsp5_device_access_setup_sysfs_failed: pm_runtime_suspend(dev); pm_runtime_disable(dev); dev_set_drvdata(dev, NULL); kfree(dad); cyttsp5_device_access_probe_data_failed: dev_err(dev, "%s failed.\n", __func__); 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; }
static int cyttsp5_debug_probe(struct cyttsp5_device *ttsp) { struct device *dev = &ttsp->dev; struct cyttsp5_debug_data *dd; struct cyttsp5_debug_platform_data *pdata = dev_get_platdata(dev); int rc; /* get context and debug print buffers */ dd = kzalloc(sizeof(*dd), GFP_KERNEL); if (dd == NULL) { dev_err(dev, "%s: Error, kzalloc\n", __func__); rc = -ENOMEM; goto cyttsp5_debug_probe_alloc_failed; } rc = device_create_file(dev, &dev_attr_int_count); if (rc) { dev_err(dev, "%s: Error, could not create int_count\n", __func__); goto cyttsp5_debug_probe_create_int_count_failed; } rc = device_create_file(dev, &dev_attr_formated_output); if (rc) { dev_err(dev, "%s: Error, could not create formated_output\n", __func__); goto cyttsp5_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); pm_runtime_get_sync(dev); dd->si = cyttsp5_request_sysinfo(ttsp); if (dd->si == NULL) { dev_err(dev, "%s: Fail get sysinfo pointer from core\n", __func__); rc = -ENODEV; goto cyttsp5_debug_probe_sysinfo_failed; } rc = cyttsp5_subscribe_attention(ttsp, CY_ATTEN_IRQ, cyttsp5_debug_attention, CY_MODE_OPERATIONAL); if (rc < 0) { dev_err(dev, "%s: Error, could not subscribe attention cb\n", __func__); goto cyttsp5_debug_probe_subscribe_failed; } pm_runtime_put(dev); return 0; cyttsp5_debug_probe_subscribe_failed: cyttsp5_debug_probe_sysinfo_failed: pm_runtime_put(dev); pm_runtime_suspend(dev); pm_runtime_disable(dev); dev_set_drvdata(dev, NULL); device_remove_file(dev, &dev_attr_formated_output); cyttsp5_debug_probe_create_formated_failed: device_remove_file(dev, &dev_attr_int_count); cyttsp5_debug_probe_create_int_count_failed: kfree(dd); cyttsp5_debug_probe_alloc_failed: dev_err(dev, "%s failed.\n", __func__); return rc; }