drivers/media/pci/cx23885/cx23885-417.c
Source file repositories/reference/linux-study-clean/drivers/media/pci/cx23885/cx23885-417.c
File Facts
- System
- Linux kernel
- Corpus path
drivers/media/pci/cx23885/cx23885-417.c- Extension
.c- Size
- 44070 bytes
- Lines
- 1565
- 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
cx23885.hcx23885-ioctl.hlinux/module.hlinux/moduleparam.hlinux/init.hlinux/fs.hlinux/delay.hlinux/device.hlinux/firmware.hlinux/slab.hmedia/v4l2-common.hmedia/v4l2-ioctl.hmedia/drv-intf/cx2341x.h
Detected Declarations
enum cx23885_capture_typeenum cx23885_capture_bitsenum cx23885_capture_endenum cx23885_framerateenum cx23885_stream_portenum cx23885_data_xfer_statusenum cx23885_picture_maskenum cx23885_vbi_mode_bitsenum cx23885_vbi_insertion_bitsenum cx23885_dma_unitenum cx23885_dma_transfer_status_bitsenum cx23885_pauseenum cx23885_copyrightenum cx23885_notification_typeenum cx23885_notification_statusenum cx23885_notification_mailboxenum cx23885_field1_linesenum cx23885_field2_linesenum cx23885_custom_data_typeenum cx23885_muteenum cx23885_mute_video_maskenum cx23885_mute_video_shiftfunction cx23885_mc417_initfunction mc417_wait_readyfunction mc417_register_writefunction mc417_register_readfunction mc417_memory_writefunction mc417_memory_readfunction mc417_gpio_setfunction mc417_gpio_clearfunction mc417_gpio_enablefunction cx23885_mbox_funcfunction cx23885_api_cmdfunction cx23885_api_funcfunction cx23885_find_mailboxfunction cx23885_load_firmwarefunction cx23885_417_check_encoderfunction cx23885_codec_settingsfunction cx23885_initialize_codecfunction queue_setupfunction buffer_preparefunction buffer_finishfunction buffer_queuefunction cx23885_start_streamingfunction cx23885_stop_streamingfunction vidioc_g_stdfunction vidioc_s_stdfunction vidioc_enum_input
Annotated Snippet
if (time_after(jiffies, timeout)) {
pr_err("ERROR: API Mailbox timeout\n");
return -1;
}
udelay(10);
}
/* read output values */
for (i = 0; i < out; i++) {
mc417_memory_read(dev, dev->cx23417_mailbox + 4 + i, data + i);
dprintk(3, "API Output %d = %d\n", i, data[i]);
}
mc417_memory_read(dev, dev->cx23417_mailbox + 2, &retval);
dprintk(3, "API result = %d\n", retval);
flag = 0;
mc417_memory_write(dev, dev->cx23417_mailbox, flag);
return retval;
}
/* We don't need to call the API often, so using just one
* mailbox will probably suffice
*/
static int cx23885_api_cmd(struct cx23885_dev *dev,
u32 command,
u32 inputcnt,
u32 outputcnt,
...)
{
u32 data[CX2341X_MBOX_MAX_DATA];
va_list vargs;
int i, err;
dprintk(3, "%s() cmds = 0x%08x\n", __func__, command);
va_start(vargs, outputcnt);
for (i = 0; i < inputcnt; i++)
data[i] = va_arg(vargs, int);
err = cx23885_mbox_func(dev, command, inputcnt, outputcnt, data);
for (i = 0; i < outputcnt; i++) {
int *vptr = va_arg(vargs, int *);
*vptr = data[i];
}
va_end(vargs);
return err;
}
static int cx23885_api_func(void *priv, u32 cmd, int in, int out, u32 data[CX2341X_MBOX_MAX_DATA])
{
return cx23885_mbox_func(priv, cmd, in, out, data);
}
static int cx23885_find_mailbox(struct cx23885_dev *dev)
{
u32 signature[4] = {
0x12345678, 0x34567812, 0x56781234, 0x78123456
};
int signaturecnt = 0;
u32 value;
int i;
dprintk(2, "%s()\n", __func__);
for (i = 0; i < CX23885_FIRM_IMAGE_SIZE; i++) {
mc417_memory_read(dev, i, &value);
if (value == signature[signaturecnt])
signaturecnt++;
else
signaturecnt = 0;
if (4 == signaturecnt) {
dprintk(1, "Mailbox signature found at 0x%x\n", i+1);
return i+1;
}
}
pr_err("Mailbox signature values not found!\n");
return -1;
}
static int cx23885_load_firmware(struct cx23885_dev *dev)
{
static const unsigned char magic[8] = {
0xa7, 0x0d, 0x00, 0x00, 0x66, 0xbb, 0x55, 0xaa
};
const struct firmware *firmware;
int i, retval = 0;
u32 value = 0;
Annotation
- Immediate include surface: `cx23885.h`, `cx23885-ioctl.h`, `linux/module.h`, `linux/moduleparam.h`, `linux/init.h`, `linux/fs.h`, `linux/delay.h`, `linux/device.h`.
- Detected declarations: `enum cx23885_capture_type`, `enum cx23885_capture_bits`, `enum cx23885_capture_end`, `enum cx23885_framerate`, `enum cx23885_stream_port`, `enum cx23885_data_xfer_status`, `enum cx23885_picture_mask`, `enum cx23885_vbi_mode_bits`, `enum cx23885_vbi_insertion_bits`, `enum cx23885_dma_unit`.
- 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.