static void __tpiu_disable_to_mictor(struct tpiu_drvdata *drvdata) { __tpiu_disable(drvdata); if (drvdata->set == TPIU_SET_A) __tpiu_disable_seta(drvdata); else if (drvdata->set == TPIU_SET_B) __tpiu_disable_setb(drvdata); }
static ssize_t tpiu_store_set(struct device *dev, struct device_attribute *attr, const char *buf, size_t size) { struct tpiu_drvdata *drvdata = dev_get_drvdata(dev->parent); char str[10] = ""; int ret; if (strlen(buf) >= 10) return -EINVAL; if (sscanf(buf, "%s", str) != 1) return -EINVAL; mutex_lock(&drvdata->mutex); if (!strcmp(str, "a")) { if (drvdata->set == TPIU_SET_A) goto out; if (!drvdata->enable || drvdata->out_mode != TPIU_OUT_MODE_MICTOR) { drvdata->set = TPIU_SET_A; goto out; } __tpiu_disable_setb(drvdata); ret = __tpiu_enable_seta(drvdata); if (ret) { dev_err(drvdata->dev, "failed to enable set A\n"); goto err; } drvdata->set = TPIU_SET_A; } else if (!strcmp(str, "b")) { if (drvdata->set == TPIU_SET_B) goto out; if (!drvdata->enable || drvdata->out_mode != TPIU_OUT_MODE_MICTOR) { drvdata->set = TPIU_SET_B; goto out; } __tpiu_disable_seta(drvdata); ret = __tpiu_enable_setb(drvdata); if (ret) { dev_err(drvdata->dev, "failed to enable set B\n"); goto err; } drvdata->set = TPIU_SET_B; } out: mutex_unlock(&drvdata->mutex); return size; err: mutex_unlock(&drvdata->mutex); return ret; }
static void __tpiu_disable_to_mictor(struct tpiu_drvdata *drvdata) { /* mictor mode needs to be disbled only when tracing is enabled */ if (!drvdata->enable) return; __tpiu_disable(drvdata); if (drvdata->set == TPIU_SET_A) __tpiu_disable_seta(drvdata); else if (drvdata->set == TPIU_SET_B) __tpiu_disable_setb(drvdata); }