drivers/base/regmap/regmap-i2c.c
Source file repositories/reference/linux-study-clean/drivers/base/regmap/regmap-i2c.c
File Facts
- System
- Linux kernel
- Corpus path
drivers/base/regmap/regmap-i2c.c- Extension
.c- Size
- 11241 bytes
- Lines
- 451
- Domain
- Driver Families
- Bucket
- drivers/base
- Inferred role
- Driver Families: exported/initcall integration point
- Status
- integration 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.
- Exports symbols or registers init work; inspect boot/module ordering and who consumes the exported contract.
- Defines or uses C structs; map object ownership, embedded links, reference counts, and lock ownership.
Dependency Surface
linux/regmap.hlinux/i2c.hlinux/module.hinternal.h
Detected Declarations
function regmap_smbus_byte_reg_readfunction regmap_smbus_byte_reg_writefunction regmap_smbus_word_reg_readfunction regmap_smbus_word_reg_writefunction regmap_smbus_word_read_swappedfunction regmap_smbus_word_write_swappedfunction regmap_i2c_writefunction regmap_i2c_gather_writefunction regmap_i2c_readfunction regmap_i2c_smbus_i2c_writefunction regmap_i2c_smbus_i2c_readfunction regmap_i2c_smbus_i2c_write_reg16function regmap_i2c_smbus_i2c_read_reg16function read_byteexport __regmap_init_i2cexport __devm_regmap_init_i2c
Annotated Snippet
switch (regmap_get_val_endian(&i2c->dev, NULL, config)) {
case REGMAP_ENDIAN_LITTLE:
bus = ®map_smbus_word;
break;
case REGMAP_ENDIAN_BIG:
bus = ®map_smbus_word_swapped;
break;
default: /* everything else is not supported */
break;
}
else if (config->val_bits == 8 && config->reg_bits == 8 &&
i2c_check_functionality(i2c->adapter,
I2C_FUNC_SMBUS_BYTE_DATA))
bus = ®map_smbus_byte;
if (!bus)
return ERR_PTR(-ENOTSUPP);
quirks = i2c->adapter->quirks;
if (quirks) {
if (quirks->max_read_len &&
(bus->max_raw_read == 0 || bus->max_raw_read > quirks->max_read_len))
max_read = quirks->max_read_len;
if (quirks->max_write_len &&
(bus->max_raw_write == 0 || bus->max_raw_write > quirks->max_write_len))
max_write = quirks->max_write_len -
(config->reg_bits + config->pad_bits) / BITS_PER_BYTE;
if (max_read || max_write) {
ret_bus = kmemdup(bus, sizeof(*bus), GFP_KERNEL);
if (!ret_bus)
return ERR_PTR(-ENOMEM);
ret_bus->free_on_exit = true;
ret_bus->max_raw_read = max_read;
ret_bus->max_raw_write = max_write;
bus = ret_bus;
}
}
return bus;
}
struct regmap *__regmap_init_i2c(struct i2c_client *i2c,
const struct regmap_config *config,
struct lock_class_key *lock_key,
const char *lock_name)
{
const struct regmap_bus *bus = regmap_get_i2c_bus(i2c, config);
if (IS_ERR(bus))
return ERR_CAST(bus);
return __regmap_init(&i2c->dev, bus, &i2c->dev, config,
lock_key, lock_name);
}
EXPORT_SYMBOL_GPL(__regmap_init_i2c);
struct regmap *__devm_regmap_init_i2c(struct i2c_client *i2c,
const struct regmap_config *config,
struct lock_class_key *lock_key,
const char *lock_name)
{
const struct regmap_bus *bus = regmap_get_i2c_bus(i2c, config);
if (IS_ERR(bus))
return ERR_CAST(bus);
return __devm_regmap_init(&i2c->dev, bus, &i2c->dev, config,
lock_key, lock_name);
}
EXPORT_SYMBOL_GPL(__devm_regmap_init_i2c);
MODULE_DESCRIPTION("Register map access API - I2C support");
MODULE_LICENSE("GPL");
Annotation
- Immediate include surface: `linux/regmap.h`, `linux/i2c.h`, `linux/module.h`, `internal.h`.
- Detected declarations: `function regmap_smbus_byte_reg_read`, `function regmap_smbus_byte_reg_write`, `function regmap_smbus_word_reg_read`, `function regmap_smbus_word_reg_write`, `function regmap_smbus_word_read_swapped`, `function regmap_smbus_word_write_swapped`, `function regmap_i2c_write`, `function regmap_i2c_gather_write`, `function regmap_i2c_read`, `function regmap_i2c_smbus_i2c_write`.
- Atlas domain: Driver Families / drivers/base.
- Implementation status: integration 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.