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

Source file repositories/reference/linux-study-clean/drivers/media/platform/arm/mali-c55/mali-c55-stats.c

File Facts

System
Linux kernel
Corpus path
drivers/media/platform/arm/mali-c55/mali-c55-stats.c
Extension
.c
Size
8811 bytes
Lines
324
Domain
Driver Families
Bucket
drivers/media
Inferred role
Driver Families: implementation source
Status
source implementation candidate

Why This File Exists

Repeatable hardware-adapter layer. Deep compatibility for every driver is out of scope; this atlas records patterns, probe lifecycles, bus glue, IRQ/DMA usage, and links back to core abstractions.

Dependency Surface

Detected Declarations

Annotated Snippet

// SPDX-License-Identifier: GPL-2.0
/*
 * ARM Mali-C55 ISP Driver - 3A Statistics capture device
 *
 * Copyright (C) 2025 Ideas on Board Oy
 */

#include <linux/container_of.h>
#include <linux/dev_printk.h>
#include <linux/list.h>
#include <linux/media/arm/mali-c55-config.h>
#include <linux/mutex.h>
#include <linux/pm_runtime.h>
#include <linux/spinlock.h>
#include <linux/string.h>

#include <media/media-entity.h>
#include <media/v4l2-dev.h>
#include <media/v4l2-event.h>
#include <media/v4l2-fh.h>
#include <media/v4l2-ioctl.h>
#include <media/videobuf2-core.h>
#include <media/videobuf2-dma-contig.h>

#include "mali-c55-common.h"
#include "mali-c55-registers.h"

static const unsigned int metering_space_addrs[] = {
	[MALI_C55_CONFIG_PING] = 0x095ac,
	[MALI_C55_CONFIG_PONG] = 0x2156c,
};

static int mali_c55_stats_enum_fmt_meta_cap(struct file *file, void *fh,
					    struct v4l2_fmtdesc *f)
{
	if (f->index)
		return -EINVAL;

	f->pixelformat = V4L2_META_FMT_MALI_C55_STATS;

	return 0;
}

static int mali_c55_stats_g_fmt_meta_cap(struct file *file, void *fh,
					 struct v4l2_format *f)
{
	static const struct v4l2_meta_format mfmt = {
		.dataformat = V4L2_META_FMT_MALI_C55_STATS,
		.buffersize = sizeof(struct mali_c55_stats_buffer)
	};

	f->fmt.meta = mfmt;

	return 0;
}

static int mali_c55_stats_querycap(struct file *file,
				   void *priv, struct v4l2_capability *cap)
{
	strscpy(cap->driver, MALI_C55_DRIVER_NAME, sizeof(cap->driver));
	strscpy(cap->card, "ARM Mali-C55 ISP", sizeof(cap->card));

	return 0;
}

static const struct v4l2_ioctl_ops mali_c55_stats_v4l2_ioctl_ops = {
	.vidioc_reqbufs = vb2_ioctl_reqbufs,
	.vidioc_querybuf = vb2_ioctl_querybuf,
	.vidioc_create_bufs = vb2_ioctl_create_bufs,
	.vidioc_qbuf = vb2_ioctl_qbuf,
	.vidioc_expbuf = vb2_ioctl_expbuf,
	.vidioc_dqbuf = vb2_ioctl_dqbuf,
	.vidioc_prepare_buf = vb2_ioctl_prepare_buf,
	.vidioc_streamon = vb2_ioctl_streamon,
	.vidioc_streamoff = vb2_ioctl_streamoff,
	.vidioc_enum_fmt_meta_cap = mali_c55_stats_enum_fmt_meta_cap,
	.vidioc_g_fmt_meta_cap = mali_c55_stats_g_fmt_meta_cap,
	.vidioc_s_fmt_meta_cap = mali_c55_stats_g_fmt_meta_cap,
	.vidioc_try_fmt_meta_cap = mali_c55_stats_g_fmt_meta_cap,
	.vidioc_querycap = mali_c55_stats_querycap,
	.vidioc_subscribe_event = v4l2_ctrl_subscribe_event,
	.vidioc_unsubscribe_event = v4l2_event_unsubscribe,
};

static const struct v4l2_file_operations mali_c55_stats_v4l2_fops = {
	.owner = THIS_MODULE,
	.unlocked_ioctl = video_ioctl2,
	.open = v4l2_fh_open,
	.release = vb2_fop_release,
	.poll = vb2_fop_poll,

Annotation

Implementation Notes