diff options
Diffstat (limited to 'drivers/i2c/i2c-core.c')
-rw-r--r-- | drivers/i2c/i2c-core.c | 49 |
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 | } |
2912 | EXPORT_SYMBOL(i2c_smbus_xfer); | 2913 | EXPORT_SYMBOL(i2c_smbus_xfer); |
2913 | 2914 | ||
2915 | int 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 | } | ||
2943 | EXPORT_SYMBOL_GPL(i2c_slave_register); | ||
2944 | |||
2945 | int 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 | } | ||
2961 | EXPORT_SYMBOL_GPL(i2c_slave_unregister); | ||
2962 | |||
2914 | MODULE_AUTHOR("Simon G. Vogl <simon@tk.uni-linz.ac.at>"); | 2963 | MODULE_AUTHOR("Simon G. Vogl <simon@tk.uni-linz.ac.at>"); |
2915 | MODULE_DESCRIPTION("I2C-Bus main module"); | 2964 | MODULE_DESCRIPTION("I2C-Bus main module"); |
2916 | MODULE_LICENSE("GPL"); | 2965 | MODULE_LICENSE("GPL"); |