Commit f86a183c authored by Dafna Hirschfeld's avatar Dafna Hirschfeld Committed by Mauro Carvalho Chehab

media: staging: rkisp1: add serialization to the resizer subdev ops

For subdevices drivers, the drivers themself are responsible
for serializing their operations.
This patch adds serialization to the resizer subdevice.
Signed-off-by: default avatarDafna Hirschfeld <dafna.hirschfeld@collabora.com>
Acked-by: default avatarHelen Koike <helen.koike@collabora.com>
Acked-by: default avatarSakari Ailus <sakari.ailus@linux.intel.com>
Signed-off-by: default avatarHans Verkuil <hverkuil-cisco@xs4all.nl>
Signed-off-by: default avatarMauro Carvalho Chehab <mchehab+huawei@kernel.org>
parent 99adeeb6
...@@ -226,6 +226,7 @@ struct rkisp1_resizer { ...@@ -226,6 +226,7 @@ struct rkisp1_resizer {
struct v4l2_subdev_pad_config pad_cfg[RKISP1_ISP_PAD_MAX]; struct v4l2_subdev_pad_config pad_cfg[RKISP1_ISP_PAD_MAX];
const struct rkisp1_rsz_config *config; const struct rkisp1_rsz_config *config;
enum rkisp1_fmt_pix_type fmt_type; enum rkisp1_fmt_pix_type fmt_type;
struct mutex ops_lock;
}; };
struct rkisp1_debug { struct rkisp1_debug {
......
...@@ -562,7 +562,9 @@ static int rkisp1_rsz_get_fmt(struct v4l2_subdev *sd, ...@@ -562,7 +562,9 @@ static int rkisp1_rsz_get_fmt(struct v4l2_subdev *sd,
struct rkisp1_resizer *rsz = struct rkisp1_resizer *rsz =
container_of(sd, struct rkisp1_resizer, sd); container_of(sd, struct rkisp1_resizer, sd);
mutex_lock(&rsz->ops_lock);
fmt->format = *rkisp1_rsz_get_pad_fmt(rsz, cfg, fmt->pad, fmt->which); fmt->format = *rkisp1_rsz_get_pad_fmt(rsz, cfg, fmt->pad, fmt->which);
mutex_unlock(&rsz->ops_lock);
return 0; return 0;
} }
...@@ -573,11 +575,13 @@ static int rkisp1_rsz_set_fmt(struct v4l2_subdev *sd, ...@@ -573,11 +575,13 @@ static int rkisp1_rsz_set_fmt(struct v4l2_subdev *sd,
struct rkisp1_resizer *rsz = struct rkisp1_resizer *rsz =
container_of(sd, struct rkisp1_resizer, sd); container_of(sd, struct rkisp1_resizer, sd);
mutex_lock(&rsz->ops_lock);
if (fmt->pad == RKISP1_RSZ_PAD_SINK) if (fmt->pad == RKISP1_RSZ_PAD_SINK)
rkisp1_rsz_set_sink_fmt(rsz, cfg, &fmt->format, fmt->which); rkisp1_rsz_set_sink_fmt(rsz, cfg, &fmt->format, fmt->which);
else else
rkisp1_rsz_set_src_fmt(rsz, cfg, &fmt->format, fmt->which); rkisp1_rsz_set_src_fmt(rsz, cfg, &fmt->format, fmt->which);
mutex_unlock(&rsz->ops_lock);
return 0; return 0;
} }
...@@ -588,10 +592,12 @@ static int rkisp1_rsz_get_selection(struct v4l2_subdev *sd, ...@@ -588,10 +592,12 @@ static int rkisp1_rsz_get_selection(struct v4l2_subdev *sd,
struct rkisp1_resizer *rsz = struct rkisp1_resizer *rsz =
container_of(sd, struct rkisp1_resizer, sd); container_of(sd, struct rkisp1_resizer, sd);
struct v4l2_mbus_framefmt *mf_sink; struct v4l2_mbus_framefmt *mf_sink;
int ret = 0;
if (sel->pad == RKISP1_RSZ_PAD_SRC) if (sel->pad == RKISP1_RSZ_PAD_SRC)
return -EINVAL; return -EINVAL;
mutex_lock(&rsz->ops_lock);
switch (sel->target) { switch (sel->target) {
case V4L2_SEL_TGT_CROP_BOUNDS: case V4L2_SEL_TGT_CROP_BOUNDS:
mf_sink = rkisp1_rsz_get_pad_fmt(rsz, cfg, RKISP1_RSZ_PAD_SINK, mf_sink = rkisp1_rsz_get_pad_fmt(rsz, cfg, RKISP1_RSZ_PAD_SINK,
...@@ -606,10 +612,11 @@ static int rkisp1_rsz_get_selection(struct v4l2_subdev *sd, ...@@ -606,10 +612,11 @@ static int rkisp1_rsz_get_selection(struct v4l2_subdev *sd,
sel->which); sel->which);
break; break;
default: default:
return -EINVAL; ret = -EINVAL;
} }
return 0; mutex_unlock(&rsz->ops_lock);
return ret;
} }
static int rkisp1_rsz_set_selection(struct v4l2_subdev *sd, static int rkisp1_rsz_set_selection(struct v4l2_subdev *sd,
...@@ -625,7 +632,9 @@ static int rkisp1_rsz_set_selection(struct v4l2_subdev *sd, ...@@ -625,7 +632,9 @@ static int rkisp1_rsz_set_selection(struct v4l2_subdev *sd,
dev_dbg(sd->dev, "%s: pad: %d sel(%d,%d)/%dx%d\n", __func__, dev_dbg(sd->dev, "%s: pad: %d sel(%d,%d)/%dx%d\n", __func__,
sel->pad, sel->r.left, sel->r.top, sel->r.width, sel->r.height); sel->pad, sel->r.left, sel->r.top, sel->r.width, sel->r.height);
mutex_lock(&rsz->ops_lock);
rkisp1_rsz_set_sink_crop(rsz, cfg, &sel->r, sel->which); rkisp1_rsz_set_sink_crop(rsz, cfg, &sel->r, sel->which);
mutex_unlock(&rsz->ops_lock);
return 0; return 0;
} }
...@@ -665,9 +674,11 @@ static int rkisp1_rsz_s_stream(struct v4l2_subdev *sd, int enable) ...@@ -665,9 +674,11 @@ static int rkisp1_rsz_s_stream(struct v4l2_subdev *sd, int enable)
if (other->is_streaming) if (other->is_streaming)
when = RKISP1_SHADOW_REGS_ASYNC; when = RKISP1_SHADOW_REGS_ASYNC;
mutex_lock(&rsz->ops_lock);
rkisp1_rsz_config(rsz, when); rkisp1_rsz_config(rsz, when);
rkisp1_dcrop_config(rsz); rkisp1_dcrop_config(rsz);
mutex_unlock(&rsz->ops_lock);
return 0; return 0;
} }
...@@ -713,6 +724,7 @@ static int rkisp1_rsz_register(struct rkisp1_resizer *rsz) ...@@ -713,6 +724,7 @@ static int rkisp1_rsz_register(struct rkisp1_resizer *rsz)
rsz->fmt_type = RKISP1_DEF_FMT_TYPE; rsz->fmt_type = RKISP1_DEF_FMT_TYPE;
mutex_init(&rsz->ops_lock);
ret = media_entity_pads_init(&sd->entity, 2, pads); ret = media_entity_pads_init(&sd->entity, 2, pads);
if (ret) if (ret)
return ret; return ret;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment