diff options
author | Lad, Prabhakar <prabhakar.csengg@gmail.com> | 2013-06-04 11:26:23 -0400 |
---|---|---|
committer | Mauro Carvalho Chehab <mchehab@redhat.com> | 2013-06-21 10:29:09 -0400 |
commit | b610b5928dc04095b9b24b83e4ddbb399d933611 (patch) | |
tree | 0fe6465e9da8fb90eb3c77bda419579c2f9cd2ef | |
parent | 379d2cf4b5267ac94f8b4569545bd524e0cca29a (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.txt | 44 | ||||
-rw-r--r-- | drivers/media/i2c/tvp514x.c | 62 |
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 | |||
3 | The TVP5146/TVP5146m2/TVP5147/TVP5147m1 device is high quality, single-chip | ||
4 | digital video decoder that digitizes and decodes all popular baseband analog | ||
5 | video formats into digital video component. The tvp514x decoder supports analog- | ||
6 | to-digital (A/D) conversion of component RGB and YPbPr signals as well as A/D | ||
7 | conversion and decoding of NTSC, PAL and SECAM composite and S-video into | ||
8 | component YCbCr. | ||
9 | |||
10 | Required 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 | |||
23 | For further reading on port node refer to Documentation/devicetree/bindings/ | ||
24 | media/video-interfaces.txt. | ||
25 | |||
26 | Example: | ||
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 | ||
1060 | static struct tvp514x_platform_data * | ||
1061 | tvp514x_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 | |||
1091 | done: | ||
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 = { | |||
1067 | static int | 1104 | static int |
1068 | tvp514x_probe(struct i2c_client *client, const struct i2c_device_id *id) | 1105 | tvp514x_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 | ||
1232 | MODULE_DEVICE_TABLE(i2c, tvp514x_id); | 1270 | MODULE_DEVICE_TABLE(i2c, tvp514x_id); |
1233 | 1271 | ||
1272 | #if IS_ENABLED(CONFIG_OF) | ||
1273 | static 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 | }; | ||
1280 | MODULE_DEVICE_TABLE(of, tvp514x_of_match); | ||
1281 | #endif | ||
1282 | |||
1234 | static struct i2c_driver tvp514x_driver = { | 1283 | static 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 | }, |