diff options
author | Vince Leung <leungv@google.com> | 2021-09-16 22:41:14 +0000 |
---|---|---|
committer | Vince Leung <leungv@google.com> | 2021-10-05 17:00:16 +0000 |
commit | c6f439e235577d4b540ab72dfcf0e883ca6a9827 (patch) | |
tree | 9dd8677af7dd8fbcb86d1436f13879902088fa18 | |
parent | 0b8c23f3a0d6ec55cf4f152040bb62a67845778e (diff) | |
download | amplifiers-c6f439e235577d4b540ab72dfcf0e883ca6a9827.tar.gz |
misc: cs40l25: Add plwe ramp down interface
Add a sysfs interface to set the ramp down time on
pwle waveforms. The rampdown time is in steps of 1ms
with a maximum ramp down time of 50ms. A zero value
indicates that the feature is off.
Bug: 200713702
Test: verified that new node is added and working
Change-Id: I5a8898bd873c47c4d306d0dc1ccc79b082119459
Signed-off-by: Paul Handrigan <Paul.Handrigan@cirrus.com>
Signed-off-by: Vince Leung <leungv@google.com>
-rw-r--r-- | cs40l25/cs40l2x.c | 77 |
1 files changed, 77 insertions, 0 deletions
diff --git a/cs40l25/cs40l2x.c b/cs40l25/cs40l2x.c index 1c65044..977c09c 100644 --- a/cs40l25/cs40l2x.c +++ b/cs40l25/cs40l2x.c @@ -6438,10 +6438,86 @@ err_mutex: return count; } +static ssize_t cs40l2x_pwle_ramp_down_show(struct device *dev, + struct device_attribute *attr, + char *buf) +{ + struct cs40l2x_private *cs40l2x = cs40l2x_get_private(dev); + int ret; + unsigned int reg, val; + + pm_runtime_get_sync(cs40l2x->dev); + mutex_lock(&cs40l2x->lock); + + reg = cs40l2x_dsp_reg(cs40l2x, "RAMPDOWN_COEFF", + CS40L2X_XM_UNPACKED_TYPE, + cs40l2x->fw_desc->id); + if (!reg) { + ret = -EPERM; + goto err_mutex; + } + + ret = regmap_read(cs40l2x->regmap, reg, &val); + if (ret) + goto err_mutex; + + /* Q0.24 format */ + ret = snprintf(buf, PAGE_SIZE, "%u\n", val); + +err_mutex: + mutex_unlock(&cs40l2x->lock); + pm_runtime_mark_last_busy(cs40l2x->dev); + pm_runtime_put_autosuspend(cs40l2x->dev); + + return ret; +} + +static ssize_t cs40l2x_pwle_ramp_down_store(struct device *dev, + struct device_attribute *attr, + const char *buf, + size_t count) +{ + struct cs40l2x_private *cs40l2x = cs40l2x_get_private(dev); + int ret; + unsigned int reg, val; + + ret = kstrtou32(buf, 10, &val); + if (ret) + return -EINVAL; + + pm_runtime_get_sync(cs40l2x->dev); + mutex_lock(&cs40l2x->lock); + + reg = cs40l2x_dsp_reg(cs40l2x, "RAMPDOWN_COEFF", + CS40L2X_XM_UNPACKED_TYPE, + cs40l2x->fw_desc->id); + if (!reg) { + ret = -EPERM; + goto err_mutex; + } + + /* Q0.24 format */ + /* Zero value means that PWLE Ramp down is off */ + ret = regmap_write(cs40l2x->regmap, reg, val); + if (ret) + goto err_mutex; + + ret = count; + +err_mutex: + mutex_unlock(&cs40l2x->lock); + pm_runtime_mark_last_busy(cs40l2x->dev); + pm_runtime_put_autosuspend(cs40l2x->dev); + + return ret; +} + static DEVICE_ATTR(cp_trigger_index, 0660, cs40l2x_cp_trigger_index_show, cs40l2x_cp_trigger_index_store); static DEVICE_ATTR(cp_trigger_queue, 0660, cs40l2x_cp_trigger_queue_show, cs40l2x_cp_trigger_queue_store); +static DEVICE_ATTR(pwle_ramp_down, 0660, cs40l2x_pwle_ramp_down_show, + cs40l2x_pwle_ramp_down_store); static DEVICE_ATTR(cp_trigger_duration, 0660, cs40l2x_cp_trigger_duration_show, NULL); static DEVICE_ATTR(cp_trigger_q_sub, 0660, cs40l2x_cp_trigger_q_sub_show, @@ -6656,6 +6732,7 @@ static struct attribute *cs40l2x_dev_attrs[] = { &dev_attr_virtual_pwle_indexes.attr, &dev_attr_available_pwle_segments.attr, &dev_attr_boost_ipk.attr, + &dev_attr_pwle_ramp_down.attr, NULL, }; |