diff options
| -rw-r--r-- | drivers/staging/media/atomisp/pci/atomisp_internal.h | 1 | ||||
| -rw-r--r-- | drivers/staging/media/atomisp/pci/atomisp_v4l2.c | 30 | 
2 files changed, 28 insertions, 3 deletions
diff --git a/drivers/staging/media/atomisp/pci/atomisp_internal.h b/drivers/staging/media/atomisp/pci/atomisp_internal.h index 9fded17a2c71..f7b4bee9574b 100644 --- a/drivers/staging/media/atomisp/pci/atomisp_internal.h +++ b/drivers/staging/media/atomisp/pci/atomisp_internal.h @@ -126,6 +126,7 @@ struct atomisp_input_subdev {  	unsigned int type;  	enum atomisp_camera_port port;  	u32 code; /* MEDIA_BUS_FMT_* */ +	bool binning_support;  	bool crop_support;  	struct v4l2_subdev *camera;  	/* Sensor rects for sensors which support crop */ diff --git a/drivers/staging/media/atomisp/pci/atomisp_v4l2.c b/drivers/staging/media/atomisp/pci/atomisp_v4l2.c index 3a2e15605919..c43b916a006e 100644 --- a/drivers/staging/media/atomisp/pci/atomisp_v4l2.c +++ b/drivers/staging/media/atomisp/pci/atomisp_v4l2.c @@ -934,11 +934,12 @@ v4l2_device_failed:  static void atomisp_init_sensor(struct atomisp_input_subdev *input)  {  	struct v4l2_subdev_mbus_code_enum mbus_code_enum = { }; +	struct v4l2_subdev_frame_size_enum fse = { };  	struct v4l2_subdev_state sd_state = {  		.pads = &input->pad_cfg,  	};  	struct v4l2_subdev_selection sel = { }; -	int err; +	int i, err;  	mbus_code_enum.which = V4L2_SUBDEV_FORMAT_ACTIVE;  	err = v4l2_subdev_call(input->camera, pad, enum_mbus_code, NULL, &mbus_code_enum); @@ -962,6 +963,28 @@ static void atomisp_init_sensor(struct atomisp_input_subdev *input)  	input->active_rect = sel.r;  	/* +	 * Check for a framesize with half active_rect width and height, +	 * if found assume the sensor supports binning. +	 * Do this before changing the crop-rect since that may influence +	 * enum_frame_size results. +	 */ +	for (i = 0; ; i++) { +		fse.index = i; +		fse.code = input->code; +		fse.which = V4L2_SUBDEV_FORMAT_ACTIVE; + +		err = v4l2_subdev_call(input->camera, pad, enum_frame_size, NULL, &fse); +		if (err) +			break; + +		if (fse.min_width <= (input->active_rect.width / 2) && +		    fse.min_height <= (input->active_rect.height / 2)) { +			input->binning_support = true; +			break; +		} +	} + +	/*  	 * The ISP also wants the non-active pixels at the border of the sensor  	 * for padding, set the crop rect to cover the entire sensor instead  	 * of only the default active area. @@ -983,9 +1006,10 @@ static void atomisp_init_sensor(struct atomisp_input_subdev *input)  	if (err)  		return; -	dev_info(input->camera->dev, "Supports crop native %dx%d active %dx%d\n", +	dev_info(input->camera->dev, "Supports crop native %dx%d active %dx%d binning %d\n",  		 input->native_rect.width, input->native_rect.height, -		 input->active_rect.width, input->active_rect.height); +		 input->active_rect.width, input->active_rect.height, +		 input->binning_support);  	input->crop_support = true;  }  | 
