aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorLad, Prabhakar <prabhakar.csengg@gmail.com>2013-06-04 11:26:23 -0400
committerMauro Carvalho Chehab <mchehab@redhat.com>2013-06-21 10:29:09 -0400
commitb610b5928dc04095b9b24b83e4ddbb399d933611 (patch)
tree0fe6465e9da8fb90eb3c77bda419579c2f9cd2ef
parent379d2cf4b5267ac94f8b4569545bd524e0cca29a (diff)
[media] media: i2c: tvp514x: add OF support
add OF support for the tvp514x driver. Signed-off-by: Lad, Prabhakar <prabhakar.csengg@gmail.com> Acked-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com> Cc: Hans Verkuil <hans.verkuil@cisco.com> Cc: Mauro Carvalho Chehab <mchehab@redhat.com> Cc: Guennadi Liakhovetski <g.liakhovetski@gmx.de> Cc: Sylwester Nawrocki <s.nawrocki@samsung.com> Cc: Sakari Ailus <sakari.ailus@iki.fi> Cc: Grant Likely <grant.likely@secretlab.ca> Cc: Rob Herring <rob.herring@calxeda.com> Cc: Rob Landley <rob@landley.net> Cc: devicetree-discuss@lists.ozlabs.org Cc: linux-doc@vger.kernel.org Cc: linux-kernel@vger.kernel.org Cc: davinci-linux-open-source@linux.davincidsp.com Signed-off-by: Hans Verkuil <hans.verkuil@cisco.com> Signed-off-by: Mauro Carvalho Chehab <mchehab@redhat.com>
-rw-r--r--Documentation/devicetree/bindings/media/i2c/tvp514x.txt44
-rw-r--r--drivers/media/i2c/tvp514x.c62
2 files changed, 100 insertions, 6 deletions
diff --git a/Documentation/devicetree/bindings/media/i2c/tvp514x.txt b/Documentation/devicetree/bindings/media/i2c/tvp514x.txt
new file mode 100644
index 000000000000..46752cc71f2e
--- /dev/null
+++ b/Documentation/devicetree/bindings/media/i2c/tvp514x.txt
@@ -0,0 +1,44 @@
1* Texas Instruments TVP514x video decoder
2
3The TVP5146/TVP5146m2/TVP5147/TVP5147m1 device is high quality, single-chip
4digital video decoder that digitizes and decodes all popular baseband analog
5video formats into digital video component. The tvp514x decoder supports analog-
6to-digital (A/D) conversion of component RGB and YPbPr signals as well as A/D
7conversion and decoding of NTSC, PAL and SECAM composite and S-video into
8component YCbCr.
9
10Required Properties :
11- compatible : value should be either one among the following
12 (a) "ti,tvp5146" for tvp5146 decoder.
13 (b) "ti,tvp5146m2" for tvp5146m2 decoder.
14 (c) "ti,tvp5147" for tvp5147 decoder.
15 (d) "ti,tvp5147m1" for tvp5147m1 decoder.
16
17- hsync-active: HSYNC Polarity configuration for endpoint.
18
19- vsync-active: VSYNC Polarity configuration for endpoint.
20
21- pclk-sample: Clock polarity of the endpoint.
22
23For further reading on port node refer to Documentation/devicetree/bindings/
24media/video-interfaces.txt.
25
26Example:
27
28 i2c0@1c22000 {
29 ...
30 ...
31 tvp514x@5c {
32 compatible = "ti,tvp5146";
33 reg = <0x5c>;
34
35 port {
36 tvp514x_1: endpoint {
37 hsync-active = <1>;
38 vsync-active = <1>;
39 pclk-sample = <0>;
40 };
41 };
42 };
43 ...
44 };
diff --git a/drivers/media/i2c/tvp514x.c b/drivers/media/i2c/tvp514x.c
index b8061b5e3eac..864eb14ae9b1 100644
--- a/drivers/media/i2c/tvp514x.c
+++ b/drivers/media/i2c/tvp514x.c
@@ -39,6 +39,7 @@
39#include <media/v4l2-device.h> 39#include <media/v4l2-device.h>
40#include <media/v4l2-common.h> 40#include <media/v4l2-common.h>
41#include <media/v4l2-mediabus.h> 41#include <media/v4l2-mediabus.h>
42#include <media/v4l2-of.h>
42#include <media/v4l2-ctrls.h> 43#include <media/v4l2-ctrls.h>
43#include <media/tvp514x.h> 44#include <media/tvp514x.h>
44#include <media/media-entity.h> 45#include <media/media-entity.h>
@@ -1056,6 +1057,42 @@ static struct tvp514x_decoder tvp514x_dev = {
1056 1057
1057}; 1058};
1058 1059
1060static struct tvp514x_platform_data *
1061tvp514x_get_pdata(struct i2c_client *client)
1062{
1063 struct tvp514x_platform_data *pdata;
1064 struct v4l2_of_endpoint bus_cfg;
1065 struct device_node *endpoint;
1066 unsigned int flags;
1067
1068 if (!IS_ENABLED(CONFIG_OF) || !client->dev.of_node)
1069 return client->dev.platform_data;
1070
1071 endpoint = v4l2_of_get_next_endpoint(client->dev.of_node, NULL);
1072 if (!endpoint)
1073 return NULL;
1074
1075 pdata = devm_kzalloc(&client->dev, sizeof(*pdata), GFP_KERNEL);
1076 if (!pdata)
1077 goto done;
1078
1079 v4l2_of_parse_endpoint(endpoint, &bus_cfg);
1080 flags = bus_cfg.bus.parallel.flags;
1081
1082 if (flags & V4L2_MBUS_HSYNC_ACTIVE_HIGH)
1083 pdata->hs_polarity = 1;
1084
1085 if (flags & V4L2_MBUS_VSYNC_ACTIVE_HIGH)
1086 pdata->vs_polarity = 1;
1087
1088 if (flags & V4L2_MBUS_PCLK_SAMPLE_RISING)
1089 pdata->clk_polarity = 1;
1090
1091done:
1092 of_node_put(endpoint);
1093 return pdata;
1094}
1095
1059/** 1096/**
1060 * tvp514x_probe() - decoder driver i2c probe handler 1097 * tvp514x_probe() - decoder driver i2c probe handler
1061 * @client: i2c driver client device structure 1098 * @client: i2c driver client device structure
@@ -1067,19 +1104,20 @@ static struct tvp514x_decoder tvp514x_dev = {
1067static int 1104static int
1068tvp514x_probe(struct i2c_client *client, const struct i2c_device_id *id) 1105tvp514x_probe(struct i2c_client *client, const struct i2c_device_id *id)
1069{ 1106{
1107 struct tvp514x_platform_data *pdata = tvp514x_get_pdata(client);
1070 struct tvp514x_decoder *decoder; 1108 struct tvp514x_decoder *decoder;
1071 struct v4l2_subdev *sd; 1109 struct v4l2_subdev *sd;
1072 int ret; 1110 int ret;
1073 1111
1112 if (pdata == NULL) {
1113 dev_err(&client->dev, "No platform data\n");
1114 return -EINVAL;
1115 }
1116
1074 /* Check if the adapter supports the needed features */ 1117 /* Check if the adapter supports the needed features */
1075 if (!i2c_check_functionality(client->adapter, I2C_FUNC_SMBUS_BYTE_DATA)) 1118 if (!i2c_check_functionality(client->adapter, I2C_FUNC_SMBUS_BYTE_DATA))
1076 return -EIO; 1119 return -EIO;
1077 1120
1078 if (!client->dev.platform_data) {
1079 v4l2_err(client, "No platform data!!\n");
1080 return -ENODEV;
1081 }
1082
1083 decoder = devm_kzalloc(&client->dev, sizeof(*decoder), GFP_KERNEL); 1121 decoder = devm_kzalloc(&client->dev, sizeof(*decoder), GFP_KERNEL);
1084 if (!decoder) 1122 if (!decoder)
1085 return -ENOMEM; 1123 return -ENOMEM;
@@ -1091,7 +1129,7 @@ tvp514x_probe(struct i2c_client *client, const struct i2c_device_id *id)
1091 sizeof(tvp514x_reg_list_default)); 1129 sizeof(tvp514x_reg_list_default));
1092 1130
1093 /* Copy board specific information here */ 1131 /* Copy board specific information here */
1094 decoder->pdata = client->dev.platform_data; 1132 decoder->pdata = pdata;
1095 1133
1096 /** 1134 /**
1097 * Fetch platform specific data, and configure the 1135 * Fetch platform specific data, and configure the
@@ -1231,8 +1269,20 @@ static const struct i2c_device_id tvp514x_id[] = {
1231 1269
1232MODULE_DEVICE_TABLE(i2c, tvp514x_id); 1270MODULE_DEVICE_TABLE(i2c, tvp514x_id);
1233 1271
1272#if IS_ENABLED(CONFIG_OF)
1273static const struct of_device_id tvp514x_of_match[] = {
1274 { .compatible = "ti,tvp5146", },
1275 { .compatible = "ti,tvp5146m2", },
1276 { .compatible = "ti,tvp5147", },
1277 { .compatible = "ti,tvp5147m1", },
1278 { /* sentinel */ },
1279};
1280MODULE_DEVICE_TABLE(of, tvp514x_of_match);
1281#endif
1282
1234static struct i2c_driver tvp514x_driver = { 1283static struct i2c_driver tvp514x_driver = {
1235 .driver = { 1284 .driver = {
1285 .of_match_table = of_match_ptr(tvp514x_of_match),
1236 .owner = THIS_MODULE, 1286 .owner = THIS_MODULE,
1237 .name = TVP514X_MODULE_NAME, 1287 .name = TVP514X_MODULE_NAME,
1238 }, 1288 },