summaryrefslogtreecommitdiff
path: root/audiometrics/audiometrics.c
diff options
context:
space:
mode:
Diffstat (limited to 'audiometrics/audiometrics.c')
-rw-r--r--audiometrics/audiometrics.c132
1 files changed, 73 insertions, 59 deletions
diff --git a/audiometrics/audiometrics.c b/audiometrics/audiometrics.c
index 9b702ad..b310496 100644
--- a/audiometrics/audiometrics.c
+++ b/audiometrics/audiometrics.c
@@ -27,6 +27,8 @@
#define AUDIOMETRIC_CH_LENGTH 16
#define AMCS_MAX_MINOR (1U)
#define AMCS_CDEV_NAME "amcs"
+#define CCA_SOURCE_MAX 2
+#define CCA_SOURCE_VOICE 1
static struct platform_device *amcs_pdev;
@@ -70,9 +72,11 @@ 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;
+ uint32_t cca_active[CCA_SOURCE_MAX];
+ uint32_t cca_enable[CCA_SOURCE_MAX];
+ uint32_t cca_cs[CCA_SOURCE_MAX];
+ int32_t voice_call_count;
+ int32_t voip_call_count;
};
struct audiometrics_priv_type {
@@ -409,62 +413,55 @@ static ssize_t ams_rate_read_once_show(struct device *dev,
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;
+ struct audiometrics_priv_type *priv = dev_get_drvdata(dev);
+ int length;
mutex_lock(&priv->lock);
- counts = scnprintf(buf, PAGE_SIZE, "%u,%u,%u", priv->sz.cca_active,
- priv->sz.cca_enable, priv->sz.cca_cs);
+ length = sysfs_emit(buf, "%u %u %u", priv->sz.cca_active[CCA_SOURCE_VOICE],
+ priv->sz.cca_enable[CCA_SOURCE_VOICE], priv->sz.cca_cs[CCA_SOURCE_VOICE]);
mutex_unlock(&priv->lock);
- return counts;
+ return length;
}
-static ssize_t cca_rate_read_once_show(struct device *dev,
+static ssize_t cca_count_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;
+ struct audiometrics_priv_type *priv = dev_get_drvdata(dev);
+ int i, length;
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;
+ length = 0;
+ for (i = 0; i < CCA_SOURCE_MAX; i++) {
+ length += sysfs_emit_at(buf, length, "%u %u ", priv->sz.cca_active[i],
+ priv->sz.cca_enable[i]);
+ priv->sz.cca_active[i] = 0;
+ priv->sz.cca_enable[i] = 0;
}
+ buf[--length] = 0;
+ mutex_unlock(&priv->lock);
+ return length;
+}
- 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;
+/*
+ * Report call counts including voice-call and VoIP-call.
+ * Ex: result 10 20
+ *
+ * means there are 10 voice-call and 20 VoIP-call.
+ */
+static ssize_t call_count_show(struct device *dev,
+ struct device_attribute *attr, char *buf)
+{
+ struct audiometrics_priv_type *priv = dev_get_drvdata(dev);
+ int length = 0;
+ mutex_lock(&priv->lock);
+ length = sysfs_emit(buf, "%d %d", priv->sz.voice_call_count,
+ priv->sz.voip_call_count);
mutex_unlock(&priv->lock);
- return counts;
+ priv->sz.voice_call_count = 0;
+ priv->sz.voip_call_count = 0;
+ return length;
}
static int amcs_cdev_open(struct inode *inode, struct file *file)
@@ -487,6 +484,7 @@ static long amcs_cdev_unlocked_ioctl(struct file *file, unsigned int cmd, unsign
long ret = -EINVAL;
int i = 0;
struct amcs_params params;
+ uint32_t cca_source;
dev_dbg(priv->device, "%s cmd = 0x%x", __func__, cmd);
@@ -620,13 +618,13 @@ static long amcs_cdev_unlocked_ioctl(struct file *file, unsigned int cmd, unsign
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;
+ params.val[1] = priv->sz.cca_active[CCA_SOURCE_VOICE];
+ params.val[2] = priv->sz.cca_enable[CCA_SOURCE_VOICE];
+ params.val[3] = priv->sz.cca_cs[CCA_SOURCE_VOICE];
} 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];
+ priv->sz.cca_active[CCA_SOURCE_VOICE] = params.val[1];
+ priv->sz.cca_enable[CCA_SOURCE_VOICE] = params.val[2];
+ priv->sz.cca_cs[CCA_SOURCE_VOICE] = params.val[3];
}
mutex_unlock(&priv->lock);
@@ -637,15 +635,29 @@ static long amcs_cdev_unlocked_ioctl(struct file *file, unsigned int cmd, unsign
break;
case AMCS_OP_CCA_INCREASE:
- mutex_lock(&priv->lock);
+ ret = 0;
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];
+ cca_source = params.val[4];
+ if (cca_source >= CCA_SOURCE_MAX) {
+ ret = -EINVAL;
+ break;
+ }
+
+ mutex_lock(&priv->lock);
+ priv->sz.cca_active[cca_source] += params.val[1];
+ priv->sz.cca_enable[cca_source] += params.val[2];
+ priv->sz.cca_cs[cca_source] += params.val[3];
+ mutex_unlock(&priv->lock);
}
- mutex_unlock(&priv->lock);
+ break;
+
+ case AMCS_OP_CALL_COUNT_INCREASE:
ret = 0;
- break;
+ if (params.val[0])
+ priv->sz.voice_call_count++;
+ else
+ priv->sz.voip_call_count++;
+ break;
default:
dev_warn(priv->device, "%s, unsupported op = %d\n", __func__, params.op);
@@ -709,7 +721,8 @@ 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 DEVICE_ATTR_RO(cca_count_read_once);
+static DEVICE_ATTR_RO(call_count);
static struct attribute *audiometrics_fs_attrs[] = {
@@ -726,7 +739,8 @@ static struct attribute *audiometrics_fs_attrs[] = {
&dev_attr_ams_cs.attr,
&dev_attr_ams_rate_read_once.attr,
&dev_attr_cca.attr,
- &dev_attr_cca_rate_read_once.attr,
+ &dev_attr_cca_count_read_once.attr,
+ &dev_attr_call_count.attr,
NULL,
};