brx->entity.type = type;
brx->entity.codes = brx_codes;
brx->entity.num_codes = ARRAY_SIZE(brx_codes);
+ brx->entity.min_width = BRX_MIN_SIZE;
+ brx->entity.max_width = BRX_MAX_SIZE;
+ brx->entity.min_height = BRX_MIN_SIZE;
+ brx->entity.max_height = BRX_MAX_SIZE;
if (type == VSP1_ENTITY_BRU) {
num_pads = vsp1->info->num_bru_inputs + 1;
};
/* -----------------------------------------------------------------------------
- * V4L2 Subdevice Pad Operations
+ * V4L2 Subdevice Operations
*/
static const unsigned int clu_codes[] = {
MEDIA_BUS_FMT_AYUV8_1X32,
};
-static int clu_enum_frame_size(struct v4l2_subdev *subdev,
- struct v4l2_subdev_state *sd_state,
- struct v4l2_subdev_frame_size_enum *fse)
-{
- return vsp1_subdev_enum_frame_size(subdev, sd_state, fse,
- CLU_MIN_SIZE, CLU_MIN_SIZE,
- CLU_MAX_SIZE, CLU_MAX_SIZE);
-}
-
-static int clu_set_format(struct v4l2_subdev *subdev,
- struct v4l2_subdev_state *sd_state,
- struct v4l2_subdev_format *fmt)
-{
- return vsp1_subdev_set_pad_format(subdev, sd_state, fmt,
- CLU_MIN_SIZE, CLU_MIN_SIZE,
- CLU_MAX_SIZE, CLU_MAX_SIZE);
-}
-
-/* -----------------------------------------------------------------------------
- * V4L2 Subdevice Operations
- */
-
static const struct v4l2_subdev_pad_ops clu_pad_ops = {
.enum_mbus_code = vsp1_subdev_enum_mbus_code,
- .enum_frame_size = clu_enum_frame_size,
+ .enum_frame_size = vsp1_subdev_enum_frame_size,
.get_fmt = vsp1_subdev_get_pad_format,
- .set_fmt = clu_set_format,
+ .set_fmt = vsp1_subdev_set_pad_format,
};
static const struct v4l2_subdev_ops clu_ops = {
clu->entity.type = VSP1_ENTITY_CLU;
clu->entity.codes = clu_codes;
clu->entity.num_codes = ARRAY_SIZE(clu_codes);
+ clu->entity.min_width = CLU_MIN_SIZE;
+ clu->entity.min_height = CLU_MIN_SIZE;
+ clu->entity.max_width = CLU_MAX_SIZE;
+ clu->entity.max_height = CLU_MAX_SIZE;
ret = vsp1_entity_init(vsp1, &clu->entity, "clu", 2, &clu_ops,
MEDIA_ENT_F_PROC_VIDEO_LUT);
* @subdev: V4L2 subdevice
* @sd_state: V4L2 subdev state
* @fse: Frame size enumeration
- * @min_width: Minimum image width
- * @min_height: Minimum image height
- * @max_width: Maximum image width
- * @max_height: Maximum image height
*
* This function implements the subdev enum_frame_size pad operation for
* entities that do not support scaling or cropping. It reports the given
*/
int vsp1_subdev_enum_frame_size(struct v4l2_subdev *subdev,
struct v4l2_subdev_state *sd_state,
- struct v4l2_subdev_frame_size_enum *fse,
- unsigned int min_width, unsigned int min_height,
- unsigned int max_width, unsigned int max_height)
+ struct v4l2_subdev_frame_size_enum *fse)
{
struct vsp1_entity *entity = to_vsp1_entity(subdev);
struct v4l2_subdev_state *state;
}
if (fse->pad == 0) {
- fse->min_width = min_width;
- fse->max_width = max_width;
- fse->min_height = min_height;
- fse->max_height = max_height;
+ fse->min_width = entity->min_width;
+ fse->max_width = entity->max_width;
+ fse->min_height = entity->min_height;
+ fse->max_height = entity->max_height;
} else {
/*
* The size on the source pad are fixed and always identical to
* @subdev: V4L2 subdevice
* @sd_state: V4L2 subdev state
* @fmt: V4L2 subdev format
- * @min_width: Minimum image width
- * @min_height: Minimum image height
- * @max_width: Maximum image width
- * @max_height: Maximum image height
*
* This function implements the subdev set_fmt pad operation for entities that
* do not support scaling or cropping. It defaults to the first supported media
* bus code if the requested code isn't supported, clamps the size to the
- * supplied minimum and maximum, and propagates the sink pad format to the
- * source pad.
+ * entity's limits, and propagates the sink pad format to the source pad.
*/
int vsp1_subdev_set_pad_format(struct v4l2_subdev *subdev,
struct v4l2_subdev_state *sd_state,
- struct v4l2_subdev_format *fmt,
- unsigned int min_width, unsigned int min_height,
- unsigned int max_width, unsigned int max_height)
+ struct v4l2_subdev_format *fmt)
{
struct vsp1_entity *entity = to_vsp1_entity(subdev);
struct v4l2_subdev_state *state;
format->code = i < entity->num_codes
? entity->codes[i] : entity->codes[0];
format->width = clamp_t(unsigned int, fmt->format.width,
- min_width, max_width);
+ entity->min_width, entity->max_width);
format->height = clamp_t(unsigned int, fmt->format.height,
- min_height, max_height);
+ entity->min_height, entity->max_height);
format->field = V4L2_FIELD_NONE;
format->colorspace = fmt->format.colorspace;
const u32 *codes;
unsigned int num_codes;
+ unsigned int min_width;
+ unsigned int min_height;
+ unsigned int max_width;
+ unsigned int max_height;
struct vsp1_pipeline *pipe;
struct v4l2_subdev_format *fmt);
int vsp1_subdev_set_pad_format(struct v4l2_subdev *subdev,
struct v4l2_subdev_state *sd_state,
- struct v4l2_subdev_format *fmt,
- unsigned int min_width, unsigned int min_height,
- unsigned int max_width, unsigned int max_height);
+ struct v4l2_subdev_format *fmt);
int vsp1_subdev_enum_mbus_code(struct v4l2_subdev *subdev,
struct v4l2_subdev_state *sd_state,
struct v4l2_subdev_mbus_code_enum *code);
int vsp1_subdev_enum_frame_size(struct v4l2_subdev *subdev,
struct v4l2_subdev_state *sd_state,
- struct v4l2_subdev_frame_size_enum *fse,
- unsigned int min_w, unsigned int min_h,
- unsigned int max_w, unsigned int max_h);
+ struct v4l2_subdev_frame_size_enum *fse);
#endif /* __VSP1_ENTITY_H__ */
if (fse->pad != HISTO_PAD_SINK)
return -EINVAL;
- return vsp1_subdev_enum_frame_size(subdev, sd_state, fse,
- HISTO_MIN_SIZE, HISTO_MIN_SIZE,
- HISTO_MAX_SIZE, HISTO_MAX_SIZE);
+ return vsp1_subdev_enum_frame_size(subdev, sd_state, fse);
}
static int histo_get_selection(struct v4l2_subdev *subdev,
return 0;
}
- return vsp1_subdev_set_pad_format(subdev, sd_state, fmt,
- HISTO_MIN_SIZE, HISTO_MIN_SIZE,
- HISTO_MAX_SIZE, HISTO_MAX_SIZE);
+ return vsp1_subdev_set_pad_format(subdev, sd_state, fmt);
}
static const struct v4l2_subdev_pad_ops histo_pad_ops = {
histo->entity.type = type;
histo->entity.codes = formats;
histo->entity.num_codes = num_formats;
+ histo->entity.min_width = HISTO_MIN_SIZE;
+ histo->entity.min_height = HISTO_MIN_SIZE;
+ histo->entity.max_width = HISTO_MAX_SIZE;
+ histo->entity.max_height = HISTO_MAX_SIZE;
ret = vsp1_entity_init(vsp1, &histo->entity, name, 2, &histo_ops,
MEDIA_ENT_F_PROC_VIDEO_STATISTICS);
return 0;
}
-static int hsit_enum_frame_size(struct v4l2_subdev *subdev,
- struct v4l2_subdev_state *sd_state,
- struct v4l2_subdev_frame_size_enum *fse)
-{
- return vsp1_subdev_enum_frame_size(subdev, sd_state, fse,
- HSIT_MIN_SIZE, HSIT_MIN_SIZE,
- HSIT_MAX_SIZE, HSIT_MAX_SIZE);
-}
-
static int hsit_set_format(struct v4l2_subdev *subdev,
struct v4l2_subdev_state *sd_state,
struct v4l2_subdev_format *fmt)
static const struct v4l2_subdev_pad_ops hsit_pad_ops = {
.enum_mbus_code = hsit_enum_mbus_code,
- .enum_frame_size = hsit_enum_frame_size,
+ .enum_frame_size = vsp1_subdev_enum_frame_size,
.get_fmt = vsp1_subdev_get_pad_format,
.set_fmt = hsit_set_format,
};
hsit->entity.codes = hsit_codes;
hsit->entity.num_codes = ARRAY_SIZE(hsit_codes);
+ hsit->entity.min_width = HSIT_MIN_SIZE;
+ hsit->entity.min_height = HSIT_MIN_SIZE;
+ hsit->entity.max_width = HSIT_MAX_SIZE;
+ hsit->entity.max_height = HSIT_MAX_SIZE;
ret = vsp1_entity_init(vsp1, &hsit->entity, inverse ? "hsi" : "hst",
2, &hsit_ops,
MEDIA_BUS_FMT_METADATA_FIXED
};
-static int iif_enum_frame_size(struct v4l2_subdev *subdev,
- struct v4l2_subdev_state *sd_state,
- struct v4l2_subdev_frame_size_enum *fse)
-{
- return vsp1_subdev_enum_frame_size(subdev, sd_state, fse,
- IIF_MIN_WIDTH, IIF_MIN_HEIGHT,
- IIF_MAX_WIDTH, IIF_MAX_HEIGHT);
-}
-
-static int iif_set_format(struct v4l2_subdev *subdev,
- struct v4l2_subdev_state *sd_state,
- struct v4l2_subdev_format *fmt)
-{
- return vsp1_subdev_set_pad_format(subdev, sd_state, fmt,
- IIF_MIN_WIDTH, IIF_MIN_HEIGHT,
- IIF_MAX_WIDTH, IIF_MAX_HEIGHT);
-}
-
static const struct v4l2_subdev_pad_ops iif_pad_ops = {
.enum_mbus_code = vsp1_subdev_enum_mbus_code,
- .enum_frame_size = iif_enum_frame_size,
+ .enum_frame_size = vsp1_subdev_enum_frame_size,
.get_fmt = vsp1_subdev_get_pad_format,
- .set_fmt = iif_set_format,
+ .set_fmt = vsp1_subdev_set_pad_format,
};
static const struct v4l2_subdev_ops iif_ops = {
iif->entity.type = VSP1_ENTITY_IIF;
iif->entity.codes = iif_codes;
iif->entity.num_codes = ARRAY_SIZE(iif_codes);
+ iif->entity.min_width = IIF_MIN_WIDTH;
+ iif->entity.min_height = IIF_MIN_HEIGHT;
+ iif->entity.max_width = IIF_MAX_WIDTH;
+ iif->entity.max_height = IIF_MAX_HEIGHT;
/*
* The IIF is never exposed to userspace, but media entity registration
MEDIA_BUS_FMT_AYUV8_1X32,
};
-static int lif_enum_frame_size(struct v4l2_subdev *subdev,
- struct v4l2_subdev_state *sd_state,
- struct v4l2_subdev_frame_size_enum *fse)
-{
- return vsp1_subdev_enum_frame_size(subdev, sd_state, fse,
- LIF_MIN_SIZE, LIF_MIN_SIZE,
- LIF_MAX_SIZE, LIF_MAX_SIZE);
-}
-
-static int lif_set_format(struct v4l2_subdev *subdev,
- struct v4l2_subdev_state *sd_state,
- struct v4l2_subdev_format *fmt)
-{
- return vsp1_subdev_set_pad_format(subdev, sd_state, fmt,
- LIF_MIN_SIZE, LIF_MIN_SIZE,
- LIF_MAX_SIZE, LIF_MAX_SIZE);
-}
-
static const struct v4l2_subdev_pad_ops lif_pad_ops = {
.enum_mbus_code = vsp1_subdev_enum_mbus_code,
- .enum_frame_size = lif_enum_frame_size,
+ .enum_frame_size = vsp1_subdev_enum_frame_size,
.get_fmt = vsp1_subdev_get_pad_format,
- .set_fmt = lif_set_format,
+ .set_fmt = vsp1_subdev_set_pad_format,
};
static const struct v4l2_subdev_ops lif_ops = {
lif->entity.index = index;
lif->entity.codes = lif_codes;
lif->entity.num_codes = ARRAY_SIZE(lif_codes);
+ lif->entity.min_width = LIF_MIN_SIZE;
+ lif->entity.min_height = LIF_MIN_SIZE;
+ lif->entity.max_width = LIF_MAX_SIZE;
+ lif->entity.max_height = LIF_MAX_SIZE;
/*
* The LIF is never exposed to userspace, but media entity registration
};
/* -----------------------------------------------------------------------------
- * V4L2 Subdevice Pad Operations
+ * V4L2 Subdevice Operations
*/
static const unsigned int lut_codes[] = {
MEDIA_BUS_FMT_AYUV8_1X32,
};
-static int lut_enum_frame_size(struct v4l2_subdev *subdev,
- struct v4l2_subdev_state *sd_state,
- struct v4l2_subdev_frame_size_enum *fse)
-{
- return vsp1_subdev_enum_frame_size(subdev, sd_state, fse,
- LUT_MIN_SIZE, LUT_MIN_SIZE,
- LUT_MAX_SIZE, LUT_MAX_SIZE);
-}
-
-static int lut_set_format(struct v4l2_subdev *subdev,
- struct v4l2_subdev_state *sd_state,
- struct v4l2_subdev_format *fmt)
-{
- return vsp1_subdev_set_pad_format(subdev, sd_state, fmt,
- LUT_MIN_SIZE, LUT_MIN_SIZE,
- LUT_MAX_SIZE, LUT_MAX_SIZE);
-}
-
-/* -----------------------------------------------------------------------------
- * V4L2 Subdevice Operations
- */
-
static const struct v4l2_subdev_pad_ops lut_pad_ops = {
.enum_mbus_code = vsp1_subdev_enum_mbus_code,
- .enum_frame_size = lut_enum_frame_size,
+ .enum_frame_size = vsp1_subdev_enum_frame_size,
.get_fmt = vsp1_subdev_get_pad_format,
- .set_fmt = lut_set_format,
+ .set_fmt = vsp1_subdev_set_pad_format,
};
static const struct v4l2_subdev_ops lut_ops = {
lut->entity.type = VSP1_ENTITY_LUT;
lut->entity.codes = lut_codes;
lut->entity.num_codes = ARRAY_SIZE(lut_codes);
+ lut->entity.min_width = LUT_MIN_SIZE;
+ lut->entity.min_height = LUT_MIN_SIZE;
+ lut->entity.max_width = LUT_MAX_SIZE;
+ lut->entity.max_height = LUT_MAX_SIZE;
ret = vsp1_entity_init(vsp1, &lut->entity, "lut", 2, &lut_ops,
MEDIA_ENT_F_PROC_VIDEO_LUT);
if (rpf == NULL)
return ERR_PTR(-ENOMEM);
- rpf->max_width = RPF_MAX_WIDTH;
- rpf->max_height = RPF_MAX_HEIGHT;
-
rpf->entity.ops = &rpf_entity_ops;
rpf->entity.type = VSP1_ENTITY_RPF;
rpf->entity.index = index;
+ rpf->entity.min_width = RWPF_MIN_WIDTH;
+ rpf->entity.min_height = RWPF_MIN_HEIGHT;
+ rpf->entity.max_width = RPF_MAX_WIDTH;
+ rpf->entity.max_height = RPF_MAX_HEIGHT;
sprintf(name, "rpf.%u", index);
ret = vsp1_entity_init(vsp1, &rpf->entity, name, 2, &vsp1_rwpf_subdev_ops,
#include "vsp1_rwpf.h"
#include "vsp1_video.h"
-#define RWPF_MIN_WIDTH 1
-#define RWPF_MIN_HEIGHT 1
-
/* -----------------------------------------------------------------------------
* V4L2 Subdevice Operations
*/
return 0;
}
-static int vsp1_rwpf_enum_frame_size(struct v4l2_subdev *subdev,
- struct v4l2_subdev_state *sd_state,
- struct v4l2_subdev_frame_size_enum *fse)
-{
- struct vsp1_rwpf *rwpf = to_rwpf(subdev);
-
- return vsp1_subdev_enum_frame_size(subdev, sd_state, fse,
- RWPF_MIN_WIDTH, RWPF_MIN_HEIGHT,
- rwpf->max_width, rwpf->max_height);
-}
-
static int vsp1_rwpf_set_format(struct v4l2_subdev *subdev,
struct v4l2_subdev_state *sd_state,
struct v4l2_subdev_format *fmt)
format->code = fmt->format.code;
format->width = clamp_t(unsigned int, fmt->format.width,
- RWPF_MIN_WIDTH, rwpf->max_width);
+ RWPF_MIN_WIDTH, rwpf->entity.max_width);
format->height = clamp_t(unsigned int, fmt->format.height,
- RWPF_MIN_HEIGHT, rwpf->max_height);
+ RWPF_MIN_HEIGHT, rwpf->entity.max_height);
format->field = V4L2_FIELD_NONE;
format->colorspace = fmt->format.colorspace;
static const struct v4l2_subdev_pad_ops vsp1_rwpf_pad_ops = {
.enum_mbus_code = vsp1_rwpf_enum_mbus_code,
- .enum_frame_size = vsp1_rwpf_enum_frame_size,
+ .enum_frame_size = vsp1_subdev_enum_frame_size,
.get_fmt = vsp1_subdev_get_pad_format,
.set_fmt = vsp1_rwpf_set_format,
.get_selection = vsp1_rwpf_get_selection,
#define RWPF_PAD_SINK 0
#define RWPF_PAD_SOURCE 1
+#define RWPF_MIN_WIDTH 1
+#define RWPF_MIN_HEIGHT 1
+
struct v4l2_ctrl;
struct vsp1_dl_manager;
struct vsp1_rwpf;
struct vsp1_video *video;
- unsigned int max_width;
- unsigned int max_height;
-
struct v4l2_pix_format_mplane format;
const struct vsp1_format_info *fmtinfo;
unsigned int brx_input;
sru->entity.type = VSP1_ENTITY_SRU;
sru->entity.codes = sru_codes;
sru->entity.num_codes = ARRAY_SIZE(sru_codes);
+ sru->entity.min_width = SRU_MIN_SIZE;
+ sru->entity.max_width = SRU_MAX_SIZE;
+ sru->entity.min_height = SRU_MIN_SIZE;
+ sru->entity.max_height = SRU_MAX_SIZE;
ret = vsp1_entity_init(vsp1, &sru->entity, "sru", 2, &sru_ops,
MEDIA_ENT_F_PROC_VIDEO_SCALER);
uds->entity.index = index;
uds->entity.codes = uds_codes;
uds->entity.num_codes = ARRAY_SIZE(uds_codes);
+ uds->entity.min_width = UDS_MIN_SIZE;
+ uds->entity.max_width = UDS_MAX_SIZE;
+ uds->entity.min_height = UDS_MIN_SIZE;
+ uds->entity.max_height = UDS_MAX_SIZE;
sprintf(name, "uds.%u", index);
ret = vsp1_entity_init(vsp1, &uds->entity, name, 2, &uds_ops,
MEDIA_BUS_FMT_AYUV8_1X32,
};
-static int uif_enum_frame_size(struct v4l2_subdev *subdev,
- struct v4l2_subdev_state *sd_state,
- struct v4l2_subdev_frame_size_enum *fse)
-{
- return vsp1_subdev_enum_frame_size(subdev, sd_state, fse,
- UIF_MIN_SIZE, UIF_MIN_SIZE,
- UIF_MAX_SIZE, UIF_MAX_SIZE);
-}
-
-static int uif_set_format(struct v4l2_subdev *subdev,
- struct v4l2_subdev_state *sd_state,
- struct v4l2_subdev_format *fmt)
-{
- return vsp1_subdev_set_pad_format(subdev, sd_state, fmt,
- UIF_MIN_SIZE, UIF_MIN_SIZE,
- UIF_MAX_SIZE, UIF_MAX_SIZE);
-}
-
static int uif_get_selection(struct v4l2_subdev *subdev,
struct v4l2_subdev_state *sd_state,
struct v4l2_subdev_selection *sel)
static const struct v4l2_subdev_pad_ops uif_pad_ops = {
.enum_mbus_code = vsp1_subdev_enum_mbus_code,
- .enum_frame_size = uif_enum_frame_size,
+ .enum_frame_size = vsp1_subdev_enum_frame_size,
.get_fmt = vsp1_subdev_get_pad_format,
- .set_fmt = uif_set_format,
+ .set_fmt = vsp1_subdev_set_pad_format,
.get_selection = uif_get_selection,
.set_selection = uif_set_selection,
};
uif->entity.index = index;
uif->entity.codes = uif_codes;
uif->entity.num_codes = ARRAY_SIZE(uif_codes);
+ uif->entity.min_width = UIF_MIN_SIZE;
+ uif->entity.min_height = UIF_MIN_SIZE;
+ uif->entity.max_width = UIF_MAX_SIZE;
+ uif->entity.max_height = UIF_MAX_SIZE;
/* The datasheet names the two UIF instances UIF4 and UIF5. */
sprintf(name, "uif.%u", index + 4);
{
struct vsp1_rwpf *wpf = to_rwpf(&entity->subdev);
- return wpf->flip.rotate ? 256 : wpf->max_width;
+ return wpf->flip.rotate ? 256 : wpf->entity.max_width;
}
static void wpf_partition(struct vsp1_entity *entity,
if (wpf == NULL)
return ERR_PTR(-ENOMEM);
+ wpf->entity.min_width = RWPF_MIN_WIDTH;
+ wpf->entity.min_height = RWPF_MIN_HEIGHT;
+
if (vsp1->info->gen == 2) {
- wpf->max_width = WPF_GEN2_MAX_WIDTH;
- wpf->max_height = WPF_GEN2_MAX_HEIGHT;
+ wpf->entity.max_width = WPF_GEN2_MAX_WIDTH;
+ wpf->entity.max_height = WPF_GEN2_MAX_HEIGHT;
} else {
- wpf->max_width = WPF_GEN3_MAX_WIDTH;
- wpf->max_height = WPF_GEN3_MAX_HEIGHT;
+ wpf->entity.max_width = WPF_GEN3_MAX_WIDTH;
+ wpf->entity.max_height = WPF_GEN3_MAX_HEIGHT;
}
wpf->entity.ops = &wpf_entity_ops;