media: i2c: adv748x: Write initial DV timings to device
authorNiklas Söderlund <niklas.soderlund+renesas@ragnatech.se>
Wed, 22 Feb 2023 22:12:48 +0000 (23:12 +0100)
committerHans Verkuil <hverkuil-cisco@xs4all.nl>
Tue, 11 Apr 2023 15:10:10 +0000 (17:10 +0200)
When initializing the HDMI block during probe an initial set of timings
are selected. These timings are stored in the drivers private data, but
not written to the device.

This in itself is not bad, but in s_dv_timings() the timings stored in
the drivers private data are compared to the new timings, if they match
no action is taken. This creates the corner-case where the timing
selected at initialization is the first timings a user want to use as
the driver then never writes it to the device preventing proper
operation.

Fix this by writing the timings to the device at initialization in
addition to storing them in the drivers private data.

Signed-off-by: Niklas Söderlund <niklas.soderlund+renesas@ragnatech.se>
Signed-off-by: Hans Verkuil <hverkuil-cisco@xs4all.nl>
drivers/media/i2c/adv748x/adv748x-hdmi.c

index 1d62e05..47688d1 100644 (file)
@@ -721,11 +721,10 @@ static int adv748x_hdmi_init_controls(struct adv748x_hdmi *hdmi)
 int adv748x_hdmi_init(struct adv748x_hdmi *hdmi)
 {
        struct adv748x_state *state = adv748x_hdmi_to_state(hdmi);
-       static const struct v4l2_dv_timings cea1280x720 =
-               V4L2_DV_BT_CEA_1280X720P30;
+       struct v4l2_dv_timings cea1280x720 = V4L2_DV_BT_CEA_1280X720P30;
        int ret;
 
-       hdmi->timings = cea1280x720;
+       adv748x_hdmi_s_dv_timings(&hdmi->sd, &cea1280x720);
 
        /* Initialise a default 16:9 aspect ratio */
        hdmi->aspect_ratio.numerator = 16;