Skip to content

Commit 7b61650

Browse files
Sakari AilusHans Verkuil
authored andcommitted
media: ivsc: csi: Make use of sub-device state
The MEI CSI driver was using sub-device state but still maintained its own format information and did its own locking. Rely on sub-device state instead. This also fixes a circular locking problem during link validation. Signed-off-by: Sakari Ailus <[email protected]> Signed-off-by: Hans Verkuil <[email protected]>
1 parent 48f5fd8 commit 7b61650

File tree

1 file changed

+13
-70
lines changed

1 file changed

+13
-70
lines changed

drivers/media/pci/intel/ivsc/mei_csi.c

Lines changed: 13 additions & 70 deletions
Original file line numberDiff line numberDiff line change
@@ -128,7 +128,6 @@ struct mei_csi {
128128
int streaming;
129129

130130
struct media_pad pads[CSI_NUM_PADS];
131-
struct v4l2_mbus_framefmt format_mbus[CSI_NUM_PADS];
132131

133132
/* number of data lanes used on the CSI-2 link */
134133
u32 nr_of_lanes;
@@ -329,79 +328,35 @@ static int mei_csi_set_stream(struct v4l2_subdev *sd, int enable)
329328
return ret;
330329
}
331330

332-
static struct v4l2_mbus_framefmt *
333-
mei_csi_get_pad_format(struct v4l2_subdev *sd,
334-
struct v4l2_subdev_state *sd_state,
335-
unsigned int pad, u32 which)
336-
{
337-
struct mei_csi *csi = sd_to_csi(sd);
338-
339-
switch (which) {
340-
case V4L2_SUBDEV_FORMAT_TRY:
341-
return v4l2_subdev_state_get_format(sd_state, pad);
342-
case V4L2_SUBDEV_FORMAT_ACTIVE:
343-
return &csi->format_mbus[pad];
344-
default:
345-
return NULL;
346-
}
347-
}
348-
349331
static int mei_csi_init_state(struct v4l2_subdev *sd,
350332
struct v4l2_subdev_state *sd_state)
351333
{
352334
struct v4l2_mbus_framefmt *mbusformat;
353-
struct mei_csi *csi = sd_to_csi(sd);
354335
unsigned int i;
355336

356-
mutex_lock(&csi->lock);
357-
358337
for (i = 0; i < sd->entity.num_pads; i++) {
359338
mbusformat = v4l2_subdev_state_get_format(sd_state, i);
360339
*mbusformat = mei_csi_format_mbus_default;
361340
}
362341

363-
mutex_unlock(&csi->lock);
364-
365-
return 0;
366-
}
367-
368-
static int mei_csi_get_fmt(struct v4l2_subdev *sd,
369-
struct v4l2_subdev_state *sd_state,
370-
struct v4l2_subdev_format *format)
371-
{
372-
struct v4l2_mbus_framefmt *mbusformat;
373-
struct mei_csi *csi = sd_to_csi(sd);
374-
375-
mutex_lock(&csi->lock);
376-
377-
mbusformat = mei_csi_get_pad_format(sd, sd_state, format->pad,
378-
format->which);
379-
if (mbusformat)
380-
format->format = *mbusformat;
381-
382-
mutex_unlock(&csi->lock);
383-
384342
return 0;
385343
}
386344

387345
static int mei_csi_set_fmt(struct v4l2_subdev *sd,
388346
struct v4l2_subdev_state *sd_state,
389347
struct v4l2_subdev_format *format)
390348
{
391-
struct v4l2_mbus_framefmt *source_mbusformat;
392-
struct v4l2_mbus_framefmt *mbusformat;
393-
struct mei_csi *csi = sd_to_csi(sd);
394-
struct media_pad *pad;
349+
struct v4l2_mbus_framefmt *source_fmt;
350+
struct v4l2_mbus_framefmt *sink_fmt;
395351

396-
mbusformat = mei_csi_get_pad_format(sd, sd_state, format->pad,
397-
format->which);
398-
if (!mbusformat)
399-
return -EINVAL;
352+
sink_fmt = v4l2_subdev_state_get_format(sd_state, CSI_PAD_SINK);
353+
source_fmt = v4l2_subdev_state_get_format(sd_state, CSI_PAD_SOURCE);
400354

401-
source_mbusformat = mei_csi_get_pad_format(sd, sd_state, CSI_PAD_SOURCE,
402-
format->which);
403-
if (!source_mbusformat)
404-
return -EINVAL;
355+
if (format->pad) {
356+
*source_fmt = *sink_fmt;
357+
358+
return 0;
359+
}
405360

406361
v4l_bound_align_image(&format->format.width, 1, 65536, 0,
407362
&format->format.height, 1, 65536, 0, 0);
@@ -504,18 +459,8 @@ static int mei_csi_set_fmt(struct v4l2_subdev *sd,
504459
if (format->format.field == V4L2_FIELD_ANY)
505460
format->format.field = V4L2_FIELD_NONE;
506461

507-
mutex_lock(&csi->lock);
508-
509-
pad = &csi->pads[format->pad];
510-
if (pad->flags & MEDIA_PAD_FL_SOURCE)
511-
format->format = csi->format_mbus[CSI_PAD_SINK];
512-
513-
*mbusformat = format->format;
514-
515-
if (pad->flags & MEDIA_PAD_FL_SINK)
516-
*source_mbusformat = format->format;
517-
518-
mutex_unlock(&csi->lock);
462+
*sink_fmt = format->format;
463+
*source_fmt = *sink_fmt;
519464

520465
return 0;
521466
}
@@ -554,7 +499,7 @@ static const struct v4l2_subdev_video_ops mei_csi_video_ops = {
554499
};
555500

556501
static const struct v4l2_subdev_pad_ops mei_csi_pad_ops = {
557-
.get_fmt = mei_csi_get_fmt,
502+
.get_fmt = v4l2_subdev_get_fmt,
558503
.set_fmt = mei_csi_set_fmt,
559504
};
560505

@@ -749,6 +694,7 @@ static int mei_csi_probe(struct mei_cl_device *cldev,
749694
goto err_disable;
750695

751696
csi->subdev.dev = &cldev->dev;
697+
csi->subdev.state_lock = &csi->lock;
752698
v4l2_subdev_init(&csi->subdev, &mei_csi_subdev_ops);
753699
csi->subdev.internal_ops = &mei_csi_internal_ops;
754700
v4l2_set_subdevdata(&csi->subdev, csi);
@@ -764,9 +710,6 @@ static int mei_csi_probe(struct mei_cl_device *cldev,
764710
if (ret)
765711
goto err_ctrl_handler;
766712

767-
csi->format_mbus[CSI_PAD_SOURCE] = mei_csi_format_mbus_default;
768-
csi->format_mbus[CSI_PAD_SINK] = mei_csi_format_mbus_default;
769-
770713
csi->pads[CSI_PAD_SOURCE].flags = MEDIA_PAD_FL_SOURCE;
771714
csi->pads[CSI_PAD_SINK].flags = MEDIA_PAD_FL_SINK;
772715
ret = media_entity_pads_init(&csi->subdev.entity, CSI_NUM_PADS,

0 commit comments

Comments
 (0)