#include <dt-bindings/i2c/i2c.h>
#include <linux/device.h>
int i2c_slave_register(struct i2c_client *client, i2c_slave_cb_t slave_cb)
if (!client || !slave_cb) {
WARN(1, "insufficient data\n");
if (!(client->flags & I2C_CLIENT_SLAVE))
dev_warn(&client->dev, "%s: client slave flag not set. You might see address collisions\n",
if (!(client->flags & I2C_CLIENT_TEN)) {
ret = i2c_check_7bit_addr_validity_strict(client->addr);
dev_err(&client->dev, "%s: invalid address\n", __func__);
if (!client->adapter->algo->reg_slave) {
dev_err(&client->dev, "%s: not supported by adapter\n", __func__);
client->slave_cb = slave_cb;
i2c_lock_bus(client->adapter, I2C_LOCK_ROOT_ADAPTER);
ret = client->adapter->algo->reg_slave(client);
i2c_unlock_bus(client->adapter, I2C_LOCK_ROOT_ADAPTER);
dev_err(&client->dev, "%s: adapter returned error %d\n", __func__, ret);
EXPORT_SYMBOL_GPL(i2c_slave_register);
int i2c_slave_unregister(struct i2c_client *client)