From a51ebfdb1264eb31d8bc226f6295d4e8054b12ae Mon Sep 17 00:00:00 2001 From: Jinyoung Park Date: Wed, 9 Apr 2014 20:13:25 +0900 Subject: stating: iio: adc: palmas: Add debugfs for auto_conv reading Added a debugfs for auto_conv value reading. Bug 1514756 Signed-off-by: Jinyoung Park Reviewed-on: http://git-master/r/414751 (cherry picked from commit a7cc5553eb36afa799ae580d2e4c06f399e5bd8f) Change-Id: Ia7fb91dab51972235885d7a087a84ce4aabd690b Signed-off-by: Jinyoung Park Reviewed-on: http://git-master/r/418393 Reviewed-by: Diwakar Tundlam --- drivers/staging/iio/adc/palmas_gpadc.c | 60 ++++++++++++++++++++++++++++++++++ 1 file changed, 60 insertions(+) (limited to 'drivers/staging') diff --git a/drivers/staging/iio/adc/palmas_gpadc.c b/drivers/staging/iio/adc/palmas_gpadc.c index 92129bf550cf..8236b0e043d9 100644 --- a/drivers/staging/iio/adc/palmas_gpadc.c +++ b/drivers/staging/iio/adc/palmas_gpadc.c @@ -691,6 +691,62 @@ out: } #ifdef CONFIG_DEBUG_FS +static int palams_gpadc_get_auto_conv_val(struct palmas_gpadc *adc, + int auto_conv_ch) +{ + unsigned int reg; + unsigned int val; + int ret; + + if (auto_conv_ch == 0) { + reg = PALMAS_GPADC_AUTO_CONV0_LSB; + } else if (auto_conv_ch == 1) { + reg = PALMAS_GPADC_AUTO_CONV1_LSB; + } else { + dev_err(adc->dev, "%s: Invalid auto conv channel %d\n\n", + __func__, auto_conv_ch); + return -EINVAL; + } + + ret = palmas_bulk_read(adc->palmas, PALMAS_GPADC_BASE, reg, &val, 2); + if (ret < 0) { + dev_err(adc->dev, "%s: Auto conv%d data read failed: %d\n", + __func__, auto_conv_ch, ret); + return ret; + } + + return (val & 0xFFF); +} + +static ssize_t auto_conv_val_read(struct file *file, + char __user *user_buf, size_t count, loff_t *ppos) +{ + struct palmas_gpadc *adc = file->private_data; + unsigned char *d_iname; + char buf[64] = { 0, }; + ssize_t ret = 0; + int auto_conv_ch = -1; + + d_iname = file->f_path.dentry->d_iname; + + if (!strcmp("auto_conv0_val", d_iname)) + auto_conv_ch = 0; + else if (!strcmp("auto_conv1_val", d_iname)) + auto_conv_ch = 1; + + ret = palams_gpadc_get_auto_conv_val(adc, auto_conv_ch); + if (ret < 0) + return ret; + + ret = snprintf(buf, sizeof(buf), "%d\n", ret); + return simple_read_from_buffer(user_buf, count, ppos, buf, ret); +} + +static const struct file_operations auto_conv_val_fops = { + .open = simple_open, + .read = auto_conv_val_read, +}; + static int auto_conv_period_get(void *data, u64 *val) { struct palmas_gpadc *adc = (struct palmas_gpadc *)data; @@ -836,6 +892,8 @@ static void palmas_gpadc_debugfs_init(struct palmas_gpadc *adc) adc->dentry, adc, &auto_conv_data_fops); debugfs_create_file("auto_conv0_shutdown", 0644, adc->dentry, adc, &auto_conv_data_fops); + debugfs_create_file("auto_conv0_val", 0444, + adc->dentry, adc, &auto_conv_val_fops); } if (adc->auto_conv1_enable) { @@ -847,6 +905,8 @@ static void palmas_gpadc_debugfs_init(struct palmas_gpadc *adc) adc->dentry, adc, &auto_conv_data_fops); debugfs_create_file("auto_conv1_shutdown", 0644, adc->dentry, adc, &auto_conv_data_fops); + debugfs_create_file("auto_conv1_val", 0444, + adc->dentry, adc, &auto_conv_val_fops); } } #else -- cgit v1.2.3