Skip to contentSkip to conversation

dt-bindings: adv7180: Introduce adv,adv7182-force-bt656-4

PATCH Superseded Fabio Estevam 2 participants 4 messages May 27, 2021 – Jun 4, 2021

Subsystems (3)

v1 of 2 Superseded Latest is v2 →

lore
Share & tools
lore
#0 lore raw

PATCH 1/2 dt-bindings: adv7180: Introduce adv,adv7182-force-bt656-4

Captured NTSC video would be out of sync when using the adv7280 with the BT.656-4 protocol. Certain registers (0x04, 0x31, 0xE6) need to be configured properly to ensure BT.656-4 compatibility.

Introduce the 'adv,adv7182-force-bt656-4' property to allow the ADV7280 behavior to be consistent with the ADV7180, where BT.656-4 timing is used.

---
 Documentation/devicetree/bindings/media/i2c/adv7180.yaml | 5 +++++
 1 file changed, 5 insertions(+)
Documentation/devicetree/bindings/media/i2c/adv7180.yaml +5 -0
index bcfd93739b4f..83e47b0c9fa2 100644
@@ -35,6 +35,11 @@ properties:
   powerdown-gpios:
     maxItems: 1
 
+  adv,adv7182-force-bt656-4:
+    description:
+      Indicates that ADV7182 should output a BT.656-4 compatible stream.
+    type: boolean
+
   port:
     $ref: /schemas/graph.yaml#/properties/port
 
Signature · 1 line
2.25.1
#1 lore raw

PATCH 2/2 media: i2c: adv7180: fix adv7280 BT.656-4 compatibility

From: Matthew Michilot <[email protected]>

Captured video would be out of sync when using the adv7280 with the BT.656-4 protocol. Certain registers (0x04, 0x31, 0xE6) had to be configured properly to ensure BT.656-4 compatibility.

An error in the adv7280 reference manual suggested that EAV/SAV mode was enabled by default, however upon inspecting register 0x31, it was determined to be disabled by default.

[fabio: Introduce "adv,adv7182-force-bt656-4"]

---
Changes since v1:
- Only force BT656-4 when the DT property is present.

 drivers/media/i2c/adv7180.c | 30 ++++++++++++++++++++++++++----
 1 file changed, 26 insertions(+), 4 deletions(-)
drivers/media/i2c/adv7180.c +26 -4
index 44bb6fe85644..a532df813d74 100644
@@ -94,6 +94,7 @@
 #define ADV7180_REG_SHAP_FILTER_CTL_1	0x0017
 #define ADV7180_REG_CTRL_2		0x001d
 #define ADV7180_REG_VSYNC_FIELD_CTL_1	0x0031
+#define ADV7180_VSYNC_FIELD_CTL_1_NEWAV 0x12
 #define ADV7180_REG_MANUAL_WIN_CTL_1	0x003d
 #define ADV7180_REG_MANUAL_WIN_CTL_2	0x003e
 #define ADV7180_REG_MANUAL_WIN_CTL_3	0x003f
@@ -216,6 +217,7 @@ struct adv7180_state {
 	struct i2c_client	*vpp_client;
 	const struct adv7180_chip_info *chip_info;
 	enum v4l2_field		field;
+	bool			force_bt656_4;
 };
 #define to_adv7180_sd(_ctrl) (&container_of(_ctrl->handler,		\
 					    struct adv7180_state,	\
@@ -963,10 +965,26 @@ static int adv7182_init(struct adv7180_state *state)
 		adv7180_write(state, ADV7180_REG_EXTENDED_OUTPUT_CONTROL, 0x57);
 		adv7180_write(state, ADV7180_REG_CTRL_2, 0xc0);
 	} else {
-		if (state->chip_info->flags & ADV7180_FLAG_V2)
-			adv7180_write(state,
-				      ADV7180_REG_EXTENDED_OUTPUT_CONTROL,
-				      0x17);
+		if (state->chip_info->flags & ADV7180_FLAG_V2) {
+			if (state->force_bt656_4) {
+				/* ITU-R BT.656-4 compatible */
+				adv7180_write(state,
+					      ADV7180_REG_EXTENDED_OUTPUT_CONTROL,
+					      ADV7180_EXTENDED_OUTPUT_CONTROL_NTSCDIS);
+				/* Manually set NEWAVMODE */
+				adv7180_write(state,
+					      ADV7180_REG_VSYNC_FIELD_CTL_1,
+					      ADV7180_VSYNC_FIELD_CTL_1_NEWAV);
+				/* Manually set V bit end position in NTSC mode */
+				adv7180_write(state,
+					     ADV7180_REG_NTSC_V_BIT_END,
+					     ADV7180_NTSC_V_BIT_END_MANUAL_NVEND);
+			} else {
+				adv7180_write(state,
+					      ADV7180_REG_EXTENDED_OUTPUT_CONTROL,
+					      0x17);
+			}
+		}
 		else
 			adv7180_write(state,
 				      ADV7180_REG_EXTENDED_OUTPUT_CONTROL,
@@ -1314,6 +1332,7 @@ static int init_device(struct adv7180_state *state)
 static int adv7180_probe(struct i2c_client *client,
 			 const struct i2c_device_id *id)
 {
+	struct device_node *np = client->dev.of_node;
 	struct adv7180_state *state;
 	struct v4l2_subdev *sd;
 	int ret;
@@ -1338,6 +1357,9 @@ static int adv7180_probe(struct i2c_client *client,
 		return ret;
 	}
 
+	if (of_property_read_bool(np, "adv,adv7182-force-bt656-4"))
+		state->force_bt656_4 = true;
+
 	if (state->chip_info->flags & ADV7180_FLAG_MIPI_CSI2) {
 		state->csi_client = i2c_new_dummy_device(client->adapter,
 				ADV7180_DEFAULT_CSI_I2C_ADDR);
Signature · 1 line
2.25.1
maintainer
#2 lore raw
In reply to Fabio Estevam
Quoted 7 lines · Fabio Estevam

Captured NTSC video would be out of sync when using the adv7280 with the BT.656-4 protocol. Certain registers (0x04, 0x31, 0xE6) need to be configured properly to ensure BT.656-4 compatibility.

Introduce the 'adv,adv7182-force-bt656-4' property to allow the ADV7280 behavior to be consistent with the ADV7180, where BT.656-4 timing is used.

I'm confused by the part numbers. 7182 or 7280? In any case, I'd just drop the part number from the property name.

Quoted 24 lines
---
 Documentation/devicetree/bindings/media/i2c/adv7180.yaml | 5 +++++
 1 file changed, 5 insertions(+)
Documentation/devicetree/bindings/media/i2c/adv7180.yaml +5 -0
index bcfd93739b4f..83e47b0c9fa2 100644
@@ -35,6 +35,11 @@ properties:
   powerdown-gpios:
     maxItems: 1
 
+  adv,adv7182-force-bt656-4:
+    description:
+      Indicates that ADV7182 should output a BT.656-4 compatible stream.
+    type: boolean
+
   port:
     $ref: /schemas/graph.yaml#/properties/port
 
Signature · 1 line
2.25.1
#3 lore raw

Hi Rob,

Quoted 2 lines · Rob Herring

I'm confused by the part numbers. 7182 or 7280? In any case, I'd just drop the part number from the property name.

Yes, dropping the part number from the property name is less confusing.

Will do as suggested in v2.

Thanks