drivers/i3c/master/renesas-i3c.c
Source file repositories/reference/linux-study-clean/drivers/i3c/master/renesas-i3c.c
File Facts
- System
- Linux kernel
- Corpus path
drivers/i3c/master/renesas-i3c.c- Extension
.c- Size
- 39661 bytes
- Lines
- 1483
- Domain
- Driver Families
- Bucket
- drivers/i3c
- 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.
- 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/bitfield.hlinux/bitops.hlinux/cleanup.hlinux/clk.hlinux/completion.hlinux/err.hlinux/errno.hlinux/i2c.hlinux/i3c/master.hlinux/interrupt.hlinux/ioport.hlinux/iopoll.hlinux/list.hlinux/module.hlinux/of.hlinux/platform_device.hlinux/reset.hlinux/slab.h../internals.h
Detected Declarations
struct renesas_i3c_cmdstruct renesas_i3c_xferstruct renesas_i3c_xferqueuestruct renesas_i3cstruct renesas_i3c_i2c_dev_datastruct renesas_i3c_irq_descenum i3c_internal_stateenum renesas_i3c_eventfunction renesas_i3c_reg_updatefunction renesas_readlfunction renesas_writelfunction renesas_set_bitfunction renesas_clear_bitfunction datbas_dvdyad_with_parityfunction renesas_i3c_get_free_posfunction renesas_i3c_get_addr_posfunction renesas_i3c_start_xfer_lockedfunction renesas_i3c_dequeue_xfer_lockedfunction renesas_i3c_dequeue_xferfunction renesas_i3c_enqueue_xferfunction renesas_i3c_wait_xferfunction renesas_i3c_set_prtsfunction renesas_i3c_bus_enablefunction renesas_i3c_resetfunction renesas_i3c_hw_initfunction renesas_i3c_bus_initfunction renesas_i3c_bus_cleanupfunction renesas_i3c_daafunction renesas_i3c_supports_ccc_cmdfunction renesas_i3c_send_ccc_cmdfunction renesas_i3c_i3c_xfersfunction renesas_i3c_attach_i3c_devfunction renesas_i3c_reattach_i3c_devfunction renesas_i3c_detach_i3c_devfunction renesas_i3c_i2c_xfersfunction renesas_i3c_attach_i2c_devfunction renesas_i3c_detach_i2c_devfunction renesas_i3c_tx_isrfunction scoped_guardfunction renesas_i3c_resp_isrfunction scoped_guardfunction renesas_i3c_tend_isrfunction scoped_guardfunction renesas_i3c_rx_isrfunction scoped_guardfunction renesas_i3c_stop_isrfunction scoped_guardfunction renesas_i3c_start_isr
Annotated Snippet
struct renesas_i3c_cmd {
u32 cmd0;
u32 len;
const void *tx_buf;
u32 tx_count;
void *rx_buf;
u32 rx_count;
u32 err;
u8 rnw;
/* i2c xfer */
int i2c_bytes_left;
int i2c_is_last;
u8 *i2c_buf;
const struct i2c_msg *msg;
};
struct renesas_i3c_xfer {
struct list_head node;
struct completion comp;
int ret;
bool is_i2c_xfer;
unsigned int ncmds;
struct renesas_i3c_cmd cmds[] __counted_by(ncmds);
};
struct renesas_i3c_xferqueue {
struct list_head list;
struct renesas_i3c_xfer *cur;
/* Lock for accessing the xfer queue */
spinlock_t lock;
};
struct renesas_i3c {
struct i3c_master_controller base;
enum i3c_internal_state internal_state;
u16 maxdevs;
u32 free_pos;
u32 dyn_addr;
u32 i2c_STDBR;
u32 i3c_STDBR;
unsigned long rate;
u8 addrs[RENESAS_I3C_MAX_DEVS];
struct renesas_i3c_xferqueue xferqueue;
void __iomem *regs;
u32 *DATBASn;
struct clk_bulk_data *clks;
struct reset_control *presetn;
struct reset_control *tresetn;
u8 num_clks;
u8 refclk_div;
};
struct renesas_i3c_i2c_dev_data {
u8 index;
};
struct renesas_i3c_irq_desc {
const char *name;
irq_handler_t isr;
const char *desc;
};
static inline void renesas_i3c_reg_update(void __iomem *reg, u32 mask, u32 val)
{
u32 data = readl(reg);
data &= ~mask;
data |= (val & mask);
writel(data, reg);
}
static inline u32 renesas_readl(void __iomem *base, u32 reg)
{
return readl(base + reg);
}
static inline void renesas_writel(void __iomem *base, u32 reg, u32 val)
{
writel(val, base + reg);
}
static void renesas_set_bit(void __iomem *base, u32 reg, u32 val)
{
renesas_i3c_reg_update(base + reg, val, val);
}
static void renesas_clear_bit(void __iomem *base, u32 reg, u32 val)
{
renesas_i3c_reg_update(base + reg, val, 0);
}
Annotation
- Immediate include surface: `linux/bitfield.h`, `linux/bitops.h`, `linux/cleanup.h`, `linux/clk.h`, `linux/completion.h`, `linux/err.h`, `linux/errno.h`, `linux/i2c.h`.
- Detected declarations: `struct renesas_i3c_cmd`, `struct renesas_i3c_xfer`, `struct renesas_i3c_xferqueue`, `struct renesas_i3c`, `struct renesas_i3c_i2c_dev_data`, `struct renesas_i3c_irq_desc`, `enum i3c_internal_state`, `enum renesas_i3c_event`, `function renesas_i3c_reg_update`, `function renesas_readl`.
- Atlas domain: Driver Families / drivers/i3c.
- Implementation status: source implementation candidate.
- Synchronization appears in or near this file; preserve lock ordering, sleepability, and interrupt-context constraints.
- 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.