drivers/media/spi/cxd2880-spi.c
Source file repositories/reference/linux-study-clean/drivers/media/spi/cxd2880-spi.c
File Facts
- System
- Linux kernel
- Corpus path
drivers/media/spi/cxd2880-spi.c- Extension
.c- Size
- 15046 bytes
- Lines
- 668
- 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.
- 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/spi/spi.hlinux/regulator/consumer.hlinux/ktime.hmedia/dvb_demux.hmedia/dmxdev.hmedia/dvb_frontend.hcxd2880.h
Detected Declarations
struct cxd2880_ts_buf_infostruct cxd2880_pid_configstruct cxd2880_pid_filter_configstruct cxd2880_dvb_spifunction cxd2880_write_spifunction cxd2880_write_regfunction cxd2880_spi_read_tsfunction cxd2880_spi_read_ts_buffer_infofunction cxd2880_spi_clear_ts_bufferfunction cxd2880_set_pid_filterfunction cxd2880_update_pid_filterfunction cxd2880_ts_readfunction cxd2880_start_feedfunction cxd2880_stop_feedfunction cxd2880_spi_probefunction cxd2880_spi_remove
Annotated Snippet
struct cxd2880_ts_buf_info {
u8 read_ready:1;
u8 almost_full:1;
u8 almost_empty:1;
u8 overflow:1;
u8 underflow:1;
u16 pkt_num;
};
struct cxd2880_pid_config {
u8 is_enable;
u16 pid;
};
struct cxd2880_pid_filter_config {
u8 is_negative;
struct cxd2880_pid_config pid_config[CXD2880_MAX_FILTER_SIZE];
};
struct cxd2880_dvb_spi {
struct dvb_frontend dvb_fe;
struct dvb_adapter adapter;
struct dvb_demux demux;
struct dmxdev dmxdev;
struct dmx_frontend dmx_fe;
struct task_struct *cxd2880_ts_read_thread;
struct spi_device *spi;
struct mutex spi_mutex; /* For SPI access exclusive control */
int feed_count;
int all_pid_feed_count;
struct regulator *vcc_supply;
u8 *ts_buf;
struct cxd2880_pid_filter_config filter_config;
};
DVB_DEFINE_MOD_OPT_ADAPTER_NR(adapter_nr);
static int cxd2880_write_spi(struct spi_device *spi, u8 *data, u32 size)
{
struct spi_message msg;
struct spi_transfer tx = {};
if (!spi || !data) {
pr_err("invalid arg\n");
return -EINVAL;
}
tx.tx_buf = data;
tx.len = size;
spi_message_init(&msg);
spi_message_add_tail(&tx, &msg);
return spi_sync(spi, &msg);
}
static int cxd2880_write_reg(struct spi_device *spi,
u8 sub_address, const u8 *data, u32 size)
{
u8 send_data[BURST_WRITE_MAX + 4];
const u8 *write_data_top = NULL;
int ret = 0;
if (!spi || !data) {
pr_err("invalid arg\n");
return -EINVAL;
}
if (size > BURST_WRITE_MAX || size > U8_MAX) {
pr_err("data size > WRITE_MAX\n");
return -EINVAL;
}
if (sub_address + size > 0x100) {
pr_err("out of range\n");
return -EINVAL;
}
send_data[0] = 0x0e;
write_data_top = data;
send_data[1] = sub_address;
send_data[2] = (u8)size;
memcpy(&send_data[3], write_data_top, send_data[2]);
ret = cxd2880_write_spi(spi, send_data, send_data[2] + 3);
if (ret)
pr_err("write spi failed %d\n", ret);
return ret;
Annotation
- Immediate include surface: `linux/spi/spi.h`, `linux/regulator/consumer.h`, `linux/ktime.h`, `media/dvb_demux.h`, `media/dmxdev.h`, `media/dvb_frontend.h`, `cxd2880.h`.
- Detected declarations: `struct cxd2880_ts_buf_info`, `struct cxd2880_pid_config`, `struct cxd2880_pid_filter_config`, `struct cxd2880_dvb_spi`, `function cxd2880_write_spi`, `function cxd2880_write_reg`, `function cxd2880_spi_read_ts`, `function cxd2880_spi_read_ts_buffer_info`, `function cxd2880_spi_clear_ts_buffer`, `function cxd2880_set_pid_filter`.
- 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.