Patch "[media] adv7604: Don't ignore pad number in subdev DV timings pad operations" has been added to the 4.6-stable tree
Subsystems (3)
This is a note to let you know that I've just added the patch titled
[media] adv7604: Don't ignore pad number in subdev DV timings pad operations
to the 4.6-stable tree which can be found at:
http://www.kernel.org/git/?p=linux/kernel/git/stable/stable-queue.git;a=summary
The filename of the patch is:
adv7604-don-t-ignore-pad-number-in-subdev-dv-timings-pad-operations.patch
and it can be found in the queue-4.6 subdirectory.
If you, or anyone else, feels it should not be added to the stable tree, please let <[email protected]> know about it.
Quoted 1 line
From
6519c3d7b8621c9f4333c98ed4b703029b51ba79Mon Sep 17 00:00:00 2001
From: Laurent Pinchart <[email protected]>
Date: Tue, 24 May 2016 09:09:33 -0300
Subject: [media] adv7604: Don't ignore pad number in subdev DV timings pad operations
From: Laurent Pinchart <[email protected]>
commit 6519c3d7b8621c9f4333c98ed4b703029b51ba79 upstream.
The dv_timings_cap() and enum_dv_timings() pad operations take a pad number as an input argument and return the DV timings capabilities and list of supported DV timings for that pad.
Commit bd3e275f3ec0 ("[media] media: i2c: adv7604: Use v4l2-dv-timings helpers") broke this as it started ignoring the pad number, always returning the information associated with the currently selected input. Fix it.
--- drivers/media/i2c/adv7604.c | 48 +++++++++++++++++++++++++++++++++----------- 1 file changed, 36 insertions(+), 12 deletions(-)
drivers/media/i2c/adv7604.c +36 -12
@@ -779,11 +779,31 @@ static const struct v4l2_dv_timings_cap V4L2_DV_BT_CAP_CUSTOM) }; -static inline const struct v4l2_dv_timings_cap * -adv76xx_get_dv_timings_cap (struct v4l2_subdev *sd) -{ -return is_digital_input (sd) ? &adv76xx_timings_cap_digital : - &adv7604_timings_cap_analog; +/* +* Return the DV timings capabilities for the requested sink pad. As a special +* case, pad value -1 returns the capabilities for the currently selected input. +*/ +static const struct v4l2_dv_timings_cap * +adv76xx_get_dv_timings_cap (struct v4l2_subdev *sd,int pad) +{ +if (pad ==-1 ) { +struct adv76xx_state *state =to_state (sd); + + pad = state->selected_input; + } + +switch (pad) { +case ADV76XX_PAD_HDMI_PORT_A : +case ADV7604_PAD_HDMI_PORT_B : +case ADV7604_PAD_HDMI_PORT_C : +case ADV7604_PAD_HDMI_PORT_D : +return &adv76xx_timings_cap_digital; + +case ADV7604_PAD_VGA_RGB : +case ADV7604_PAD_VGA_COMP : +default : +return &adv7604_timings_cap_analog; + } }
@@ -1329,7 +1349,7 @@ static int stdi2dv_timings(struct v4l2_sconst struct v4l2_bt_timings *bt = &v4l2_dv_timings_presets[i].bt;if (!v4l2_valid_dv_timings (&v4l2_dv_timings_presets[i], -adv76xx_get_dv_timings_cap (sd), +adv76xx_get_dv_timings_cap (sd,-1 ), adv76xx_check_dv_timings,NULL ))continue ;if (vtotal (bt) != stdi->lcf +1 )
@@ -1430,18 +1450,22 @@ static int adv76xx_enum_dv_timings(strucreturn -EINVAL ;return v4l2_enum_dv_timings_cap (timings, -adv76xx_get_dv_timings_cap (sd), adv76xx_check_dv_timings,NULL ); +adv76xx_get_dv_timings_cap (sd, timings->pad), + adv76xx_check_dv_timings,NULL ); }static int adv76xx_dv_timings_cap (struct v4l2_subdev *sd,struct v4l2_dv_timings_cap *cap) {struct adv76xx_state *state =to_state (sd); +unsigned int pad = cap->pad;if (cap->pad >= state->source_pad)return -EINVAL ; - *cap = *adv76xx_get_dv_timings_cap (sd); + *cap = *adv76xx_get_dv_timings_cap (sd, pad); + cap->pad = pad; +return 0 ; }
@@ -1450,9 +1474,9 @@ static int adv76xx_dv_timings_cap(structstatic void adv76xx_fill_optional_dv_timings_fields (struct v4l2_subdev *sd,struct v4l2_dv_timings *timings) { -v4l2_find_dv_timings_cap (timings,adv76xx_get_dv_timings_cap (sd), -is_digital_input (sd) ?250000 :1000000 , - adv76xx_check_dv_timings,NULL ); +v4l2_find_dv_timings_cap (timings,adv76xx_get_dv_timings_cap (sd,-1 ), +is_digital_input (sd) ?250000 :1000000 , + adv76xx_check_dv_timings,NULL ); }static unsigned int adv7604_read_hdmi_pixelclock (struct v4l2_subdev *sd)
@@ -1620,7 +1644,7 @@ static int adv76xx_s_dv_timings(struct v bt = &timings->bt; -if (!v4l2_valid_dv_timings (timings,adv76xx_get_dv_timings_cap (sd), +if (!v4l2_valid_dv_timings (timings,adv76xx_get_dv_timings_cap (sd,-1 ), adv76xx_check_dv_timings,NULL ))return -ERANGE ;
Patches currently in stable-queue which might be from [email protected] are
queue-4.6/adv7604-don-t-ignore-pad-number-in-subdev-dv-timings-pad-operations.patch