|
@@ -597,6 +597,39 @@ int v4l_fill_dv_preset_info(u32 preset, struct v4l2_dv_enum_preset *info)
|
|
|
}
|
|
|
EXPORT_SYMBOL_GPL(v4l_fill_dv_preset_info);
|
|
|
|
|
|
+/**
|
|
|
+ * v4l_match_dv_timings - check if two timings match
|
|
|
+ * @t1 - compare this v4l2_dv_timings struct...
|
|
|
+ * @t2 - with this struct.
|
|
|
+ * @pclock_delta - the allowed pixelclock deviation.
|
|
|
+ *
|
|
|
+ * Compare t1 with t2 with a given margin of error for the pixelclock.
|
|
|
+ */
|
|
|
+bool v4l_match_dv_timings(const struct v4l2_dv_timings *t1,
|
|
|
+ const struct v4l2_dv_timings *t2,
|
|
|
+ unsigned pclock_delta)
|
|
|
+{
|
|
|
+ if (t1->type != t2->type || t1->type != V4L2_DV_BT_656_1120)
|
|
|
+ return false;
|
|
|
+ if (t1->bt.width == t2->bt.width &&
|
|
|
+ t1->bt.height == t2->bt.height &&
|
|
|
+ t1->bt.interlaced == t2->bt.interlaced &&
|
|
|
+ t1->bt.polarities == t2->bt.polarities &&
|
|
|
+ t1->bt.pixelclock >= t2->bt.pixelclock - pclock_delta &&
|
|
|
+ t1->bt.pixelclock <= t2->bt.pixelclock + pclock_delta &&
|
|
|
+ t1->bt.hfrontporch == t2->bt.hfrontporch &&
|
|
|
+ t1->bt.vfrontporch == t2->bt.vfrontporch &&
|
|
|
+ t1->bt.vsync == t2->bt.vsync &&
|
|
|
+ t1->bt.vbackporch == t2->bt.vbackporch &&
|
|
|
+ (!t1->bt.interlaced ||
|
|
|
+ (t1->bt.il_vfrontporch == t2->bt.il_vfrontporch &&
|
|
|
+ t1->bt.il_vsync == t2->bt.il_vsync &&
|
|
|
+ t1->bt.il_vbackporch == t2->bt.il_vbackporch)))
|
|
|
+ return true;
|
|
|
+ return false;
|
|
|
+}
|
|
|
+EXPORT_SYMBOL_GPL(v4l_match_dv_timings);
|
|
|
+
|
|
|
const struct v4l2_frmsize_discrete *v4l2_find_nearest_format(
|
|
|
const struct v4l2_discrete_probe *probe,
|
|
|
s32 width, s32 height)
|