Loading Documentation/devicetree/bindings/media/i2c/tvp7002.txt 0 → 100644 +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>; }; }; }; ... }; drivers/media/i2c/tvp7002.c +60 −7 Original line number Diff line number Diff line Loading @@ -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"); Loading Loading @@ -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 Loading @@ -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 */ Loading Loading @@ -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, }, Loading Loading
Documentation/devicetree/bindings/media/i2c/tvp7002.txt 0 → 100644 +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>; }; }; }; ... };
drivers/media/i2c/tvp7002.c +60 −7 Original line number Diff line number Diff line Loading @@ -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"); Loading Loading @@ -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 Loading @@ -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 */ Loading Loading @@ -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, }, Loading