diff options
| -rw-r--r-- | drivers/media/v4l2-core/v4l2-dv-timings.c | 20 | 
1 files changed, 14 insertions, 6 deletions
diff --git a/drivers/media/v4l2-core/v4l2-dv-timings.c b/drivers/media/v4l2-core/v4l2-dv-timings.c index 003c32fed3f7..942d0005c55e 100644 --- a/drivers/media/v4l2-core/v4l2-dv-timings.c +++ b/drivers/media/v4l2-core/v4l2-dv-timings.c @@ -145,6 +145,8 @@ bool v4l2_valid_dv_timings(const struct v4l2_dv_timings *t,  	const struct v4l2_bt_timings *bt = &t->bt;  	const struct v4l2_bt_timings_cap *cap = &dvcap->bt;  	u32 caps = cap->capabilities; +	const u32 max_vert = 10240; +	u32 max_hor = 3 * bt->width;  	if (t->type != V4L2_DV_BT_656_1120)  		return false; @@ -166,14 +168,20 @@ bool v4l2_valid_dv_timings(const struct v4l2_dv_timings *t,  	if (!bt->interlaced &&  	    (bt->il_vbackporch || bt->il_vsync || bt->il_vfrontporch))  		return false; -	if (bt->hfrontporch > 2 * bt->width || -	    bt->hsync > 1024 || bt->hbackporch > 1024) +	/* +	 * Some video receivers cannot properly separate the frontporch, +	 * backporch and sync values, and instead they only have the total +	 * blanking. That can be assigned to any of these three fields. +	 * So just check that none of these are way out of range. +	 */ +	if (bt->hfrontporch > max_hor || +	    bt->hsync > max_hor || bt->hbackporch > max_hor)  		return false; -	if (bt->vfrontporch > 4096 || -	    bt->vsync > 128 || bt->vbackporch > 4096) +	if (bt->vfrontporch > max_vert || +	    bt->vsync > max_vert || bt->vbackporch > max_vert)  		return false; -	if (bt->interlaced && (bt->il_vfrontporch > 4096 || -	    bt->il_vsync > 128 || bt->il_vbackporch > 4096)) +	if (bt->interlaced && (bt->il_vfrontporch > max_vert || +	    bt->il_vsync > max_vert || bt->il_vbackporch > max_vert))  		return false;  	return fnc == NULL || fnc(t, fnc_handle);  }  | 
