Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit c0d9644f authored by Lad, Prabhakar's avatar Lad, Prabhakar Committed by Mauro Carvalho Chehab
Browse files

[media] media: i2c: tvp7002: add OF support



add OF support for the tvp7002 driver.

Signed-off-by: default avatarLad, Prabhakar <prabhakar.csengg@gmail.com>
Signed-off-by: default avatarHans Verkuil <hans.verkuil@cisco.com>
Signed-off-by: default avatarMauro Carvalho Chehab <m.chehab@samsung.com>
parent d1d70aa6
Loading
Loading
Loading
Loading
+53 −0
Original line number Diff line number Diff line
* Texas Instruments TV7002 video decoder

The TVP7002 device supports digitizing of video and graphics signal in RGB and
YPbPr color space.

Required Properties :
- compatible : Must be "ti,tvp7002"

Optional Properties:
- hsync-active: HSYNC Polarity configuration for the bus. Default value when
  this property is not specified is <0>.

- vsync-active: VSYNC Polarity configuration for the bus. Default value when
  this property is not specified is <0>.

- pclk-sample: Clock polarity of the bus. Default value when this property is
  not specified is <0>.

- sync-on-green-active: Active state of Sync-on-green signal property of the
  endpoint.
  0 = Normal Operation (Active Low, Default)
  1 = Inverted operation

- field-even-active: Active-high Field ID output polarity control of the bus.
  Under normal operation, the field ID output is set to logic 1 for an odd field
  (field 1) and set to logic 0 for an even field (field 0).
  0 = Normal Operation (Active Low, Default)
  1 = FID output polarity inverted

For further reading of port node refer Documentation/devicetree/bindings/media/
video-interfaces.txt.

Example:

	i2c0@1c22000 {
		...
		...
		tvp7002@5c {
			compatible = "ti,tvp7002";
			reg = <0x5c>;

			port {
				tvp7002_1: endpoint {
					hsync-active = <1>;
					vsync-active = <1>;
					pclk-sample = <0>;
					sync-on-green-active = <1>;
					field-even-active = <0>;
				};
			};
		};
		...
	};
+60 −7
Original line number Diff line number Diff line
@@ -35,6 +35,8 @@
#include <media/v4l2-device.h>
#include <media/v4l2-common.h>
#include <media/v4l2-ctrls.h>
#include <media/v4l2-of.h>

#include "tvp7002_reg.h"

MODULE_DESCRIPTION("TI TVP7002 Video and Graphics Digitizer driver");
@@ -943,6 +945,48 @@ static const struct v4l2_subdev_ops tvp7002_ops = {
	.pad = &tvp7002_pad_ops,
};

static struct tvp7002_config *
tvp7002_get_pdata(struct i2c_client *client)
{
	struct v4l2_of_endpoint bus_cfg;
	struct tvp7002_config *pdata;
	struct device_node *endpoint;
	unsigned int flags;

	if (!IS_ENABLED(CONFIG_OF) || !client->dev.of_node)
		return client->dev.platform_data;

	endpoint = v4l2_of_get_next_endpoint(client->dev.of_node, NULL);
	if (!endpoint)
		return NULL;

	pdata = devm_kzalloc(&client->dev, sizeof(*pdata), GFP_KERNEL);
	if (!pdata)
		goto done;

	v4l2_of_parse_endpoint(endpoint, &bus_cfg);
	flags = bus_cfg.bus.parallel.flags;

	if (flags & V4L2_MBUS_HSYNC_ACTIVE_HIGH)
		pdata->hs_polarity = 1;

	if (flags & V4L2_MBUS_VSYNC_ACTIVE_HIGH)
		pdata->vs_polarity = 1;

	if (flags & V4L2_MBUS_PCLK_SAMPLE_RISING)
		pdata->clk_polarity = 1;

	if (flags & V4L2_MBUS_FIELD_EVEN_HIGH)
		pdata->fid_polarity = 1;

	if (flags & V4L2_MBUS_VIDEO_SOG_ACTIVE_HIGH)
		pdata->sog_polarity = 1;

done:
	of_node_put(endpoint);
	return pdata;
}

/*
 * tvp7002_probe - Probe a TVP7002 device
 * @c: ptr to i2c_client struct
@@ -954,32 +998,32 @@ static const struct v4l2_subdev_ops tvp7002_ops = {
 */
static int tvp7002_probe(struct i2c_client *c, const struct i2c_device_id *id)
{
	struct tvp7002_config *pdata = tvp7002_get_pdata(c);
	struct v4l2_subdev *sd;
	struct tvp7002 *device;
	struct v4l2_dv_timings timings;
	int polarity_a;
	int polarity_b;
	u8 revision;

	int error;

	if (pdata == NULL) {
		dev_err(&c->dev, "No platform data\n");
		return -EINVAL;
	}

	/* Check if the adapter supports the needed features */
	if (!i2c_check_functionality(c->adapter,
		I2C_FUNC_SMBUS_READ_BYTE | I2C_FUNC_SMBUS_WRITE_BYTE_DATA))
		return -EIO;

	if (!c->dev.platform_data) {
		v4l_err(c, "No platform data!!\n");
		return -ENODEV;
	}

	device = devm_kzalloc(&c->dev, sizeof(struct tvp7002), GFP_KERNEL);

	if (!device)
		return -ENOMEM;

	sd = &device->sd;
	device->pdata = c->dev.platform_data;
	device->pdata = pdata;
	device->current_timings = tvp7002_timings;

	/* Tell v4l2 the device is ready */
@@ -1084,9 +1128,18 @@ static const struct i2c_device_id tvp7002_id[] = {
};
MODULE_DEVICE_TABLE(i2c, tvp7002_id);

#if IS_ENABLED(CONFIG_OF)
static const struct of_device_id tvp7002_of_match[] = {
	{ .compatible = "ti,tvp7002", },
	{ /* sentinel */ },
};
MODULE_DEVICE_TABLE(of, tvp7002_of_match);
#endif

/* I2C driver data */
static struct i2c_driver tvp7002_driver = {
	.driver = {
		.of_match_table = of_match_ptr(tvp7002_of_match),
		.owner = THIS_MODULE,
		.name = TVP7002_MODULE_NAME,
	},