diff options
Diffstat (limited to 'include/linux/i2c.h')
-rw-r--r-- | include/linux/i2c.h | 29 |
1 files changed, 29 insertions, 0 deletions
diff --git a/include/linux/i2c.h b/include/linux/i2c.h index b556e0ab946f..a720d9921b47 100644 --- a/include/linux/i2c.h +++ b/include/linux/i2c.h | |||
@@ -46,6 +46,8 @@ struct i2c_client; | |||
46 | struct i2c_driver; | 46 | struct i2c_driver; |
47 | union i2c_smbus_data; | 47 | union i2c_smbus_data; |
48 | struct i2c_board_info; | 48 | struct i2c_board_info; |
49 | enum i2c_slave_event; | ||
50 | typedef int (*i2c_slave_cb_t)(struct i2c_client *, enum i2c_slave_event, u8 *); | ||
49 | 51 | ||
50 | struct module; | 52 | struct module; |
51 | 53 | ||
@@ -209,6 +211,8 @@ struct i2c_driver { | |||
209 | * @irq: indicates the IRQ generated by this device (if any) | 211 | * @irq: indicates the IRQ generated by this device (if any) |
210 | * @detected: member of an i2c_driver.clients list or i2c-core's | 212 | * @detected: member of an i2c_driver.clients list or i2c-core's |
211 | * userspace_devices list | 213 | * userspace_devices list |
214 | * @slave_cb: Callback when I2C slave mode of an adapter is used. The adapter | ||
215 | * calls it to pass on slave events to the slave driver. | ||
212 | * | 216 | * |
213 | * An i2c_client identifies a single device (i.e. chip) connected to an | 217 | * An i2c_client identifies a single device (i.e. chip) connected to an |
214 | * i2c bus. The behaviour exposed to Linux is defined by the driver | 218 | * i2c bus. The behaviour exposed to Linux is defined by the driver |
@@ -224,6 +228,7 @@ struct i2c_client { | |||
224 | struct device dev; /* the device structure */ | 228 | struct device dev; /* the device structure */ |
225 | int irq; /* irq issued by device */ | 229 | int irq; /* irq issued by device */ |
226 | struct list_head detected; | 230 | struct list_head detected; |
231 | i2c_slave_cb_t slave_cb; /* callback for slave mode */ | ||
227 | }; | 232 | }; |
228 | #define to_i2c_client(d) container_of(d, struct i2c_client, dev) | 233 | #define to_i2c_client(d) container_of(d, struct i2c_client, dev) |
229 | 234 | ||
@@ -246,6 +251,25 @@ static inline void i2c_set_clientdata(struct i2c_client *dev, void *data) | |||
246 | dev_set_drvdata(&dev->dev, data); | 251 | dev_set_drvdata(&dev->dev, data); |
247 | } | 252 | } |
248 | 253 | ||
254 | /* I2C slave support */ | ||
255 | |||
256 | enum i2c_slave_event { | ||
257 | I2C_SLAVE_REQ_READ_START, | ||
258 | I2C_SLAVE_REQ_READ_END, | ||
259 | I2C_SLAVE_REQ_WRITE_START, | ||
260 | I2C_SLAVE_REQ_WRITE_END, | ||
261 | I2C_SLAVE_STOP, | ||
262 | }; | ||
263 | |||
264 | extern int i2c_slave_register(struct i2c_client *client, i2c_slave_cb_t slave_cb); | ||
265 | extern int i2c_slave_unregister(struct i2c_client *client); | ||
266 | |||
267 | static inline int i2c_slave_event(struct i2c_client *client, | ||
268 | enum i2c_slave_event event, u8 *val) | ||
269 | { | ||
270 | return client->slave_cb(client, event, val); | ||
271 | } | ||
272 | |||
249 | /** | 273 | /** |
250 | * struct i2c_board_info - template for device creation | 274 | * struct i2c_board_info - template for device creation |
251 | * @type: chip type, to initialize i2c_client.name | 275 | * @type: chip type, to initialize i2c_client.name |
@@ -352,6 +376,8 @@ i2c_register_board_info(int busnum, struct i2c_board_info const *info, | |||
352 | * into I2C transfers instead. | 376 | * into I2C transfers instead. |
353 | * @functionality: Return the flags that this algorithm/adapter pair supports | 377 | * @functionality: Return the flags that this algorithm/adapter pair supports |
354 | * from the I2C_FUNC_* flags. | 378 | * from the I2C_FUNC_* flags. |
379 | * @reg_slave: Register given client to I2C slave mode of this adapter | ||
380 | * @unreg_slave: Unregister given client from I2C slave mode of this adapter | ||
355 | * | 381 | * |
356 | * The following structs are for those who like to implement new bus drivers: | 382 | * The following structs are for those who like to implement new bus drivers: |
357 | * i2c_algorithm is the interface to a class of hardware solutions which can | 383 | * i2c_algorithm is the interface to a class of hardware solutions which can |
@@ -377,6 +403,9 @@ struct i2c_algorithm { | |||
377 | 403 | ||
378 | /* To determine what the adapter supports */ | 404 | /* To determine what the adapter supports */ |
379 | u32 (*functionality) (struct i2c_adapter *); | 405 | u32 (*functionality) (struct i2c_adapter *); |
406 | |||
407 | int (*reg_slave)(struct i2c_client *client); | ||
408 | int (*unreg_slave)(struct i2c_client *client); | ||
380 | }; | 409 | }; |
381 | 410 | ||
382 | /** | 411 | /** |