Skip to content

Commit c7e2621

Browse files
pinchartlHans Verkuil
authored andcommitted
media: rkisp1: csi: Use V4L2 subdev active state
Use the V4L2 subdev active state API to store the active format and crop rectangle. This simplifies the driver not only by dropping the state stored in the rkisp1_csi structure, but also by replacing the ops_lock with the state lock. Signed-off-by: Laurent Pinchart <[email protected]> Reviewed-by: Paul Elder <[email protected]> Reviewed-by: Sakari Ailus <[email protected]> Signed-off-by: Hans Verkuil <[email protected]>
1 parent 2cce0a3 commit c7e2621

File tree

2 files changed

+33
-80
lines changed

2 files changed

+33
-80
lines changed

drivers/media/platform/rockchip/rkisp1/rkisp1-common.h

Lines changed: 0 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -167,9 +167,6 @@ struct rkisp1_sensor_async {
167167
* @is_dphy_errctrl_disabled: if dphy errctrl is disabled (avoid endless interrupt)
168168
* @sd: v4l2_subdev variable
169169
* @pads: media pads
170-
* @pad_cfg: configurations for the pads
171-
* @sink_fmt: input format
172-
* @lock: protects pad_cfg and sink_fmt
173170
* @source: source in-use, set when starting streaming
174171
*/
175172
struct rkisp1_csi {
@@ -178,9 +175,6 @@ struct rkisp1_csi {
178175
bool is_dphy_errctrl_disabled;
179176
struct v4l2_subdev sd;
180177
struct media_pad pads[RKISP1_CSI_PAD_NUM];
181-
struct v4l2_subdev_pad_config pad_cfg[RKISP1_CSI_PAD_NUM];
182-
const struct rkisp1_mbus_info *sink_fmt;
183-
struct mutex lock;
184178
struct v4l2_subdev *source;
185179
};
186180

drivers/media/platform/rockchip/rkisp1/rkisp1-csi.c

Lines changed: 33 additions & 74 deletions
Original file line numberDiff line numberDiff line change
@@ -30,23 +30,6 @@ static inline struct rkisp1_csi *to_rkisp1_csi(struct v4l2_subdev *sd)
3030
return container_of(sd, struct rkisp1_csi, sd);
3131
}
3232

33-
static struct v4l2_mbus_framefmt *
34-
rkisp1_csi_get_pad_fmt(struct rkisp1_csi *csi,
35-
struct v4l2_subdev_state *sd_state,
36-
unsigned int pad, u32 which)
37-
{
38-
struct v4l2_subdev_state state = {
39-
.pads = csi->pad_cfg
40-
};
41-
42-
lockdep_assert_held(&csi->lock);
43-
44-
if (which == V4L2_SUBDEV_FORMAT_TRY)
45-
return v4l2_subdev_get_try_format(&csi->sd, sd_state, pad);
46-
else
47-
return v4l2_subdev_get_try_format(&csi->sd, &state, pad);
48-
}
49-
5033
int rkisp1_csi_link_sensor(struct rkisp1_device *rkisp1, struct v4l2_subdev *sd,
5134
struct rkisp1_sensor_async *s_asd,
5235
unsigned int source_pad)
@@ -76,7 +59,8 @@ int rkisp1_csi_link_sensor(struct rkisp1_device *rkisp1, struct v4l2_subdev *sd,
7659
}
7760

7861
static int rkisp1_csi_config(struct rkisp1_csi *csi,
79-
const struct rkisp1_sensor_async *sensor)
62+
const struct rkisp1_sensor_async *sensor,
63+
const struct rkisp1_mbus_info *format)
8064
{
8165
struct rkisp1_device *rkisp1 = csi->rkisp1;
8266
unsigned int lanes = sensor->lanes;
@@ -98,7 +82,7 @@ static int rkisp1_csi_config(struct rkisp1_csi *csi,
9882

9983
/* Configure Data Type and Virtual Channel */
10084
rkisp1_write(rkisp1, RKISP1_CIF_MIPI_IMG_DATA_SEL,
101-
RKISP1_CIF_MIPI_DATA_SEL_DT(csi->sink_fmt->mipi_dt) |
85+
RKISP1_CIF_MIPI_DATA_SEL_DT(format->mipi_dt) |
10286
RKISP1_CIF_MIPI_DATA_SEL_VC(0));
10387

10488
/* Clear MIPI interrupts */
@@ -151,15 +135,16 @@ static void rkisp1_csi_disable(struct rkisp1_csi *csi)
151135
}
152136

153137
static int rkisp1_csi_start(struct rkisp1_csi *csi,
154-
const struct rkisp1_sensor_async *sensor)
138+
const struct rkisp1_sensor_async *sensor,
139+
const struct rkisp1_mbus_info *format)
155140
{
156141
struct rkisp1_device *rkisp1 = csi->rkisp1;
157142
union phy_configure_opts opts;
158143
struct phy_configure_opts_mipi_dphy *cfg = &opts.mipi_dphy;
159144
s64 pixel_clock;
160145
int ret;
161146

162-
ret = rkisp1_csi_config(csi, sensor);
147+
ret = rkisp1_csi_config(csi, sensor, format);
163148
if (ret)
164149
return ret;
165150

@@ -169,7 +154,7 @@ static int rkisp1_csi_start(struct rkisp1_csi *csi,
169154
return -EINVAL;
170155
}
171156

172-
phy_mipi_dphy_get_default_config(pixel_clock, csi->sink_fmt->bus_width,
157+
phy_mipi_dphy_get_default_config(pixel_clock, format->bus_width,
173158
sensor->lanes, cfg);
174159
phy_set_mode(csi->dphy, PHY_MODE_MIPI_DPHY);
175160
phy_configure(csi->dphy, &opts);
@@ -248,7 +233,6 @@ static int rkisp1_csi_enum_mbus_code(struct v4l2_subdev *sd,
248233
struct v4l2_subdev_state *sd_state,
249234
struct v4l2_subdev_mbus_code_enum *code)
250235
{
251-
struct rkisp1_csi *csi = to_rkisp1_csi(sd);
252236
unsigned int i;
253237
int pos = 0;
254238

@@ -258,15 +242,10 @@ static int rkisp1_csi_enum_mbus_code(struct v4l2_subdev *sd,
258242
if (code->index)
259243
return -EINVAL;
260244

261-
mutex_lock(&csi->lock);
262-
263-
sink_fmt = rkisp1_csi_get_pad_fmt(csi, sd_state,
264-
RKISP1_CSI_PAD_SINK,
265-
code->which);
245+
sink_fmt = v4l2_subdev_get_pad_format(sd, sd_state,
246+
RKISP1_CSI_PAD_SINK);
266247
code->code = sink_fmt->code;
267248

268-
mutex_unlock(&csi->lock);
269-
270249
return 0;
271250
}
272251

@@ -296,9 +275,9 @@ static int rkisp1_csi_init_config(struct v4l2_subdev *sd,
296275
{
297276
struct v4l2_mbus_framefmt *sink_fmt, *src_fmt;
298277

299-
sink_fmt = v4l2_subdev_get_try_format(sd, sd_state,
278+
sink_fmt = v4l2_subdev_get_pad_format(sd, sd_state,
300279
RKISP1_CSI_PAD_SINK);
301-
src_fmt = v4l2_subdev_get_try_format(sd, sd_state,
280+
src_fmt = v4l2_subdev_get_pad_format(sd, sd_state,
302281
RKISP1_CSI_PAD_SRC);
303282

304283
sink_fmt->width = RKISP1_DEFAULT_WIDTH;
@@ -311,36 +290,18 @@ static int rkisp1_csi_init_config(struct v4l2_subdev *sd,
311290
return 0;
312291
}
313292

314-
static int rkisp1_csi_get_fmt(struct v4l2_subdev *sd,
315-
struct v4l2_subdev_state *sd_state,
316-
struct v4l2_subdev_format *fmt)
317-
{
318-
struct rkisp1_csi *csi = to_rkisp1_csi(sd);
319-
320-
mutex_lock(&csi->lock);
321-
fmt->format = *rkisp1_csi_get_pad_fmt(csi, sd_state, fmt->pad,
322-
fmt->which);
323-
mutex_unlock(&csi->lock);
324-
325-
return 0;
326-
}
327-
328293
static int rkisp1_csi_set_fmt(struct v4l2_subdev *sd,
329294
struct v4l2_subdev_state *sd_state,
330295
struct v4l2_subdev_format *fmt)
331296
{
332-
struct rkisp1_csi *csi = to_rkisp1_csi(sd);
333297
const struct rkisp1_mbus_info *mbus_info;
334298
struct v4l2_mbus_framefmt *sink_fmt, *src_fmt;
335299

336300
/* The format on the source pad always matches the sink pad. */
337301
if (fmt->pad == RKISP1_CSI_PAD_SRC)
338-
return rkisp1_csi_get_fmt(sd, sd_state, fmt);
302+
return v4l2_subdev_get_fmt(sd, sd_state, fmt);
339303

340-
mutex_lock(&csi->lock);
341-
342-
sink_fmt = rkisp1_csi_get_pad_fmt(csi, sd_state, RKISP1_CSI_PAD_SINK,
343-
fmt->which);
304+
sink_fmt = v4l2_subdev_get_pad_format(sd, sd_state, RKISP1_CSI_PAD_SINK);
344305

345306
sink_fmt->code = fmt->format.code;
346307

@@ -359,16 +320,10 @@ static int rkisp1_csi_set_fmt(struct v4l2_subdev *sd,
359320

360321
fmt->format = *sink_fmt;
361322

362-
if (fmt->which == V4L2_SUBDEV_FORMAT_ACTIVE)
363-
csi->sink_fmt = mbus_info;
364-
365323
/* Propagate the format to the source pad. */
366-
src_fmt = rkisp1_csi_get_pad_fmt(csi, sd_state, RKISP1_CSI_PAD_SRC,
367-
fmt->which);
324+
src_fmt = v4l2_subdev_get_pad_format(sd, sd_state, RKISP1_CSI_PAD_SRC);
368325
*src_fmt = *sink_fmt;
369326

370-
mutex_unlock(&csi->lock);
371-
372327
return 0;
373328
}
374329

@@ -380,8 +335,11 @@ static int rkisp1_csi_s_stream(struct v4l2_subdev *sd, int enable)
380335
{
381336
struct rkisp1_csi *csi = to_rkisp1_csi(sd);
382337
struct rkisp1_device *rkisp1 = csi->rkisp1;
338+
const struct v4l2_mbus_framefmt *sink_fmt;
339+
const struct rkisp1_mbus_info *format;
383340
struct rkisp1_sensor_async *source_asd;
384341
struct v4l2_async_connection *asc;
342+
struct v4l2_subdev_state *sd_state;
385343
struct media_pad *source_pad;
386344
struct v4l2_subdev *source;
387345
int ret;
@@ -415,9 +373,12 @@ static int rkisp1_csi_s_stream(struct v4l2_subdev *sd, int enable)
415373
if (source_asd->mbus_type != V4L2_MBUS_CSI2_DPHY)
416374
return -EINVAL;
417375

418-
mutex_lock(&csi->lock);
419-
ret = rkisp1_csi_start(csi, source_asd);
420-
mutex_unlock(&csi->lock);
376+
sd_state = v4l2_subdev_lock_and_get_active_state(sd);
377+
sink_fmt = v4l2_subdev_get_pad_format(sd, sd_state, RKISP1_CSI_PAD_SINK);
378+
format = rkisp1_mbus_info_get_by_code(sink_fmt->code);
379+
v4l2_subdev_unlock_state(sd_state);
380+
381+
ret = rkisp1_csi_start(csi, source_asd, format);
421382
if (ret)
422383
return ret;
423384

@@ -447,7 +408,7 @@ static const struct v4l2_subdev_video_ops rkisp1_csi_video_ops = {
447408
static const struct v4l2_subdev_pad_ops rkisp1_csi_pad_ops = {
448409
.enum_mbus_code = rkisp1_csi_enum_mbus_code,
449410
.init_cfg = rkisp1_csi_init_config,
450-
.get_fmt = rkisp1_csi_get_fmt,
411+
.get_fmt = v4l2_subdev_get_fmt,
451412
.set_fmt = rkisp1_csi_set_fmt,
452413
};
453414

@@ -459,13 +420,11 @@ static const struct v4l2_subdev_ops rkisp1_csi_ops = {
459420
int rkisp1_csi_register(struct rkisp1_device *rkisp1)
460421
{
461422
struct rkisp1_csi *csi = &rkisp1->csi;
462-
struct v4l2_subdev_state state = {};
463423
struct media_pad *pads;
464424
struct v4l2_subdev *sd;
465425
int ret;
466426

467427
csi->rkisp1 = rkisp1;
468-
mutex_init(&csi->lock);
469428

470429
sd = &csi->sd;
471430
v4l2_subdev_init(sd, &rkisp1_csi_ops);
@@ -481,26 +440,26 @@ int rkisp1_csi_register(struct rkisp1_device *rkisp1)
481440
pads[RKISP1_CSI_PAD_SRC].flags = MEDIA_PAD_FL_SOURCE |
482441
MEDIA_PAD_FL_MUST_CONNECT;
483442

484-
csi->sink_fmt = rkisp1_mbus_info_get_by_code(RKISP1_CSI_DEF_FMT);
485-
486443
ret = media_entity_pads_init(&sd->entity, RKISP1_CSI_PAD_NUM, pads);
487444
if (ret)
488-
goto error;
445+
goto err_entity_cleanup;
489446

490-
state.pads = csi->pad_cfg;
491-
rkisp1_csi_init_config(sd, &state);
447+
ret = v4l2_subdev_init_finalize(sd);
448+
if (ret)
449+
goto err_entity_cleanup;
492450

493451
ret = v4l2_device_register_subdev(&csi->rkisp1->v4l2_dev, sd);
494452
if (ret) {
495453
dev_err(sd->dev, "Failed to register csi receiver subdev\n");
496-
goto error;
454+
goto err_subdev_cleanup;
497455
}
498456

499457
return 0;
500458

501-
error:
459+
err_subdev_cleanup:
460+
v4l2_subdev_cleanup(sd);
461+
err_entity_cleanup:
502462
media_entity_cleanup(&sd->entity);
503-
mutex_destroy(&csi->lock);
504463
csi->rkisp1 = NULL;
505464
return ret;
506465
}
@@ -513,8 +472,8 @@ void rkisp1_csi_unregister(struct rkisp1_device *rkisp1)
513472
return;
514473

515474
v4l2_device_unregister_subdev(&csi->sd);
475+
v4l2_subdev_cleanup(&csi->sd);
516476
media_entity_cleanup(&csi->sd.entity);
517-
mutex_destroy(&csi->lock);
518477
}
519478

520479
int rkisp1_csi_init(struct rkisp1_device *rkisp1)

0 commit comments

Comments
 (0)