From: Rodrigo Alencar <[email protected]>

Add debugfs_reg64_access function pointer field into iio_info and modify
file operation callbacks to favor 64-bit variant when it is available.

Signed-off-by: Rodrigo Alencar <[email protected]>
---
 drivers/iio/industrialio-core.c | 33 ++++++++++++++++++++++++---------
 include/linux/iio/iio.h         |  4 ++++
 2 files changed, 28 insertions(+), 9 deletions(-)

diff --git a/drivers/iio/industrialio-core.c b/drivers/iio/industrialio-core.c
index bd6f4f9f4533..cb4e2ade25c0 100644
--- a/drivers/iio/industrialio-core.c
+++ b/drivers/iio/industrialio-core.c
@@ -386,6 +386,7 @@ static ssize_t iio_debugfs_read_reg(struct file *file, char 
__user *userbuf,
        struct iio_dev *indio_dev = file->private_data;
        struct iio_dev_opaque *iio_dev_opaque = to_iio_dev_opaque(indio_dev);
        unsigned int val = 0;
+       u64 val64 = 0;
        int ret;
 
        if (*ppos > 0)
@@ -393,9 +394,17 @@ static ssize_t iio_debugfs_read_reg(struct file *file, 
char __user *userbuf,
                                               iio_dev_opaque->read_buf,
                                               iio_dev_opaque->read_buf_len);
 
-       ret = indio_dev->info->debugfs_reg_access(indio_dev,
-                                                 
iio_dev_opaque->cached_reg_addr,
-                                                 0, &val);
+       if (indio_dev->info->debugfs_reg64_access) {
+               ret = indio_dev->info->debugfs_reg64_access(indio_dev,
+                                                           
iio_dev_opaque->cached_reg_addr,
+                                                           0, &val64);
+       } else {
+               ret = indio_dev->info->debugfs_reg_access(indio_dev,
+                                                         
iio_dev_opaque->cached_reg_addr,
+                                                         0, &val);
+               val64 = val;
+       }
+
        if (ret) {
                dev_err(indio_dev->dev.parent, "%s: read failed\n", __func__);
                return ret;
@@ -403,7 +412,7 @@ static ssize_t iio_debugfs_read_reg(struct file *file, char 
__user *userbuf,
 
        iio_dev_opaque->read_buf_len = snprintf(iio_dev_opaque->read_buf,
                                                
sizeof(iio_dev_opaque->read_buf),
-                                               "0x%X\n", val);
+                                               "0x%llX", val64);
 
        return simple_read_from_buffer(userbuf, count, ppos,
                                       iio_dev_opaque->read_buf,
@@ -415,8 +424,9 @@ static ssize_t iio_debugfs_write_reg(struct file *file,
 {
        struct iio_dev *indio_dev = file->private_data;
        struct iio_dev_opaque *iio_dev_opaque = to_iio_dev_opaque(indio_dev);
-       unsigned int reg, val;
+       unsigned int reg;
        char buf[80];
+       u64 val64;
        int ret;
 
        if (count >= sizeof(buf))
@@ -429,7 +439,7 @@ static ssize_t iio_debugfs_write_reg(struct file *file,
 
        buf[ret] = '\0';
 
-       ret = sscanf(buf, "%i %i", &reg, &val);
+       ret = sscanf(buf, "%i %lli", &reg, &val64);
 
        switch (ret) {
        case 1:
@@ -437,8 +447,12 @@ static ssize_t iio_debugfs_write_reg(struct file *file,
                break;
        case 2:
                iio_dev_opaque->cached_reg_addr = reg;
-               ret = indio_dev->info->debugfs_reg_access(indio_dev, reg,
-                                                         val, NULL);
+               if (indio_dev->info->debugfs_reg64_access)
+                       ret = indio_dev->info->debugfs_reg64_access(indio_dev, 
reg,
+                                                                   val64, 
NULL);
+               else
+                       ret = indio_dev->info->debugfs_reg_access(indio_dev, 
reg,
+                                                                 val64, NULL);
                if (ret) {
                        dev_err(indio_dev->dev.parent, "%s: write failed\n",
                                __func__);
@@ -469,7 +483,8 @@ static void iio_device_register_debugfs(struct iio_dev 
*indio_dev)
 {
        struct iio_dev_opaque *iio_dev_opaque;
 
-       if (indio_dev->info->debugfs_reg_access == NULL)
+       if (!indio_dev->info->debugfs_reg_access &&
+           !indio_dev->info->debugfs_reg64_access)
                return;
 
        if (!iio_debugfs_dentry)
diff --git a/include/linux/iio/iio.h b/include/linux/iio/iio.h
index 96b05c86c325..86d17ee69e05 100644
--- a/include/linux/iio/iio.h
+++ b/include/linux/iio/iio.h
@@ -484,6 +484,7 @@ struct iio_trigger; /* forward declaration */
  * @update_scan_mode:  function to configure device and scan buffer when
  *                     channels have changed
  * @debugfs_reg_access:        function to read or write register value of 
device
+ * @debugfs_reg64_access: function to read or write 64-bit register value of 
device
  * @fwnode_xlate:      fwnode based function pointer to obtain channel 
specifier index.
  * @hwfifo_set_watermark: function pointer to set the current hardware
  *                     fifo watermark level; see hwfifo_* entries in
@@ -572,6 +573,9 @@ struct iio_info {
        int (*debugfs_reg_access)(struct iio_dev *indio_dev,
                                  unsigned int reg, unsigned int writeval,
                                  unsigned int *readval);
+       int (*debugfs_reg64_access)(struct iio_dev *indio_dev,
+                                   unsigned int reg, u64 writeval,
+                                   u64 *readval);
        int (*fwnode_xlate)(struct iio_dev *indio_dev,
                            const struct fwnode_reference_args *iiospec);
        int (*hwfifo_set_watermark)(struct iio_dev *indio_dev, unsigned int 
val);

-- 
2.43.0



Reply via email to