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