static ssize_t stm_store_stm_en(struct device *dev,
				struct device_attribute *attr,
				const char *buf, size_t size)
{
	struct stm_drvdata *drvdata = dev_get_drvdata(dev->parent);
	uint32_t val;
	int ret = 0;

	if (sscanf(buf, "%x", &val) != 1)
		return -EINVAL;

	if (val) {
		exynos_etb_stm();
		spin_lock(&drvdata->spinlock);
		__stm_enable(drvdata);
		drvdata->enable = true;
		spin_unlock(&drvdata->spinlock);
	} else {
		spin_lock(&drvdata->spinlock);
		__stm_disable(drvdata);
		drvdata->enable = false;
		spin_unlock(&drvdata->spinlock);

		/* Wait for 100ms so that pending data has been written to HW */
		msleep(100);
	}

	if (ret)
		return ret;
	return size;
}
static int stm_enable(struct coresight_device *csdev)
{
	struct stm_drvdata *drvdata = dev_get_drvdata(csdev->dev.parent);

	exynos_etb_stm();
	spin_lock(&drvdata->spinlock);
	__stm_enable(drvdata);
	drvdata->enable = true;
	spin_unlock(&drvdata->spinlock);

	dev_info(drvdata->dev, "STM tracing enabled\n");
	return 0;
}
static int stm_enable(struct coresight_device *csdev)
{
	struct stm_drvdata *drvdata = dev_get_drvdata(csdev->dev.parent);
	int ret;

	ret = clk_prepare_enable(drvdata->clk);
	if (ret)
		return ret;

	spin_lock(&drvdata->spinlock);
	__stm_enable(drvdata);
	drvdata->enable = true;
	spin_unlock(&drvdata->spinlock);

	dev_info(drvdata->dev, "STM tracing enabled\n");
	return 0;
}