diff --git a/drivers/misc/cs40l20.c b/drivers/misc/cs40l20.c index 749c6a7b58d9..5792abd6e6df 100644 --- a/drivers/misc/cs40l20.c +++ b/drivers/misc/cs40l20.c @@ -319,6 +319,53 @@ static ssize_t cs40l20_redc_measured_show(struct device *dev, return snprintf(buf, PAGE_SIZE, "%d\n", redc_measured); } +static ssize_t cs40l20_redc_stored_show(struct device *dev, + struct device_attribute *attr, char *buf) +{ + struct cs40l20_private *cs40l20 = cs40l20_get_private(dev); + int ret; + unsigned int val; + + mutex_lock(&cs40l20->lock); + ret = regmap_read(cs40l20->regmap, + cs40l20_dsp_reg(cs40l20, "REDC_STORED", + CS40L20_XM_UNPACKED_TYPE), &val); + mutex_unlock(&cs40l20->lock); + + if (ret) { + pr_err("Failed to read stored ReDC\n"); + return ret; + } + + return snprintf(buf, PAGE_SIZE, "%d\n", val); +} + +static ssize_t cs40l20_redc_stored_store(struct device *dev, + struct device_attribute *attr, + const char *buf, size_t count) +{ + struct cs40l20_private *cs40l20 = cs40l20_get_private(dev); + int ret; + unsigned int val; + + ret = kstrtou32(buf, 10, &val); + if (ret) + return -EINVAL; + + mutex_lock(&cs40l20->lock); + ret = regmap_write(cs40l20->regmap, + cs40l20_dsp_reg(cs40l20, "REDC_STORED", + CS40L20_XM_UNPACKED_TYPE), val); + mutex_unlock(&cs40l20->lock); + + if (ret) { + pr_err("Failed to store ReDC\n"); + return ret; + } + + return count; +} + static ssize_t cs40l20_dig_scale_show(struct device *dev, struct device_attribute *attr, char *buf) { @@ -369,6 +416,8 @@ static DEVICE_ATTR(f0_measured, 0660, cs40l20_f0_measured_show, NULL); static DEVICE_ATTR(f0_stored, 0660, cs40l20_f0_stored_show, cs40l20_f0_stored_store); static DEVICE_ATTR(redc_measured, 0660, cs40l20_redc_measured_show, NULL); +static DEVICE_ATTR(redc_stored, 0660, cs40l20_redc_stored_show, + cs40l20_redc_stored_store); static DEVICE_ATTR(dig_scale, 0660, cs40l20_dig_scale_show, cs40l20_dig_scale_store); @@ -379,6 +428,7 @@ static struct attribute *cs40l20_dev_attrs[] = { &dev_attr_f0_measured.attr, &dev_attr_f0_stored.attr, &dev_attr_redc_measured.attr, + &dev_attr_redc_stored.attr, &dev_attr_dig_scale.attr, NULL, }; diff --git a/drivers/misc/cs40l20.h b/drivers/misc/cs40l20.h index c16078766aea..14de2740857d 100644 --- a/drivers/misc/cs40l20.h +++ b/drivers/misc/cs40l20.h @@ -697,7 +697,7 @@ #define CS40L20_XM_LIST_TERM 0xBEDEAD #define CS40L20_NUM_ALGOS_MAX 16 -#define CS40L20_FW_REV_MIN 0x000205 +#define CS40L20_FW_REV_MIN 0x000300 #define CS40L20_ALGO_ID_SIZE 4 #define CS40L20_COEFF_COUNT_SIZE 4