summaryrefslogtreecommitdiff
path: root/cs40l25
diff options
context:
space:
mode:
authorTim Howe <tim.howe@cirrus.com>2020-10-12 17:30:10 -0500
committerchasewu <chasewu@google.com>2021-05-18 08:13:05 +0800
commitbb8e3995da5f54648115be90d8dcaba9fe3de2b4 (patch)
tree4c4df1e5c64ed3491fb2b2ed260d074d1b25bf0c /cs40l25
parent27e7b63002ae4091b830a64c765157056c60a978 (diff)
downloadamplifiers-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.c74
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,