diff options
author | Tim Howe <tim.howe@cirrus.com> | 2020-10-12 17:30:10 -0500 |
---|---|---|
committer | chasewu <chasewu@google.com> | 2021-05-18 08:13:05 +0800 |
commit | bb8e3995da5f54648115be90d8dcaba9fe3de2b4 (patch) | |
tree | 4c4df1e5c64ed3491fb2b2ed260d074d1b25bf0c /cs40l25 | |
parent | 27e7b63002ae4091b830a64c765157056c60a978 (diff) | |
download | amplifiers-bb8e3995da5f54648115be90d8dcaba9fe3de2b4.tar.gz |
misc: cs40l25: Add bemf_shift control
Allows the end-user to shift the values of the bemf_rec output from 0
to 24 digits in order to display an appropriate amount of precision
for each value. Default value is 12.
Bug: 186142403
Test: check the sysfs nodes
Change-Id: I3da77470a426a08da5fd96774b415f211b03e8c8
Signed-off-by: Tim Howe <tim.howe@cirrus.com>
Signed-off-by: Charles Keepax <ckeepax@opensource.cirrus.com>
Signed-off-by: chasewu <chasewu@google.com>
Diffstat (limited to 'cs40l25')
-rw-r--r-- | cs40l25/cs40l2x.c | 74 |
1 files changed, 74 insertions, 0 deletions
diff --git a/cs40l25/cs40l2x.c b/cs40l25/cs40l2x.c index d759b7a..5b7d2b2 100644 --- a/cs40l25/cs40l2x.c +++ b/cs40l25/cs40l2x.c @@ -4088,6 +4088,77 @@ err_bemf_rec_en: return ret; } +static ssize_t cs40l2x_bemf_shift_store(struct device *dev, + struct device_attribute *attr, + const char *buf, size_t count) +{ + struct cs40l2x_private *cs40l2x = cs40l2x_get_private(dev); + struct regmap *regmap = cs40l2x->regmap; + unsigned int reg, val; + int ret; + + ret = kstrtou32(buf, 10, &val); + if (ret) + return -EINVAL; + + pm_runtime_get_sync(cs40l2x->dev); + mutex_lock(&cs40l2x->lock); + + reg = cs40l2x_dsp_reg(cs40l2x, "BEMF_SHIFT", + CS40L2X_XM_UNPACKED_TYPE, CS40L2X_ALGO_ID_PAR); + if (!reg) { + dev_err(cs40l2x->dev, "Unable to get bemf shift register\n"); + ret = -EPERM; + goto err_exit; + } + + ret = regmap_write(regmap, reg, val); + if (ret) + goto err_exit; + + ret = count; + +err_exit: + mutex_unlock(&cs40l2x->lock); + pm_runtime_mark_last_busy(cs40l2x->dev); + pm_runtime_put_autosuspend(cs40l2x->dev); + + return ret; +} + +static ssize_t cs40l2x_bemf_shift_show(struct device *dev, + struct device_attribute *attr, char *buf) +{ + struct cs40l2x_private *cs40l2x = cs40l2x_get_private(dev); + struct regmap *regmap = cs40l2x->regmap; + unsigned int reg, val; + int ret; + + pm_runtime_get_sync(cs40l2x->dev); + mutex_lock(&cs40l2x->lock); + + reg = cs40l2x_dsp_reg(cs40l2x, "BEMF_SHIFT", + CS40L2X_XM_UNPACKED_TYPE, CS40L2X_ALGO_ID_PAR); + if (!reg) { + dev_err(cs40l2x->dev, "Unable to get bemf shift register\n"); + ret = -EINVAL; + goto err_exit; + } + + ret = regmap_read(regmap, reg, &val); + if (ret) + goto err_exit; + + ret = snprintf(buf, PAGE_SIZE, "%d\n", val); + +err_exit: + mutex_unlock(&cs40l2x->lock); + pm_runtime_mark_last_busy(cs40l2x->dev); + pm_runtime_put_autosuspend(cs40l2x->dev); + + return ret; +} + static ssize_t cs40l2x_dyn_f0_show(struct device *dev, struct device_attribute *attr, char *buf) { @@ -6690,6 +6761,8 @@ static DEVICE_ATTR(bemf_measured, 0660, cs40l2x_bemf_measured_show, NULL); static DEVICE_ATTR(bemf_rec, 0660, cs40l2x_bemf_rec_show, NULL); static DEVICE_ATTR(bemf_rec_en, 0660, cs40l2x_bemf_rec_en_show, cs40l2x_bemf_rec_en_store); +static DEVICE_ATTR(bemf_shift, 0660, cs40l2x_bemf_shift_show, + cs40l2x_bemf_shift_store); static DEVICE_ATTR(dynamic_f0, 0660, cs40l2x_dyn_f0_show, NULL); static DEVICE_ATTR(dynamic_f0_index, 0660, cs40l2x_dyn_f0_index_show, cs40l2x_dyn_f0_index_store); @@ -6811,6 +6884,7 @@ static struct attribute *cs40l2x_dev_attrs[] = { &dev_attr_bemf_measured.attr, &dev_attr_bemf_rec.attr, &dev_attr_bemf_rec_en.attr, + &dev_attr_bemf_shift.attr, &dev_attr_dynamic_f0.attr, &dev_attr_dynamic_f0_index.attr, &dev_attr_dynamic_f0_val.attr, |