drivers/staging/media/imx/imx-media-csc-scaler.c
Source file repositories/reference/linux-study-clean/drivers/staging/media/imx/imx-media-csc-scaler.c
File Facts
- System
- Linux kernel
- Corpus path
drivers/staging/media/imx/imx-media-csc-scaler.c- Extension
.c- Size
- 24127 bytes
- Lines
- 926
- Domain
- Driver Families
- Bucket
- drivers/staging
- 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.
- 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.
- Allocates kernel memory; connect allocation flags and lifetime to context constraints.
- Defines or uses C structs; map object ownership, embedded links, reference counts, and lock ownership.
Dependency Surface
linux/module.hlinux/delay.hlinux/fs.hlinux/sched.hlinux/slab.hvideo/imx-ipu-v3.hvideo/imx-ipu-image-convert.hmedia/media-device.hmedia/v4l2-ctrls.hmedia/v4l2-event.hmedia/v4l2-mem2mem.hmedia/v4l2-device.hmedia/v4l2-ioctl.hmedia/videobuf2-dma-contig.himx-media.h
Detected Declarations
struct ipu_csc_scaler_privstruct ipu_csc_scaler_q_datastruct ipu_csc_scaler_ctxfunction job_abortfunction ipu_ic_pp_completefunction device_runfunction ipu_csc_scaler_querycapfunction ipu_csc_scaler_enum_fmtfunction ipu_csc_scaler_g_fmtfunction ipu_csc_scaler_try_fmtfunction ipu_csc_scaler_s_fmtfunction ipu_csc_scaler_g_selectionfunction ipu_csc_scaler_s_selectionfunction ipu_csc_scaler_queue_setupfunction ipu_csc_scaler_buf_preparefunction ipu_csc_scaler_buf_queuefunction ipu_image_from_q_datafunction ipu_csc_scaler_start_streamingfunction ipu_csc_scaler_stop_streamingfunction ipu_csc_scaler_queue_initfunction ipu_csc_scaler_s_ctrlfunction ipu_csc_scaler_init_controlsfunction ipu_csc_scaler_openfunction ipu_csc_scaler_releasefunction ipu_csc_scaler_video_device_releasefunction imx_media_csc_scaler_device_registerfunction imx_media_csc_scaler_device_unregisterfunction imx_media_csc_scaler_device_init
Annotated Snippet
struct ipu_csc_scaler_priv {
struct imx_media_video_dev vdev;
struct v4l2_m2m_dev *m2m_dev;
struct device *dev;
struct imx_media_dev *md;
struct mutex mutex; /* mem2mem device mutex */
};
#define vdev_to_priv(v) container_of(v, struct ipu_csc_scaler_priv, vdev)
/* Per-queue, driver-specific private data */
struct ipu_csc_scaler_q_data {
struct v4l2_pix_format cur_fmt;
struct v4l2_rect rect;
};
struct ipu_csc_scaler_ctx {
struct ipu_csc_scaler_priv *priv;
struct v4l2_fh fh;
struct ipu_csc_scaler_q_data q_data[2];
struct ipu_image_convert_ctx *icc;
struct v4l2_ctrl_handler ctrl_hdlr;
int rotate;
bool hflip;
bool vflip;
enum ipu_rotate_mode rot_mode;
unsigned int sequence;
};
static inline struct ipu_csc_scaler_ctx *file_to_ctx(struct file *filp)
{
return container_of(file_to_v4l2_fh(filp), struct ipu_csc_scaler_ctx, fh);
}
static struct ipu_csc_scaler_q_data *get_q_data(struct ipu_csc_scaler_ctx *ctx,
enum v4l2_buf_type type)
{
if (V4L2_TYPE_IS_OUTPUT(type))
return &ctx->q_data[V4L2_M2M_SRC];
else
return &ctx->q_data[V4L2_M2M_DST];
}
/*
* mem2mem callbacks
*/
static void job_abort(void *_ctx)
{
struct ipu_csc_scaler_ctx *ctx = _ctx;
if (ctx->icc)
ipu_image_convert_abort(ctx->icc);
}
static void ipu_ic_pp_complete(struct ipu_image_convert_run *run, void *_ctx)
{
struct ipu_csc_scaler_ctx *ctx = _ctx;
struct ipu_csc_scaler_priv *priv = ctx->priv;
struct vb2_v4l2_buffer *src_buf, *dst_buf;
src_buf = v4l2_m2m_src_buf_remove(ctx->fh.m2m_ctx);
dst_buf = v4l2_m2m_dst_buf_remove(ctx->fh.m2m_ctx);
v4l2_m2m_buf_copy_metadata(src_buf, dst_buf);
src_buf->sequence = ctx->sequence++;
dst_buf->sequence = src_buf->sequence;
v4l2_m2m_buf_done(src_buf, run->status ? VB2_BUF_STATE_ERROR :
VB2_BUF_STATE_DONE);
v4l2_m2m_buf_done(dst_buf, run->status ? VB2_BUF_STATE_ERROR :
VB2_BUF_STATE_DONE);
v4l2_m2m_job_finish(priv->m2m_dev, ctx->fh.m2m_ctx);
kfree(run);
}
static void device_run(void *_ctx)
{
struct ipu_csc_scaler_ctx *ctx = _ctx;
struct ipu_csc_scaler_priv *priv = ctx->priv;
struct vb2_v4l2_buffer *src_buf, *dst_buf;
struct ipu_image_convert_run *run;
int ret;
Annotation
- Immediate include surface: `linux/module.h`, `linux/delay.h`, `linux/fs.h`, `linux/sched.h`, `linux/slab.h`, `video/imx-ipu-v3.h`, `video/imx-ipu-image-convert.h`, `media/media-device.h`.
- Detected declarations: `struct ipu_csc_scaler_priv`, `struct ipu_csc_scaler_q_data`, `struct ipu_csc_scaler_ctx`, `function job_abort`, `function ipu_ic_pp_complete`, `function device_run`, `function ipu_csc_scaler_querycap`, `function ipu_csc_scaler_enum_fmt`, `function ipu_csc_scaler_g_fmt`, `function ipu_csc_scaler_try_fmt`.
- Atlas domain: Driver Families / drivers/staging.
- Implementation status: source implementation candidate.
Implementation Notes
- This generated page is the file-by-file coverage layer; curated subsystem chapters should link here when they synthesize a multi-file control flow.
- Core OS pages should be promoted from atlas-only to deep-reviewed when they explain data structures, invariants, locking, lifecycle, and C implementation snippets.
- Driver-family pages are intentionally pattern-oriented unless they are part of the selected PCIe/NVMe representative device path.