drivers/media/pci/cobalt/cobalt-v4l2.c
Source file repositories/reference/linux-study-clean/drivers/media/pci/cobalt/cobalt-v4l2.c
File Facts
- System
- Linux kernel
- Corpus path
drivers/media/pci/cobalt/cobalt-v4l2.c- Extension
.c- Size
- 36957 bytes
- Lines
- 1318
- 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.
- 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.
- Uses kernel synchronization; read lock ordering, sleepability, and interrupt context assumptions before translating.
- Defines or uses C structs; map object ownership, embedded links, reference counts, and lock ownership.
Dependency Surface
linux/dma-mapping.hlinux/delay.hlinux/math64.hlinux/pci.hlinux/v4l2-dv-timings.hmedia/v4l2-ctrls.hmedia/v4l2-event.hmedia/v4l2-dv-timings.hmedia/i2c/adv7604.hmedia/i2c/adv7842.hcobalt-alsa.hcobalt-cpld.hcobalt-driver.hcobalt-v4l2.hcobalt-irq.hcobalt-omnitek.h
Detected Declarations
function cobalt_queue_setupfunction cobalt_buf_initfunction cobalt_buf_cleanupfunction cobalt_buf_preparefunction chain_all_buffersfunction list_for_each_entryfunction cobalt_buf_queuefunction cobalt_enable_outputfunction cobalt_enable_inputfunction cobalt_dma_start_streamingfunction cobalt_start_streamingfunction cobalt_dma_stop_streamingfunction msecs_to_jiffiesfunction cobalt_stop_streamingfunction cobalt_cobaltcfunction cobalt_g_registerfunction cobalt_s_registerfunction cobalt_querycapfunction cobalt_video_input_status_showfunction cobalt_log_statusfunction cobalt_enum_dv_timingsfunction cobalt_s_dv_timingsfunction cobalt_g_dv_timingsfunction cobalt_query_dv_timingsfunction cobalt_dv_timings_capfunction cobalt_enum_fmt_vid_capfunction cobalt_g_fmt_vid_capfunction cobalt_try_fmt_vid_capfunction cobalt_s_fmt_vid_capfunction cobalt_try_fmt_vid_outfunction cobalt_g_fmt_vid_outfunction cobalt_enum_fmt_vid_outfunction cobalt_s_fmt_vid_outfunction cobalt_enum_inputfunction cobalt_g_inputfunction cobalt_s_inputfunction cobalt_enum_outputfunction cobalt_g_outputfunction cobalt_s_outputfunction cobalt_g_edidfunction cobalt_s_edidfunction cobalt_subscribe_eventfunction cobalt_g_parmfunction cobalt_g_pixelaspectfunction cobalt_g_selectionfunction cobalt_node_registerfunction cobalt_nodes_registerfunction cobalt_nodes_unregister
Annotated Snippet
msecs_to_jiffies(timeout_msec))) {
omni_sg_dma_abort_channel(s);
pr_warn("aborted\n");
}
cobalt_write_bar0(cobalt, DMA_INTERRUPT_STATUS_REG,
1 << s->dma_channel);
}
static void cobalt_stop_streaming(struct vb2_queue *q)
{
struct cobalt_stream *s = q->drv_priv;
struct cobalt *cobalt = s->cobalt;
int rx = s->video_channel;
struct m00233_video_measure_regmap __iomem *vmr;
struct m00473_freewheel_regmap __iomem *fw;
struct m00479_clk_loss_detector_regmap __iomem *clkloss;
struct cobalt_buffer *cb;
struct list_head *p, *safe;
unsigned long flags;
cobalt_dma_stop_streaming(s);
/* Return all buffers to user space */
spin_lock_irqsave(&s->irqlock, flags);
list_for_each_safe(p, safe, &s->bufs) {
cb = list_entry(p, struct cobalt_buffer, list);
list_del(&cb->list);
vb2_buffer_done(&cb->vb.vb2_buf, VB2_BUF_STATE_ERROR);
}
spin_unlock_irqrestore(&s->irqlock, flags);
if (s->is_audio || s->is_output)
return;
fw = COBALT_CVI_FREEWHEEL(cobalt, rx);
vmr = COBALT_CVI_VMR(cobalt, rx);
clkloss = COBALT_CVI_CLK_LOSS(cobalt, rx);
iowrite32(0, &vmr->control);
iowrite32(M00233_CONTROL_BITMAP_ENABLE_MEASURE_MSK, &vmr->control);
iowrite32(0, &fw->ctrl);
iowrite32(0, &clkloss->ctrl);
}
static const struct vb2_ops cobalt_qops = {
.queue_setup = cobalt_queue_setup,
.buf_init = cobalt_buf_init,
.buf_cleanup = cobalt_buf_cleanup,
.buf_prepare = cobalt_buf_prepare,
.buf_queue = cobalt_buf_queue,
.start_streaming = cobalt_start_streaming,
.stop_streaming = cobalt_stop_streaming,
};
/* V4L2 ioctls */
#ifdef CONFIG_VIDEO_ADV_DEBUG
static int cobalt_cobaltc(struct cobalt *cobalt, unsigned int cmd, void *arg)
{
struct v4l2_dbg_register *regs = arg;
void __iomem *adrs = cobalt->bar1 + regs->reg;
cobalt_info("cobalt_cobaltc: adrs = %p\n", adrs);
if (!capable(CAP_SYS_ADMIN))
return -EPERM;
regs->size = 4;
if (cmd == VIDIOC_DBG_S_REGISTER)
iowrite32(regs->val, adrs);
else
regs->val = ioread32(adrs);
return 0;
}
static int cobalt_g_register(struct file *file, void *priv,
struct v4l2_dbg_register *reg)
{
struct cobalt_stream *s = video_drvdata(file);
struct cobalt *cobalt = s->cobalt;
return cobalt_cobaltc(cobalt, VIDIOC_DBG_G_REGISTER, reg);
}
static int cobalt_s_register(struct file *file, void *priv,
const struct v4l2_dbg_register *reg)
{
struct cobalt_stream *s = video_drvdata(file);
struct cobalt *cobalt = s->cobalt;
return cobalt_cobaltc(cobalt, VIDIOC_DBG_S_REGISTER,
Annotation
- Immediate include surface: `linux/dma-mapping.h`, `linux/delay.h`, `linux/math64.h`, `linux/pci.h`, `linux/v4l2-dv-timings.h`, `media/v4l2-ctrls.h`, `media/v4l2-event.h`, `media/v4l2-dv-timings.h`.
- Detected declarations: `function cobalt_queue_setup`, `function cobalt_buf_init`, `function cobalt_buf_cleanup`, `function cobalt_buf_prepare`, `function chain_all_buffers`, `function list_for_each_entry`, `function cobalt_buf_queue`, `function cobalt_enable_output`, `function cobalt_enable_input`, `function cobalt_dma_start_streaming`.
- Atlas domain: Driver Families / drivers/media.
- Implementation status: source implementation candidate.
- Synchronization appears in or near this file; preserve lock ordering, sleepability, and interrupt-context constraints.
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.