static int cti_enable_hw(struct cti_drvdata *drvdata)
{
struct cti_config *config = &drvdata->config;
- unsigned long flags;
- int rc = 0;
+ int rc;
- raw_spin_lock_irqsave(&drvdata->spinlock, flags);
+ guard(raw_spinlock_irqsave)(&drvdata->spinlock);
/* no need to do anything if enabled or unpowered*/
if (config->hw_enabled || !config->hw_powered)
/* claim the device */
rc = coresight_claim_device(drvdata->csdev);
if (rc)
- goto cti_err_not_enabled;
+ return rc;
cti_write_all_hw_regs(drvdata);
config->hw_enabled = true;
- drvdata->config.enable_req_count++;
- raw_spin_unlock_irqrestore(&drvdata->spinlock, flags);
- return rc;
cti_state_unchanged:
drvdata->config.enable_req_count++;
-
- /* cannot enable due to error */
-cti_err_not_enabled:
- raw_spin_unlock_irqrestore(&drvdata->spinlock, flags);
- return rc;
+ return 0;
}
/* re-enable CTI on CPU when using CPU hotplug */
{
struct cti_config *config = &drvdata->config;
- raw_spin_lock(&drvdata->spinlock);
+ guard(raw_spinlock_irqsave)(&drvdata->spinlock);
+
config->hw_powered = true;
/* no need to do anything if no enable request */
if (!drvdata->config.enable_req_count)
- goto cti_hp_not_enabled;
+ return;
/* try to claim the device */
if (coresight_claim_device(drvdata->csdev))
- goto cti_hp_not_enabled;
+ return;
cti_write_all_hw_regs(drvdata);
config->hw_enabled = true;
- raw_spin_unlock(&drvdata->spinlock);
return;
-
- /* did not re-enable due to no claim / no request */
-cti_hp_not_enabled:
- raw_spin_unlock(&drvdata->spinlock);
}
/* disable hardware */
{
struct cti_config *config = &drvdata->config;
struct coresight_device *csdev = drvdata->csdev;
- int ret = 0;
- raw_spin_lock(&drvdata->spinlock);
+ guard(raw_spinlock_irqsave)(&drvdata->spinlock);
/* don't allow negative refcounts, return an error */
- if (!drvdata->config.enable_req_count) {
- ret = -EINVAL;
- goto cti_not_disabled;
- }
+ if (!drvdata->config.enable_req_count)
+ return -EINVAL;
/* check refcount - disable on 0 */
if (--drvdata->config.enable_req_count > 0)
- goto cti_not_disabled;
+ return 0;
/* no need to do anything if disabled or cpu unpowered */
if (!config->hw_enabled || !config->hw_powered)
- goto cti_not_disabled;
+ return 0;
CS_UNLOCK(drvdata->base);
coresight_disclaim_device_unlocked(csdev);
CS_LOCK(drvdata->base);
- raw_spin_unlock(&drvdata->spinlock);
- return ret;
-
- /* not disabled this call */
-cti_not_disabled:
- raw_spin_unlock(&drvdata->spinlock);
- return ret;
+ return 0;
}
void cti_write_single_reg(struct cti_drvdata *drvdata, int offset, u32 value)
struct cti_drvdata *drvdata = dev_get_drvdata(dev->parent);
struct cti_config *config = &drvdata->config;
- raw_spin_lock(&drvdata->spinlock);
+ guard(raw_spinlock_irqsave)(&drvdata->spinlock);
+
/* write if enabled */
if (cti_active(config))
cti_write_single_reg(drvdata, CTIINTACK, ackval);
- raw_spin_unlock(&drvdata->spinlock);
}
/*
reg_offset = (direction == CTI_TRIG_IN ? CTIINEN(trigger_idx) :
CTIOUTEN(trigger_idx));
- raw_spin_lock(&drvdata->spinlock);
+ guard(raw_spinlock_irqsave)(&drvdata->spinlock);
/* read - modify write - the trigger / channel enable value */
reg_value = direction == CTI_TRIG_IN ? config->ctiinen[trigger_idx] :
/* write through if enabled */
if (cti_active(config))
cti_write_single_reg(drvdata, reg_offset, reg_value);
- raw_spin_unlock(&drvdata->spinlock);
+
return 0;
}
chan_bitmask = BIT(channel_idx);
- raw_spin_lock(&drvdata->spinlock);
+ guard(raw_spinlock_irqsave)(&drvdata->spinlock);
+
reg_value = config->ctigate;
switch (op) {
case CTI_GATE_CHAN_ENABLE:
if (cti_active(config))
cti_write_single_reg(drvdata, CTIGATE, reg_value);
}
- raw_spin_unlock(&drvdata->spinlock);
+
return err;
}
chan_bitmask = BIT(channel_idx);
- raw_spin_lock(&drvdata->spinlock);
+ guard(raw_spinlock_irqsave)(&drvdata->spinlock);
+
reg_value = config->ctiappset;
switch (op) {
case CTI_CHAN_SET:
if ((err == 0) && cti_active(config))
cti_write_single_reg(drvdata, reg_offset, reg_value);
- raw_spin_unlock(&drvdata->spinlock);
return err;
}
if (WARN_ON_ONCE(drvdata->ctidev.cpu != cpu))
return NOTIFY_BAD;
- raw_spin_lock(&drvdata->spinlock);
+ guard(raw_spinlock_irqsave)(&drvdata->spinlock);
switch (cmd) {
case CPU_PM_ENTER:
}
cti_notify_exit:
- raw_spin_unlock(&drvdata->spinlock);
return notify_res;
}
if (!drvdata)
return 0;
- raw_spin_lock(&drvdata->spinlock);
+ guard(raw_spinlock_irqsave)(&drvdata->spinlock);
+
drvdata->config.hw_powered = false;
if (drvdata->config.hw_enabled)
coresight_disclaim_device(drvdata->csdev);
- raw_spin_unlock(&drvdata->spinlock);
+
return 0;
}
bool enabled, powered;
struct cti_drvdata *drvdata = dev_get_drvdata(dev->parent);
- raw_spin_lock(&drvdata->spinlock);
- enable_req = drvdata->config.enable_req_count;
- powered = drvdata->config.hw_powered;
- enabled = drvdata->config.hw_enabled;
- raw_spin_unlock(&drvdata->spinlock);
+ scoped_guard(raw_spinlock_irqsave, &drvdata->spinlock) {
+ enable_req = drvdata->config.enable_req_count;
+ powered = drvdata->config.hw_powered;
+ enabled = drvdata->config.hw_enabled;
+ }
if (powered)
return sprintf(buf, "%d\n", enabled);
bool powered;
struct cti_drvdata *drvdata = dev_get_drvdata(dev->parent);
- raw_spin_lock(&drvdata->spinlock);
- powered = drvdata->config.hw_powered;
- raw_spin_unlock(&drvdata->spinlock);
+ scoped_guard(raw_spinlock_irqsave, &drvdata->spinlock)
+ powered = drvdata->config.hw_powered;
return sprintf(buf, "%d\n", powered);
}
u32 val = 0;
pm_runtime_get_sync(dev->parent);
- raw_spin_lock(&drvdata->spinlock);
- if (drvdata->config.hw_powered)
- val = readl_relaxed(drvdata->base + cti_attr->off);
- raw_spin_unlock(&drvdata->spinlock);
+
+ scoped_guard(raw_spinlock_irqsave, &drvdata->spinlock) {
+ if (drvdata->config.hw_powered)
+ val = readl_relaxed(drvdata->base + cti_attr->off);
+ }
+
pm_runtime_put_sync(dev->parent);
return sysfs_emit(buf, "0x%x\n", val);
}
return -EINVAL;
pm_runtime_get_sync(dev->parent);
- raw_spin_lock(&drvdata->spinlock);
- if (drvdata->config.hw_powered)
- cti_write_single_reg(drvdata, cti_attr->off, val);
- raw_spin_unlock(&drvdata->spinlock);
+
+ scoped_guard(raw_spinlock_irqsave, &drvdata->spinlock) {
+ if (drvdata->config.hw_powered)
+ cti_write_single_reg(drvdata, cti_attr->off, val);
+ }
+
pm_runtime_put_sync(dev->parent);
return size;
}
struct cti_drvdata *drvdata = dev_get_drvdata(dev->parent);
struct cti_config *config = &drvdata->config;
- raw_spin_lock(&drvdata->spinlock);
- if ((reg_offset >= 0) && cti_active(config)) {
- CS_UNLOCK(drvdata->base);
- val = readl_relaxed(drvdata->base + reg_offset);
- if (pcached_val)
- *pcached_val = val;
- CS_LOCK(drvdata->base);
- } else if (pcached_val) {
- val = *pcached_val;
+ scoped_guard(raw_spinlock_irqsave, &drvdata->spinlock) {
+ if ((reg_offset >= 0) && cti_active(config)) {
+ CS_UNLOCK(drvdata->base);
+ val = readl_relaxed(drvdata->base + reg_offset);
+ if (pcached_val)
+ *pcached_val = val;
+ CS_LOCK(drvdata->base);
+ } else if (pcached_val) {
+ val = *pcached_val;
+ }
}
- raw_spin_unlock(&drvdata->spinlock);
+
return sprintf(buf, "%#x\n", val);
}
if (kstrtoul(buf, 0, &val))
return -EINVAL;
- raw_spin_lock(&drvdata->spinlock);
- /* local store */
- if (pcached_val)
- *pcached_val = (u32)val;
+ scoped_guard(raw_spinlock_irqsave, &drvdata->spinlock) {
+ /* local store */
+ if (pcached_val)
+ *pcached_val = (u32)val;
+
+ /* write through if offset and enabled */
+ if ((reg_offset >= 0) && cti_active(config))
+ cti_write_single_reg(drvdata, reg_offset, val);
+ }
- /* write through if offset and enabled */
- if ((reg_offset >= 0) && cti_active(config))
- cti_write_single_reg(drvdata, reg_offset, val);
- raw_spin_unlock(&drvdata->spinlock);
return size;
}
if (val > (CTIINOUTEN_MAX - 1))
return -EINVAL;
- raw_spin_lock(&drvdata->spinlock);
+ guard(raw_spinlock_irqsave)(&drvdata->spinlock);
+
drvdata->config.ctiinout_sel = val;
- raw_spin_unlock(&drvdata->spinlock);
return size;
}
static DEVICE_ATTR_RW(inout_sel);
int index;
struct cti_drvdata *drvdata = dev_get_drvdata(dev->parent);
- raw_spin_lock(&drvdata->spinlock);
- index = drvdata->config.ctiinout_sel;
- val = drvdata->config.ctiinen[index];
- raw_spin_unlock(&drvdata->spinlock);
+ scoped_guard(raw_spinlock_irqsave, &drvdata->spinlock) {
+ index = drvdata->config.ctiinout_sel;
+ val = drvdata->config.ctiinen[index];
+ }
+
return sprintf(buf, "%#lx\n", val);
}
if (kstrtoul(buf, 0, &val))
return -EINVAL;
- raw_spin_lock(&drvdata->spinlock);
+ guard(raw_spinlock_irqsave)(&drvdata->spinlock);
+
index = config->ctiinout_sel;
config->ctiinen[index] = val;
/* write through if enabled */
if (cti_active(config))
cti_write_single_reg(drvdata, CTIINEN(index), val);
- raw_spin_unlock(&drvdata->spinlock);
+
return size;
}
static DEVICE_ATTR_RW(inen);
int index;
struct cti_drvdata *drvdata = dev_get_drvdata(dev->parent);
- raw_spin_lock(&drvdata->spinlock);
- index = drvdata->config.ctiinout_sel;
- val = drvdata->config.ctiouten[index];
- raw_spin_unlock(&drvdata->spinlock);
+ scoped_guard(raw_spinlock_irqsave, &drvdata->spinlock) {
+ index = drvdata->config.ctiinout_sel;
+ val = drvdata->config.ctiouten[index];
+ }
+
return sprintf(buf, "%#lx\n", val);
}
if (kstrtoul(buf, 0, &val))
return -EINVAL;
- raw_spin_lock(&drvdata->spinlock);
+ guard(raw_spinlock_irqsave)(&drvdata->spinlock);
+
index = config->ctiinout_sel;
config->ctiouten[index] = val;
/* write through if enabled */
if (cti_active(config))
cti_write_single_reg(drvdata, CTIOUTEN(index), val);
- raw_spin_unlock(&drvdata->spinlock);
+
return size;
}
static DEVICE_ATTR_RW(outen);
if (kstrtoul(buf, 0, &val))
return -EINVAL;
- raw_spin_lock(&drvdata->spinlock);
+ guard(raw_spinlock_irqsave)(&drvdata->spinlock);
/* a 1'b1 in appclr clears down the same bit in appset*/
config->ctiappset &= ~val;
/* write through if enabled */
if (cti_active(config))
cti_write_single_reg(drvdata, CTIAPPCLEAR, val);
- raw_spin_unlock(&drvdata->spinlock);
+
return size;
}
static DEVICE_ATTR_WO(appclear);
if (kstrtoul(buf, 0, &val))
return -EINVAL;
- raw_spin_lock(&drvdata->spinlock);
+ guard(raw_spinlock_irqsave)(&drvdata->spinlock);
/* write through if enabled */
if (cti_active(config))
cti_write_single_reg(drvdata, CTIAPPPULSE, val);
- raw_spin_unlock(&drvdata->spinlock);
+
return size;
}
static DEVICE_ATTR_WO(apppulse);
u32 val;
struct cti_drvdata *drvdata = dev_get_drvdata(dev->parent);
- raw_spin_lock(&drvdata->spinlock);
- val = drvdata->config.trig_filter_enable;
- raw_spin_unlock(&drvdata->spinlock);
+ scoped_guard(raw_spinlock_irqsave, &drvdata->spinlock)
+ val = drvdata->config.trig_filter_enable;
+
return sprintf(buf, "%d\n", val);
}
if (kstrtoul(buf, 0, &val))
return -EINVAL;
- raw_spin_lock(&drvdata->spinlock);
+ guard(raw_spinlock_irqsave)(&drvdata->spinlock);
+
drvdata->config.trig_filter_enable = !!val;
- raw_spin_unlock(&drvdata->spinlock);
return size;
}
static DEVICE_ATTR_RW(trig_filter_enable);
struct cti_drvdata *drvdata = dev_get_drvdata(dev->parent);
struct cti_config *config = &drvdata->config;
- raw_spin_lock(&drvdata->spinlock);
+ guard(raw_spinlock_irqsave)(&drvdata->spinlock);
/* clear the CTI trigger / channel programming registers */
for (i = 0; i < config->nr_trig_max; i++) {
if (cti_active(config))
cti_write_all_hw_regs(drvdata);
- raw_spin_unlock(&drvdata->spinlock);
return size;
}
static DEVICE_ATTR_WO(chan_xtrigs_reset);
if (val > (drvdata->config.nr_ctm_channels - 1))
return -EINVAL;
- raw_spin_lock(&drvdata->spinlock);
+ guard(raw_spinlock_irqsave)(&drvdata->spinlock);
+
drvdata->config.xtrig_rchan_sel = val;
- raw_spin_unlock(&drvdata->spinlock);
return size;
}
unsigned long val;
struct cti_drvdata *drvdata = dev_get_drvdata(dev->parent);
- raw_spin_lock(&drvdata->spinlock);
- val = drvdata->config.xtrig_rchan_sel;
- raw_spin_unlock(&drvdata->spinlock);
+ scoped_guard(raw_spinlock_irqsave, &drvdata->spinlock)
+ val = drvdata->config.xtrig_rchan_sel;
return sprintf(buf, "%ld\n", val);
}
unsigned long inuse_bits = 0, chan_mask;
/* scan regs to get bitmap of channels in use. */
- raw_spin_lock(&drvdata->spinlock);
- for (i = 0; i < config->nr_trig_max; i++) {
- inuse_bits |= config->ctiinen[i];
- inuse_bits |= config->ctiouten[i];
+ scoped_guard(raw_spinlock_irqsave, &drvdata->spinlock) {
+ for (i = 0; i < config->nr_trig_max; i++) {
+ inuse_bits |= config->ctiinen[i];
+ inuse_bits |= config->ctiouten[i];
+ }
}
- raw_spin_unlock(&drvdata->spinlock);
/* inverse bits if printing free channels */
if (!inuse)