]> rtime.felk.cvut.cz Git - sojka/nv-tegra/linux-3.10.git/commitdiff
media: platform: tegra: add multi offset len read
authorVishal Agrawal <visagrawal@nvidia.com>
Thu, 15 Oct 2015 00:50:33 +0000 (17:50 -0700)
committermobile promotions <svcmobile_promotions@nvidia.com>
Wed, 28 Oct 2015 18:38:49 +0000 (11:38 -0700)
+ Add support for multi offset length read

Bug 1690851
Bug 1695405

Change-Id: I6e5a01a779765c3b742272141ab082970a00fb11
Signed-off-by: Vishal Agrawal <visagrawal@nvidia.com>
(cherry picked from commit 2c65a7015ae42c22b951677e3cbb0de2d3efc42d)
Reviewed-on: http://git-master/r/817864
Reviewed-by: Automatic_Commit_Validation_User
Reviewed-by: Laszlo Weber <lweber@nvidia.com>
GVS: Gerrit_Virtual_Submit
Reviewed-by: Arun Shamanna Lakshmi <aruns@nvidia.com>
drivers/media/platform/tegra/auto/debugfs.c
drivers/media/platform/tegra/auto/isc-dev-priv.h
drivers/media/platform/tegra/auto/isc_dev.c
include/media/isc-dev.h

index ba551068122afc7606b467aaf27b2503dbad6b36..3aea05eaa0ae6f52c95d280b9417e9b78039ec23 100644 (file)
@@ -172,7 +172,7 @@ static int i2c_val_get(void *data, u64 *val)
        struct isc_dev_info *isc_dev = data;
        u8 temp = 0;
 
-       if (isc_dev_raw_rd(isc_dev, isc_dev->reg_off, &temp, 1)) {
+       if (isc_dev_raw_rd(isc_dev, 0, isc_dev->reg_off, &temp, 1)) {
                dev_err(isc_dev->dev, "ERR:%s failed\n", __func__);
                return -EIO;
        }
index 550b19975eee3435bbcd4265e15efda55f4a7023..2e940bb85de66becb33c1b4b7bd12a3c44b04e23 100644 (file)
@@ -29,7 +29,8 @@ struct isc_dev_info {
        u8 power_is_on;
 };
 
-int isc_dev_raw_rd(struct isc_dev_info *, unsigned int, u8 *, size_t);
+int isc_dev_raw_rd(struct isc_dev_info *, unsigned int,
+       unsigned int, u8 *, size_t);
 int isc_dev_raw_wr(struct isc_dev_info *, unsigned int, u8 *, size_t);
 
 int isc_dev_debugfs_init(struct isc_dev_info *isc_dev);
index f83301afe763d1bd77fcde682aba0b23f35d32bc..877d0c048d9aa2a0e3093945c3dd4879dc99da4a 100644 (file)
@@ -66,7 +66,8 @@ static void isc_dev_dump(
    offset - address in the device's register space to start with.
 */
 int isc_dev_raw_rd(
-       struct isc_dev_info *info, unsigned int offset, u8 *val, size_t size)
+       struct isc_dev_info *info, unsigned int offset,
+       unsigned int offset_len, u8 *val, size_t size)
 {
        int ret = -ENODEV;
        u8 data[2];
@@ -80,14 +81,20 @@ int isc_dev_raw_rd(
                return ret;
        }
 
-       if (info->reg_len == 2) {
+       /* when user read device from debugfs, the offset_len will be 0.
+        * And the offset_len should come from device info
+        */
+       if (!offset_len)
+               offset_len = info->reg_len;
+
+       if (offset_len == 2) {
                data[0] = (u8)((offset >> 8) & 0xff);
                data[1] = (u8)(offset & 0xff);
-       } else if (info->reg_len == 1)
+       } else if (offset_len == 1)
                data[0] = (u8)(offset & 0xff);
 
        i2cmsg[0].addr = info->i2c_client->addr;
-       i2cmsg[0].len = info->reg_len;
+       i2cmsg[0].len = offset_len;
        i2cmsg[0].buf = (__u8 *)data;
        i2cmsg[0].flags = I2C_M_NOSTART;
 
@@ -179,7 +186,8 @@ static int isc_dev_raw_rw(struct isc_dev_info *info)
                ret = isc_dev_raw_wr(info, -1, buf, pkg->size);
        } else {
                /* read from device */
-               ret = isc_dev_raw_rd(info, pkg->offset, buf, pkg->size);
+               ret = isc_dev_raw_rd(info, pkg->offset,
+                               pkg->offset_len, buf, pkg->size);
                if (!ret && copy_to_user(
                        (void __user *)u_ptr, buf, pkg->size)) {
                        dev_err(info->dev, "%s copy_to_user err line %d\n",
@@ -204,6 +212,7 @@ static int isc_dev_get_pkg(
                        return -EFAULT;
                }
                info->rw_pkg.offset = pkg32.offset;
+               info->rw_pkg.offset_len = pkg32.offset_len;
                info->rw_pkg.size = pkg32.size;
                info->rw_pkg.flags = pkg32.flags;
                info->rw_pkg.buffer = (unsigned long)pkg32.buffer;
index 0075b9dd69e6e40a7edf55476122719409db2fcc..04a852a3eb2c05a56cca666976da0a04c26596e4 100644 (file)
 #define MAX_ISC_DEV_PAK_SIZE   32
 #define ISC_DEV_PKG_FLAG_WR    1
 
-struct isc_dev_pkg {
+struct __attribute__ ((__packed__)) isc_dev_pkg {
        __u16 offset;
+       __u16 offset_len;
        __u16 size;
        __u32 flags;
        unsigned long buffer;
-} __packed;
+};
 
-struct isc_dev_pkg32 {
+struct __attribute__ ((__packed__)) isc_dev_pkg32 {
        __u16 offset;
+       __u16 offset_len;
        __u16 size;
        __u32 flags;
        __u32 buffer;
-} __packed;
+};
 
 #ifdef __KERNEL__
 #include <linux/ioctl.h>  /* For IOCTL macros */