diff --git a/drivers/media/platform/rockchip/cif/capture.c b/drivers/media/platform/rockchip/cif/capture.c index 1224740f122c..20c9aaf440b5 100644 --- a/drivers/media/platform/rockchip/cif/capture.c +++ b/drivers/media/platform/rockchip/cif/capture.c @@ -5073,6 +5073,7 @@ static int rkcif_try_fmt_vid_cap_mplane(struct file *file, void *fh, static int rkcif_enum_framesizes(struct file *file, void *prov, struct v4l2_frmsizeenum *fsize) { + struct v4l2_frmsize_discrete *d = &fsize->discrete; struct v4l2_frmsize_stepwise *s = &fsize->stepwise; struct rkcif_stream *stream = video_drvdata(file); struct rkcif_device *dev = stream->cifdev; @@ -5093,13 +5094,19 @@ static int rkcif_enum_framesizes(struct file *file, void *prov, &input_rect, stream->id, &csi_info); - fsize->type = V4L2_FRMSIZE_TYPE_STEPWISE; - s->min_width = CIF_MIN_WIDTH; - s->min_height = CIF_MIN_HEIGHT; - s->max_width = input_rect.width; - s->max_height = input_rect.height; - s->step_width = OUTPUT_STEP_WISE; - s->step_height = OUTPUT_STEP_WISE; + if (dev->hw_dev->adapt_to_usbcamerahal) { + fsize->type = V4L2_FRMSIZE_TYPE_DISCRETE; + d->width = input_rect.width; + d->height = input_rect.height; + } else { + fsize->type = V4L2_FRMSIZE_TYPE_STEPWISE; + s->min_width = CIF_MIN_WIDTH; + s->min_height = CIF_MIN_HEIGHT; + s->max_width = input_rect.width; + s->max_height = input_rect.height; + s->step_width = OUTPUT_STEP_WISE; + s->step_height = OUTPUT_STEP_WISE; + } return 0; } @@ -5131,13 +5138,19 @@ static int rkcif_enum_frameintervals(struct file *file, void *fh, fi.interval.denominator = 30; } - fival->type = V4L2_FRMIVAL_TYPE_CONTINUOUS; - fival->stepwise.step.numerator = 1; - fival->stepwise.step.denominator = 1; - fival->stepwise.max.numerator = 1; - fival->stepwise.max.denominator = 1; - fival->stepwise.min.numerator = fi.interval.numerator; - fival->stepwise.min.denominator = fi.interval.denominator; + if (dev->hw_dev->adapt_to_usbcamerahal) { + fival->type = V4L2_FRMIVAL_TYPE_DISCRETE; + fival->discrete.numerator = fi.interval.numerator; + fival->discrete.denominator = fi.interval.denominator; + } else { + fival->type = V4L2_FRMIVAL_TYPE_CONTINUOUS; + fival->stepwise.step.numerator = 1; + fival->stepwise.step.denominator = 1; + fival->stepwise.max.numerator = 1; + fival->stepwise.max.denominator = 1; + fival->stepwise.min.numerator = fi.interval.numerator; + fival->stepwise.min.denominator = fi.interval.denominator; + } return 0; } diff --git a/drivers/media/platform/rockchip/cif/hw.c b/drivers/media/platform/rockchip/cif/hw.c index 9813197d7006..a6d4ff096df9 100644 --- a/drivers/media/platform/rockchip/cif/hw.c +++ b/drivers/media/platform/rockchip/cif/hw.c @@ -1197,6 +1197,11 @@ static int rkcif_plat_hw_probe(struct platform_device *pdev) return PTR_ERR(cif_hw->base_addr); } + if (of_property_read_bool(np, "rockchip,android-usb-camerahal-enable")) { + dev_info(dev, "config cif adapt to android usb camera hal!\n"); + cif_hw->adapt_to_usbcamerahal = true; + } + cif_hw->grf = syscon_regmap_lookup_by_phandle(np, "rockchip,grf"); if (IS_ERR(cif_hw->grf)) dev_warn(dev, "unable to get rockchip,grf\n"); diff --git a/drivers/media/platform/rockchip/cif/hw.h b/drivers/media/platform/rockchip/cif/hw.h index fd6ff6dca3ce..0b9f6ca07411 100644 --- a/drivers/media/platform/rockchip/cif/hw.h +++ b/drivers/media/platform/rockchip/cif/hw.h @@ -127,6 +127,7 @@ struct rkcif_hw { struct mutex dev_lock; struct rkcif_multi_sync_config sync_config; spinlock_t group_lock; + bool adapt_to_usbcamerahal; }; void rkcif_hw_soft_reset(struct rkcif_hw *cif_hw, bool is_rst_iommu);