Skip to content

Commit 01535ea

Browse files
djrscallyHans Verkuil
authored andcommitted
media: platform: Add mali-c55 parameters video node
Add a new code file to the mali-c55 driver that registers an output video node for userspace to queue buffers of parameters to. Handlers are included to program the statistics generation plus the white balance, black level correction and mesh shading correction blocks. Update the rest of the driver to register and link the new video node Tested-by: Lad Prabhakar <prabhakar.mahadev-lad.rj@bp.renesas.com> Acked-by: Nayden Kanchev <nayden.kanchev@arm.com> Co-developed-by: Jacopo Mondi <jacopo.mondi@ideasonboard.com> Signed-off-by: Jacopo Mondi <jacopo.mondi@ideasonboard.com> Signed-off-by: Daniel Scally <dan.scally@ideasonboard.com> Signed-off-by: Hans Verkuil <hverkuil+cisco@kernel.org> [hverkuil: remove deprecated vb2_ops_wait_prepare/finish callbacks]
1 parent 08a9936 commit 01535ea

7 files changed

Lines changed: 1021 additions & 1 deletion

File tree

drivers/media/platform/arm/mali-c55/Kconfig

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ config VIDEO_MALI_C55
77
select GENERIC_PHY_MIPI_DPHY
88
select MEDIA_CONTROLLER
99
select V4L2_FWNODE
10+
select V4L2_ISP
1011
select VIDEO_V4L2_SUBDEV_API
1112
select VIDEOBUF2_DMA_CONTIG
1213
select VIDEOBUF2_VMALLOC

drivers/media/platform/arm/mali-c55/Makefile

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
mali-c55-y := mali-c55-capture.o \
44
mali-c55-core.o \
55
mali-c55-isp.o \
6+
mali-c55-params.o \
67
mali-c55-resizer.o \
78
mali-c55-stats.o \
89
mali-c55-tpg.o

drivers/media/platform/arm/mali-c55/mali-c55-common.h

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@
2121
#include <media/v4l2-ctrls.h>
2222
#include <media/v4l2-dev.h>
2323
#include <media/v4l2-device.h>
24+
#include <media/v4l2-isp.h>
2425
#include <media/v4l2-subdev.h>
2526
#include <media/videobuf2-core.h>
2627
#include <media/videobuf2-v4l2.h>
@@ -44,6 +45,7 @@ struct device;
4445
struct mali_c55;
4546
struct mali_c55_cap_dev;
4647
struct media_pipeline;
48+
struct mali_c55_params_buffer;
4749
struct platform_device;
4850
struct resource;
4951

@@ -52,6 +54,7 @@ enum mali_c55_isp_pads {
5254
MALI_C55_ISP_PAD_SOURCE_VIDEO,
5355
MALI_C55_ISP_PAD_SOURCE_BYPASS,
5456
MALI_C55_ISP_PAD_SOURCE_STATS,
57+
MALI_C55_ISP_PAD_SINK_PARAMS,
5558
MALI_C55_ISP_NUM_PADS,
5659
};
5760

@@ -170,6 +173,12 @@ struct mali_c55_stats_buf {
170173
bool failed;
171174
};
172175

176+
struct mali_c55_params_buf {
177+
struct vb2_v4l2_buffer vb;
178+
struct list_head queue;
179+
struct v4l2_isp_params_buffer *config;
180+
};
181+
173182
struct mali_c55_stats {
174183
struct mali_c55 *mali_c55;
175184
struct video_device vdev;
@@ -185,6 +194,21 @@ struct mali_c55_stats {
185194
} buffers;
186195
};
187196

