From 71fdb5d9021eb4aba727af8e5a7daedeb2f00860 Mon Sep 17 00:00:00 2001 From: Dave Stevenson Date: Thu, 17 Feb 2022 16:23:23 +0000 Subject: [PATCH] media: i2c: ov7251: Add get_selection for NATIVE_SIZE, CROP_BOUNDS, CROP_DEFAULT As required by libcamera, add get_selection handling for V4L2_SEL_TGT_NATIVE_SIZE, V4L2_SEL_TGT_CROP_DEFAULT, and V4L2_SEL_TGT_CROP_BOUNDS. Signed-off-by: Dave Stevenson --- drivers/media/i2c/ov7251.c | 45 ++++++++++++++++++++++++++++++++------ 1 file changed, 38 insertions(+), 7 deletions(-) --- a/drivers/media/i2c/ov7251.c +++ b/drivers/media/i2c/ov7251.c @@ -56,6 +56,18 @@ #define OV7251_PLL2_SYS_DIV_REG 0x309a #define OV7251_PLL2_ADC_DIV_REG 0x309b +/* + * OV7251 native and active pixel array size. + * Datasheet not available to confirm these values, so assume there are no + * border pixels. + */ +#define OV7251_NATIVE_WIDTH 640U +#define OV7251_NATIVE_HEIGHT 480U +#define OV7251_PIXEL_ARRAY_LEFT 0U +#define OV7251_PIXEL_ARRAY_TOP 0U +#define OV7251_PIXEL_ARRAY_WIDTH 640U +#define OV7251_PIXEL_ARRAY_HEIGHT 480U + #define OV7251_PIXEL_CLOCK 48000000 struct reg_value { @@ -1212,15 +1224,34 @@ static int ov7251_get_selection(struct v { struct ov7251 *ov7251 = to_ov7251(sd); - if (sel->target != V4L2_SEL_TGT_CROP) - return -EINVAL; + switch (sel->target) { + case V4L2_SEL_TGT_CROP: + mutex_lock(&ov7251->lock); + sel->r = *__ov7251_get_pad_crop(ov7251, sd_state, sel->pad, + sel->which); + mutex_unlock(&ov7251->lock); - mutex_lock(&ov7251->lock); - sel->r = *__ov7251_get_pad_crop(ov7251, sd_state, sel->pad, - sel->which); - mutex_unlock(&ov7251->lock); + return 0; - return 0; + case V4L2_SEL_TGT_NATIVE_SIZE: + sel->r.top = 0; + sel->r.left = 0; + sel->r.width = OV7251_NATIVE_WIDTH; + sel->r.height = OV7251_NATIVE_HEIGHT; + + return 0; + + case V4L2_SEL_TGT_CROP_DEFAULT: + case V4L2_SEL_TGT_CROP_BOUNDS: + sel->r.top = OV7251_PIXEL_ARRAY_TOP; + sel->r.left = OV7251_PIXEL_ARRAY_LEFT; + sel->r.width = OV7251_PIXEL_ARRAY_WIDTH; + sel->r.height = OV7251_PIXEL_ARRAY_HEIGHT; + + return 0; + } + + return -EINVAL; } static int ov7251_s_stream(struct v4l2_subdev *subdev, int enable)