drivers/i2c/busses/i2c-fsi.c
Source file repositories/reference/linux-study-clean/drivers/i2c/busses/i2c-fsi.c
File Facts
- System
- Linux kernel
- Corpus path
drivers/i2c/busses/i2c-fsi.c- Extension
.c- Size
- 17808 bytes
- Lines
- 776
- 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.
- 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/bitfield.hlinux/bitops.hlinux/delay.hlinux/device.hlinux/errno.hlinux/fsi.hlinux/i2c.hlinux/jiffies.hlinux/kernel.hlinux/list.hlinux/module.hlinux/mutex.hlinux/of.hlinux/slab.h
Detected Declarations
struct fsi_i2c_ctrlstruct fsi_i2c_portfunction fsi_i2c_read_regfunction fsi_i2c_write_regfunction fsi_i2c_dev_initfunction fsi_i2c_set_portfunction fsi_i2c_startfunction fsi_i2c_get_op_bytesfunction fsi_i2c_write_fifofunction fsi_i2c_read_fifofunction fsi_i2c_get_sclfunction fsi_i2c_set_sclfunction fsi_i2c_get_sdafunction fsi_i2c_set_sdafunction fsi_i2c_prepare_recoveryfunction fsi_i2c_unprepare_recoveryfunction fsi_i2c_reset_busfunction fsi_i2c_reset_enginefunction fsi_i2c_abortfunction fsi_i2c_handle_statusfunction fsi_i2c_waitfunction fsi_i2c_xferfunction fsi_i2c_functionalityfunction for_each_child_of_nodefunction fsi_i2c_probefunction fsi_i2c_removefunction list_for_each_entry_safe
Annotated Snippet
struct fsi_i2c_ctrl {
struct fsi_device *fsi;
u8 fifo_size;
struct list_head ports;
struct mutex lock;
};
struct fsi_i2c_port {
struct list_head list;
struct i2c_adapter adapter;
struct fsi_i2c_ctrl *ctrl;
u16 port;
u16 xfrd;
};
static int fsi_i2c_read_reg(struct fsi_device *fsi, unsigned int reg,
u32 *data)
{
int rc;
__be32 data_be;
rc = fsi_device_read(fsi, reg, &data_be, sizeof(data_be));
if (rc)
return rc;
*data = be32_to_cpu(data_be);
return 0;
}
static int fsi_i2c_write_reg(struct fsi_device *fsi, unsigned int reg,
u32 *data)
{
__be32 data_be = cpu_to_be32p(data);
return fsi_device_write(fsi, reg, &data_be, sizeof(data_be));
}
static int fsi_i2c_dev_init(struct fsi_i2c_ctrl *i2c)
{
int rc;
u32 mode = I2C_MODE_ENHANCED, extended_status, watermark;
u32 interrupt = 0;
/* since we use polling, disable interrupts */
rc = fsi_i2c_write_reg(i2c->fsi, I2C_FSI_INT_MASK, &interrupt);
if (rc)
return rc;
mode |= FIELD_PREP(I2C_MODE_CLKDIV, I2C_DEFAULT_CLK_DIV);
rc = fsi_i2c_write_reg(i2c->fsi, I2C_FSI_MODE, &mode);
if (rc)
return rc;
rc = fsi_i2c_read_reg(i2c->fsi, I2C_FSI_ESTAT, &extended_status);
if (rc)
return rc;
i2c->fifo_size = FIELD_GET(I2C_ESTAT_FIFO_SZ, extended_status);
watermark = FIELD_PREP(I2C_WATERMARK_HI,
i2c->fifo_size - I2C_FIFO_HI_LVL);
watermark |= FIELD_PREP(I2C_WATERMARK_LO, I2C_FIFO_LO_LVL);
return fsi_i2c_write_reg(i2c->fsi, I2C_FSI_WATER_MARK, &watermark);
}
static int fsi_i2c_set_port(struct fsi_i2c_port *port)
{
int rc;
struct fsi_device *fsi = port->ctrl->fsi;
u32 mode, dummy = 0;
rc = fsi_i2c_read_reg(fsi, I2C_FSI_MODE, &mode);
if (rc)
return rc;
if (FIELD_GET(I2C_MODE_PORT, mode) == port->port)
return 0;
mode = (mode & ~I2C_MODE_PORT) | FIELD_PREP(I2C_MODE_PORT, port->port);
rc = fsi_i2c_write_reg(fsi, I2C_FSI_MODE, &mode);
if (rc)
return rc;
/* reset engine when port is changed */
return fsi_i2c_write_reg(fsi, I2C_FSI_RESET_ERR, &dummy);
}
static int fsi_i2c_start(struct fsi_i2c_port *port, struct i2c_msg *msg,
bool stop)
Annotation
- Immediate include surface: `linux/bitfield.h`, `linux/bitops.h`, `linux/delay.h`, `linux/device.h`, `linux/errno.h`, `linux/fsi.h`, `linux/i2c.h`, `linux/jiffies.h`.
- Detected declarations: `struct fsi_i2c_ctrl`, `struct fsi_i2c_port`, `function fsi_i2c_read_reg`, `function fsi_i2c_write_reg`, `function fsi_i2c_dev_init`, `function fsi_i2c_set_port`, `function fsi_i2c_start`, `function fsi_i2c_get_op_bytes`, `function fsi_i2c_write_fifo`, `function fsi_i2c_read_fifo`.
- Atlas domain: Driver Families / drivers/i2c.
- 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.