aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/i2c/i2c-core.c
diff options
context:
space:
mode:
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");