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;
}