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 int __tpiu_enable_to_mictor(struct tpiu_drvdata *drvdata) { int ret; if (drvdata->set == TPIU_SET_A) { ret = __tpiu_enable_seta(drvdata); if (ret) return ret; } else if (drvdata->set == TPIU_SET_B) { ret = __tpiu_enable_setb(drvdata); if (ret) return ret; } __tpiu_enable(drvdata, 0x8000, 0x101); return 0; }
static int __tpiu_enable_to_mictor(struct tpiu_drvdata *drvdata) { int ret; if (drvdata->set == TPIU_SET_A) { ret = __tpiu_enable_seta(drvdata); if (ret) return ret; } else if (drvdata->set == TPIU_SET_B) { ret = __tpiu_enable_setb(drvdata); if (ret) return ret; } TPIU_UNLOCK(drvdata); tpiu_writel(drvdata, 0x8000, TPIU_CURR_PORTSZ); tpiu_writel(drvdata, 0x101, TPIU_FFCR); TPIU_LOCK(drvdata); return 0; }