diff options
Diffstat (limited to 'audiometrics/audiometrics.c')
-rw-r--r-- | audiometrics/audiometrics.c | 132 |
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, }; |