// SPDX-License-Identifier: GPL-2.0-or-later /* * Linux I2C core * * Copyright (C) 1995-99 Simon G. Vogl * With some changes from Kyösti Mälkki <kmalkki@cc.hut.fi> * Mux support by Rodolfo Giometti <giometti@enneenne.com> and * Michael Lawnick <michael.lawnick.ext@nsn.com> * * Copyright (C) 2013-2017 Wolfram Sang <wsa@kernel.org>
*/
staticvoid set_sda_gpio_value(struct i2c_adapter *adap, int val)
{
gpiod_set_value_cansleep(adap->bus_recovery_info->sda_gpiod, val);
}
staticint i2c_generic_bus_free(struct i2c_adapter *adap)
{ struct i2c_bus_recovery_info *bri = adap->bus_recovery_info; int ret = -EOPNOTSUPP;
if (bri->get_bus_free)
ret = bri->get_bus_free(adap); elseif (bri->get_sda)
ret = bri->get_sda(adap);
if (ret < 0) return ret;
return ret ? 0 : -EBUSY;
}
/* * We are generating clock pulses. ndelay() determines durating of clk pulses. * We will generate clock with rate 100 KHz and so duration of both clock levels * is: delay in ns = (10^6 / 100) / 2
*/ #define RECOVERY_NDELAY 5000 #define RECOVERY_CLK_CNT 9
int i2c_generic_scl_recovery(struct i2c_adapter *adap)
{ struct i2c_bus_recovery_info *bri = adap->bus_recovery_info; int i = 0, scl = 1, ret = 0;
if (bri->prepare_recovery)
bri->prepare_recovery(adap); if (bri->pinctrl)
pinctrl_select_state(bri->pinctrl, bri->pins_gpio);
/* * If we can set SDA, we will always create a STOP to ensure additional * pulses will do no harm. This is achieved by letting SDA follow SCL * half a cycle later. Check the 'incomplete_write_byte' fault injector * for details. Note that we must honour tsu:sto, 4us, but lets use 5us * here for simplicity.
*/
bri->set_scl(adap, scl);
ndelay(RECOVERY_NDELAY); if (bri->set_sda)
bri->set_sda(adap, scl);
ndelay(RECOVERY_NDELAY / 2);
/* * By this time SCL is high, as we need to give 9 falling-rising edges
*/ while (i++ < RECOVERY_CLK_CNT * 2) { if (scl) { /* SCL shouldn't be low here */ if (!bri->get_scl(adap)) {
dev_err(&adap->dev, "SCL is stuck low, exit recovery\n");
ret = -EBUSY; break;
}
}
/* * we can't change states without pinctrl, so remove the states if * populated
*/ if (!p) {
bri->pins_default = NULL;
bri->pins_gpio = NULL; return;
}
if (!bri->pins_default) {
bri->pins_default = pinctrl_lookup_state(p,
PINCTRL_STATE_DEFAULT); if (IS_ERR(bri->pins_default)) {
dev_dbg(dev, PINCTRL_STATE_DEFAULT " state not found for GPIO recovery\n");
bri->pins_default = NULL;
}
} if (!bri->pins_gpio) {
bri->pins_gpio = pinctrl_lookup_state(p, "gpio"); if (IS_ERR(bri->pins_gpio))
bri->pins_gpio = pinctrl_lookup_state(p, "recovery");
if (IS_ERR(bri->pins_gpio)) {
dev_dbg(dev, "no gpio or recovery state found for GPIO recovery\n");
bri->pins_gpio = NULL;
}
}
/* for pinctrl state changes, we need all the information */ if (bri->pins_default && bri->pins_gpio) {
dev_info(dev, "using pinctrl states for GPIO recovery");
} else {
bri->pinctrl = NULL;
bri->pins_default = NULL;
bri->pins_gpio = NULL;
}
}
/* * don't touch the recovery information if the driver is not using * generic SCL recovery
*/ if (bri->recover_bus && bri->recover_bus != i2c_generic_scl_recovery) return 0;
/* * pins might be taken as GPIO, so we should inform pinctrl about * this and move the state to GPIO
*/ if (bri->pinctrl)
pinctrl_select_state(bri->pinctrl, bri->pins_gpio);
/* * if there is incomplete or no recovery information, see if generic * GPIO recovery is available
*/ if (!bri->scl_gpiod) {
gpiod = devm_gpiod_get(dev, "scl", GPIOD_OUT_HIGH_OPEN_DRAIN); if (PTR_ERR(gpiod) == -EPROBE_DEFER) {
ret = -EPROBE_DEFER; goto cleanup_pinctrl_state;
} if (!IS_ERR(gpiod)) {
bri->scl_gpiod = gpiod;
bri->recover_bus = i2c_generic_scl_recovery;
dev_info(dev, "using generic GPIOs for recovery\n");
}
}
/* SDA GPIOD line is optional, so we care about DEFER only */ if (!bri->sda_gpiod) { /* * We have SCL. Pull SCL low and wait a bit so that SDA glitches * have no effect.
*/
gpiod_direction_output(bri->scl_gpiod, 0);
udelay(10);
gpiod = devm_gpiod_get(dev, "sda", GPIOD_IN);
/* Wait a bit in case of a SDA glitch, and then release SCL. */
udelay(10);
gpiod_direction_output(bri->scl_gpiod, 1);
if (PTR_ERR(gpiod) == -EPROBE_DEFER) {
ret = -EPROBE_DEFER; goto cleanup_pinctrl_state;
} if (!IS_ERR(gpiod))
bri->sda_gpiod = gpiod;
}
cleanup_pinctrl_state: /* change the state of the pins back to their default state */ if (bri->pinctrl)
pinctrl_select_state(bri->pinctrl, bri->pins_default);
if (client->flags & I2C_CLIENT_HOST_NOTIFY) {
dev_dbg(dev, "Using Host Notify IRQ\n"); /* Keep adapter active when Host Notify is required */
pm_runtime_get_sync(&client->adapter->dev);
irq = i2c_smbus_host_notify_to_irq(client);
} elseif (is_of_node(fwnode)) {
irq = fwnode_irq_get_byname(fwnode, "irq"); if (irq == -EINVAL || irq == -ENODATA)
irq = fwnode_irq_get(fwnode, 0);
} elseif (is_acpi_device_node(fwnode)) { bool wake_capable;
irq = i2c_acpi_get_irq(client, &wake_capable); if (irq > 0 && wake_capable)
client->flags |= I2C_CLIENT_WAKE;
} if (irq == -EPROBE_DEFER) {
status = dev_err_probe(dev, irq, "can't get irq\n"); goto put_sync_adapter;
}
if (irq < 0)
irq = 0;
client->irq = irq;
}
driver = to_i2c_driver(dev->driver);
/* * An I2C ID table is not mandatory, if and only if, a suitable OF * or ACPI ID table is supplied for the probing device.
*/ if (!driver->id_table &&
!acpi_driver_match_device(dev, dev->driver) &&
!i2c_of_match_device(dev->driver->of_match_table, client)) {
status = -ENODEV; goto put_sync_adapter;
}
if (client->flags & I2C_CLIENT_WAKE) { int wakeirq;
wakeirq = fwnode_irq_get_byname(fwnode, "wakeup"); if (wakeirq == -EPROBE_DEFER) {
status = dev_err_probe(dev, wakeirq, "can't get wakeirq\n"); goto put_sync_adapter;
}
device_init_wakeup(&client->dev, true);
if (wakeirq > 0 && wakeirq != client->irq)
status = dev_pm_set_dedicated_wake_irq(dev, wakeirq); elseif (client->irq > 0)
status = dev_pm_set_wake_irq(dev, client->irq); else
status = 0;
if (status)
dev_warn(&client->dev, "failed to set up wakeup irq\n");
}
dev_dbg(dev, "probe\n");
status = of_clk_set_defaults(to_of_node(fwnode), false); if (status < 0) goto err_clear_wakeup_irq;
do_power_on = !i2c_acpi_waive_d0_probe(dev);
status = dev_pm_domain_attach(&client->dev, do_power_on ? PD_FLAG_ATTACH_POWER_ON : 0); if (status) goto err_clear_wakeup_irq;
client->devres_group_id = devres_open_group(&client->dev, NULL,
GFP_KERNEL); if (!client->devres_group_id) {
status = -ENOMEM; goto err_detach_pm_domain;
}
if (driver->probe)
status = driver->probe(client); else
status = -EINVAL;
/* * Note that we are not closing the devres group opened above so * even resources that were attached to the device after probe is * run are released when i2c_device_remove() is executed. This is * needed as some drivers would allocate additional resources, * for example when updating firmware.
*/
/** * i2c_verify_client - return parameter as i2c_client, or NULL * @dev: device, probably from some driver model iterator * * When traversing the driver model tree, perhaps using driver model * iterators like @device_for_each_child(), you can't assume very much * about the nodes you find. Use this function to avoid oopses caused * by wrongly treating some non-I2C device as an i2c_client.
*/ struct i2c_client *i2c_verify_client(struct device *dev)
{ return (dev->type == &i2c_client_type)
? to_i2c_client(dev)
: NULL;
}
EXPORT_SYMBOL(i2c_verify_client);
/* Return a unique address which takes the flags of the client into account */ staticunsignedshort i2c_encode_flags_to_addr(struct i2c_client *client)
{ unsignedshort addr = client->addr;
/* For some client flags, add an arbitrary offset to avoid collisions */ if (client->flags & I2C_CLIENT_TEN)
addr |= I2C_ADDR_OFFSET_TEN_BIT;
if (client->flags & I2C_CLIENT_SLAVE)
addr |= I2C_ADDR_OFFSET_SLAVE;
return addr;
}
/* This is a permissive address validity check, I2C address map constraints
* are purposely not enforced, except for the general call address. */ staticint i2c_check_addr_validity(unsignedint addr, unsignedshort flags)
{ if (flags & I2C_CLIENT_TEN) { /* 10-bit address, all values are valid */ if (addr > 0x3ff) return -EINVAL;
} else { /* 7-bit address, reject the general call address */ if (addr == 0x00 || addr > 0x7f) return -EINVAL;
} return 0;
}
/* And this is a strict address validity check, used when probing. If a * device uses a reserved address, then it shouldn't be probed. 7-bit * addressing is assumed, 10-bit address devices are rare and should be
* explicitly enumerated. */ int i2c_check_7bit_addr_validity_strict(unsignedshort addr)
{ /* * Reserved addresses per I2C specification: * 0x00 General call address / START byte * 0x01 CBUS address * 0x02 Reserved for different bus format * 0x03 Reserved for future purposes * 0x04-0x07 Hs-mode master code * 0x78-0x7b 10-bit slave addressing * 0x7c-0x7f Reserved for future purposes
*/ if (addr < 0x08 || addr > 0x77) return -EINVAL; return 0;
}
/* walk up mux tree */ staticint i2c_check_mux_parents(struct i2c_adapter *adapter, int addr)
{ struct i2c_adapter *parent = i2c_parent_is_i2c_adapter(adapter); int result;
result = device_for_each_child(&adapter->dev, &addr,
__i2c_check_addr_busy);
if (!result && parent)
result = i2c_check_mux_parents(parent, addr);
return result;
}
/* recurse down mux tree */ staticint i2c_check_mux_children(struct device *dev, void *addrp)
{ int result;
if (dev->type == &i2c_adapter_type)
result = device_for_each_child(dev, addrp,
i2c_check_mux_children); else
result = __i2c_check_addr_busy(dev, addrp);
return result;
}
staticint i2c_check_addr_busy(struct i2c_adapter *adapter, int addr)
{ struct i2c_adapter *parent = i2c_parent_is_i2c_adapter(adapter); int result = 0;
if (parent)
result = i2c_check_mux_parents(parent, addr);
if (!result)
result = device_for_each_child(&adapter->dev, &addr,
i2c_check_mux_children);
return result;
}
/** * i2c_adapter_lock_bus - Get exclusive access to an I2C bus segment * @adapter: Target I2C bus segment * @flags: I2C_LOCK_ROOT_ADAPTER locks the root i2c adapter, I2C_LOCK_SEGMENT * locks only this branch in the adapter tree
*/ staticvoid i2c_adapter_lock_bus(struct i2c_adapter *adapter, unsignedint flags)
{
rt_mutex_lock_nested(&adapter->bus_lock, i2c_adapter_depth(adapter));
}
/** * i2c_adapter_trylock_bus - Try to get exclusive access to an I2C bus segment * @adapter: Target I2C bus segment * @flags: I2C_LOCK_ROOT_ADAPTER trylocks the root i2c adapter, I2C_LOCK_SEGMENT * trylocks only this branch in the adapter tree
*/ staticint i2c_adapter_trylock_bus(struct i2c_adapter *adapter, unsignedint flags)
{ return rt_mutex_trylock(&adapter->bus_lock);
}
/** * i2c_adapter_unlock_bus - Release exclusive access to an I2C bus segment * @adapter: Target I2C bus segment * @flags: I2C_LOCK_ROOT_ADAPTER unlocks the root i2c adapter, I2C_LOCK_SEGMENT * unlocks only this branch in the adapter tree
*/ staticvoid i2c_adapter_unlock_bus(struct i2c_adapter *adapter, unsignedint flags)
{
rt_mutex_unlock(&adapter->bus_lock);
}
/* * Serialize device instantiation in case it can be instantiated explicitly * and by auto-detection
*/ staticint i2c_lock_addr(struct i2c_adapter *adap, unsignedshort addr, unsignedshort flags)
{ if (!(flags & I2C_CLIENT_TEN) &&
test_and_set_bit(addr, adap->addrs_in_instantiation)) return -EBUSY;
/** * i2c_new_client_device - instantiate an i2c device * @adap: the adapter managing the device * @info: describes one I2C device; bus_num is ignored * Context: can sleep * * Create an i2c device. Binding is handled through driver model * probe()/remove() methods. A driver may be bound to this device when we * return from this function, or any later moment (e.g. maybe hotplugging will * load the driver module). This call is not appropriate for use by mainboard * initialization logic, which usually runs during an arch_initcall() long * before any i2c_adapter could exist. * * This returns the new i2c client, which may be saved for later use with * i2c_unregister_device(); or an ERR_PTR to describe the error.
*/ struct i2c_client *
i2c_new_client_device(struct i2c_adapter *adap, struct i2c_board_info const *info)
{ struct fwnode_handle *fwnode = info->fwnode; struct i2c_client *client; bool need_put = false; int status;
client = kzalloc(sizeof *client, GFP_KERNEL); if (!client) return ERR_PTR(-ENOMEM);
/** * i2c_unregister_device - reverse effect of i2c_new_*_device() * @client: value returned from i2c_new_*_device() * Context: can sleep
*/ void i2c_unregister_device(struct i2c_client *client)
{ struct fwnode_handle *fwnode;
if (IS_ERR_OR_NULL(client)) return;
fwnode = dev_fwnode(&client->dev); if (is_of_node(fwnode))
of_node_clear_flag(to_of_node(fwnode), OF_POPULATED); elseif (is_acpi_device_node(fwnode))
acpi_device_clear_enumerated(to_acpi_device_node(fwnode));
/* * If the primary fwnode is a software node it is free-ed by * device_remove_software_node() below, avoid double-free.
*/ if (!is_software_node(fwnode))
fwnode_handle_put(fwnode);
/** * i2c_find_device_by_fwnode() - find an i2c_client for the fwnode * @fwnode: &struct fwnode_handle corresponding to the &struct i2c_client * * Look up and return the &struct i2c_client corresponding to the @fwnode. * If no client can be found, or @fwnode is NULL, this returns NULL. * * The user must call put_device(&client->dev) once done with the i2c client.
*/ struct i2c_client *i2c_find_device_by_fwnode(struct fwnode_handle *fwnode)
{ struct i2c_client *client; struct device *dev;
if (!fwnode) return NULL;
dev = bus_find_device_by_fwnode(&i2c_bus_type, fwnode); if (!dev) return NULL;
client = i2c_verify_client(dev); if (!client)
put_device(dev);
/** * i2c_new_dummy_device - return a new i2c device bound to a dummy driver * @adapter: the adapter managing the device * @address: seven bit address to be used * Context: can sleep * * This returns an I2C client bound to the "dummy" driver, intended for use * with devices that consume multiple addresses. Examples of such chips * include various EEPROMS (like 24c04 and 24c08 models). * * These dummy devices have two main uses. First, most I2C and SMBus calls * except i2c_transfer() need a client handle; the dummy will be that handle. * And second, this prevents the specified address from being bound to a * different driver. * * This returns the new i2c client, which should be saved for later use with * i2c_unregister_device(); or an ERR_PTR to describe the error.
*/ struct i2c_client *i2c_new_dummy_device(struct i2c_adapter *adapter, u16 address)
{ struct i2c_board_info info = {
I2C_BOARD_INFO("dummy", address),
};
/** * devm_i2c_new_dummy_device - return a new i2c device bound to a dummy driver * @dev: device the managed resource is bound to * @adapter: the adapter managing the device * @address: seven bit address to be used * Context: can sleep * * This is the device-managed version of @i2c_new_dummy_device. It returns the * new i2c client or an ERR_PTR in case of an error.
*/ struct i2c_client *devm_i2c_new_dummy_device(struct device *dev, struct i2c_adapter *adapter,
u16 address)
{ struct i2c_client *client; int ret;
client = i2c_new_dummy_device(adapter, address); if (IS_ERR(client)) return client;
ret = devm_add_action_or_reset(dev, devm_i2c_release_dummy, client); if (ret) return ERR_PTR(ret);
/** * i2c_new_ancillary_device - Helper to get the instantiated secondary address * and create the associated device * @client: Handle to the primary client * @name: Handle to specify which secondary address to get * @default_addr: Used as a fallback if no secondary address was specified * Context: can sleep * * I2C clients can be composed of multiple I2C slaves bound together in a single * component. The I2C client driver then binds to the master I2C slave and needs * to create I2C dummy clients to communicate with all the other slaves. * * This function creates and returns an I2C dummy client whose I2C address is * retrieved from the platform firmware based on the given slave name. If no * address is specified by the firmware default_addr is used. * * On DT-based platforms the address is retrieved from the "reg" property entry * cell whose "reg-names" value matches the slave name. * * This returns the new i2c client, which should be saved for later use with * i2c_unregister_device(); or an ERR_PTR to describe the error.
*/ struct i2c_client *i2c_new_ancillary_device(struct i2c_client *client, constchar *name,
u16 default_addr)
{ struct device_node *np = client->dev.of_node;
u32 addr = default_addr; int i;
i = of_property_match_string(np, "reg-names", name); if (i >= 0)
of_property_read_u32_index(np, "reg", i, &addr);
/* * Let users instantiate I2C devices through sysfs. This can be used when * platform initialization code doesn't contain the proper data for * whatever reason. Also useful for drivers that do device detection and * detection fails, either because the device uses an unexpected address, * or this is a compatible device with different ID register values. * * Parameter checking may look overzealous, but we really don't want * the user to provide incorrect parameters.
*/ static ssize_t
new_device_store(struct device *dev, struct device_attribute *attr, constchar *buf, size_t count)
{ struct i2c_adapter *adap = to_i2c_adapter(dev); struct i2c_board_info info; struct i2c_client *client; char *blank, end; int res;
/* * And of course let the users delete the devices they instantiated, if * they got it wrong. This interface can only be used to delete devices * instantiated by i2c_sysfs_new_device above. This guarantees that we * don't delete devices to which some kernel code still has references. * * Parameter checking may look overzealous, but we really don't want * the user to delete the wrong device.
*/ static ssize_t
delete_device_store(struct device *dev, struct device_attribute *attr, constchar *buf, size_t count)
{ struct i2c_adapter *adap = to_i2c_adapter(dev); struct i2c_client *client, *next; unsignedshort addr; char end; int res;
/* Parse parameters, reject extra parameters */
res = sscanf(buf, "%hi%c", &addr, &end); if (res < 1) {
dev_err(dev, "%s: Can't parse I2C address\n", "delete_device"); return -EINVAL;
} if (res > 1 && end != '\n') {
dev_err(dev, "%s: Extra parameters\n", "delete_device"); return -EINVAL;
}
/* Make sure the device was added through sysfs */
res = -ENOENT;
mutex_lock_nested(&adap->userspace_clients_lock,
i2c_adapter_depth(adap));
list_for_each_entry_safe(client, next, &adap->userspace_clients,
detected) { if (i2c_encode_flags_to_addr(client) == addr) {
dev_info(dev, "%s: Deleting device %s at 0x%02hx\n", "delete_device", client->name, client->addr);
list_del(&client->detected);
i2c_unregister_device(client);
res = count; break;
}
}
mutex_unlock(&adap->userspace_clients_lock);
if (res < 0)
dev_err(dev, "%s: Can't find device in list\n", "delete_device"); return res;
} static DEVICE_ATTR_IGNORE_LOCKDEP(delete_device, S_IWUSR, NULL,
delete_device_store);
/** * i2c_verify_adapter - return parameter as i2c_adapter or NULL * @dev: device, probably from some driver model iterator * * When traversing the driver model tree, perhaps using driver model * iterators like @device_for_each_child(), you can't assume very much * about the nodes you find. Use this function to avoid oopses caused * by wrongly treating some non-I2C device as an i2c_adapter.
*/ struct i2c_adapter *i2c_verify_adapter(struct device *dev)
{ return (dev->type == &i2c_adapter_type)
? to_i2c_adapter(dev)
: NULL;
}
EXPORT_SYMBOL(i2c_verify_adapter);
if (!i2c_check_functionality(adap, I2C_FUNC_SMBUS_HOST_NOTIFY)) return 0;
domain = irq_domain_create_linear(adap->dev.parent->fwnode,
I2C_ADDR_7BITS_COUNT,
&i2c_host_notify_irq_ops, adap); if (!domain) return -ENOMEM;
adap->host_notify_domain = domain;
return 0;
}
/** * i2c_handle_smbus_host_notify - Forward a Host Notify event to the correct * I2C client. * @adap: the adapter * @addr: the I2C address of the notifying device * Context: can't sleep * * Helper function to be called from an I2C bus driver's interrupt * handler. It will schedule the Host Notify IRQ.
*/ int i2c_handle_smbus_host_notify(struct i2c_adapter *adap, unsignedshort addr)
{ int irq;
if (!adap) return -EINVAL;
dev_dbg(&adap->dev, "Detected HostNotify from address 0x%02x", addr);
irq = irq_find_mapping(adap->host_notify_domain, addr); if (irq <= 0) return -ENXIO;
/* * This adapter can be used as a parent immediately after device_add(), * setup runtime-pm (especially ignore-children) before hand.
*/
device_enable_async_suspend(&adap->dev);
pm_runtime_no_callbacks(&adap->dev);
pm_suspend_ignore_children(&adap->dev, true);
pm_runtime_enable(&adap->dev);
res = device_add(&adap->dev); if (res) {
pr_err("adapter '%s': can't register device (%d)\n", adap->name, res);
put_device(&adap->dev); goto out_list;
}
/** * __i2c_add_numbered_adapter - i2c_add_numbered_adapter where nr is never -1 * @adap: the adapter to register (with adap->nr initialized) * Context: can sleep * * See i2c_add_numbered_adapter() for details.
*/ staticint __i2c_add_numbered_adapter(struct i2c_adapter *adap)
{ int id;
mutex_lock(&core_lock);
id = idr_alloc(&i2c_adapter_idr, adap, adap->nr, adap->nr + 1, GFP_KERNEL);
mutex_unlock(&core_lock); if (WARN(id < 0, "couldn't get idr")) return id == -ENOSPC ? -EBUSY : id;
return i2c_register_adapter(adap);
}
/** * i2c_add_adapter - declare i2c adapter, use dynamic bus number * @adapter: the adapter to add * Context: can sleep * * This routine is used to declare an I2C adapter when its bus number * doesn't matter or when its bus number is specified by an dt alias. * Examples of bases when the bus number doesn't matter: I2C adapters * dynamically added by USB links or PCI plugin cards. * * When this returns zero, a new bus number was allocated and stored * in adap->nr, and the specified adapter became available for clients. * Otherwise, a negative errno value is returned.
*/ int i2c_add_adapter(struct i2c_adapter *adapter)
{ struct device *dev = &adapter->dev; int id;
id = of_alias_get_id(dev->of_node, "i2c"); if (id >= 0) {
adapter->nr = id; return __i2c_add_numbered_adapter(adapter);
}
mutex_lock(&core_lock);
id = idr_alloc(&i2c_adapter_idr, adapter,
__i2c_first_dynamic_bus_num, 0, GFP_KERNEL);
mutex_unlock(&core_lock); if (WARN(id < 0, "couldn't get idr")) return id;
/** * i2c_add_numbered_adapter - declare i2c adapter, use static bus number * @adap: the adapter to register (with adap->nr initialized) * Context: can sleep * * This routine is used to declare an I2C adapter when its bus number * matters. For example, use it for I2C adapters from system-on-chip CPUs, * or otherwise built in to the system's mainboard, and where i2c_board_info * is used to properly configure I2C devices. * * If the requested bus number is set to -1, then this function will behave * identically to i2c_add_adapter, and will dynamically assign a bus number. * * If no devices have pre-been declared for this bus, then be sure to * register the adapter before any dynamically allocated ones. Otherwise * the required bus ID may not be available. * * When this returns zero, the specified adapter became available for * clients using the bus number provided in adap->nr. Also, the table * of I2C devices pre-declared using i2c_register_board_info() is scanned, * and the appropriate driver model device nodes are created. Otherwise, a * negative errno value is returned.
*/ int i2c_add_numbered_adapter(struct i2c_adapter *adap)
{ if (adap->nr == -1) /* -1 means dynamically assign bus id */ return i2c_add_adapter(adap);
/* Remove the devices we created ourselves as the result of hardware
* probing (using a driver's detect method) */
list_for_each_entry_safe(client, _n, &driver->clients, detected) { if (client->adapter == adapter) {
dev_dbg(&adapter->dev, "Removing %s at 0x%x\n",
client->name, client->addr);
list_del(&client->detected);
i2c_unregister_device(client);
}
}
}
/** * i2c_del_adapter - unregister I2C adapter * @adap: the adapter being unregistered * Context: can sleep * * This unregisters an I2C adapter which was previously registered * by @i2c_add_adapter or @i2c_add_numbered_adapter.
*/ void i2c_del_adapter(struct i2c_adapter *adap)
{ struct i2c_adapter *found; struct i2c_client *client, *next;
/* First make sure that this adapter was ever added */
mutex_lock(&core_lock);
found = idr_find(&i2c_adapter_idr, adap->nr);
mutex_unlock(&core_lock); if (found != adap) {
pr_debug("attempting to delete unregistered adapter [%s]\n", adap->name); return;
}
i2c_acpi_remove_space_handler(adap); /* Tell drivers about this removal */
mutex_lock(&core_lock);
bus_for_each_drv(&i2c_bus_type, NULL, adap,
__process_removed_adapter);
mutex_unlock(&core_lock);
/* Detach any active clients. This can't fail, thus we do not * check the returned value. This is a two-pass process, because * we can't remove the dummy devices during the first pass: they * could have been instantiated by real devices wishing to clean
* them up properly, so we give them a chance to do that first. */
device_for_each_child(&adap->dev, NULL, __unregister_client);
device_for_each_child(&adap->dev, NULL, __unregister_dummy);
/* device name is gone after device_unregister */
dev_dbg(&adap->dev, "adapter [%s] unregistered\n", adap->name);
pm_runtime_disable(&adap->dev);
i2c_host_notify_irq_teardown(adap);
debugfs_remove_recursive(adap->debugfs);
/* wait until all references to the device are gone * * FIXME: This is old code and should ideally be replaced by an * alternative which results in decoupling the lifetime of the struct * device from the i2c_adapter, like spi or netdev do. Any solution * should be thoroughly tested with DEBUG_KOBJECT_RELEASE enabled!
*/
init_completion(&adap->dev_released);
device_unregister(&adap->dev);
wait_for_completion(&adap->dev_released);
/* free bus id */
mutex_lock(&core_lock);
idr_remove(&i2c_adapter_idr, adap->nr);
mutex_unlock(&core_lock);
/* Clear the device structure in case this adapter is ever going to be
added again */
memset(&adap->dev, 0, sizeof(adap->dev));
}
EXPORT_SYMBOL(i2c_del_adapter);
/** * devm_i2c_add_adapter - device-managed variant of i2c_add_adapter() * @dev: managing device for adding this I2C adapter * @adapter: the adapter to add * Context: can sleep * * Add adapter with dynamic bus number, same with i2c_add_adapter() * but the adapter will be auto deleted on driver detach.
*/ int devm_i2c_add_adapter(struct device *dev, struct i2c_adapter *adapter)
{ int ret;
ret = i2c_add_adapter(adapter); if (ret) return ret;
if (dev->parent && dev_fwnode(dev->parent) == data) return 1;
return 0;
}
/** * i2c_find_adapter_by_fwnode() - find an i2c_adapter for the fwnode * @fwnode: &struct fwnode_handle corresponding to the &struct i2c_adapter * * Look up and return the &struct i2c_adapter corresponding to the @fwnode. * If no adapter can be found, or @fwnode is NULL, this returns NULL. * * The user must call put_device(&adapter->dev) once done with the i2c adapter.
*/ struct i2c_adapter *i2c_find_adapter_by_fwnode(struct fwnode_handle *fwnode)
{ struct i2c_adapter *adapter; struct device *dev;
if (!fwnode) return NULL;
dev = bus_find_device(&i2c_bus_type, NULL, fwnode,
i2c_dev_or_parent_fwnode_match); if (!dev) return NULL;
adapter = i2c_verify_adapter(dev); if (!adapter)
put_device(dev);
/** * i2c_get_adapter_by_fwnode() - find an i2c_adapter for the fwnode * @fwnode: &struct fwnode_handle corresponding to the &struct i2c_adapter * * Look up and return the &struct i2c_adapter corresponding to the @fwnode, * and increment the adapter module's use count. If no adapter can be found, * or @fwnode is NULL, this returns NULL. * * The user must call i2c_put_adapter(adapter) once done with the i2c adapter. * Note that this is different from i2c_find_adapter_by_node().
*/ struct i2c_adapter *i2c_get_adapter_by_fwnode(struct fwnode_handle *fwnode)
{ struct i2c_adapter *adapter;
adapter = i2c_find_adapter_by_fwnode(fwnode); if (!adapter) return NULL;
if (!try_module_get(adapter->owner)) {
put_device(&adapter->dev);
adapter = NULL;
}
/** * i2c_parse_fw_timings - get I2C related timing parameters from firmware * @dev: The device to scan for I2C timing properties * @t: the i2c_timings struct to be filled with values * @use_defaults: bool to use sane defaults derived from the I2C specification * when properties are not found, otherwise don't update * * Scan the device for the generic I2C properties describing timing parameters * for the signal and fill the given struct with the results. If a property was * not found and use_defaults was true, then maximum timings are assumed which * are derived from the I2C specification. If use_defaults is not used, the * results will be as before, so drivers can apply their own defaults before * calling this helper. The latter is mainly intended for avoiding regressions * of existing drivers which want to switch to this function. New drivers * almost always should use the defaults.
*/ void i2c_parse_fw_timings(struct device *dev, struct i2c_timings *t, bool use_defaults)
{ bool u = use_defaults;
u32 d;
/* * An i2c_driver is used with one or more i2c_client (device) nodes to access * i2c slave chips, on a bus instance associated with some i2c_adapter.
*/
int i2c_register_driver(struct module *owner, struct i2c_driver *driver)
{ int res;
/* Can't register until after driver model init */ if (WARN_ON(!is_registered)) return -EAGAIN;
/* add the driver to the list of i2c drivers in the driver core */
driver->driver.owner = owner;
driver->driver.bus = &i2c_bus_type;
INIT_LIST_HEAD(&driver->clients);
/* When registration returns, the driver core * will have called probe() for all matching-but-unbound devices.
*/
res = driver_register(&driver->driver); if (res) return res;
retval = i2c_add_driver(&dummy_driver); if (retval) goto class_err;
if (IS_ENABLED(CONFIG_OF_DYNAMIC))
WARN_ON(of_reconfig_notifier_register(&i2c_of_notifier)); if (IS_ENABLED(CONFIG_ACPI))
WARN_ON(acpi_reconfig_notifier_register(&i2c_acpi_notifier));
staticvoid __exit i2c_exit(void)
{ if (IS_ENABLED(CONFIG_ACPI))
WARN_ON(acpi_reconfig_notifier_unregister(&i2c_acpi_notifier)); if (IS_ENABLED(CONFIG_OF_DYNAMIC))
WARN_ON(of_reconfig_notifier_unregister(&i2c_of_notifier));
i2c_del_driver(&dummy_driver);
debugfs_remove_recursive(i2c_debugfs_root);
bus_unregister(&i2c_bus_type);
tracepoint_synchronize_unregister();
}
/* We must initialize early, because some subsystems register i2c drivers * in subsys_initcall() code, but are linked (and initialized) before i2c.
*/
postcore_initcall(i2c_init);
module_exit(i2c_exit);
/* ---------------------------------------------------- * the functional interface to the i2c busses. * ----------------------------------------------------
*/
/* Check if val is exceeding the quirk IFF quirk is non 0 */ #define i2c_quirk_exceeded(val, quirk) ((quirk) && ((val) > (quirk)))
/* special checks for combined messages */ if (num == 2) { if (q->flags & I2C_AQ_COMB_WRITE_FIRST && msgs[0].flags & I2C_M_RD) return i2c_quirk_error(adap, &msgs[0], "1st comb msg must be write");
if (q->flags & I2C_AQ_COMB_READ_SECOND && !(msgs[1].flags & I2C_M_RD)) return i2c_quirk_error(adap, &msgs[1], "2nd comb msg must be read");
if (q->flags & I2C_AQ_COMB_SAME_ADDR && msgs[0].addr != msgs[1].addr) return i2c_quirk_error(adap, &msgs[0], "comb msg only to same addr");
if (i2c_quirk_exceeded(msgs[0].len, q->max_comb_1st_msg_len)) return i2c_quirk_error(adap, &msgs[0], "msg too long");
if (i2c_quirk_exceeded(msgs[1].len, q->max_comb_2nd_msg_len)) return i2c_quirk_error(adap, &msgs[1], "msg too long");
do_len_check = false;
}
}
if (i2c_quirk_exceeded(num, max_num)) return i2c_quirk_error(adap, &msgs[0], "too many messages");
for (i = 0; i < num; i++) {
u16 len = msgs[i].len;
if (msgs[i].flags & I2C_M_RD) { if (do_len_check && i2c_quirk_exceeded(len, q->max_read_len)) return i2c_quirk_error(adap, &msgs[i], "msg too long");
if (q->flags & I2C_AQ_NO_ZERO_LEN_READ && len == 0) return i2c_quirk_error(adap, &msgs[i], "no zero length");
} else { if (do_len_check && i2c_quirk_exceeded(len, q->max_write_len)) return i2c_quirk_error(adap, &msgs[i], "msg too long");
if (q->flags & I2C_AQ_NO_ZERO_LEN_WRITE && len == 0) return i2c_quirk_error(adap, &msgs[i], "no zero length");
}
}
return 0;
}
/** * __i2c_transfer - unlocked flavor of i2c_transfer * @adap: Handle to I2C bus * @msgs: One or more messages to execute before STOP is issued to * terminate the operation; each message begins with a START. * @num: Number of messages to be executed. * * Returns negative errno, else the number of messages executed. * * Adapter lock must be held when calling this function. No debug logging * takes place.
*/ int __i2c_transfer(struct i2c_adapter *adap, struct i2c_msg *msgs, int num)
{ unsignedlong orig_jiffies; int ret, try;
if (!adap->algo->master_xfer) {
dev_dbg(&adap->dev, "I2C level transfers not supported\n"); return -EOPNOTSUPP;
}
if (WARN_ON(!msgs || num < 1)) return -EINVAL;
ret = __i2c_check_suspended(adap); if (ret) return ret;
if (adap->quirks && i2c_check_for_quirks(adap, msgs, num)) return -EOPNOTSUPP;
/* * i2c_trace_msg_key gets enabled when tracepoint i2c_transfer gets * enabled. This is an efficient way of keeping the for-loop from * being executed when not needed.
*/ if (static_branch_unlikely(&i2c_trace_msg_key)) { int i; for (i = 0; i < num; i++) if (msgs[i].flags & I2C_M_RD)
trace_i2c_read(adap, &msgs[i], i); else
trace_i2c_write(adap, &msgs[i], i);
}
/* Retry automatically on arbitration loss */
orig_jiffies = jiffies; for (ret = 0, try = 0; try <= adap->retries; try++) { if (i2c_in_atomic_xfer_mode() && adap->algo->master_xfer_atomic)
ret = adap->algo->master_xfer_atomic(adap, msgs, num); else
ret = adap->algo->master_xfer(adap, msgs, num);
if (ret != -EAGAIN) break; if (time_after(jiffies, orig_jiffies + adap->timeout)) break;
}
if (static_branch_unlikely(&i2c_trace_msg_key)) { int i; for (i = 0; i < ret; i++) if (msgs[i].flags & I2C_M_RD)
trace_i2c_reply(adap, &msgs[i], i);
trace_i2c_result(adap, num, ret);
}
return ret;
}
EXPORT_SYMBOL(__i2c_transfer);
/** * i2c_transfer - execute a single or combined I2C message * @adap: Handle to I2C bus * @msgs: One or more messages to execute before STOP is issued to * terminate the operation; each message begins with a START. * @num: Number of messages to be executed. * * Returns negative errno, else the number of messages executed. * * Note that there is no requirement that each message be sent to * the same slave address, although that is the most common model.
*/ int i2c_transfer(struct i2c_adapter *adap, struct i2c_msg *msgs, int num)
{ int ret;
/* REVISIT the fault reporting model here is weak: * * - When we get an error after receiving N bytes from a slave, * there is no way to report "N". * * - When we get a NAK after transmitting N bytes to a slave, * there is no way to report "N" ... or to let the master * continue executing the rest of this combined message, if * that's the appropriate response. * * - When for example "num" is two and we successfully complete * the first message but get an error part way through the * second, it's unclear whether that should be reported as * one (discarding status on the second message) or errno * (discarding status on the first one).
*/
ret = __i2c_lock_bus_helper(adap); if (ret) return ret;
ret = __i2c_transfer(adap, msgs, num);
i2c_unlock_bus(adap, I2C_LOCK_SEGMENT);
return ret;
}
EXPORT_SYMBOL(i2c_transfer);
/** * i2c_transfer_buffer_flags - issue a single I2C message transferring data * to/from a buffer * @client: Handle to slave device * @buf: Where the data is stored * @count: How many bytes to transfer, must be less than 64k since msg.len is u16 * @flags: The flags to be used for the message, e.g. I2C_M_RD for reads * * Returns negative errno, or else the number of bytes transferred.
*/ int i2c_transfer_buffer_flags(conststruct i2c_client *client, char *buf, int count, u16 flags)
{ int ret; struct i2c_msg msg = {
.addr = client->addr,
.flags = flags | (client->flags & I2C_M_TEN),
.len = count,
.buf = buf,
};
ret = i2c_transfer(client->adapter, &msg, 1);
/* * If everything went ok (i.e. 1 msg transferred), return #bytes * transferred, else error code.
*/ return (ret == 1) ? count : ret;
}
EXPORT_SYMBOL(i2c_transfer_buffer_flags);
/** * i2c_get_device_id - get manufacturer, part id and die revision of a device * @client: The device to query * @id: The queried information * * Returns negative errno on error, zero on success.
*/ int i2c_get_device_id(conststruct i2c_client *client, struct i2c_device_identity *id)
{ struct i2c_adapter *adap = client->adapter; union i2c_smbus_data raw_id; int ret;
if (!i2c_check_functionality(adap, I2C_FUNC_SMBUS_READ_I2C_BLOCK)) return -EOPNOTSUPP;
raw_id.block[0] = 3;
--> --------------------
--> maximum size reached
--> --------------------
Messung V0.5
¤ Dauer der Verarbeitung: 0.52 Sekunden
(vorverarbeitet)
¤
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.