}
 }
 
-static u8 i2c_rd8(struct v4l2_subdev *sd, u16 reg)
+static noinline u32 i2c_rdreg(struct v4l2_subdev *sd, u16 reg, u32 n)
 {
-       u8 val;
+       __le32 val = 0;
 
-       i2c_rd(sd, reg, &val, 1);
+       i2c_rd(sd, reg, (u8 __force *)&val, n);
 
-       return val;
+       return le32_to_cpu(val);
+}
+
+static noinline void i2c_wrreg(struct v4l2_subdev *sd, u16 reg, u32 val, u32 n)
+{
+       __le32 raw = cpu_to_le32(val);
+
+       i2c_wr(sd, reg, (u8 __force *)&raw, n);
+}
+
+static u8 i2c_rd8(struct v4l2_subdev *sd, u16 reg)
+{
+       return i2c_rdreg(sd, reg, 1);
 }
 
 static void i2c_wr8(struct v4l2_subdev *sd, u16 reg, u8 val)
 {
-       i2c_wr(sd, reg, &val, 1);
+       i2c_wrreg(sd, reg, val, 1);
 }
 
 static void i2c_wr8_and_or(struct v4l2_subdev *sd, u16 reg,
                u8 mask, u8 val)
 {
-       i2c_wr8(sd, reg, (i2c_rd8(sd, reg) & mask) | val);
+       i2c_wrreg(sd, reg, (i2c_rdreg(sd, reg, 2) & mask) | val, 2);
 }
 
 static u16 i2c_rd16(struct v4l2_subdev *sd, u16 reg)
 {
-       u16 val;
-
-       i2c_rd(sd, reg, (u8 *)&val, 2);
-
-       return val;
+       return i2c_rdreg(sd, reg, 2);
 }
 
 static void i2c_wr16(struct v4l2_subdev *sd, u16 reg, u16 val)
 {
-       i2c_wr(sd, reg, (u8 *)&val, 2);
+       i2c_wrreg(sd, reg, val, 2);
 }
 
 static void i2c_wr16_and_or(struct v4l2_subdev *sd, u16 reg, u16 mask, u16 val)
 {
-       i2c_wr16(sd, reg, (i2c_rd16(sd, reg) & mask) | val);
+       i2c_wrreg(sd, reg, (i2c_rdreg(sd, reg, 2) & mask) | val, 2);
 }
 
 static u32 i2c_rd32(struct v4l2_subdev *sd, u16 reg)
 {
-       u32 val;
-
-       i2c_rd(sd, reg, (u8 *)&val, 4);
-
-       return val;
+       return i2c_rdreg(sd, reg, 4);
 }
 
 static void i2c_wr32(struct v4l2_subdev *sd, u16 reg, u32 val)
 {
-       i2c_wr(sd, reg, (u8 *)&val, 4);
+       i2c_wrreg(sd, reg, val, 4);
 }
 
 /* --------------- STATUS --------------- */
 
        reg->size = tc358743_get_reg_size(reg->reg);
 
-       i2c_rd(sd, reg->reg, (u8 *)®->val, reg->size);
+       reg->val = i2c_rdreg(sd, reg->reg, reg->size);
 
        return 0;
 }
            reg->reg == BCAPS)
                return 0;
 
-       i2c_wr(sd, (u16)reg->reg, (u8 *)®->val,
+       i2c_wrreg(sd, (u16)reg->reg, reg->val,
                        tc358743_get_reg_size(reg->reg));
 
        return 0;