From: Philipp Zabel <p.za...@pengutronix.de>

By looking at the endpoint flags, it can be determined whether the link
should be of V4L2_MBUS_PARALLEL or V4L2_MBUS_BT656 type. Disable the
dedicated HSYNC/VSYNC outputs in BT.656 mode.

For devices that are not instantiated through DT the current behavior
is preserved.

Signed-off-by: Philipp Zabel <p.za...@pengutronix.de>
Signed-off-by: Lucas Stach <l.st...@pengutronix.de>
---
 drivers/media/i2c/tvp5150.c | 34 ++++++++++++++++++++++++++++++++--
 1 file changed, 32 insertions(+), 2 deletions(-)

diff --git a/drivers/media/i2c/tvp5150.c b/drivers/media/i2c/tvp5150.c
index 8670b478dcd6..21cde350e385 100644
--- a/drivers/media/i2c/tvp5150.c
+++ b/drivers/media/i2c/tvp5150.c
@@ -11,10 +11,12 @@
 #include <linux/delay.h>
 #include <linux/module.h>
 #include <linux/regmap.h>
+#include <linux/of_graph.h>
 #include <media/v4l2-async.h>
 #include <media/v4l2-device.h>
 #include <media/tvp5150.h>
 #include <media/v4l2-ctrls.h>
+#include <media/v4l2-of.h>
 
 #include "tvp5150_reg.h"
 
@@ -38,6 +40,7 @@ struct tvp5150 {
        struct v4l2_subdev sd;
        struct media_pad pad;
        struct v4l2_ctrl_handler hdl;
+       enum v4l2_mbus_type bus_type;
        struct v4l2_mbus_framefmt format;
        struct v4l2_rect rect;
        struct regmap *regmap;
@@ -424,8 +427,6 @@ static const struct i2c_reg_value tvp5150_init_enable[] = {
                TVP5150_MISC_CTL, 0x6f
        },{     /* Activates video std autodetection for all standards */
                TVP5150_AUTOSW_MSK, 0x0
-       },{     /* Default format: 0x47. For 4:2:2: 0x40 */
-               TVP5150_DATA_RATE_SEL, 0x47
        },{
                TVP5150_CHROMA_PROC_CTL_1, 0x0c
        },{
@@ -760,6 +761,25 @@ static int tvp5150_reset(struct v4l2_subdev *sd, u32 val)
        /* Initializes TVP5150 to stream enabled values */
        tvp5150_write_inittab(sd, tvp5150_init_enable);
 
+       switch (decoder->bus_type) {
+       case V4L2_MBUS_BT656:
+               /* 8-bit ITU BT.656 */
+               regmap_update_bits(decoder->regmap, TVP5150_DATA_RATE_SEL,
+                                  0x7, 0x7);
+               /* disable HSYNC, VSYNC/PALI, AVID, and FID/GLCO */
+               regmap_update_bits(decoder->regmap, TVP5150_MISC_CTL, 0x4, 0x0);
+               break;
+       case V4L2_MBUS_PARALLEL:
+               /* 8-bit YUV 4:2:2 */
+               regmap_update_bits(decoder->regmap, TVP5150_DATA_RATE_SEL,
+                                  0x7, 0x0);
+               /* enable HSYNC, VSYNC/PALI, AVID, and FID/GLCO */
+               regmap_update_bits(decoder->regmap, TVP5150_MISC_CTL, 0x4, 0x4);
+               break;
+       default:
+               return -EINVAL;
+       }
+
        /* Initialize image preferences */
        v4l2_ctrl_handler_setup(&decoder->hdl);
 
@@ -1315,6 +1335,8 @@ static struct regmap_config tvp5150_config = {
 static int tvp5150_probe(struct i2c_client *c,
                         const struct i2c_device_id *id)
 {
+       struct v4l2_of_endpoint bus_cfg;
+       struct device_node *endpoint;
        struct tvp5150 *core;
        struct v4l2_subdev *sd;
        struct regmap *map;
@@ -1375,6 +1397,14 @@ static int tvp5150_probe(struct i2c_client *c,
                }
        }
 
+       endpoint = of_graph_get_next_endpoint(c->dev.of_node, NULL);
+       if (endpoint) {
+               v4l2_of_parse_endpoint(endpoint, &bus_cfg);
+               core->bus_type = bus_cfg.bus_type;
+       } else {
+               core->bus_type = V4L2_MBUS_BT656;
+       }
+
        core->norm = V4L2_STD_ALL;      /* Default is autodetect */
        core->input = TVP5150_COMPOSITE1;
        core->enable = 1;
-- 
2.6.2

--
To unsubscribe from this list: send the line "unsubscribe linux-media" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to