drivers/i2c/busses/i2c-imx-lpi2c.c
Source file repositories/reference/linux-study-clean/drivers/i2c/busses/i2c-imx-lpi2c.c
File Facts
- System
- Linux kernel
- Corpus path
drivers/i2c/busses/i2c-imx-lpi2c.c- Extension
.c- Size
- 46993 bytes
- Lines
- 1740
- Domain
- Driver Families
- Bucket
- drivers/i2c
- 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/bitfield.hlinux/clk.hlinux/completion.hlinux/delay.hlinux/dma-mapping.hlinux/dmaengine.hlinux/err.hlinux/errno.hlinux/i2c.hlinux/init.hlinux/interrupt.hlinux/io.hlinux/iopoll.hlinux/kernel.hlinux/module.hlinux/of.hlinux/pinctrl/consumer.hlinux/platform_device.hlinux/pm_runtime.hlinux/sched.hlinux/slab.h
Detected Declarations
struct imx_lpi2c_hwdatastruct lpi2c_imx_dmastruct lpi2c_imx_structenum lpi2c_imx_modeenum lpi2c_imx_pincfgfunction readl_poll_timeoutfunction lpi2c_imx_bus_busyfunction lpi2c_imx_txfifo_cntfunction lpi2c_imx_set_modefunction lpi2c_imx_startfunction lpi2c_imx_stopfunction lpi2c_imx_configfunction lpi2c_imx_master_enablefunction lpi2c_imx_master_disablefunction lpi2c_imx_pio_msg_completefunction lpi2c_imx_txfifo_emptyfunction lpi2c_imx_set_tx_watermarkfunction lpi2c_imx_set_rx_watermarkfunction lpi2c_imx_write_txfifofunction lpi2c_imx_read_rxfifofunction lpi2c_imx_writefunction lpi2c_imx_write_atomicfunction lpi2c_SMBus_block_read_length_bytefunction lpi2c_imx_read_initfunction lpi2c_imx_read_chunk_atomicfunction lpi2c_imx_read_atomicfunction is_use_dmafunction lpi2c_imx_pio_xferfunction lpi2c_imx_pio_xfer_atomicfunction lpi2c_imx_dma_timeout_calculatefunction lpi2c_imx_alloc_rx_cmd_buffunction lpi2c_imx_dma_msg_completefunction lpi2c_dma_unmapfunction lpi2c_cleanup_rx_cmd_dmafunction lpi2c_cleanup_dmafunction lpi2c_dma_callbackfunction lpi2c_dma_rx_cmd_submitfunction lpi2c_dma_submitfunction lpi2c_imx_find_max_burst_numfunction lpi2c_imx_dma_burst_num_calculatefunction lpi2c_dma_configfunction lpi2c_dma_enablefunction receivefunction lpi2c_imx_xfer_commonfunction lpi2c_imx_xferfunction lpi2c_imx_xfer_atomicfunction lpi2c_imx_target_isrfunction lpi2c_imx_master_isr
Annotated Snippet
struct imx_lpi2c_hwdata {
bool need_request_free_irq; /* Needed by irqsteer */
bool need_prepare_unprepare_clk; /* Needed by LPCG */
};
struct lpi2c_imx_dma {
bool using_pio_mode;
u8 rx_cmd_buf_len;
u8 *dma_buf;
u16 *rx_cmd_buf;
unsigned int dma_len;
unsigned int tx_burst_num;
unsigned int rx_burst_num;
unsigned long dma_msg_flag;
resource_size_t phy_addr;
dma_addr_t dma_tx_addr;
dma_addr_t dma_addr;
enum dma_data_direction dma_data_dir;
enum dma_transfer_direction dma_transfer_dir;
struct dma_chan *chan_tx;
struct dma_chan *chan_rx;
};
struct lpi2c_imx_struct {
struct i2c_adapter adapter;
int num_clks;
struct clk_bulk_data *clks;
void __iomem *base;
__u8 *rx_buf;
__u8 *tx_buf;
struct completion complete;
unsigned long rate_per;
unsigned int msglen;
unsigned int delivered;
unsigned int block_data;
unsigned int bitrate;
unsigned int txfifosize;
unsigned int rxfifosize;
enum lpi2c_imx_mode mode;
struct i2c_bus_recovery_info rinfo;
bool can_use_dma;
struct lpi2c_imx_dma *dma;
struct i2c_client *target;
int irq;
const struct imx_lpi2c_hwdata *hwdata;
};
static const struct imx_lpi2c_hwdata imx7ulp_lpi2c_hwdata = {
};
static const struct imx_lpi2c_hwdata imx8qxp_lpi2c_hwdata = {
.need_request_free_irq = true,
.need_prepare_unprepare_clk = true,
};
static const struct imx_lpi2c_hwdata imx8qm_lpi2c_hwdata = {
.need_request_free_irq = true,
.need_prepare_unprepare_clk = true,
};
#define lpi2c_imx_read_msr_poll_timeout(atomic, val, cond) \
(atomic ? readl_poll_timeout_atomic(lpi2c_imx->base + LPI2C_MSR, val, \
cond, 0, 500000) : \
readl_poll_timeout(lpi2c_imx->base + LPI2C_MSR, val, cond, \
0, 500000))
static void lpi2c_imx_intctrl(struct lpi2c_imx_struct *lpi2c_imx,
unsigned int enable)
{
writel(enable, lpi2c_imx->base + LPI2C_MIER);
}
static int lpi2c_imx_bus_busy(struct lpi2c_imx_struct *lpi2c_imx, bool atomic)
{
unsigned int temp;
int err;
err = lpi2c_imx_read_msr_poll_timeout(atomic, temp,
temp & (MSR_ALF | MSR_BBF | MSR_MBF));
/* check for arbitration lost, clear if set */
if (temp & MSR_ALF) {
writel(temp, lpi2c_imx->base + LPI2C_MSR);
return -EAGAIN;
}
/* check for bus not busy */
if (err) {
dev_dbg(&lpi2c_imx->adapter.dev, "bus not work\n");
if (lpi2c_imx->adapter.bus_recovery_info)
Annotation
- Immediate include surface: `linux/bitfield.h`, `linux/clk.h`, `linux/completion.h`, `linux/delay.h`, `linux/dma-mapping.h`, `linux/dmaengine.h`, `linux/err.h`, `linux/errno.h`.
- Detected declarations: `struct imx_lpi2c_hwdata`, `struct lpi2c_imx_dma`, `struct lpi2c_imx_struct`, `enum lpi2c_imx_mode`, `enum lpi2c_imx_pincfg`, `function readl_poll_timeout`, `function lpi2c_imx_bus_busy`, `function lpi2c_imx_txfifo_cnt`, `function lpi2c_imx_set_mode`, `function lpi2c_imx_start`.
- Atlas domain: Driver Families / drivers/i2c.
- 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.