drivers/i2c/busses/i2c-keba.c
Source file repositories/reference/linux-study-clean/drivers/i2c/busses/i2c-keba.c
File Facts
- System
- Linux kernel
- Corpus path
drivers/i2c/busses/i2c-keba.c- Extension
.c- Size
- 14162 bytes
- Lines
- 595
- 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.
- 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/i2c.hlinux/io.hlinux/iopoll.hlinux/module.hlinux/misc/keba.h
Detected Declarations
struct ki2cfunction ki2c_inuse_lockfunction ki2c_inuse_unlockfunction ki2c_wait_for_bitfunction ki2c_wait_for_mcffunction ki2c_wait_for_datafunction ki2c_wait_for_data_ackfunction ki2c_has_capabilityfunction ki2c_get_sclfunction ki2c_get_sdafunction ki2c_set_sclfunction udelayfunction ki2c_reset_bus_bytewisefunction ki2c_reset_busfunction ki2c_write_target_addrfunction ki2c_start_addrfunction ki2c_repstart_addrfunction ki2c_stopfunction ki2c_writefunction ki2c_readfunction ki2c_xferfunction ki2c_unregister_devicesfunction ki2c_register_devicesfunction ki2c_funcfunction ki2c_probefunction ki2c_remove
Annotated Snippet
struct ki2c {
struct keba_i2c_auxdev *auxdev;
void __iomem *base;
struct i2c_adapter adapter;
struct i2c_client **client;
int client_size;
};
static int ki2c_inuse_lock(struct ki2c *ki2c)
{
u8 sts;
int ret;
/*
* The I2C controller has an IN_USE bit for locking access to the
* controller. This enables the use of I2C controller by other none
* Linux processors.
*
* If the I2C controller is free, then the first read returns
* IN_USE == 0. After that the I2C controller is locked and further
* reads of IN_USE return 1.
*
* The I2C controller is unlocked by writing 1 into IN_USE.
*
* The IN_USE bit acts as a hardware semaphore for the I2C controller.
* Poll for semaphore, but sleep while polling to free the CPU.
*/
ret = readb_poll_timeout(ki2c->base + KI2C_STATUS_REG,
sts, (sts & KI2C_STATUS_IN_USE) == 0,
KI2C_INUSE_SLEEP_US, KI2C_INUSE_TIMEOUT_US);
if (ret)
dev_err(&ki2c->auxdev->auxdev.dev, "%s err!\n", __func__);
return ret;
}
static void ki2c_inuse_unlock(struct ki2c *ki2c)
{
/* unlock the controller by writing 1 into IN_USE */
iowrite8(KI2C_STATUS_IN_USE, ki2c->base + KI2C_STATUS_REG);
}
static int ki2c_wait_for_bit(void __iomem *addr, u8 mask, unsigned long timeout)
{
u8 val;
return readb_poll_timeout(addr, val, (val & mask), KI2C_POLL_DELAY_US,
jiffies_to_usecs(timeout));
}
static int ki2c_wait_for_mcf(struct ki2c *ki2c)
{
return ki2c_wait_for_bit(ki2c->base + KI2C_STATUS_REG, KI2C_STATUS_MCF,
ki2c->adapter.timeout);
}
static int ki2c_wait_for_data(struct ki2c *ki2c)
{
int ret;
ret = ki2c_wait_for_mcf(ki2c);
if (ret < 0)
return ret;
return ki2c_wait_for_bit(ki2c->base + KI2C_STATUS_REG,
KI2C_STATUS_ACK_CYC,
ki2c->adapter.timeout);
}
static int ki2c_wait_for_data_ack(struct ki2c *ki2c)
{
unsigned int reg;
int ret;
ret = ki2c_wait_for_data(ki2c);
if (ret < 0)
return ret;
/* RXAK == 0 means ACK reveived */
reg = ioread8(ki2c->base + KI2C_STATUS_REG);
if (reg & KI2C_STATUS_RXAK)
return -EIO;
return 0;
}
static int ki2c_has_capability(struct ki2c *ki2c, unsigned int cap)
{
unsigned int reg = ioread8(ki2c->base + KI2C_CAPABILITY_REG);
Annotation
- Immediate include surface: `linux/i2c.h`, `linux/io.h`, `linux/iopoll.h`, `linux/module.h`, `linux/misc/keba.h`.
- Detected declarations: `struct ki2c`, `function ki2c_inuse_lock`, `function ki2c_inuse_unlock`, `function ki2c_wait_for_bit`, `function ki2c_wait_for_mcf`, `function ki2c_wait_for_data`, `function ki2c_wait_for_data_ack`, `function ki2c_has_capability`, `function ki2c_get_scl`, `function ki2c_get_sda`.
- Atlas domain: Driver Families / drivers/i2c.
- Implementation status: source implementation candidate.
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.