summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPixelBot AutoMerger <android-nexus-securitybot@system.gserviceaccount.com>2022-11-13 18:34:20 -0800
committerSecurityBot <android-nexus-securitybot@system.gserviceaccount.com>2022-11-13 18:34:20 -0800
commitb0f4296a7368213c91a93df13f212c834689eaab (patch)
tree304b682c7fa505e153b54a2c03955f351e54db5b
parent5f2484108386af73566a0efc2d7ef720ab392975 (diff)
parent35d385c24c28edeeab94483ee9beb423b5eee3c1 (diff)
downloadamplifiers-b0f4296a7368213c91a93df13f212c834689eaab.tar.gz
Merge android13-gs-pixel-5.10-tm-qpr2 into android13-gs-pixel-5.10-tm-qpr3
SBMerger: 478053055 Change-Id: Ic312698f8971c7427cbc5b0ed778817becdc9007 Signed-off-by: SecurityBot <android-nexus-securitybot@system.gserviceaccount.com>
-rw-r--r--audiometrics/audiometrics.c217
-rw-r--r--audiometrics/uapi/audiometrics_api.h2
2 files changed, 173 insertions, 46 deletions
diff --git a/audiometrics/audiometrics.c b/audiometrics/audiometrics.c
index 41f66ad..420fa40 100644
--- a/audiometrics/audiometrics.c
+++ b/audiometrics/audiometrics.c
@@ -70,6 +70,9 @@ struct audio_sz_type {
uint32_t mic_broken_degrade;
uint32_t ams_count;
uint32_t cs_count;
+ uint32_t cca_active;
+ uint32_t cca_enable;
+ uint32_t cca_cs;
};
struct audiometrics_priv_type {
@@ -166,60 +169,62 @@ static ssize_t speaker_impedance_show(struct device *dev,
struct device_attribute *attr, char *buf)
{
struct audiometrics_priv_type *priv = NULL;
- int counts = 0;
+ int i, length;
int scale = 100000;
if (IS_ERR_OR_NULL(dev))
- return -EINVAL;
+ return -ENODEV;
priv = dev_get_drvdata(dev);
if (IS_ERR_OR_NULL(priv))
- return -EINVAL;
+ return -ENODEV;
mutex_lock(&priv->lock);
- counts = scnprintf(buf, PAGE_SIZE, "%d.%05d,%d.%05d",
- priv->sz.speaker_impedance[0] / scale,
- priv->sz.speaker_impedance[0] % scale,
- priv->sz.speaker_impedance[1] / scale,
- priv->sz.speaker_impedance[1] % scale);
+ length = 0;
+ for (i = 0; i < SPEAKER_MAX_COUNT; i++) {
+ if (priv->sz.speaker_impedance[i] < 0)
+ continue;
- mutex_unlock(&priv->lock);
-
- dev_dbg(dev, "%s: %s\n", __func__, buf);
+ length += scnprintf(buf + length, PAGE_SIZE - length, "%.*s%d.%05d", i, ",",
+ priv->sz.speaker_impedance[i] / scale,
+ priv->sz.speaker_impedance[i] % scale);
+ }
- return counts;
+ mutex_unlock(&priv->lock);
+ return length;
}
static ssize_t speaker_temp_show(struct device *dev,
struct device_attribute *attr, char *buf)
{
struct audiometrics_priv_type *priv = NULL;
- int counts = 0;
+ int i, length;
int scale = 100000;
if (IS_ERR_OR_NULL(dev))
- return -EINVAL;
+ return -ENODEV;
priv = dev_get_drvdata(dev);
if (IS_ERR_OR_NULL(priv))
- return -EINVAL;
+ return -ENODEV;
mutex_lock(&priv->lock);
- counts = scnprintf(buf, PAGE_SIZE, "%d.%05d,%d.%05d",
- priv->sz.speaker_temp[0] / scale,
- priv->sz.speaker_temp[0] % scale,
- priv->sz.speaker_temp[1] / scale,
- priv->sz.speaker_temp[1] % scale);
-
- mutex_unlock(&priv->lock);
+ length = 0;
+ for (i = 0; i < SPEAKER_MAX_COUNT; i++) {
+ if (priv->sz.speaker_temp[i] < 0)
+ continue;
- dev_dbg(dev, "%s: %s\n", __func__, buf);
+ length += scnprintf(buf + length, PAGE_SIZE - length, "%.*s%d.%05d", i, ",",
+ priv->sz.speaker_temp[i] / scale,
+ priv->sz.speaker_temp[i] % scale);
+ }
- return counts;
+ mutex_unlock(&priv->lock);
+ return length;
}
@@ -227,30 +232,31 @@ static ssize_t speaker_excursion_show(struct device *dev,
struct device_attribute *attr, char *buf)
{
struct audiometrics_priv_type *priv = NULL;
- int counts = 0;
+ int i, length;
int scale = 100000;
if (IS_ERR_OR_NULL(dev))
- return -EINVAL;
+ return -ENODEV;
priv = dev_get_drvdata(dev);
if (IS_ERR_OR_NULL(priv))
- return -EINVAL;
+ return -ENODEV;
mutex_lock(&priv->lock);
- counts = scnprintf(buf, PAGE_SIZE, "%d.%05d,%d.%05d",
- priv->sz.speaker_excursion[0] / scale,
- priv->sz.speaker_excursion[0] % scale,
- priv->sz.speaker_excursion[1] / scale,
- priv->sz.speaker_excursion[1] % scale);
+ length = 0;
+ for (i = 0; i < SPEAKER_MAX_COUNT; i++) {
+ if (priv->sz.speaker_excursion[i] < 0)
+ continue;
- mutex_unlock(&priv->lock);
-
- dev_dbg(dev, "%s: %s\n", __func__, buf);
+ length += scnprintf(buf + length, PAGE_SIZE - length, "%.*s%d.%05d", i, ",",
+ priv->sz.speaker_excursion[i] / scale,
+ priv->sz.speaker_excursion[i] % scale);
+ }
- return counts;
+ mutex_unlock(&priv->lock);
+ return length;
}
@@ -259,27 +265,29 @@ static ssize_t speaker_heartbeat_show(struct device *dev,
struct device_attribute *attr, char *buf)
{
struct audiometrics_priv_type *priv = NULL;
- int counts = 0;
+ int i, length;
if (IS_ERR_OR_NULL(dev))
- return -EINVAL;
+ return -ENODEV;
priv = dev_get_drvdata(dev);
if (IS_ERR_OR_NULL(priv))
- return -EINVAL;
+ return -ENODEV;
mutex_lock(&priv->lock);
- counts = scnprintf(buf, PAGE_SIZE, "%d,%d",
- priv->sz.speaker_heartbeat[0],
- priv->sz.speaker_heartbeat[1]);
+ length = 0;
+ for (i = 0; i < SPEAKER_MAX_COUNT; i++) {
+ if (priv->sz.speaker_heartbeat[i] < 0)
+ continue;
- mutex_unlock(&priv->lock);
-
- dev_dbg(dev, "%s: %s\n", __func__, buf);
+ length += scnprintf(buf + length, PAGE_SIZE - length, "%.*s%d", i, ",",
+ priv->sz.speaker_heartbeat[i]);
+ }
- return counts;
+ mutex_unlock(&priv->lock);
+ return length;
}
static ssize_t codec_crashed_counter_show(struct device *dev,
@@ -400,6 +408,67 @@ static ssize_t ams_rate_read_once_show(struct device *dev,
return counts;
}
+static ssize_t cca_show(struct device *dev,
+ struct device_attribute *attr, char *buf)
+{
+ struct audiometrics_priv_type *priv;
+ int counts;
+
+ if (IS_ERR_OR_NULL(dev))
+ return -ENODEV;
+
+ priv = dev_get_drvdata(dev);
+
+ if (IS_ERR_OR_NULL(priv))
+ return -ENODEV;
+
+ mutex_lock(&priv->lock);
+ counts = scnprintf(buf, PAGE_SIZE, "%u,%u,%u", priv->sz.cca_active,
+ priv->sz.cca_enable, priv->sz.cca_cs);
+ mutex_unlock(&priv->lock);
+
+ return counts;
+}
+
+static ssize_t cca_rate_read_once_show(struct device *dev,
+ struct device_attribute *attr, char *buf)
+{
+ struct audiometrics_priv_type *priv;
+ int counts;
+ uint rate_active = 0, rate_enable = 0;
+ const int scale = 100;
+
+
+ if (IS_ERR_OR_NULL(dev))
+ return -ENODEV;
+
+ priv = dev_get_drvdata(dev);
+
+ if (IS_ERR_OR_NULL(priv))
+ return -ENODEV;
+
+ mutex_lock(&priv->lock);
+
+ if (priv->sz.cca_cs) {
+ rate_active = (priv->sz.cca_active * scale / priv->sz.cca_cs);
+ rate_enable = (priv->sz.cca_enable * scale / priv->sz.cca_cs);
+ }
+
+ if (rate_active > scale) {
+ rate_active = scale;
+ rate_enable = scale;
+ }
+
+ counts = scnprintf(buf, PAGE_SIZE, "%u,%u", rate_active, rate_enable);
+
+ priv->sz.cca_active = 0;
+ priv->sz.cca_enable = 0;
+ priv->sz.cca_cs = 0;
+
+ mutex_unlock(&priv->lock);
+ return counts;
+}
+
static int amcs_cdev_open(struct inode *inode, struct file *file)
{
struct audiometrics_priv_type *priv = container_of(inode->i_cdev,
@@ -550,6 +619,36 @@ static long amcs_cdev_unlocked_ioctl(struct file *file, unsigned int cmd, unsign
ret = 0;
break;
+ case AMCS_OP_CCA:
+ mutex_lock(&priv->lock);
+ if (params.val[0] == AMCS_OP2_GET) {
+ params.val[1] = priv->sz.cca_active;
+ params.val[2] = priv->sz.cca_enable;
+ params.val[3] = priv->sz.cca_cs;
+ } else if (params.val[0] == AMCS_OP2_SET) {
+ priv->sz.cca_active = params.val[1];
+ priv->sz.cca_enable = params.val[2];
+ priv->sz.cca_cs = params.val[3];
+ }
+ mutex_unlock(&priv->lock);
+
+ if (!copy_to_user((struct amcs_params *)arg, &params, _IOC_SIZE(cmd)))
+ ret = 0;
+ else
+ ret = -EINVAL;
+ break;
+
+ case AMCS_OP_CCA_INCREASE:
+ mutex_lock(&priv->lock);
+ if (params.val[0] == AMCS_OP2_SET) {
+ priv->sz.cca_active += params.val[1];
+ priv->sz.cca_enable += params.val[2];
+ priv->sz.cca_cs += params.val[3];
+ }
+ mutex_unlock(&priv->lock);
+ ret = 0;
+ break;
+
default:
dev_warn(priv->device, "%s, unsupported op = %d\n", __func__, params.op);
ret = -EINVAL;
@@ -611,6 +710,8 @@ static DEVICE_ATTR_RO(mic_broken_degrade);
static DEVICE_ATTR_RO(codec_crashed_counter);
static DEVICE_ATTR_RO(ams_cs);
static DEVICE_ATTR_RO(ams_rate_read_once);
+static DEVICE_ATTR_RO(cca);
+static DEVICE_ATTR_RO(cca_rate_read_once);
static struct attribute *audiometrics_fs_attrs[] = {
@@ -626,6 +727,8 @@ static struct attribute *audiometrics_fs_attrs[] = {
&dev_attr_codec_crashed_counter.attr,
&dev_attr_ams_cs.attr,
&dev_attr_ams_rate_read_once.attr,
+ &dev_attr_cca.attr,
+ &dev_attr_cca_rate_read_once.attr,
NULL,
};
@@ -650,6 +753,27 @@ static void init_hwinfo_revision(struct audiometrics_priv_type *priv)
mutex_unlock(&priv->lock);
}
+static void init_suez_speaker_default(struct audiometrics_priv_type *priv)
+{
+ int i;
+ mutex_lock(&priv->lock);
+ for (i = 0; i < SPEAKER_MAX_COUNT && i < 2; i++) {
+ priv->sz.speaker_impedance[i] = 0;
+ priv->sz.speaker_excursion[i] = 0;
+ priv->sz.speaker_temp[i] = 0;
+ priv->sz.speaker_heartbeat[i] = 0;
+ }
+
+ for (i = 2; i < SPEAKER_MAX_COUNT; i++) {
+ priv->sz.speaker_impedance[i] = -1;
+ priv->sz.speaker_excursion[i] = -1;
+ priv->sz.speaker_temp[i] = -1;
+ priv->sz.speaker_heartbeat[i] = -1;
+ }
+ mutex_unlock(&priv->lock);
+}
+
+
static int amcs_init_cdev(struct audiometrics_priv_type *priv)
{
int ret;
@@ -745,6 +869,7 @@ static int audiometrics_platform_probe(struct platform_device *pdev)
}
init_hwinfo_revision(priv);
+ init_suez_speaker_default(priv);
dev_dbg(&pdev->dev, "%s registered\n", __func__);
return 0;
diff --git a/audiometrics/uapi/audiometrics_api.h b/audiometrics/uapi/audiometrics_api.h
index 698d545..7877fd7 100644
--- a/audiometrics/uapi/audiometrics_api.h
+++ b/audiometrics/uapi/audiometrics_api.h
@@ -43,6 +43,8 @@ enum amcs_params_op {
AMCS_OP_COUNTER,
AMCS_OP_AMS,
AMCS_OP_AMS_INCREASE,
+ AMCS_OP_CCA,
+ AMCS_OP_CCA_INCREASE,
AMCS_OP_PARAMS_MAX,
};