diff options
author | Linus Torvalds <torvalds@linux-foundation.org> | 2010-08-12 13:06:29 -0400 |
---|---|---|
committer | Linus Torvalds <torvalds@linux-foundation.org> | 2010-08-12 13:06:29 -0400 |
commit | 1c00650c233c404fadf9347329214d55283bd17a (patch) | |
tree | 9de7cda2fe2e54411cc24ff3befd758c9cb9cd74 /include | |
parent | 26df0766a73a859bb93dc58e747c5028557a23fd (diff) | |
parent | 7f528135da9704d67db1f727162024b078e1cd8f (diff) |
Merge branch 'i2c-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/jdelvare/staging
* 'i2c-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/jdelvare/staging:
i2c: I2C bus multiplexer driver pca954x
i2c: Multiplexed I2C bus core support
i2c: Use a separate mutex for userspace client lists
i2c: Make i2c_default_probe self-sufficient
i2c: Drop dummy variable
i2c: Move adapter locking helpers to i2c-core
V4L/DVB: Use custom I2C probing function mechanism
i2c: Add support for custom probe function
i2c-dev: Use memdup_user
i2c-dev: Remove unnecessary kmalloc casts
Diffstat (limited to 'include')
-rw-r--r-- | include/linux/i2c-mux.h | 46 | ||||
-rw-r--r-- | include/linux/i2c.h | 33 | ||||
-rw-r--r-- | include/linux/i2c/pca954x.h | 47 |
3 files changed, 110 insertions, 16 deletions
diff --git a/include/linux/i2c-mux.h b/include/linux/i2c-mux.h new file mode 100644 index 000000000000..34536effd652 --- /dev/null +++ b/include/linux/i2c-mux.h | |||
@@ -0,0 +1,46 @@ | |||
1 | /* | ||
2 | * | ||
3 | * i2c-mux.h - functions for the i2c-bus mux support | ||
4 | * | ||
5 | * Copyright (c) 2008-2009 Rodolfo Giometti <giometti@linux.it> | ||
6 | * Copyright (c) 2008-2009 Eurotech S.p.A. <info@eurotech.it> | ||
7 | * Michael Lawnick <michael.lawnick.ext@nsn.com> | ||
8 | * | ||
9 | * This program is free software; you can redistribute it and/or modify | ||
10 | * it under the terms of the GNU General Public License as published by | ||
11 | * the Free Software Foundation; either version 2 of the License, or | ||
12 | * (at your option) any later version. | ||
13 | * | ||
14 | * This program is distributed in the hope that it will be useful, | ||
15 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
16 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
17 | * GNU General Public License for more details. | ||
18 | * | ||
19 | * You should have received a copy of the GNU General Public License | ||
20 | * along with this program; if not, write to the Free Software | ||
21 | * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. | ||
22 | */ | ||
23 | |||
24 | #ifndef _LINUX_I2C_MUX_H | ||
25 | #define _LINUX_I2C_MUX_H | ||
26 | |||
27 | #ifdef __KERNEL__ | ||
28 | |||
29 | /* | ||
30 | * Called to create a i2c bus on a multiplexed bus segment. | ||
31 | * The mux_dev and chan_id parameters are passed to the select | ||
32 | * and deselect callback functions to perform hardware-specific | ||
33 | * mux control. | ||
34 | */ | ||
35 | struct i2c_adapter *i2c_add_mux_adapter(struct i2c_adapter *parent, | ||
36 | void *mux_dev, u32 force_nr, u32 chan_id, | ||
37 | int (*select) (struct i2c_adapter *, | ||
38 | void *mux_dev, u32 chan_id), | ||
39 | int (*deselect) (struct i2c_adapter *, | ||
40 | void *mux_dev, u32 chan_id)); | ||
41 | |||
42 | int i2c_del_mux_adapter(struct i2c_adapter *adap); | ||
43 | |||
44 | #endif /* __KERNEL__ */ | ||
45 | |||
46 | #endif /* _LINUX_I2C_MUX_H */ | ||
diff --git a/include/linux/i2c.h b/include/linux/i2c.h index 38dd4025aa4e..4bae0b72ed3c 100644 --- a/include/linux/i2c.h +++ b/include/linux/i2c.h | |||
@@ -37,6 +37,7 @@ | |||
37 | #include <linux/of.h> /* for struct device_node */ | 37 | #include <linux/of.h> /* for struct device_node */ |
38 | 38 | ||
39 | extern struct bus_type i2c_bus_type; | 39 | extern struct bus_type i2c_bus_type; |
40 | extern struct device_type i2c_adapter_type; | ||
40 | 41 | ||
41 | /* --- General options ------------------------------------------------ */ | 42 | /* --- General options ------------------------------------------------ */ |
42 | 43 | ||
@@ -284,12 +285,18 @@ i2c_new_device(struct i2c_adapter *adap, struct i2c_board_info const *info); | |||
284 | 285 | ||
285 | /* If you don't know the exact address of an I2C device, use this variant | 286 | /* If you don't know the exact address of an I2C device, use this variant |
286 | * instead, which can probe for device presence in a list of possible | 287 | * instead, which can probe for device presence in a list of possible |
287 | * addresses. | 288 | * addresses. The "probe" callback function is optional. If it is provided, |
289 | * it must return 1 on successful probe, 0 otherwise. If it is not provided, | ||
290 | * a default probing method is used. | ||
288 | */ | 291 | */ |
289 | extern struct i2c_client * | 292 | extern struct i2c_client * |
290 | i2c_new_probed_device(struct i2c_adapter *adap, | 293 | i2c_new_probed_device(struct i2c_adapter *adap, |
291 | struct i2c_board_info *info, | 294 | struct i2c_board_info *info, |
292 | unsigned short const *addr_list); | 295 | unsigned short const *addr_list, |
296 | int (*probe)(struct i2c_adapter *, unsigned short addr)); | ||
297 | |||
298 | /* Common custom probe functions */ | ||
299 | extern int i2c_probe_func_quick_read(struct i2c_adapter *, unsigned short addr); | ||
293 | 300 | ||
294 | /* For devices that use several addresses, use i2c_new_dummy() to make | 301 | /* For devices that use several addresses, use i2c_new_dummy() to make |
295 | * client handles for the extra addresses. | 302 | * client handles for the extra addresses. |
@@ -362,6 +369,7 @@ struct i2c_adapter { | |||
362 | char name[48]; | 369 | char name[48]; |
363 | struct completion dev_released; | 370 | struct completion dev_released; |
364 | 371 | ||
372 | struct mutex userspace_clients_lock; | ||
365 | struct list_head userspace_clients; | 373 | struct list_head userspace_clients; |
366 | }; | 374 | }; |
367 | #define to_i2c_adapter(d) container_of(d, struct i2c_adapter, dev) | 375 | #define to_i2c_adapter(d) container_of(d, struct i2c_adapter, dev) |
@@ -376,23 +384,16 @@ static inline void i2c_set_adapdata(struct i2c_adapter *dev, void *data) | |||
376 | dev_set_drvdata(&dev->dev, data); | 384 | dev_set_drvdata(&dev->dev, data); |
377 | } | 385 | } |
378 | 386 | ||
379 | /** | 387 | static inline int i2c_parent_is_i2c_adapter(const struct i2c_adapter *adapter) |
380 | * i2c_lock_adapter - Prevent access to an I2C bus segment | ||
381 | * @adapter: Target I2C bus segment | ||
382 | */ | ||
383 | static inline void i2c_lock_adapter(struct i2c_adapter *adapter) | ||
384 | { | 388 | { |
385 | rt_mutex_lock(&adapter->bus_lock); | 389 | return adapter->dev.parent != NULL |
390 | && adapter->dev.parent->bus == &i2c_bus_type | ||
391 | && adapter->dev.parent->type == &i2c_adapter_type; | ||
386 | } | 392 | } |
387 | 393 | ||
388 | /** | 394 | /* Adapter locking functions, exported for shared pin cases */ |
389 | * i2c_unlock_adapter - Reauthorize access to an I2C bus segment | 395 | void i2c_lock_adapter(struct i2c_adapter *); |
390 | * @adapter: Target I2C bus segment | 396 | void i2c_unlock_adapter(struct i2c_adapter *); |
391 | */ | ||
392 | static inline void i2c_unlock_adapter(struct i2c_adapter *adapter) | ||
393 | { | ||
394 | rt_mutex_unlock(&adapter->bus_lock); | ||
395 | } | ||
396 | 397 | ||
397 | /*flags for the client struct: */ | 398 | /*flags for the client struct: */ |
398 | #define I2C_CLIENT_PEC 0x04 /* Use Packet Error Checking */ | 399 | #define I2C_CLIENT_PEC 0x04 /* Use Packet Error Checking */ |
diff --git a/include/linux/i2c/pca954x.h b/include/linux/i2c/pca954x.h new file mode 100644 index 000000000000..28f1f8d5ab1f --- /dev/null +++ b/include/linux/i2c/pca954x.h | |||
@@ -0,0 +1,47 @@ | |||
1 | /* | ||
2 | * | ||
3 | * pca954x.h - I2C multiplexer/switch support | ||
4 | * | ||
5 | * Copyright (c) 2008-2009 Rodolfo Giometti <giometti@linux.it> | ||
6 | * Copyright (c) 2008-2009 Eurotech S.p.A. <info@eurotech.it> | ||
7 | * Michael Lawnick <michael.lawnick.ext@nsn.com> | ||
8 | * | ||
9 | * This program is free software; you can redistribute it and/or modify | ||
10 | * it under the terms of the GNU General Public License as published by | ||
11 | * the Free Software Foundation; either version 2 of the License, or | ||
12 | * (at your option) any later version. | ||
13 | * | ||
14 | * This program is distributed in the hope that it will be useful, | ||
15 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
16 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
17 | * GNU General Public License for more details. | ||
18 | * | ||
19 | * You should have received a copy of the GNU General Public License | ||
20 | * along with this program; if not, write to the Free Software | ||
21 | * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. | ||
22 | */ | ||
23 | |||
24 | |||
25 | #ifndef _LINUX_I2C_PCA954X_H | ||
26 | #define _LINUX_I2C_PCA954X_H | ||
27 | |||
28 | /* Platform data for the PCA954x I2C multiplexers */ | ||
29 | |||
30 | /* Per channel initialisation data: | ||
31 | * @adap_id: bus number for the adapter. 0 = don't care | ||
32 | * @deselect_on_exit: set this entry to 1, if your H/W needs deselection | ||
33 | * of this channel after transaction. | ||
34 | * | ||
35 | */ | ||
36 | struct pca954x_platform_mode { | ||
37 | int adap_id; | ||
38 | unsigned int deselect_on_exit:1; | ||
39 | }; | ||
40 | |||
41 | /* Per mux/switch data, used with i2c_register_board_info */ | ||
42 | struct pca954x_platform_data { | ||
43 | struct pca954x_platform_mode *modes; | ||
44 | int num_modes; | ||
45 | }; | ||
46 | |||
47 | #endif /* _LINUX_I2C_PCA954X_H */ | ||