|
@@ -78,6 +78,7 @@ static ssize_t reset_store(struct device *dev,
|
|
|
int i, ret;
|
|
|
unsigned long val;
|
|
|
struct etm_drvdata *drvdata = dev_get_drvdata(dev->parent);
|
|
|
+ struct etm_config *config = &drvdata->config;
|
|
|
|
|
|
ret = kstrtoul(buf, 16, &val);
|
|
|
if (ret)
|
|
@@ -85,19 +86,14 @@ static ssize_t reset_store(struct device *dev,
|
|
|
|
|
|
if (val) {
|
|
|
spin_lock(&drvdata->spinlock);
|
|
|
- drvdata->mode = ETM_MODE_EXCLUDE;
|
|
|
- drvdata->ctrl = 0x0;
|
|
|
- drvdata->trigger_event = ETM_DEFAULT_EVENT_VAL;
|
|
|
- drvdata->startstop_ctrl = 0x0;
|
|
|
- drvdata->addr_idx = 0x0;
|
|
|
+ memset(config, 0, sizeof(struct etm_config));
|
|
|
+ config->mode = ETM_MODE_EXCLUDE;
|
|
|
+ config->trigger_event = ETM_DEFAULT_EVENT_VAL;
|
|
|
for (i = 0; i < drvdata->nr_addr_cmp; i++) {
|
|
|
- drvdata->addr_val[i] = 0x0;
|
|
|
- drvdata->addr_acctype[i] = 0x0;
|
|
|
- drvdata->addr_type[i] = ETM_ADDR_TYPE_NONE;
|
|
|
+ config->addr_type[i] = ETM_ADDR_TYPE_NONE;
|
|
|
}
|
|
|
- drvdata->cntr_idx = 0x0;
|
|
|
|
|
|
- etm_set_default(drvdata);
|
|
|
+ etm_set_default(config);
|
|
|
spin_unlock(&drvdata->spinlock);
|
|
|
}
|
|
|
|
|
@@ -110,8 +106,9 @@ static ssize_t mode_show(struct device *dev,
|
|
|
{
|
|
|
unsigned long val;
|
|
|
struct etm_drvdata *drvdata = dev_get_drvdata(dev->parent);
|
|
|
+ struct etm_config *config = &drvdata->config;
|
|
|
|
|
|
- val = drvdata->mode;
|
|
|
+ val = config->mode;
|
|
|
return sprintf(buf, "%#lx\n", val);
|
|
|
}
|
|
|
|
|
@@ -122,48 +119,49 @@ static ssize_t mode_store(struct device *dev,
|
|
|
int ret;
|
|
|
unsigned long val;
|
|
|
struct etm_drvdata *drvdata = dev_get_drvdata(dev->parent);
|
|
|
+ struct etm_config *config = &drvdata->config;
|
|
|
|
|
|
ret = kstrtoul(buf, 16, &val);
|
|
|
if (ret)
|
|
|
return ret;
|
|
|
|
|
|
spin_lock(&drvdata->spinlock);
|
|
|
- drvdata->mode = val & ETM_MODE_ALL;
|
|
|
+ config->mode = val & ETM_MODE_ALL;
|
|
|
|
|
|
- if (drvdata->mode & ETM_MODE_EXCLUDE)
|
|
|
- drvdata->enable_ctrl1 |= ETMTECR1_INC_EXC;
|
|
|
+ if (config->mode & ETM_MODE_EXCLUDE)
|
|
|
+ config->enable_ctrl1 |= ETMTECR1_INC_EXC;
|
|
|
else
|
|
|
- drvdata->enable_ctrl1 &= ~ETMTECR1_INC_EXC;
|
|
|
+ config->enable_ctrl1 &= ~ETMTECR1_INC_EXC;
|
|
|
|
|
|
- if (drvdata->mode & ETM_MODE_CYCACC)
|
|
|
- drvdata->ctrl |= ETMCR_CYC_ACC;
|
|
|
+ if (config->mode & ETM_MODE_CYCACC)
|
|
|
+ config->ctrl |= ETMCR_CYC_ACC;
|
|
|
else
|
|
|
- drvdata->ctrl &= ~ETMCR_CYC_ACC;
|
|
|
+ config->ctrl &= ~ETMCR_CYC_ACC;
|
|
|
|
|
|
- if (drvdata->mode & ETM_MODE_STALL) {
|
|
|
+ if (config->mode & ETM_MODE_STALL) {
|
|
|
if (!(drvdata->etmccr & ETMCCR_FIFOFULL)) {
|
|
|
dev_warn(drvdata->dev, "stall mode not supported\n");
|
|
|
ret = -EINVAL;
|
|
|
goto err_unlock;
|
|
|
}
|
|
|
- drvdata->ctrl |= ETMCR_STALL_MODE;
|
|
|
+ config->ctrl |= ETMCR_STALL_MODE;
|
|
|
} else
|
|
|
- drvdata->ctrl &= ~ETMCR_STALL_MODE;
|
|
|
+ config->ctrl &= ~ETMCR_STALL_MODE;
|
|
|
|
|
|
- if (drvdata->mode & ETM_MODE_TIMESTAMP) {
|
|
|
+ if (config->mode & ETM_MODE_TIMESTAMP) {
|
|
|
if (!(drvdata->etmccer & ETMCCER_TIMESTAMP)) {
|
|
|
dev_warn(drvdata->dev, "timestamp not supported\n");
|
|
|
ret = -EINVAL;
|
|
|
goto err_unlock;
|
|
|
}
|
|
|
- drvdata->ctrl |= ETMCR_TIMESTAMP_EN;
|
|
|
+ config->ctrl |= ETMCR_TIMESTAMP_EN;
|
|
|
} else
|
|
|
- drvdata->ctrl &= ~ETMCR_TIMESTAMP_EN;
|
|
|
+ config->ctrl &= ~ETMCR_TIMESTAMP_EN;
|
|
|
|
|
|
- if (drvdata->mode & ETM_MODE_CTXID)
|
|
|
- drvdata->ctrl |= ETMCR_CTXID_SIZE;
|
|
|
+ if (config->mode & ETM_MODE_CTXID)
|
|
|
+ config->ctrl |= ETMCR_CTXID_SIZE;
|
|
|
else
|
|
|
- drvdata->ctrl &= ~ETMCR_CTXID_SIZE;
|
|
|
+ config->ctrl &= ~ETMCR_CTXID_SIZE;
|
|
|
spin_unlock(&drvdata->spinlock);
|
|
|
|
|
|
return size;
|
|
@@ -179,8 +177,9 @@ static ssize_t trigger_event_show(struct device *dev,
|
|
|
{
|
|
|
unsigned long val;
|
|
|
struct etm_drvdata *drvdata = dev_get_drvdata(dev->parent);
|
|
|
+ struct etm_config *config = &drvdata->config;
|
|
|
|
|
|
- val = drvdata->trigger_event;
|
|
|
+ val = config->trigger_event;
|
|
|
return sprintf(buf, "%#lx\n", val);
|
|
|
}
|
|
|
|
|
@@ -191,12 +190,13 @@ static ssize_t trigger_event_store(struct device *dev,
|
|
|
int ret;
|
|
|
unsigned long val;
|
|
|
struct etm_drvdata *drvdata = dev_get_drvdata(dev->parent);
|
|
|
+ struct etm_config *config = &drvdata->config;
|
|
|
|
|
|
ret = kstrtoul(buf, 16, &val);
|
|
|
if (ret)
|
|
|
return ret;
|
|
|
|
|
|
- drvdata->trigger_event = val & ETM_EVENT_MASK;
|
|
|
+ config->trigger_event = val & ETM_EVENT_MASK;
|
|
|
|
|
|
return size;
|
|
|
}
|
|
@@ -207,8 +207,9 @@ static ssize_t enable_event_show(struct device *dev,
|
|
|
{
|
|
|
unsigned long val;
|
|
|
struct etm_drvdata *drvdata = dev_get_drvdata(dev->parent);
|
|
|
+ struct etm_config *config = &drvdata->config;
|
|
|
|
|
|
- val = drvdata->enable_event;
|
|
|
+ val = config->enable_event;
|
|
|
return sprintf(buf, "%#lx\n", val);
|
|
|
}
|
|
|
|
|
@@ -219,12 +220,13 @@ static ssize_t enable_event_store(struct device *dev,
|
|
|
int ret;
|
|
|
unsigned long val;
|
|
|
struct etm_drvdata *drvdata = dev_get_drvdata(dev->parent);
|
|
|
+ struct etm_config *config = &drvdata->config;
|
|
|
|
|
|
ret = kstrtoul(buf, 16, &val);
|
|
|
if (ret)
|
|
|
return ret;
|
|
|
|
|
|
- drvdata->enable_event = val & ETM_EVENT_MASK;
|
|
|
+ config->enable_event = val & ETM_EVENT_MASK;
|
|
|
|
|
|
return size;
|
|
|
}
|
|
@@ -235,8 +237,9 @@ static ssize_t fifofull_level_show(struct device *dev,
|
|
|
{
|
|
|
unsigned long val;
|
|
|
struct etm_drvdata *drvdata = dev_get_drvdata(dev->parent);
|
|
|
+ struct etm_config *config = &drvdata->config;
|
|
|
|
|
|
- val = drvdata->fifofull_level;
|
|
|
+ val = config->fifofull_level;
|
|
|
return sprintf(buf, "%#lx\n", val);
|
|
|
}
|
|
|
|
|
@@ -247,12 +250,13 @@ static ssize_t fifofull_level_store(struct device *dev,
|
|
|
int ret;
|
|
|
unsigned long val;
|
|
|
struct etm_drvdata *drvdata = dev_get_drvdata(dev->parent);
|
|
|
+ struct etm_config *config = &drvdata->config;
|
|
|
|
|
|
ret = kstrtoul(buf, 16, &val);
|
|
|
if (ret)
|
|
|
return ret;
|
|
|
|
|
|
- drvdata->fifofull_level = val;
|
|
|
+ config->fifofull_level = val;
|
|
|
|
|
|
return size;
|
|
|
}
|
|
@@ -263,8 +267,9 @@ static ssize_t addr_idx_show(struct device *dev,
|
|
|
{
|
|
|
unsigned long val;
|
|
|
struct etm_drvdata *drvdata = dev_get_drvdata(dev->parent);
|
|
|
+ struct etm_config *config = &drvdata->config;
|
|
|
|
|
|
- val = drvdata->addr_idx;
|
|
|
+ val = config->addr_idx;
|
|
|
return sprintf(buf, "%#lx\n", val);
|
|
|
}
|
|
|
|
|
@@ -275,6 +280,7 @@ static ssize_t addr_idx_store(struct device *dev,
|
|
|
int ret;
|
|
|
unsigned long val;
|
|
|
struct etm_drvdata *drvdata = dev_get_drvdata(dev->parent);
|
|
|
+ struct etm_config *config = &drvdata->config;
|
|
|
|
|
|
ret = kstrtoul(buf, 16, &val);
|
|
|
if (ret)
|
|
@@ -288,7 +294,7 @@ static ssize_t addr_idx_store(struct device *dev,
|
|
|
* dereferenced multiple times within a spinlock block elsewhere.
|
|
|
*/
|
|
|
spin_lock(&drvdata->spinlock);
|
|
|
- drvdata->addr_idx = val;
|
|
|
+ config->addr_idx = val;
|
|
|
spin_unlock(&drvdata->spinlock);
|
|
|
|
|
|
return size;
|
|
@@ -301,16 +307,17 @@ static ssize_t addr_single_show(struct device *dev,
|
|
|
u8 idx;
|
|
|
unsigned long val;
|
|
|
struct etm_drvdata *drvdata = dev_get_drvdata(dev->parent);
|
|
|
+ struct etm_config *config = &drvdata->config;
|
|
|
|
|
|
spin_lock(&drvdata->spinlock);
|
|
|
- idx = drvdata->addr_idx;
|
|
|
- if (!(drvdata->addr_type[idx] == ETM_ADDR_TYPE_NONE ||
|
|
|
- drvdata->addr_type[idx] == ETM_ADDR_TYPE_SINGLE)) {
|
|
|
+ idx = config->addr_idx;
|
|
|
+ if (!(config->addr_type[idx] == ETM_ADDR_TYPE_NONE ||
|
|
|
+ config->addr_type[idx] == ETM_ADDR_TYPE_SINGLE)) {
|
|
|
spin_unlock(&drvdata->spinlock);
|
|
|
return -EINVAL;
|
|
|
}
|
|
|
|
|
|
- val = drvdata->addr_val[idx];
|
|
|
+ val = config->addr_val[idx];
|
|
|
spin_unlock(&drvdata->spinlock);
|
|
|
|
|
|
return sprintf(buf, "%#lx\n", val);
|
|
@@ -324,21 +331,22 @@ static ssize_t addr_single_store(struct device *dev,
|
|
|
int ret;
|
|
|
unsigned long val;
|
|
|
struct etm_drvdata *drvdata = dev_get_drvdata(dev->parent);
|
|
|
+ struct etm_config *config = &drvdata->config;
|
|
|
|
|
|
ret = kstrtoul(buf, 16, &val);
|
|
|
if (ret)
|
|
|
return ret;
|
|
|
|
|
|
spin_lock(&drvdata->spinlock);
|
|
|
- idx = drvdata->addr_idx;
|
|
|
- if (!(drvdata->addr_type[idx] == ETM_ADDR_TYPE_NONE ||
|
|
|
- drvdata->addr_type[idx] == ETM_ADDR_TYPE_SINGLE)) {
|
|
|
+ idx = config->addr_idx;
|
|
|
+ if (!(config->addr_type[idx] == ETM_ADDR_TYPE_NONE ||
|
|
|
+ config->addr_type[idx] == ETM_ADDR_TYPE_SINGLE)) {
|
|
|
spin_unlock(&drvdata->spinlock);
|
|
|
return -EINVAL;
|
|
|
}
|
|
|
|
|
|
- drvdata->addr_val[idx] = val;
|
|
|
- drvdata->addr_type[idx] = ETM_ADDR_TYPE_SINGLE;
|
|
|
+ config->addr_val[idx] = val;
|
|
|
+ config->addr_type[idx] = ETM_ADDR_TYPE_SINGLE;
|
|
|
spin_unlock(&drvdata->spinlock);
|
|
|
|
|
|
return size;
|
|
@@ -351,23 +359,24 @@ static ssize_t addr_range_show(struct device *dev,
|
|
|
u8 idx;
|
|
|
unsigned long val1, val2;
|
|
|
struct etm_drvdata *drvdata = dev_get_drvdata(dev->parent);
|
|
|
+ struct etm_config *config = &drvdata->config;
|
|
|
|
|
|
spin_lock(&drvdata->spinlock);
|
|
|
- idx = drvdata->addr_idx;
|
|
|
+ idx = config->addr_idx;
|
|
|
if (idx % 2 != 0) {
|
|
|
spin_unlock(&drvdata->spinlock);
|
|
|
return -EPERM;
|
|
|
}
|
|
|
- if (!((drvdata->addr_type[idx] == ETM_ADDR_TYPE_NONE &&
|
|
|
- drvdata->addr_type[idx + 1] == ETM_ADDR_TYPE_NONE) ||
|
|
|
- (drvdata->addr_type[idx] == ETM_ADDR_TYPE_RANGE &&
|
|
|
- drvdata->addr_type[idx + 1] == ETM_ADDR_TYPE_RANGE))) {
|
|
|
+ if (!((config->addr_type[idx] == ETM_ADDR_TYPE_NONE &&
|
|
|
+ config->addr_type[idx + 1] == ETM_ADDR_TYPE_NONE) ||
|
|
|
+ (config->addr_type[idx] == ETM_ADDR_TYPE_RANGE &&
|
|
|
+ config->addr_type[idx + 1] == ETM_ADDR_TYPE_RANGE))) {
|
|
|
spin_unlock(&drvdata->spinlock);
|
|
|
return -EPERM;
|
|
|
}
|
|
|
|
|
|
- val1 = drvdata->addr_val[idx];
|
|
|
- val2 = drvdata->addr_val[idx + 1];
|
|
|
+ val1 = config->addr_val[idx];
|
|
|
+ val2 = config->addr_val[idx + 1];
|
|
|
spin_unlock(&drvdata->spinlock);
|
|
|
|
|
|
return sprintf(buf, "%#lx %#lx\n", val1, val2);
|
|
@@ -380,6 +389,7 @@ static ssize_t addr_range_store(struct device *dev,
|
|
|
u8 idx;
|
|
|
unsigned long val1, val2;
|
|
|
struct etm_drvdata *drvdata = dev_get_drvdata(dev->parent);
|
|
|
+ struct etm_config *config = &drvdata->config;
|
|
|
|
|
|
if (sscanf(buf, "%lx %lx", &val1, &val2) != 2)
|
|
|
return -EINVAL;
|
|
@@ -388,24 +398,24 @@ static ssize_t addr_range_store(struct device *dev,
|
|
|
return -EINVAL;
|
|
|
|
|
|
spin_lock(&drvdata->spinlock);
|
|
|
- idx = drvdata->addr_idx;
|
|
|
+ idx = config->addr_idx;
|
|
|
if (idx % 2 != 0) {
|
|
|
spin_unlock(&drvdata->spinlock);
|
|
|
return -EPERM;
|
|
|
}
|
|
|
- if (!((drvdata->addr_type[idx] == ETM_ADDR_TYPE_NONE &&
|
|
|
- drvdata->addr_type[idx + 1] == ETM_ADDR_TYPE_NONE) ||
|
|
|
- (drvdata->addr_type[idx] == ETM_ADDR_TYPE_RANGE &&
|
|
|
- drvdata->addr_type[idx + 1] == ETM_ADDR_TYPE_RANGE))) {
|
|
|
+ if (!((config->addr_type[idx] == ETM_ADDR_TYPE_NONE &&
|
|
|
+ config->addr_type[idx + 1] == ETM_ADDR_TYPE_NONE) ||
|
|
|
+ (config->addr_type[idx] == ETM_ADDR_TYPE_RANGE &&
|
|
|
+ config->addr_type[idx + 1] == ETM_ADDR_TYPE_RANGE))) {
|
|
|
spin_unlock(&drvdata->spinlock);
|
|
|
return -EPERM;
|
|
|
}
|
|
|
|
|
|
- drvdata->addr_val[idx] = val1;
|
|
|
- drvdata->addr_type[idx] = ETM_ADDR_TYPE_RANGE;
|
|
|
- drvdata->addr_val[idx + 1] = val2;
|
|
|
- drvdata->addr_type[idx + 1] = ETM_ADDR_TYPE_RANGE;
|
|
|
- drvdata->enable_ctrl1 |= (1 << (idx/2));
|
|
|
+ config->addr_val[idx] = val1;
|
|
|
+ config->addr_type[idx] = ETM_ADDR_TYPE_RANGE;
|
|
|
+ config->addr_val[idx + 1] = val2;
|
|
|
+ config->addr_type[idx + 1] = ETM_ADDR_TYPE_RANGE;
|
|
|
+ config->enable_ctrl1 |= (1 << (idx/2));
|
|
|
spin_unlock(&drvdata->spinlock);
|
|
|
|
|
|
return size;
|
|
@@ -418,16 +428,17 @@ static ssize_t addr_start_show(struct device *dev,
|
|
|
u8 idx;
|
|
|
unsigned long val;
|
|
|
struct etm_drvdata *drvdata = dev_get_drvdata(dev->parent);
|
|
|
+ struct etm_config *config = &drvdata->config;
|
|
|
|
|
|
spin_lock(&drvdata->spinlock);
|
|
|
- idx = drvdata->addr_idx;
|
|
|
- if (!(drvdata->addr_type[idx] == ETM_ADDR_TYPE_NONE ||
|
|
|
- drvdata->addr_type[idx] == ETM_ADDR_TYPE_START)) {
|
|
|
+ idx = config->addr_idx;
|
|
|
+ if (!(config->addr_type[idx] == ETM_ADDR_TYPE_NONE ||
|
|
|
+ config->addr_type[idx] == ETM_ADDR_TYPE_START)) {
|
|
|
spin_unlock(&drvdata->spinlock);
|
|
|
return -EPERM;
|
|
|
}
|
|
|
|
|
|
- val = drvdata->addr_val[idx];
|
|
|
+ val = config->addr_val[idx];
|
|
|
spin_unlock(&drvdata->spinlock);
|
|
|
|
|
|
return sprintf(buf, "%#lx\n", val);
|
|
@@ -441,23 +452,24 @@ static ssize_t addr_start_store(struct device *dev,
|
|
|
int ret;
|
|
|
unsigned long val;
|
|
|
struct etm_drvdata *drvdata = dev_get_drvdata(dev->parent);
|
|
|
+ struct etm_config *config = &drvdata->config;
|
|
|
|
|
|
ret = kstrtoul(buf, 16, &val);
|
|
|
if (ret)
|
|
|
return ret;
|
|
|
|
|
|
spin_lock(&drvdata->spinlock);
|
|
|
- idx = drvdata->addr_idx;
|
|
|
- if (!(drvdata->addr_type[idx] == ETM_ADDR_TYPE_NONE ||
|
|
|
- drvdata->addr_type[idx] == ETM_ADDR_TYPE_START)) {
|
|
|
+ idx = config->addr_idx;
|
|
|
+ if (!(config->addr_type[idx] == ETM_ADDR_TYPE_NONE ||
|
|
|
+ config->addr_type[idx] == ETM_ADDR_TYPE_START)) {
|
|
|
spin_unlock(&drvdata->spinlock);
|
|
|
return -EPERM;
|
|
|
}
|
|
|
|
|
|
- drvdata->addr_val[idx] = val;
|
|
|
- drvdata->addr_type[idx] = ETM_ADDR_TYPE_START;
|
|
|
- drvdata->startstop_ctrl |= (1 << idx);
|
|
|
- drvdata->enable_ctrl1 |= BIT(25);
|
|
|
+ config->addr_val[idx] = val;
|
|
|
+ config->addr_type[idx] = ETM_ADDR_TYPE_START;
|
|
|
+ config->startstop_ctrl |= (1 << idx);
|
|
|
+ config->enable_ctrl1 |= BIT(25);
|
|
|
spin_unlock(&drvdata->spinlock);
|
|
|
|
|
|
return size;
|
|
@@ -470,16 +482,17 @@ static ssize_t addr_stop_show(struct device *dev,
|
|
|
u8 idx;
|
|
|
unsigned long val;
|
|
|
struct etm_drvdata *drvdata = dev_get_drvdata(dev->parent);
|
|
|
+ struct etm_config *config = &drvdata->config;
|
|
|
|
|
|
spin_lock(&drvdata->spinlock);
|
|
|
- idx = drvdata->addr_idx;
|
|
|
- if (!(drvdata->addr_type[idx] == ETM_ADDR_TYPE_NONE ||
|
|
|
- drvdata->addr_type[idx] == ETM_ADDR_TYPE_STOP)) {
|
|
|
+ idx = config->addr_idx;
|
|
|
+ if (!(config->addr_type[idx] == ETM_ADDR_TYPE_NONE ||
|
|
|
+ config->addr_type[idx] == ETM_ADDR_TYPE_STOP)) {
|
|
|
spin_unlock(&drvdata->spinlock);
|
|
|
return -EPERM;
|
|
|
}
|
|
|
|
|
|
- val = drvdata->addr_val[idx];
|
|
|
+ val = config->addr_val[idx];
|
|
|
spin_unlock(&drvdata->spinlock);
|
|
|
|
|
|
return sprintf(buf, "%#lx\n", val);
|
|
@@ -493,23 +506,24 @@ static ssize_t addr_stop_store(struct device *dev,
|
|
|
int ret;
|
|
|
unsigned long val;
|
|
|
struct etm_drvdata *drvdata = dev_get_drvdata(dev->parent);
|
|
|
+ struct etm_config *config = &drvdata->config;
|
|
|
|
|
|
ret = kstrtoul(buf, 16, &val);
|
|
|
if (ret)
|
|
|
return ret;
|
|
|
|
|
|
spin_lock(&drvdata->spinlock);
|
|
|
- idx = drvdata->addr_idx;
|
|
|
- if (!(drvdata->addr_type[idx] == ETM_ADDR_TYPE_NONE ||
|
|
|
- drvdata->addr_type[idx] == ETM_ADDR_TYPE_STOP)) {
|
|
|
+ idx = config->addr_idx;
|
|
|
+ if (!(config->addr_type[idx] == ETM_ADDR_TYPE_NONE ||
|
|
|
+ config->addr_type[idx] == ETM_ADDR_TYPE_STOP)) {
|
|
|
spin_unlock(&drvdata->spinlock);
|
|
|
return -EPERM;
|
|
|
}
|
|
|
|
|
|
- drvdata->addr_val[idx] = val;
|
|
|
- drvdata->addr_type[idx] = ETM_ADDR_TYPE_STOP;
|
|
|
- drvdata->startstop_ctrl |= (1 << (idx + 16));
|
|
|
- drvdata->enable_ctrl1 |= ETMTECR1_START_STOP;
|
|
|
+ config->addr_val[idx] = val;
|
|
|
+ config->addr_type[idx] = ETM_ADDR_TYPE_STOP;
|
|
|
+ config->startstop_ctrl |= (1 << (idx + 16));
|
|
|
+ config->enable_ctrl1 |= ETMTECR1_START_STOP;
|
|
|
spin_unlock(&drvdata->spinlock);
|
|
|
|
|
|
return size;
|
|
@@ -521,9 +535,10 @@ static ssize_t addr_acctype_show(struct device *dev,
|
|
|
{
|
|
|
unsigned long val;
|
|
|
struct etm_drvdata *drvdata = dev_get_drvdata(dev->parent);
|
|
|
+ struct etm_config *config = &drvdata->config;
|
|
|
|
|
|
spin_lock(&drvdata->spinlock);
|
|
|
- val = drvdata->addr_acctype[drvdata->addr_idx];
|
|
|
+ val = config->addr_acctype[config->addr_idx];
|
|
|
spin_unlock(&drvdata->spinlock);
|
|
|
|
|
|
return sprintf(buf, "%#lx\n", val);
|
|
@@ -536,13 +551,14 @@ static ssize_t addr_acctype_store(struct device *dev,
|
|
|
int ret;
|
|
|
unsigned long val;
|
|
|
struct etm_drvdata *drvdata = dev_get_drvdata(dev->parent);
|
|
|
+ struct etm_config *config = &drvdata->config;
|
|
|
|
|
|
ret = kstrtoul(buf, 16, &val);
|
|
|
if (ret)
|
|
|
return ret;
|
|
|
|
|
|
spin_lock(&drvdata->spinlock);
|
|
|
- drvdata->addr_acctype[drvdata->addr_idx] = val;
|
|
|
+ config->addr_acctype[config->addr_idx] = val;
|
|
|
spin_unlock(&drvdata->spinlock);
|
|
|
|
|
|
return size;
|
|
@@ -554,8 +570,9 @@ static ssize_t cntr_idx_show(struct device *dev,
|
|
|
{
|
|
|
unsigned long val;
|
|
|
struct etm_drvdata *drvdata = dev_get_drvdata(dev->parent);
|
|
|
+ struct etm_config *config = &drvdata->config;
|
|
|
|
|
|
- val = drvdata->cntr_idx;
|
|
|
+ val = config->cntr_idx;
|
|
|
return sprintf(buf, "%#lx\n", val);
|
|
|
}
|
|
|
|
|
@@ -566,6 +583,7 @@ static ssize_t cntr_idx_store(struct device *dev,
|
|
|
int ret;
|
|
|
unsigned long val;
|
|
|
struct etm_drvdata *drvdata = dev_get_drvdata(dev->parent);
|
|
|
+ struct etm_config *config = &drvdata->config;
|
|
|
|
|
|
ret = kstrtoul(buf, 16, &val);
|
|
|
if (ret)
|
|
@@ -578,7 +596,7 @@ static ssize_t cntr_idx_store(struct device *dev,
|
|
|
* dereferenced multiple times within a spinlock block elsewhere.
|
|
|
*/
|
|
|
spin_lock(&drvdata->spinlock);
|
|
|
- drvdata->cntr_idx = val;
|
|
|
+ config->cntr_idx = val;
|
|
|
spin_unlock(&drvdata->spinlock);
|
|
|
|
|
|
return size;
|
|
@@ -590,9 +608,10 @@ static ssize_t cntr_rld_val_show(struct device *dev,
|
|
|
{
|
|
|
unsigned long val;
|
|
|
struct etm_drvdata *drvdata = dev_get_drvdata(dev->parent);
|
|
|
+ struct etm_config *config = &drvdata->config;
|
|
|
|
|
|
spin_lock(&drvdata->spinlock);
|
|
|
- val = drvdata->cntr_rld_val[drvdata->cntr_idx];
|
|
|
+ val = config->cntr_rld_val[config->cntr_idx];
|
|
|
spin_unlock(&drvdata->spinlock);
|
|
|
|
|
|
return sprintf(buf, "%#lx\n", val);
|
|
@@ -605,13 +624,14 @@ static ssize_t cntr_rld_val_store(struct device *dev,
|
|
|
int ret;
|
|
|
unsigned long val;
|
|
|
struct etm_drvdata *drvdata = dev_get_drvdata(dev->parent);
|
|
|
+ struct etm_config *config = &drvdata->config;
|
|
|
|
|
|
ret = kstrtoul(buf, 16, &val);
|
|
|
if (ret)
|
|
|
return ret;
|
|
|
|
|
|
spin_lock(&drvdata->spinlock);
|
|
|
- drvdata->cntr_rld_val[drvdata->cntr_idx] = val;
|
|
|
+ config->cntr_rld_val[config->cntr_idx] = val;
|
|
|
spin_unlock(&drvdata->spinlock);
|
|
|
|
|
|
return size;
|
|
@@ -623,9 +643,10 @@ static ssize_t cntr_event_show(struct device *dev,
|
|
|
{
|
|
|
unsigned long val;
|
|
|
struct etm_drvdata *drvdata = dev_get_drvdata(dev->parent);
|
|
|
+ struct etm_config *config = &drvdata->config;
|
|
|
|
|
|
spin_lock(&drvdata->spinlock);
|
|
|
- val = drvdata->cntr_event[drvdata->cntr_idx];
|
|
|
+ val = config->cntr_event[config->cntr_idx];
|
|
|
spin_unlock(&drvdata->spinlock);
|
|
|
|
|
|
return sprintf(buf, "%#lx\n", val);
|
|
@@ -638,13 +659,14 @@ static ssize_t cntr_event_store(struct device *dev,
|
|
|
int ret;
|
|
|
unsigned long val;
|
|
|
struct etm_drvdata *drvdata = dev_get_drvdata(dev->parent);
|
|
|
+ struct etm_config *config = &drvdata->config;
|
|
|
|
|
|
ret = kstrtoul(buf, 16, &val);
|
|
|
if (ret)
|
|
|
return ret;
|
|
|
|
|
|
spin_lock(&drvdata->spinlock);
|
|
|
- drvdata->cntr_event[drvdata->cntr_idx] = val & ETM_EVENT_MASK;
|
|
|
+ config->cntr_event[config->cntr_idx] = val & ETM_EVENT_MASK;
|
|
|
spin_unlock(&drvdata->spinlock);
|
|
|
|
|
|
return size;
|
|
@@ -656,9 +678,10 @@ static ssize_t cntr_rld_event_show(struct device *dev,
|
|
|
{
|
|
|
unsigned long val;
|
|
|
struct etm_drvdata *drvdata = dev_get_drvdata(dev->parent);
|
|
|
+ struct etm_config *config = &drvdata->config;
|
|
|
|
|
|
spin_lock(&drvdata->spinlock);
|
|
|
- val = drvdata->cntr_rld_event[drvdata->cntr_idx];
|
|
|
+ val = config->cntr_rld_event[config->cntr_idx];
|
|
|
spin_unlock(&drvdata->spinlock);
|
|
|
|
|
|
return sprintf(buf, "%#lx\n", val);
|
|
@@ -671,13 +694,14 @@ static ssize_t cntr_rld_event_store(struct device *dev,
|
|
|
int ret;
|
|
|
unsigned long val;
|
|
|
struct etm_drvdata *drvdata = dev_get_drvdata(dev->parent);
|
|
|
+ struct etm_config *config = &drvdata->config;
|
|
|
|
|
|
ret = kstrtoul(buf, 16, &val);
|
|
|
if (ret)
|
|
|
return ret;
|
|
|
|
|
|
spin_lock(&drvdata->spinlock);
|
|
|
- drvdata->cntr_rld_event[drvdata->cntr_idx] = val & ETM_EVENT_MASK;
|
|
|
+ config->cntr_rld_event[config->cntr_idx] = val & ETM_EVENT_MASK;
|
|
|
spin_unlock(&drvdata->spinlock);
|
|
|
|
|
|
return size;
|
|
@@ -690,12 +714,13 @@ static ssize_t cntr_val_show(struct device *dev,
|
|
|
int i, ret = 0;
|
|
|
u32 val;
|
|
|
struct etm_drvdata *drvdata = dev_get_drvdata(dev->parent);
|
|
|
+ struct etm_config *config = &drvdata->config;
|
|
|
|
|
|
if (!drvdata->enable) {
|
|
|
spin_lock(&drvdata->spinlock);
|
|
|
for (i = 0; i < drvdata->nr_cntr; i++)
|
|
|
ret += sprintf(buf, "counter %d: %x\n",
|
|
|
- i, drvdata->cntr_val[i]);
|
|
|
+ i, config->cntr_val[i]);
|
|
|
spin_unlock(&drvdata->spinlock);
|
|
|
return ret;
|
|
|
}
|
|
@@ -715,13 +740,14 @@ static ssize_t cntr_val_store(struct device *dev,
|
|
|
int ret;
|
|
|
unsigned long val;
|
|
|
struct etm_drvdata *drvdata = dev_get_drvdata(dev->parent);
|
|
|
+ struct etm_config *config = &drvdata->config;
|
|
|
|
|
|
ret = kstrtoul(buf, 16, &val);
|
|
|
if (ret)
|
|
|
return ret;
|
|
|
|
|
|
spin_lock(&drvdata->spinlock);
|
|
|
- drvdata->cntr_val[drvdata->cntr_idx] = val;
|
|
|
+ config->cntr_val[config->cntr_idx] = val;
|
|
|
spin_unlock(&drvdata->spinlock);
|
|
|
|
|
|
return size;
|
|
@@ -733,8 +759,9 @@ static ssize_t seq_12_event_show(struct device *dev,
|
|
|
{
|
|
|
unsigned long val;
|
|
|
struct etm_drvdata *drvdata = dev_get_drvdata(dev->parent);
|
|
|
+ struct etm_config *config = &drvdata->config;
|
|
|
|
|
|
- val = drvdata->seq_12_event;
|
|
|
+ val = config->seq_12_event;
|
|
|
return sprintf(buf, "%#lx\n", val);
|
|
|
}
|
|
|
|
|
@@ -745,12 +772,13 @@ static ssize_t seq_12_event_store(struct device *dev,
|
|
|
int ret;
|
|
|
unsigned long val;
|
|
|
struct etm_drvdata *drvdata = dev_get_drvdata(dev->parent);
|
|
|
+ struct etm_config *config = &drvdata->config;
|
|
|
|
|
|
ret = kstrtoul(buf, 16, &val);
|
|
|
if (ret)
|
|
|
return ret;
|
|
|
|
|
|
- drvdata->seq_12_event = val & ETM_EVENT_MASK;
|
|
|
+ config->seq_12_event = val & ETM_EVENT_MASK;
|
|
|
return size;
|
|
|
}
|
|
|
static DEVICE_ATTR_RW(seq_12_event);
|
|
@@ -760,8 +788,9 @@ static ssize_t seq_21_event_show(struct device *dev,
|
|
|
{
|
|
|
unsigned long val;
|
|
|
struct etm_drvdata *drvdata = dev_get_drvdata(dev->parent);
|
|
|
+ struct etm_config *config = &drvdata->config;
|
|
|
|
|
|
- val = drvdata->seq_21_event;
|
|
|
+ val = config->seq_21_event;
|
|
|
return sprintf(buf, "%#lx\n", val);
|
|
|
}
|
|
|
|
|
@@ -772,12 +801,13 @@ static ssize_t seq_21_event_store(struct device *dev,
|
|
|
int ret;
|
|
|
unsigned long val;
|
|
|
struct etm_drvdata *drvdata = dev_get_drvdata(dev->parent);
|
|
|
+ struct etm_config *config = &drvdata->config;
|
|
|
|
|
|
ret = kstrtoul(buf, 16, &val);
|
|
|
if (ret)
|
|
|
return ret;
|
|
|
|
|
|
- drvdata->seq_21_event = val & ETM_EVENT_MASK;
|
|
|
+ config->seq_21_event = val & ETM_EVENT_MASK;
|
|
|
return size;
|
|
|
}
|
|
|
static DEVICE_ATTR_RW(seq_21_event);
|
|
@@ -787,8 +817,9 @@ static ssize_t seq_23_event_show(struct device *dev,
|
|
|
{
|
|
|
unsigned long val;
|
|
|
struct etm_drvdata *drvdata = dev_get_drvdata(dev->parent);
|
|
|
+ struct etm_config *config = &drvdata->config;
|
|
|
|
|
|
- val = drvdata->seq_23_event;
|
|
|
+ val = config->seq_23_event;
|
|
|
return sprintf(buf, "%#lx\n", val);
|
|
|
}
|
|
|
|
|
@@ -799,12 +830,13 @@ static ssize_t seq_23_event_store(struct device *dev,
|
|
|
int ret;
|
|
|
unsigned long val;
|
|
|
struct etm_drvdata *drvdata = dev_get_drvdata(dev->parent);
|
|
|
+ struct etm_config *config = &drvdata->config;
|
|
|
|
|
|
ret = kstrtoul(buf, 16, &val);
|
|
|
if (ret)
|
|
|
return ret;
|
|
|
|
|
|
- drvdata->seq_23_event = val & ETM_EVENT_MASK;
|
|
|
+ config->seq_23_event = val & ETM_EVENT_MASK;
|
|
|
return size;
|
|
|
}
|
|
|
static DEVICE_ATTR_RW(seq_23_event);
|
|
@@ -814,8 +846,9 @@ static ssize_t seq_31_event_show(struct device *dev,
|
|
|
{
|
|
|
unsigned long val;
|
|
|
struct etm_drvdata *drvdata = dev_get_drvdata(dev->parent);
|
|
|
+ struct etm_config *config = &drvdata->config;
|
|
|
|
|
|
- val = drvdata->seq_31_event;
|
|
|
+ val = config->seq_31_event;
|
|
|
return sprintf(buf, "%#lx\n", val);
|
|
|
}
|
|
|
|
|
@@ -826,12 +859,13 @@ static ssize_t seq_31_event_store(struct device *dev,
|
|
|
int ret;
|
|
|
unsigned long val;
|
|
|
struct etm_drvdata *drvdata = dev_get_drvdata(dev->parent);
|
|
|
+ struct etm_config *config = &drvdata->config;
|
|
|
|
|
|
ret = kstrtoul(buf, 16, &val);
|
|
|
if (ret)
|
|
|
return ret;
|
|
|
|
|
|
- drvdata->seq_31_event = val & ETM_EVENT_MASK;
|
|
|
+ config->seq_31_event = val & ETM_EVENT_MASK;
|
|
|
return size;
|
|
|
}
|
|
|
static DEVICE_ATTR_RW(seq_31_event);
|
|
@@ -841,8 +875,9 @@ static ssize_t seq_32_event_show(struct device *dev,
|
|
|
{
|
|
|
unsigned long val;
|
|
|
struct etm_drvdata *drvdata = dev_get_drvdata(dev->parent);
|
|
|
+ struct etm_config *config = &drvdata->config;
|
|
|
|
|
|
- val = drvdata->seq_32_event;
|
|
|
+ val = config->seq_32_event;
|
|
|
return sprintf(buf, "%#lx\n", val);
|
|
|
}
|
|
|
|
|
@@ -853,12 +888,13 @@ static ssize_t seq_32_event_store(struct device *dev,
|
|
|
int ret;
|
|
|
unsigned long val;
|
|
|
struct etm_drvdata *drvdata = dev_get_drvdata(dev->parent);
|
|
|
+ struct etm_config *config = &drvdata->config;
|
|
|
|
|
|
ret = kstrtoul(buf, 16, &val);
|
|
|
if (ret)
|
|
|
return ret;
|
|
|
|
|
|
- drvdata->seq_32_event = val & ETM_EVENT_MASK;
|
|
|
+ config->seq_32_event = val & ETM_EVENT_MASK;
|
|
|
return size;
|
|
|
}
|
|
|
static DEVICE_ATTR_RW(seq_32_event);
|
|
@@ -868,8 +904,9 @@ static ssize_t seq_13_event_show(struct device *dev,
|
|
|
{
|
|
|
unsigned long val;
|
|
|
struct etm_drvdata *drvdata = dev_get_drvdata(dev->parent);
|
|
|
+ struct etm_config *config = &drvdata->config;
|
|
|
|
|
|
- val = drvdata->seq_13_event;
|
|
|
+ val = config->seq_13_event;
|
|
|
return sprintf(buf, "%#lx\n", val);
|
|
|
}
|
|
|
|
|
@@ -880,12 +917,13 @@ static ssize_t seq_13_event_store(struct device *dev,
|
|
|
int ret;
|
|
|
unsigned long val;
|
|
|
struct etm_drvdata *drvdata = dev_get_drvdata(dev->parent);
|
|
|
+ struct etm_config *config = &drvdata->config;
|
|
|
|
|
|
ret = kstrtoul(buf, 16, &val);
|
|
|
if (ret)
|
|
|
return ret;
|
|
|
|
|
|
- drvdata->seq_13_event = val & ETM_EVENT_MASK;
|
|
|
+ config->seq_13_event = val & ETM_EVENT_MASK;
|
|
|
return size;
|
|
|
}
|
|
|
static DEVICE_ATTR_RW(seq_13_event);
|
|
@@ -895,9 +933,10 @@ static ssize_t seq_curr_state_show(struct device *dev,
|
|
|
{
|
|
|
unsigned long val, flags;
|
|
|
struct etm_drvdata *drvdata = dev_get_drvdata(dev->parent);
|
|
|
+ struct etm_config *config = &drvdata->config;
|
|
|
|
|
|
if (!drvdata->enable) {
|
|
|
- val = drvdata->seq_curr_state;
|
|
|
+ val = config->seq_curr_state;
|
|
|
goto out;
|
|
|
}
|
|
|
|
|
@@ -921,6 +960,7 @@ static ssize_t seq_curr_state_store(struct device *dev,
|
|
|
int ret;
|
|
|
unsigned long val;
|
|
|
struct etm_drvdata *drvdata = dev_get_drvdata(dev->parent);
|
|
|
+ struct etm_config *config = &drvdata->config;
|
|
|
|
|
|
ret = kstrtoul(buf, 16, &val);
|
|
|
if (ret)
|
|
@@ -929,7 +969,7 @@ static ssize_t seq_curr_state_store(struct device *dev,
|
|
|
if (val > ETM_SEQ_STATE_MAX_VAL)
|
|
|
return -EINVAL;
|
|
|
|
|
|
- drvdata->seq_curr_state = val;
|
|
|
+ config->seq_curr_state = val;
|
|
|
|
|
|
return size;
|
|
|
}
|
|
@@ -940,8 +980,9 @@ static ssize_t ctxid_idx_show(struct device *dev,
|
|
|
{
|
|
|
unsigned long val;
|
|
|
struct etm_drvdata *drvdata = dev_get_drvdata(dev->parent);
|
|
|
+ struct etm_config *config = &drvdata->config;
|
|
|
|
|
|
- val = drvdata->ctxid_idx;
|
|
|
+ val = config->ctxid_idx;
|
|
|
return sprintf(buf, "%#lx\n", val);
|
|
|
}
|
|
|
|
|
@@ -952,6 +993,7 @@ static ssize_t ctxid_idx_store(struct device *dev,
|
|
|
int ret;
|
|
|
unsigned long val;
|
|
|
struct etm_drvdata *drvdata = dev_get_drvdata(dev->parent);
|
|
|
+ struct etm_config *config = &drvdata->config;
|
|
|
|
|
|
ret = kstrtoul(buf, 16, &val);
|
|
|
if (ret)
|
|
@@ -965,7 +1007,7 @@ static ssize_t ctxid_idx_store(struct device *dev,
|
|
|
* dereferenced multiple times within a spinlock block elsewhere.
|
|
|
*/
|
|
|
spin_lock(&drvdata->spinlock);
|
|
|
- drvdata->ctxid_idx = val;
|
|
|
+ config->ctxid_idx = val;
|
|
|
spin_unlock(&drvdata->spinlock);
|
|
|
|
|
|
return size;
|
|
@@ -977,9 +1019,10 @@ static ssize_t ctxid_pid_show(struct device *dev,
|
|
|
{
|
|
|
unsigned long val;
|
|
|
struct etm_drvdata *drvdata = dev_get_drvdata(dev->parent);
|
|
|
+ struct etm_config *config = &drvdata->config;
|
|
|
|
|
|
spin_lock(&drvdata->spinlock);
|
|
|
- val = drvdata->ctxid_vpid[drvdata->ctxid_idx];
|
|
|
+ val = config->ctxid_vpid[config->ctxid_idx];
|
|
|
spin_unlock(&drvdata->spinlock);
|
|
|
|
|
|
return sprintf(buf, "%#lx\n", val);
|
|
@@ -992,6 +1035,7 @@ static ssize_t ctxid_pid_store(struct device *dev,
|
|
|
int ret;
|
|
|
unsigned long vpid, pid;
|
|
|
struct etm_drvdata *drvdata = dev_get_drvdata(dev->parent);
|
|
|
+ struct etm_config *config = &drvdata->config;
|
|
|
|
|
|
ret = kstrtoul(buf, 16, &vpid);
|
|
|
if (ret)
|
|
@@ -1000,8 +1044,8 @@ static ssize_t ctxid_pid_store(struct device *dev,
|
|
|
pid = coresight_vpid_to_pid(vpid);
|
|
|
|
|
|
spin_lock(&drvdata->spinlock);
|
|
|
- drvdata->ctxid_pid[drvdata->ctxid_idx] = pid;
|
|
|
- drvdata->ctxid_vpid[drvdata->ctxid_idx] = vpid;
|
|
|
+ config->ctxid_pid[config->ctxid_idx] = pid;
|
|
|
+ config->ctxid_vpid[config->ctxid_idx] = vpid;
|
|
|
spin_unlock(&drvdata->spinlock);
|
|
|
|
|
|
return size;
|
|
@@ -1013,8 +1057,9 @@ static ssize_t ctxid_mask_show(struct device *dev,
|
|
|
{
|
|
|
unsigned long val;
|
|
|
struct etm_drvdata *drvdata = dev_get_drvdata(dev->parent);
|
|
|
+ struct etm_config *config = &drvdata->config;
|
|
|
|
|
|
- val = drvdata->ctxid_mask;
|
|
|
+ val = config->ctxid_mask;
|
|
|
return sprintf(buf, "%#lx\n", val);
|
|
|
}
|
|
|
|
|
@@ -1025,12 +1070,13 @@ static ssize_t ctxid_mask_store(struct device *dev,
|
|
|
int ret;
|
|
|
unsigned long val;
|
|
|
struct etm_drvdata *drvdata = dev_get_drvdata(dev->parent);
|
|
|
+ struct etm_config *config = &drvdata->config;
|
|
|
|
|
|
ret = kstrtoul(buf, 16, &val);
|
|
|
if (ret)
|
|
|
return ret;
|
|
|
|
|
|
- drvdata->ctxid_mask = val;
|
|
|
+ config->ctxid_mask = val;
|
|
|
return size;
|
|
|
}
|
|
|
static DEVICE_ATTR_RW(ctxid_mask);
|
|
@@ -1040,8 +1086,9 @@ static ssize_t sync_freq_show(struct device *dev,
|
|
|
{
|
|
|
unsigned long val;
|
|
|
struct etm_drvdata *drvdata = dev_get_drvdata(dev->parent);
|
|
|
+ struct etm_config *config = &drvdata->config;
|
|
|
|
|
|
- val = drvdata->sync_freq;
|
|
|
+ val = config->sync_freq;
|
|
|
return sprintf(buf, "%#lx\n", val);
|
|
|
}
|
|
|
|
|
@@ -1052,12 +1099,13 @@ static ssize_t sync_freq_store(struct device *dev,
|
|
|
int ret;
|
|
|
unsigned long val;
|
|
|
struct etm_drvdata *drvdata = dev_get_drvdata(dev->parent);
|
|
|
+ struct etm_config *config = &drvdata->config;
|
|
|
|
|
|
ret = kstrtoul(buf, 16, &val);
|
|
|
if (ret)
|
|
|
return ret;
|
|
|
|
|
|
- drvdata->sync_freq = val & ETM_SYNC_MASK;
|
|
|
+ config->sync_freq = val & ETM_SYNC_MASK;
|
|
|
return size;
|
|
|
}
|
|
|
static DEVICE_ATTR_RW(sync_freq);
|
|
@@ -1067,8 +1115,9 @@ static ssize_t timestamp_event_show(struct device *dev,
|
|
|
{
|
|
|
unsigned long val;
|
|
|
struct etm_drvdata *drvdata = dev_get_drvdata(dev->parent);
|
|
|
+ struct etm_config *config = &drvdata->config;
|
|
|
|
|
|
- val = drvdata->timestamp_event;
|
|
|
+ val = config->timestamp_event;
|
|
|
return sprintf(buf, "%#lx\n", val);
|
|
|
}
|
|
|
|
|
@@ -1079,12 +1128,13 @@ static ssize_t timestamp_event_store(struct device *dev,
|
|
|
int ret;
|
|
|
unsigned long val;
|
|
|
struct etm_drvdata *drvdata = dev_get_drvdata(dev->parent);
|
|
|
+ struct etm_config *config = &drvdata->config;
|
|
|
|
|
|
ret = kstrtoul(buf, 16, &val);
|
|
|
if (ret)
|
|
|
return ret;
|
|
|
|
|
|
- drvdata->timestamp_event = val & ETM_EVENT_MASK;
|
|
|
+ config->timestamp_event = val & ETM_EVENT_MASK;
|
|
|
return size;
|
|
|
}
|
|
|
static DEVICE_ATTR_RW(timestamp_event);
|