media fixes for v4.7-rc7
-----BEGIN PGP SIGNATURE----- Version: GnuPG v1 iQIcBAABAgAGBQJXhhNXAAoJEAhfPr2O5OEVydgP/A6DOW7KTQ/0yRlKxvvGObqV Fdxwt2bUypksRhSh0r/cMpI2ILDGbXJyVseyz3zJ8LfRPw5Sm+BqkqiMfNte47c9 fc1faaIR6MHkfPbzjBYM+4i2GGuHJ6ltjWGrL+ZnaXwYmJQcbGQGBZu/JX5N+gjm qc++PFb8P3IieK4IL5+xRWaaXeCceyVIc8KK4f3LHPH7zH5dsuPQEeEOhjK74PLI 5uxmI6S15tK0OB+PqYAlwIwaGGhXWGOuVboXpCFQ+T6SEHmpblnC90XGjfFDGsIo ai5BXGiiokTSD5vvZwa/f0rnEiqk+uxLpibercaI2zUQaoLxqysnDIVZGH9wmMZD Ddh2QayZO3xFdGDIt/pXQuxAj/IvRI5IbRJqzKPOw3bJGjrkpJRXqRXUS7nMWCbF OJns6HbFq4UaCpxmHjutPA3xE7rWRer25aok1hEMkqAGjFmVK1dmTvinO8eolgc9 MZlX/J/fGwkcNXzUOAwzrO52DC6qVQbxNfpZ/8daLDjSMNA0IjV/ubpm8TJ/PRn4 fyefImTiswpq1vJSO9sINitzQIMQEpAA/VokPAkVuDCs7Bu2YLvcSLU2IRIWXetB D7ayQxaZnGsbCOCi95IfUvEAdvOpauRf0QvRDnEW4puHvJxrt1a1vjKD8VoArV8M U6RVqs7kjqw6FNDAwp3J =L9yq -----END PGP SIGNATURE----- Merge tag 'media/v4.7-2' of git://git.kernel.org/pub/scm/linux/kernel/git/mchehab/linux-media Pull media fixes from Mauro Carvalho Chehab: "Two regression fixes: - a regression when handling VIDIOC_CROPCAP at the media core; - a regression at adv7604 that was ignoring pad number in subdev ops" * tag 'media/v4.7-2' of git://git.kernel.org/pub/scm/linux/kernel/git/mchehab/linux-media: [media] adv7604: Don't ignore pad number in subdev DV timings pad operations [media] v4l2-ioctl: fix stupid mistake in cropcap condition
This commit is contained in:
commit
cf875cc1dc
|
@ -779,11 +779,31 @@ static const struct v4l2_dv_timings_cap adv76xx_timings_cap_digital = {
|
|||
V4L2_DV_BT_CAP_CUSTOM)
|
||||
};
|
||||
|
||||
static inline const struct v4l2_dv_timings_cap *
|
||||
adv76xx_get_dv_timings_cap(struct v4l2_subdev *sd)
|
||||
/*
|
||||
* 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)
|
||||
{
|
||||
return is_digital_input(sd) ? &adv76xx_timings_cap_digital :
|
||||
&adv7604_timings_cap_analog;
|
||||
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_subdev *sd,
|
|||
const 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(struct v4l2_subdev *sd,
|
|||
return -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(struct v4l2_subdev *sd,
|
|||
static 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 v4l2_subdev *sd,
|
|||
|
||||
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;
|
||||
|
||||
|
|
|
@ -2171,7 +2171,7 @@ static int v4l_cropcap(const struct v4l2_ioctl_ops *ops,
|
|||
* The determine_valid_ioctls() call already should ensure
|
||||
* that this can never happen, but just in case...
|
||||
*/
|
||||
if (WARN_ON(!ops->vidioc_cropcap && !ops->vidioc_cropcap))
|
||||
if (WARN_ON(!ops->vidioc_cropcap && !ops->vidioc_g_selection))
|
||||
return -ENOTTY;
|
||||
|
||||
if (ops->vidioc_cropcap)
|
||||
|
|
Loading…
Reference in New Issue