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_setup_sysfs_attention(struct device *dev) { struct cyttsp5_device_access_data *dad = cyttsp5_get_device_access_data(dev); int rc = 0; dad->si = cmd->request_sysinfo(dev); if (!dad->si) return -EINVAL; rc = cyttsp5_setup_sysfs(dev); cmd->unsubscribe_attention(dev, CY_ATTEN_STARTUP, CY_MODULE_DEVICE_ACCESS, cyttsp5_setup_sysfs_attention, 0); return rc; }
static int cyttsp5_device_access_probe(struct device *dev) { struct cyttsp5_core_data *cd = dev_get_drvdata(dev); struct cyttsp5_device_access_data *dad; int rc; dad = kzalloc(sizeof(*dad), GFP_KERNEL); if (!dad) { dev_err(dev, "%s: Error, kzalloc\n", __func__); rc = -ENOMEM; goto cyttsp5_device_access_probe_data_failed; } mutex_init(&dad->sysfs_lock); dad->dev = dev; #ifdef TTHE_TUNER_SUPPORT mutex_init(&dad->debugfs_lock); dad->heatmap.num_element = 200; #endif cd->cyttsp5_dynamic_data[CY_MODULE_DEVICE_ACCESS] = dad; /* get sysinfo */ dad->si = cmd->request_sysinfo(dev); if (dad->si) { rc = cyttsp5_setup_sysfs(dev); 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); cmd->subscribe_attention(dev, CY_ATTEN_STARTUP, CY_MODULE_DEVICE_ACCESS, cyttsp5_setup_sysfs_attention, 0); } return 0; cyttsp5_device_access_setup_sysfs_failed: kfree(dad); cyttsp5_device_access_probe_data_failed: dev_err(dev, "%s failed.\n", __func__); return rc; }