[media] tc358743: Add OF device ID table
[linux-2.6-block.git] / drivers / media / i2c / tc358743.c
index f569a05fe10547e4ffc159bbce96d5765ae9e40b..acef4eca269f1c1f3f1e36d6ca8c76e1523cd9b6 100644 (file)
@@ -194,57 +194,61 @@ static void i2c_wr(struct v4l2_subdev *sd, u16 reg, u8 *values, u32 n)
        }
 }
 
-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, (u8 __force *)&val, n);
 
-       i2c_rd(sd, reg, &val, 1);
+       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);
 
-       return 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 --------------- */
@@ -1227,7 +1231,7 @@ static int tc358743_g_register(struct v4l2_subdev *sd,
 
        reg->size = tc358743_get_reg_size(reg->reg);
 
-       i2c_rd(sd, reg->reg, (u8 *)&reg->val, reg->size);
+       reg->val = i2c_rdreg(sd, reg->reg, reg->size);
 
        return 0;
 }
@@ -1253,7 +1257,7 @@ static int tc358743_s_register(struct v4l2_subdev *sd,
            reg->reg == BCAPS)
                return 0;
 
-       i2c_wr(sd, (u16)reg->reg, (u8 *)&reg->val,
+       i2c_wrreg(sd, (u16)reg->reg, reg->val,
                        tc358743_get_reg_size(reg->reg));
 
        return 0;
@@ -1459,6 +1463,10 @@ static int tc358743_g_mbus_config(struct v4l2_subdev *sd,
 static int tc358743_s_stream(struct v4l2_subdev *sd, int enable)
 {
        enable_stream(sd, enable);
+       if (!enable) {
+               /* Put all lanes in PL-11 state (STOPSTATE) */
+               tc358743_set_csi(sd);
+       }
 
        return 0;
 }
@@ -1951,9 +1959,18 @@ static struct i2c_device_id tc358743_id[] = {
 
 MODULE_DEVICE_TABLE(i2c, tc358743_id);
 
+#if IS_ENABLED(CONFIG_OF)
+static const struct of_device_id tc358743_of_match[] = {
+       { .compatible = "toshiba,tc358743" },
+       {},
+};
+MODULE_DEVICE_TABLE(of, tc358743_of_match);
+#endif
+
 static struct i2c_driver tc358743_driver = {
        .driver = {
                .name = "tc358743",
+               .of_match_table = of_match_ptr(tc358743_of_match),
        },
        .probe = tc358743_probe,
        .remove = tc358743_remove,