drivers/media/cec/i2c/tda9950.c
Source file repositories/reference/linux-study-clean/drivers/media/cec/i2c/tda9950.c
File Facts
- System
- Linux kernel
- Corpus path
drivers/media/cec/i2c/tda9950.c- Extension
.c- Size
- 11572 bytes
- Lines
- 508
- 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.
- Touches IRQ or DMA behavior; this matters for the representative real-device path.
- 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/delay.hlinux/i2c.hlinux/interrupt.hlinux/module.hlinux/platform_data/tda9950.hlinux/slab.hdrm/drm_edid.hmedia/cec.hmedia/cec-notifier.h
Detected Declarations
struct tda9950_privfunction tda9950_write_rangefunction tda9950_writefunction tda9950_read_rangefunction tda9950_readfunction tda9950_irqfunction tda9950_cec_transmitfunction tda9950_cec_adap_log_addrfunction tda9950_glue_openfunction tda9950_glue_releasefunction tda9950_openfunction tda9950_releasefunction tda9950_cec_adap_enablefunction tda9950_devm_glue_exitfunction tda9950_devm_glue_initfunction tda9950_cec_delfunction tda9950_probefunction tda9950_remove
Annotated Snippet
struct tda9950_priv {
struct i2c_client *client;
struct device *hdmi;
struct cec_adapter *adap;
struct tda9950_glue *glue;
u16 addresses;
struct cec_msg rx_msg;
struct cec_notifier *notify;
bool open;
};
static int tda9950_write_range(struct i2c_client *client, u8 addr, u8 *p, int cnt)
{
struct i2c_msg msg;
u8 buf[CEC_MAX_MSG_SIZE + 3];
int ret;
if (WARN_ON(cnt > sizeof(buf) - 1))
return -EINVAL;
buf[0] = addr;
memcpy(buf + 1, p, cnt);
msg.addr = client->addr;
msg.flags = 0;
msg.len = cnt + 1;
msg.buf = buf;
dev_dbg(&client->dev, "wr 0x%02x: %*ph\n", addr, cnt, p);
ret = i2c_transfer(client->adapter, &msg, 1);
if (ret < 0)
dev_err(&client->dev, "Error %d writing to cec:0x%x\n", ret, addr);
return ret < 0 ? ret : 0;
}
static void tda9950_write(struct i2c_client *client, u8 addr, u8 val)
{
tda9950_write_range(client, addr, &val, 1);
}
static int tda9950_read_range(struct i2c_client *client, u8 addr, u8 *p, int cnt)
{
struct i2c_msg msg[2];
int ret;
msg[0].addr = client->addr;
msg[0].flags = 0;
msg[0].len = 1;
msg[0].buf = &addr;
msg[1].addr = client->addr;
msg[1].flags = I2C_M_RD;
msg[1].len = cnt;
msg[1].buf = p;
ret = i2c_transfer(client->adapter, msg, 2);
if (ret < 0)
dev_err(&client->dev, "Error %d reading from cec:0x%x\n", ret, addr);
dev_dbg(&client->dev, "rd 0x%02x: %*ph\n", addr, cnt, p);
return ret;
}
static u8 tda9950_read(struct i2c_client *client, u8 addr)
{
int ret;
u8 val;
ret = tda9950_read_range(client, addr, &val, 1);
if (ret < 0)
val = 0;
return val;
}
static irqreturn_t tda9950_irq(int irq, void *data)
{
struct tda9950_priv *priv = data;
unsigned int tx_status;
u8 csr, cconr, buf[19];
u8 arb_lost_cnt, nack_cnt, err_cnt;
if (!priv->open)
return IRQ_NONE;
csr = tda9950_read(priv->client, REG_CSR);
if (!(csr & CSR_INT))
return IRQ_NONE;
Annotation
- Immediate include surface: `linux/delay.h`, `linux/i2c.h`, `linux/interrupt.h`, `linux/module.h`, `linux/platform_data/tda9950.h`, `linux/slab.h`, `drm/drm_edid.h`, `media/cec.h`.
- Detected declarations: `struct tda9950_priv`, `function tda9950_write_range`, `function tda9950_write`, `function tda9950_read_range`, `function tda9950_read`, `function tda9950_irq`, `function tda9950_cec_transmit`, `function tda9950_cec_adap_log_addr`, `function tda9950_glue_open`, `function tda9950_glue_release`.
- Atlas domain: Driver Families / drivers/media.
- Implementation status: source implementation candidate.
- IRQ or DMA behavior appears here, which is relevant to the selected PCIe/NVMe device path.
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.