aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/i2c/i2c-core.c
diff options
context:
space:
mode:
authorWolfram Sang <wsa+renesas@sang-engineering.com>2014-11-18 11:04:53 -0500
committerWolfram Sang <wsa@the-dreams.de>2014-12-11 16:25:53 -0500
commit4b1acc43331d6c716c331a61477660dc20c8b59c (patch)
treebf4138594b8e48384972f56c499c895ec9fe0de5 /drivers/i2c/i2c-core.c
parent40ed1b4caf76e27807a49d42a41f43e8393a7607 (diff)
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>
Diffstat (limited to 'drivers/i2c/i2c-core.c')
-rw-r--r--drivers/i2c/i2c-core.c49
1 files changed, 49 insertions, 0 deletions
diff --git a/drivers/i2c/i2c-core.c b/drivers/i2c/i2c-core.c
index 3105bd273f70..c09d06bf4d9b 100644
--- a/drivers/i2c/i2c-core.c
+++ b/drivers/i2c/i2c-core.c
@@ -24,6 +24,7 @@
24 (c) 2013 Wolfram Sang <wsa@the-dreams.de> 24 (c) 2013 Wolfram Sang <wsa@the-dreams.de>
25 I2C ACPI code Copyright (C) 2014 Intel Corp 25 I2C ACPI code Copyright (C) 2014 Intel Corp
26 Author: Lan Tianyu <tianyu.lan@intel.com> 26 Author: Lan Tianyu <tianyu.lan@intel.com>
27 I2C slave support (c) 2014 by Wolfram Sang <wsa@sang-engineering.com>
27 */ 28 */
28 29
29#include <linux/module.h> 30#include <linux/module.h>
@@ -2911,6 +2912,54 @@ trace:
2911} 2912}
2912EXPORT_SYMBOL(i2c_smbus_xfer); 2913EXPORT_SYMBOL(i2c_smbus_xfer);
2913 2914
2915int i2c_slave_register(struct i2c_client *client, i2c_slave_cb_t slave_cb)
2916{
2917 int ret;
2918
2919 if (!client || !slave_cb)
2920 return -EINVAL;
2921
2922 if (!(client->flags & I2C_CLIENT_TEN)) {
2923 /* Enforce stricter address checking */
2924 ret = i2c_check_addr_validity(client->addr);
2925 if (ret)
2926 return ret;
2927 }
2928
2929 if (!client->adapter->algo->reg_slave)
2930 return -EOPNOTSUPP;
2931
2932 client->slave_cb = slave_cb;
2933
2934 i2c_lock_adapter(client->adapter);
2935 ret = client->adapter->algo->reg_slave(client);
2936 i2c_unlock_adapter(client->adapter);
2937
2938 if (ret)
2939 client->slave_cb = NULL;
2940
2941 return ret;
2942}
2943EXPORT_SYMBOL_GPL(i2c_slave_register);
2944
2945int i2c_slave_unregister(struct i2c_client *client)
2946{
2947 int ret;
2948
2949 if (!client->adapter->algo->unreg_slave)
2950 return -EOPNOTSUPP;
2951
2952 i2c_lock_adapter(client->adapter);
2953 ret = client->adapter->algo->unreg_slave(client);
2954 i2c_unlock_adapter(client->adapter);
2955
2956 if (ret == 0)
2957 client->slave_cb = NULL;
2958
2959 return ret;
2960}
2961EXPORT_SYMBOL_GPL(i2c_slave_unregister);
2962
2914MODULE_AUTHOR("Simon G. Vogl <simon@tk.uni-linz.ac.at>"); 2963MODULE_AUTHOR("Simon G. Vogl <simon@tk.uni-linz.ac.at>");
2915MODULE_DESCRIPTION("I2C-Bus main module"); 2964MODULE_DESCRIPTION("I2C-Bus main module");
2916MODULE_LICENSE("GPL"); 2965MODULE_LICENSE("GPL");