|
@@ -32,7 +32,7 @@
|
|
|
#define CCDC_MIN_HEIGHT 32
|
|
|
|
|
|
static struct v4l2_mbus_framefmt *
|
|
|
-__ccdc_get_format(struct isp_ccdc_device *ccdc, struct v4l2_subdev_fh *fh,
|
|
|
+__ccdc_get_format(struct isp_ccdc_device *ccdc, struct v4l2_subdev_pad_config *cfg,
|
|
|
unsigned int pad, enum v4l2_subdev_format_whence which);
|
|
|
|
|
|
static const unsigned int ccdc_fmts[] = {
|
|
@@ -1935,21 +1935,21 @@ static int ccdc_set_stream(struct v4l2_subdev *sd, int enable)
|
|
|
}
|
|
|
|
|
|
static struct v4l2_mbus_framefmt *
|
|
|
-__ccdc_get_format(struct isp_ccdc_device *ccdc, struct v4l2_subdev_fh *fh,
|
|
|
+__ccdc_get_format(struct isp_ccdc_device *ccdc, struct v4l2_subdev_pad_config *cfg,
|
|
|
unsigned int pad, enum v4l2_subdev_format_whence which)
|
|
|
{
|
|
|
if (which == V4L2_SUBDEV_FORMAT_TRY)
|
|
|
- return v4l2_subdev_get_try_format(fh, pad);
|
|
|
+ return v4l2_subdev_get_try_format(&ccdc->subdev, cfg, pad);
|
|
|
else
|
|
|
return &ccdc->formats[pad];
|
|
|
}
|
|
|
|
|
|
static struct v4l2_rect *
|
|
|
-__ccdc_get_crop(struct isp_ccdc_device *ccdc, struct v4l2_subdev_fh *fh,
|
|
|
+__ccdc_get_crop(struct isp_ccdc_device *ccdc, struct v4l2_subdev_pad_config *cfg,
|
|
|
enum v4l2_subdev_format_whence which)
|
|
|
{
|
|
|
if (which == V4L2_SUBDEV_FORMAT_TRY)
|
|
|
- return v4l2_subdev_get_try_crop(fh, CCDC_PAD_SOURCE_OF);
|
|
|
+ return v4l2_subdev_get_try_crop(&ccdc->subdev, cfg, CCDC_PAD_SOURCE_OF);
|
|
|
else
|
|
|
return &ccdc->crop;
|
|
|
}
|
|
@@ -1957,12 +1957,12 @@ __ccdc_get_crop(struct isp_ccdc_device *ccdc, struct v4l2_subdev_fh *fh,
|
|
|
/*
|
|
|
* ccdc_try_format - Try video format on a pad
|
|
|
* @ccdc: ISP CCDC device
|
|
|
- * @fh : V4L2 subdev file handle
|
|
|
+ * @cfg : V4L2 subdev pad configuration
|
|
|
* @pad: Pad number
|
|
|
* @fmt: Format
|
|
|
*/
|
|
|
static void
|
|
|
-ccdc_try_format(struct isp_ccdc_device *ccdc, struct v4l2_subdev_fh *fh,
|
|
|
+ccdc_try_format(struct isp_ccdc_device *ccdc, struct v4l2_subdev_pad_config *cfg,
|
|
|
unsigned int pad, struct v4l2_mbus_framefmt *fmt,
|
|
|
enum v4l2_subdev_format_whence which)
|
|
|
{
|
|
@@ -1998,7 +1998,7 @@ ccdc_try_format(struct isp_ccdc_device *ccdc, struct v4l2_subdev_fh *fh,
|
|
|
case CCDC_PAD_SOURCE_OF:
|
|
|
pixelcode = fmt->code;
|
|
|
field = fmt->field;
|
|
|
- *fmt = *__ccdc_get_format(ccdc, fh, CCDC_PAD_SINK, which);
|
|
|
+ *fmt = *__ccdc_get_format(ccdc, cfg, CCDC_PAD_SINK, which);
|
|
|
|
|
|
/* In SYNC mode the bridge converts YUV formats from 2X8 to
|
|
|
* 1X16. In BT.656 no such conversion occurs. As we don't know
|
|
@@ -2023,7 +2023,7 @@ ccdc_try_format(struct isp_ccdc_device *ccdc, struct v4l2_subdev_fh *fh,
|
|
|
}
|
|
|
|
|
|
/* Hardcode the output size to the crop rectangle size. */
|
|
|
- crop = __ccdc_get_crop(ccdc, fh, which);
|
|
|
+ crop = __ccdc_get_crop(ccdc, cfg, which);
|
|
|
fmt->width = crop->width;
|
|
|
fmt->height = crop->height;
|
|
|
|
|
@@ -2040,7 +2040,7 @@ ccdc_try_format(struct isp_ccdc_device *ccdc, struct v4l2_subdev_fh *fh,
|
|
|
break;
|
|
|
|
|
|
case CCDC_PAD_SOURCE_VP:
|
|
|
- *fmt = *__ccdc_get_format(ccdc, fh, CCDC_PAD_SINK, which);
|
|
|
+ *fmt = *__ccdc_get_format(ccdc, cfg, CCDC_PAD_SINK, which);
|
|
|
|
|
|
/* The video port interface truncates the data to 10 bits. */
|
|
|
info = omap3isp_video_format_info(fmt->code);
|
|
@@ -2112,12 +2112,12 @@ static void ccdc_try_crop(struct isp_ccdc_device *ccdc,
|
|
|
/*
|
|
|
* ccdc_enum_mbus_code - Handle pixel format enumeration
|
|
|
* @sd : pointer to v4l2 subdev structure
|
|
|
- * @fh : V4L2 subdev file handle
|
|
|
+ * @cfg : V4L2 subdev pad configuration
|
|
|
* @code : pointer to v4l2_subdev_mbus_code_enum structure
|
|
|
* return -EINVAL or zero on success
|
|
|
*/
|
|
|
static int ccdc_enum_mbus_code(struct v4l2_subdev *sd,
|
|
|
- struct v4l2_subdev_fh *fh,
|
|
|
+ struct v4l2_subdev_pad_config *cfg,
|
|
|
struct v4l2_subdev_mbus_code_enum *code)
|
|
|
{
|
|
|
struct isp_ccdc_device *ccdc = v4l2_get_subdevdata(sd);
|
|
@@ -2132,7 +2132,7 @@ static int ccdc_enum_mbus_code(struct v4l2_subdev *sd,
|
|
|
break;
|
|
|
|
|
|
case CCDC_PAD_SOURCE_OF:
|
|
|
- format = __ccdc_get_format(ccdc, fh, code->pad,
|
|
|
+ format = __ccdc_get_format(ccdc, cfg, code->pad,
|
|
|
V4L2_SUBDEV_FORMAT_TRY);
|
|
|
|
|
|
if (format->code == MEDIA_BUS_FMT_YUYV8_2X8 ||
|
|
@@ -2163,7 +2163,7 @@ static int ccdc_enum_mbus_code(struct v4l2_subdev *sd,
|
|
|
if (code->index != 0)
|
|
|
return -EINVAL;
|
|
|
|
|
|
- format = __ccdc_get_format(ccdc, fh, code->pad,
|
|
|
+ format = __ccdc_get_format(ccdc, cfg, code->pad,
|
|
|
V4L2_SUBDEV_FORMAT_TRY);
|
|
|
|
|
|
/* A pixel code equal to 0 means that the video port doesn't
|
|
@@ -2183,7 +2183,7 @@ static int ccdc_enum_mbus_code(struct v4l2_subdev *sd,
|
|
|
}
|
|
|
|
|
|
static int ccdc_enum_frame_size(struct v4l2_subdev *sd,
|
|
|
- struct v4l2_subdev_fh *fh,
|
|
|
+ struct v4l2_subdev_pad_config *cfg,
|
|
|
struct v4l2_subdev_frame_size_enum *fse)
|
|
|
{
|
|
|
struct isp_ccdc_device *ccdc = v4l2_get_subdevdata(sd);
|
|
@@ -2195,7 +2195,7 @@ static int ccdc_enum_frame_size(struct v4l2_subdev *sd,
|
|
|
format.code = fse->code;
|
|
|
format.width = 1;
|
|
|
format.height = 1;
|
|
|
- ccdc_try_format(ccdc, fh, fse->pad, &format, V4L2_SUBDEV_FORMAT_TRY);
|
|
|
+ ccdc_try_format(ccdc, cfg, fse->pad, &format, V4L2_SUBDEV_FORMAT_TRY);
|
|
|
fse->min_width = format.width;
|
|
|
fse->min_height = format.height;
|
|
|
|
|
@@ -2205,7 +2205,7 @@ static int ccdc_enum_frame_size(struct v4l2_subdev *sd,
|
|
|
format.code = fse->code;
|
|
|
format.width = -1;
|
|
|
format.height = -1;
|
|
|
- ccdc_try_format(ccdc, fh, fse->pad, &format, V4L2_SUBDEV_FORMAT_TRY);
|
|
|
+ ccdc_try_format(ccdc, cfg, fse->pad, &format, V4L2_SUBDEV_FORMAT_TRY);
|
|
|
fse->max_width = format.width;
|
|
|
fse->max_height = format.height;
|
|
|
|
|
@@ -2215,7 +2215,7 @@ static int ccdc_enum_frame_size(struct v4l2_subdev *sd,
|
|
|
/*
|
|
|
* ccdc_get_selection - Retrieve a selection rectangle on a pad
|
|
|
* @sd: ISP CCDC V4L2 subdevice
|
|
|
- * @fh: V4L2 subdev file handle
|
|
|
+ * @cfg: V4L2 subdev pad configuration
|
|
|
* @sel: Selection rectangle
|
|
|
*
|
|
|
* The only supported rectangles are the crop rectangles on the output formatter
|
|
@@ -2223,7 +2223,7 @@ static int ccdc_enum_frame_size(struct v4l2_subdev *sd,
|
|
|
*
|
|
|
* Return 0 on success or a negative error code otherwise.
|
|
|
*/
|
|
|
-static int ccdc_get_selection(struct v4l2_subdev *sd, struct v4l2_subdev_fh *fh,
|
|
|
+static int ccdc_get_selection(struct v4l2_subdev *sd, struct v4l2_subdev_pad_config *cfg,
|
|
|
struct v4l2_subdev_selection *sel)
|
|
|
{
|
|
|
struct isp_ccdc_device *ccdc = v4l2_get_subdevdata(sd);
|
|
@@ -2239,12 +2239,12 @@ static int ccdc_get_selection(struct v4l2_subdev *sd, struct v4l2_subdev_fh *fh,
|
|
|
sel->r.width = INT_MAX;
|
|
|
sel->r.height = INT_MAX;
|
|
|
|
|
|
- format = __ccdc_get_format(ccdc, fh, CCDC_PAD_SINK, sel->which);
|
|
|
+ format = __ccdc_get_format(ccdc, cfg, CCDC_PAD_SINK, sel->which);
|
|
|
ccdc_try_crop(ccdc, format, &sel->r);
|
|
|
break;
|
|
|
|
|
|
case V4L2_SEL_TGT_CROP:
|
|
|
- sel->r = *__ccdc_get_crop(ccdc, fh, sel->which);
|
|
|
+ sel->r = *__ccdc_get_crop(ccdc, cfg, sel->which);
|
|
|
break;
|
|
|
|
|
|
default:
|
|
@@ -2257,7 +2257,7 @@ static int ccdc_get_selection(struct v4l2_subdev *sd, struct v4l2_subdev_fh *fh,
|
|
|
/*
|
|
|
* ccdc_set_selection - Set a selection rectangle on a pad
|
|
|
* @sd: ISP CCDC V4L2 subdevice
|
|
|
- * @fh: V4L2 subdev file handle
|
|
|
+ * @cfg: V4L2 subdev pad configuration
|
|
|
* @sel: Selection rectangle
|
|
|
*
|
|
|
* The only supported rectangle is the actual crop rectangle on the output
|
|
@@ -2265,7 +2265,7 @@ static int ccdc_get_selection(struct v4l2_subdev *sd, struct v4l2_subdev_fh *fh,
|
|
|
*
|
|
|
* Return 0 on success or a negative error code otherwise.
|
|
|
*/
|
|
|
-static int ccdc_set_selection(struct v4l2_subdev *sd, struct v4l2_subdev_fh *fh,
|
|
|
+static int ccdc_set_selection(struct v4l2_subdev *sd, struct v4l2_subdev_pad_config *cfg,
|
|
|
struct v4l2_subdev_selection *sel)
|
|
|
{
|
|
|
struct isp_ccdc_device *ccdc = v4l2_get_subdevdata(sd);
|
|
@@ -2284,17 +2284,17 @@ static int ccdc_set_selection(struct v4l2_subdev *sd, struct v4l2_subdev_fh *fh,
|
|
|
* rectangle.
|
|
|
*/
|
|
|
if (sel->flags & V4L2_SEL_FLAG_KEEP_CONFIG) {
|
|
|
- sel->r = *__ccdc_get_crop(ccdc, fh, sel->which);
|
|
|
+ sel->r = *__ccdc_get_crop(ccdc, cfg, sel->which);
|
|
|
return 0;
|
|
|
}
|
|
|
|
|
|
- format = __ccdc_get_format(ccdc, fh, CCDC_PAD_SINK, sel->which);
|
|
|
+ format = __ccdc_get_format(ccdc, cfg, CCDC_PAD_SINK, sel->which);
|
|
|
ccdc_try_crop(ccdc, format, &sel->r);
|
|
|
- *__ccdc_get_crop(ccdc, fh, sel->which) = sel->r;
|
|
|
+ *__ccdc_get_crop(ccdc, cfg, sel->which) = sel->r;
|
|
|
|
|
|
/* Update the source format. */
|
|
|
- format = __ccdc_get_format(ccdc, fh, CCDC_PAD_SOURCE_OF, sel->which);
|
|
|
- ccdc_try_format(ccdc, fh, CCDC_PAD_SOURCE_OF, format, sel->which);
|
|
|
+ format = __ccdc_get_format(ccdc, cfg, CCDC_PAD_SOURCE_OF, sel->which);
|
|
|
+ ccdc_try_format(ccdc, cfg, CCDC_PAD_SOURCE_OF, format, sel->which);
|
|
|
|
|
|
return 0;
|
|
|
}
|
|
@@ -2302,19 +2302,19 @@ static int ccdc_set_selection(struct v4l2_subdev *sd, struct v4l2_subdev_fh *fh,
|
|
|
/*
|
|
|
* ccdc_get_format - Retrieve the video format on a pad
|
|
|
* @sd : ISP CCDC V4L2 subdevice
|
|
|
- * @fh : V4L2 subdev file handle
|
|
|
+ * @cfg: V4L2 subdev pad configuration
|
|
|
* @fmt: Format
|
|
|
*
|
|
|
* Return 0 on success or -EINVAL if the pad is invalid or doesn't correspond
|
|
|
* to the format type.
|
|
|
*/
|
|
|
-static int ccdc_get_format(struct v4l2_subdev *sd, struct v4l2_subdev_fh *fh,
|
|
|
+static int ccdc_get_format(struct v4l2_subdev *sd, struct v4l2_subdev_pad_config *cfg,
|
|
|
struct v4l2_subdev_format *fmt)
|
|
|
{
|
|
|
struct isp_ccdc_device *ccdc = v4l2_get_subdevdata(sd);
|
|
|
struct v4l2_mbus_framefmt *format;
|
|
|
|
|
|
- format = __ccdc_get_format(ccdc, fh, fmt->pad, fmt->which);
|
|
|
+ format = __ccdc_get_format(ccdc, cfg, fmt->pad, fmt->which);
|
|
|
if (format == NULL)
|
|
|
return -EINVAL;
|
|
|
|
|
@@ -2325,30 +2325,30 @@ static int ccdc_get_format(struct v4l2_subdev *sd, struct v4l2_subdev_fh *fh,
|
|
|
/*
|
|
|
* ccdc_set_format - Set the video format on a pad
|
|
|
* @sd : ISP CCDC V4L2 subdevice
|
|
|
- * @fh : V4L2 subdev file handle
|
|
|
+ * @cfg: V4L2 subdev pad configuration
|
|
|
* @fmt: Format
|
|
|
*
|
|
|
* Return 0 on success or -EINVAL if the pad is invalid or doesn't correspond
|
|
|
* to the format type.
|
|
|
*/
|
|
|
-static int ccdc_set_format(struct v4l2_subdev *sd, struct v4l2_subdev_fh *fh,
|
|
|
+static int ccdc_set_format(struct v4l2_subdev *sd, struct v4l2_subdev_pad_config *cfg,
|
|
|
struct v4l2_subdev_format *fmt)
|
|
|
{
|
|
|
struct isp_ccdc_device *ccdc = v4l2_get_subdevdata(sd);
|
|
|
struct v4l2_mbus_framefmt *format;
|
|
|
struct v4l2_rect *crop;
|
|
|
|
|
|
- format = __ccdc_get_format(ccdc, fh, fmt->pad, fmt->which);
|
|
|
+ format = __ccdc_get_format(ccdc, cfg, fmt->pad, fmt->which);
|
|
|
if (format == NULL)
|
|
|
return -EINVAL;
|
|
|
|
|
|
- ccdc_try_format(ccdc, fh, fmt->pad, &fmt->format, fmt->which);
|
|
|
+ ccdc_try_format(ccdc, cfg, fmt->pad, &fmt->format, fmt->which);
|
|
|
*format = fmt->format;
|
|
|
|
|
|
/* Propagate the format from sink to source */
|
|
|
if (fmt->pad == CCDC_PAD_SINK) {
|
|
|
/* Reset the crop rectangle. */
|
|
|
- crop = __ccdc_get_crop(ccdc, fh, fmt->which);
|
|
|
+ crop = __ccdc_get_crop(ccdc, cfg, fmt->which);
|
|
|
crop->left = 0;
|
|
|
crop->top = 0;
|
|
|
crop->width = fmt->format.width;
|
|
@@ -2357,16 +2357,16 @@ static int ccdc_set_format(struct v4l2_subdev *sd, struct v4l2_subdev_fh *fh,
|
|
|
ccdc_try_crop(ccdc, &fmt->format, crop);
|
|
|
|
|
|
/* Update the source formats. */
|
|
|
- format = __ccdc_get_format(ccdc, fh, CCDC_PAD_SOURCE_OF,
|
|
|
+ format = __ccdc_get_format(ccdc, cfg, CCDC_PAD_SOURCE_OF,
|
|
|
fmt->which);
|
|
|
*format = fmt->format;
|
|
|
- ccdc_try_format(ccdc, fh, CCDC_PAD_SOURCE_OF, format,
|
|
|
+ ccdc_try_format(ccdc, cfg, CCDC_PAD_SOURCE_OF, format,
|
|
|
fmt->which);
|
|
|
|
|
|
- format = __ccdc_get_format(ccdc, fh, CCDC_PAD_SOURCE_VP,
|
|
|
+ format = __ccdc_get_format(ccdc, cfg, CCDC_PAD_SOURCE_VP,
|
|
|
fmt->which);
|
|
|
*format = fmt->format;
|
|
|
- ccdc_try_format(ccdc, fh, CCDC_PAD_SOURCE_VP, format,
|
|
|
+ ccdc_try_format(ccdc, cfg, CCDC_PAD_SOURCE_VP, format,
|
|
|
fmt->which);
|
|
|
}
|
|
|
|
|
@@ -2453,7 +2453,7 @@ static int ccdc_init_formats(struct v4l2_subdev *sd, struct v4l2_subdev_fh *fh)
|
|
|
format.format.code = MEDIA_BUS_FMT_SGRBG10_1X10;
|
|
|
format.format.width = 4096;
|
|
|
format.format.height = 4096;
|
|
|
- ccdc_set_format(sd, fh, &format);
|
|
|
+ ccdc_set_format(sd, fh ? fh->pad : NULL, &format);
|
|
|
|
|
|
return 0;
|
|
|
}
|