197+
struct mali_c55_params {
198+
struct mali_c55 *mali_c55;
199+
struct video_device vdev;
200+
struct vb2_queue queue;
201+
struct media_pad pad;
202+
/* Mutex to provide to vb2 */
203+
struct mutex lock;
204+
205+
struct {
206+
/* Spinlock to guard buffer queue */
207+
spinlock_t lock;
208+
struct list_head queue;
209+
} buffers;
210+
};
211+
188212
enum mali_c55_config_spaces {
189213
MALI_C55_CONFIG_PONG,
190214
MALI_C55_CONFIG_PING,
@@ -228,6 +252,7 @@ struct mali_c55 {
228252
struct mali_c55_isp isp;
229253
struct mali_c55_resizer resizers[MALI_C55_NUM_RSZS];
230254
struct mali_c55_cap_dev cap_devs[MALI_C55_NUM_CAP_DEVS];
255+
struct mali_c55_params params;
231256
struct mali_c55_stats stats;
232257

233258
struct mali_c55_context context;
@@ -259,6 +284,8 @@ int mali_c55_register_capture_devs(struct mali_c55 *mali_c55);
259284
void mali_c55_unregister_capture_devs(struct mali_c55 *mali_c55);
260285
int mali_c55_register_stats(struct mali_c55 *mali_c55);
261286
void mali_c55_unregister_stats(struct mali_c55 *mali_c55);
287+
int mali_c55_register_params(struct mali_c55 *mali_c55);
288+
void mali_c55_unregister_params(struct mali_c55 *mali_c55);
262289
struct mali_c55_context *mali_c55_get_active_context(struct mali_c55 *mali_c55);
263290
void mali_c55_set_plane_done(struct mali_c55_cap_dev *cap_dev,
264291
enum mali_c55_planes plane);
@@ -278,5 +305,6 @@ mali_c55_isp_get_mbus_config_by_index(u32 index);
278305
bool mali_c55_pipeline_ready(struct mali_c55 *mali_c55);
279306
void mali_c55_stats_fill_buffer(struct mali_c55 *mali_c55,
280307
enum mali_c55_config_spaces cfg_space);
308+
void mali_c55_params_write_config(struct mali_c55 *mali_c55);
281309

282310
#endif /* _MALI_C55_COMMON_H */

drivers/media/platform/arm/mali-c55/mali-c55-core.c

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -294,6 +294,16 @@ static int mali_c55_create_links(struct mali_c55 *mali_c55)
294294
goto err_remove_links;
295295
}
296296

297+
ret = media_create_pad_link(&mali_c55->params.vdev.entity, 0,
298+
&mali_c55->isp.sd.entity,
299+
MALI_C55_ISP_PAD_SINK_PARAMS,
300+
MEDIA_LNK_FL_ENABLED);
301+
if (ret) {
302+
dev_err(mali_c55->dev,
303+
"failed to link ISP and parameters video node\n");
304+
goto err_remove_links;
305+
}
306+
297307
return 0;
298308

299309
err_remove_links:
@@ -308,6 +318,7 @@ static void mali_c55_unregister_entities(struct mali_c55 *mali_c55)
308318
mali_c55_unregister_isp(mali_c55);
309319
mali_c55_unregister_resizers(mali_c55);
310320
mali_c55_unregister_capture_devs(mali_c55);
321+
mali_c55_unregister_params(mali_c55);
311322
mali_c55_unregister_stats(mali_c55);
312323
}
313324

@@ -344,6 +355,10 @@ static int mali_c55_register_entities(struct mali_c55 *mali_c55)
344355
if (ret)
345356
goto err_unregister_entities;
346357

358+
ret = mali_c55_register_params(mali_c55);
359+
if (ret)
360+
goto err_unregister_entities;
361+
347362
ret = mali_c55_register_stats(mali_c55);
348363
if (ret)
349364
goto err_unregister_entities;
@@ -433,6 +448,7 @@ static int mali_c55_media_frameworks_init(struct mali_c55 *mali_c55)
433448
sizeof(mali_c55->media_dev.model));
434449

435450
media_device_init(&mali_c55->media_dev);
451+
436452
ret = media_device_register(&mali_c55->media_dev);
437453
if (ret)
438454
goto err_cleanup_media_device;
@@ -492,11 +508,13 @@ bool mali_c55_pipeline_ready(struct mali_c55 *mali_c55)
492508
{
493509
struct mali_c55_cap_dev *fr = &mali_c55->cap_devs[MALI_C55_CAP_DEV_FR];
494510
struct mali_c55_cap_dev *ds = &mali_c55->cap_devs[MALI_C55_CAP_DEV_DS];
511+
struct mali_c55_params *params = &mali_c55->params;
495512
struct mali_c55_stats *stats = &mali_c55->stats;
496513

497514
return vb2_start_streaming_called(&fr->queue) &&
498515
(!(mali_c55->capabilities & MALI_C55_GPS_DS_PIPE_FITTED) ||
499516
vb2_start_streaming_called(&ds->queue)) &&
517+
vb2_start_streaming_called(&params->queue) &&
500518
vb2_start_streaming_called(&stats->queue);
501519
}
502520

