i2c: core changes for slave support
Finally(!), make Linux support being an I2C slave. Most of the existing infrastructure is reused. We mainly add i2c_slave_register/unregister() calls which tells i2c bus drivers to activate the slave mode. Then, they also get a callback to report slave events to. Signed-off-by: Wolfram Sang <wsa+renesas@sang-engineering.com> Signed-off-by: Wolfram Sang <wsa@the-dreams.de>
This commit is contained in:

committed by
Wolfram Sang

parent
40ed1b4caf
commit
4b1acc4333
@@ -24,6 +24,7 @@
|
||||
(c) 2013 Wolfram Sang <wsa@the-dreams.de>
|
||||
I2C ACPI code Copyright (C) 2014 Intel Corp
|
||||
Author: Lan Tianyu <tianyu.lan@intel.com>
|
||||
I2C slave support (c) 2014 by Wolfram Sang <wsa@sang-engineering.com>
|
||||
*/
|
||||
|
||||
#include <linux/module.h>
|
||||
@@ -2911,6 +2912,54 @@ trace:
|
||||
}
|
||||
EXPORT_SYMBOL(i2c_smbus_xfer);
|
||||
|
||||
int i2c_slave_register(struct i2c_client *client, i2c_slave_cb_t slave_cb)
|
||||
{
|
||||
int ret;
|
||||
|
||||
if (!client || !slave_cb)
|
||||
return -EINVAL;
|
||||
|
||||
if (!(client->flags & I2C_CLIENT_TEN)) {
|
||||
/* Enforce stricter address checking */
|
||||
ret = i2c_check_addr_validity(client->addr);
|
||||
if (ret)
|
||||
return ret;
|
||||
}
|
||||
|
||||
if (!client->adapter->algo->reg_slave)
|
||||
return -EOPNOTSUPP;
|
||||
|
||||
client->slave_cb = slave_cb;
|
||||
|
||||
i2c_lock_adapter(client->adapter);
|
||||
ret = client->adapter->algo->reg_slave(client);
|
||||
i2c_unlock_adapter(client->adapter);
|
||||
|
||||
if (ret)
|
||||
client->slave_cb = NULL;
|
||||
|
||||
return ret;
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(i2c_slave_register);
|
||||
|
||||
int i2c_slave_unregister(struct i2c_client *client)
|
||||
{
|
||||
int ret;
|
||||
|
||||
if (!client->adapter->algo->unreg_slave)
|
||||
return -EOPNOTSUPP;
|
||||
|
||||
i2c_lock_adapter(client->adapter);
|
||||
ret = client->adapter->algo->unreg_slave(client);
|
||||
i2c_unlock_adapter(client->adapter);
|
||||
|
||||
if (ret == 0)
|
||||
client->slave_cb = NULL;
|
||||
|
||||
return ret;
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(i2c_slave_unregister);
|
||||
|
||||
MODULE_AUTHOR("Simon G. Vogl <simon@tk.uni-linz.ac.at>");
|
||||
MODULE_DESCRIPTION("I2C-Bus main module");
|
||||
MODULE_LICENSE("GPL");
|
||||
|
Reference in New Issue
Block a user