I2C Bus(i2c-core.c)
i2c_device_probe(struct device *dev)i2c_device_remove(struct device *dev)i2c_device_shutdown(struct device *dev) static const struct dev_pm_ops i2c_device_pm_ops = {
.suspend = i2c_device_pm_suspend,
.resume = i2c_device_pm_resume,
.freeze = i2c_device_pm_freeze,
.thaw = i2c_device_pm_thaw,
.poweroff = i2c_device_pm_poweroff,
.restore = i2c_device_pm_restore,
SET_RUNTIME_PM_OPS(
pm_generic_runtime_suspend,
pm_generic_runtime_resume,
NULL
)
};
struct bus_type i2c_bus_type = {
.name = "i2c",
.match = i2c_device_match,
.probe = i2c_device_probe,
.remove = i2c_device_remove,
.shutdown = i2c_device_shutdown,
.pm = &i2c_device_pm_ops,
};
i2c_check_addr_validity(unsigned short addr)i2c_check_addr_busy(struct i2c_adapter *adapter, int addr) i2c_lock_adapter(struct i2c_adapter *adapter)i2c_trylock_adapter(struct i2c_adapter *adapter)i2c_unlock_adapter(struct i2c_adapter *adapter) i2c_dev_set_name(struct i2c_adapter *adap,struct i2c_client *client) i2c_new_device(struct i2c_adapter *adap, struct i2c_board_info const *info): instantiate an i2c device i2c_sysfs_delete_device and i2c_sysfs_new_device: there are "new_device" and "delete_device" node that we can use to create one new i2c_client or delete it.for example:echo "i2c_example 34" > new_devicethere will be "0-0022/" directory be createdecho "34" > delete_devicethe "0-0022/" directory will be removed of_i2c_register_devices(struct i2c_adapter *adap) of_find_i2c_device_by_node(struct device_node *node)of_find_i2c_adapter_by_node(struct device_node *node) i2c_register_adapter(struct i2c_adapter *adap) i2c_add_adapter(struct i2c_adapter *adapter):declare i2c adapter, use dynamic bus number i2c_add_numbered_adapter(struct i2c_adapter *adap):declare i2c adapter, use static bus number i2c_del_adapter(struct i2c_adapter *adap): unregister I2C adapter i2c_register_driver(struct module *owner, struct i2c_driver *driver): register one i2c_driver i2c_del_driver(struct i2c_driver *driver): unregister I2C driver.
i2c_use_client(struct i2c_client *client): increments the reference count of the i2c client structure
i2c_release_client(struct i2c_client *client):release a use of the i2c client structure
struct i2c_cmd_arg {
unsigned cmd;
void *arg;
};
i2c_cmd:
i2c_clients_command: send command to adapter's every client and do the responding i2c_driver's command interface.
i2c_init: register bus: i2c_bus_type
i2c_exit: unregister bus: i2c_bus_type
the functional interface to the i2c busses.
__i2c_transfer:unlocked flavor of i2c_transfer
i2c_transfer(struct i2c_adapter *adap, struct i2c_mst *msgs, int num):execute a single or combined I2C message
i2c_master_send(const struct i2c_client *client, char *buf, int count):issue a single I2C message in master transmit mode
i2c_master_recv(const struct i2c_client *client, char *buf, int count): issue a single I2C message in master receive mode, specially there is a flag I2C_M_RD.
i2c_adapter_id: return adapter's nr.
i2c_detect(struct i2c_adapter *adapter, struct i2c_driver *driver):
i2c_check_addr_busy(struct i2c_adapter *adapter, int addr): check if the addr have already been assigned to one client of adapter's client list.
i2c_check_addr_validity: as 0x0~0x7 and 0x78~0x7f is revered, so addr must not in those range.
i2c_new_probed_device(struct i2c_adapter *adap, struct i2c_board_info *info, unsigned short const *addr_list, int (*probe)(struct i2c_adapter *, unsigned short addr)): try select a valid addr from address list to add a new i2c_client.
i2c_get_adapter: give adapter's number to get the adapter and do moudle_get to increase its reference
i2c_put_adapter: decrease its reference
For new i2c driver added:
use platform bus to register the device and match the driver's probe.
in the probe:
i2c_add_numbered_adapter(adap); // but assign new i2c_algorithm with .master_xfer and .functionality be assigned
the i2c driver mainly implement the master_xfer and supply some PM functions