@@ -574,6 +592,14 @@ static irqreturn_t mali_c55_isr(int irq, void *context)
574592
curr_config >>= ffs(MALI_C55_REG_PING_PONG_READ_MASK) - 1;
575593
mali_c55->next_config = curr_config ^ 1;
576594

595+
/*
596+
* Write the configuration parameters received from
597+
* userspace into the configuration buffer, which will
598+
* be transferred to the 'next' active config space at
599+
* by mali_c55_swap_next_config().
600+
*/
601+
mali_c55_params_write_config(mali_c55);
602+
577603
mali_c55_stats_fill_buffer(mali_c55,
578604
mali_c55->next_config ^ 1);
579605

drivers/media/platform/arm/mali-c55/mali-c55-isp.c

Lines changed: 22 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -151,6 +151,7 @@ static int mali_c55_isp_start(struct mali_c55 *mali_c55,
151151
cfg->bypass ? MALI_C55_ISP_RAW_BYPASS_BYPASS_MASK :
152152
0x00);
153153

154+
mali_c55_params_write_config(mali_c55);
154155
ret = mali_c55_config_write(ctx, MALI_C55_CONFIG_PING, true);
155156
if (ret) {
156157
dev_err(mali_c55->dev, "failed to write ISP config\n");
@@ -494,21 +495,40 @@ static int mali_c55_isp_init_state(struct v4l2_subdev *sd,
494495

495496
src_fmt = v4l2_subdev_state_get_format(state,
496497
MALI_C55_ISP_PAD_SOURCE_STATS);
498+
sink_fmt = v4l2_subdev_state_get_format(state,
499+
MALI_C55_ISP_PAD_SINK_PARAMS);
497500

498501
src_fmt->width = 0;
499502
src_fmt->height = 0;
500503
src_fmt->field = V4L2_FIELD_NONE;
501504
src_fmt->code = MEDIA_BUS_FMT_METADATA_FIXED;
502505

506+
sink_fmt->width = 0;
507+
sink_fmt->height = 0;
508+
sink_fmt->field = V4L2_FIELD_NONE;
509+
sink_fmt->code = MEDIA_BUS_FMT_METADATA_FIXED;
510+
503511
return 0;
504512
}
505513

506514
static const struct v4l2_subdev_internal_ops mali_c55_isp_internal_ops = {
507515
.init_state = mali_c55_isp_init_state,
508516
};
509517

518+
static int mali_c55_subdev_link_validate(struct media_link *link)
519+
{
520+
/*
521+
* Skip validation for the parameters sink pad, as the source is not
522+
* a subdevice.
523+
*/
524+
if (link->sink->index == MALI_C55_ISP_PAD_SINK_PARAMS)
525+
return 0;
526+
527+
return v4l2_subdev_link_validate(link);
528+
}
529+
510530
static const struct media_entity_operations mali_c55_isp_media_ops = {
511-
.link_validate = v4l2_subdev_link_validate,
531+
.link_validate = mali_c55_subdev_link_validate,
512532
};
513533

514534
static int mali_c55_isp_s_ctrl(struct v4l2_ctrl *ctrl)
@@ -597,6 +617,7 @@ int mali_c55_register_isp(struct mali_c55 *mali_c55)
597617
isp->pads[MALI_C55_ISP_PAD_SOURCE_VIDEO].flags = MEDIA_PAD_FL_SOURCE;
598618
isp->pads[MALI_C55_ISP_PAD_SOURCE_BYPASS].flags = MEDIA_PAD_FL_SOURCE;
599619
isp->pads[MALI_C55_ISP_PAD_SOURCE_STATS].flags = MEDIA_PAD_FL_SOURCE;
620+
isp->pads[MALI_C55_ISP_PAD_SINK_PARAMS].flags = MEDIA_PAD_FL_SINK;
600621

601622
ret = media_entity_pads_init(&sd->entity, MALI_C55_ISP_NUM_PADS,
602623
isp->pads);

0 commit comments

Comments
 (0)