diff options
Diffstat (limited to 'include/linux/i2c.h')
-rw-r--r-- | include/linux/i2c.h | 198 |
1 files changed, 16 insertions, 182 deletions
diff --git a/include/linux/i2c.h b/include/linux/i2c.h index 7b40cda57a70..6ed1d59bfb1e 100644 --- a/include/linux/i2c.h +++ b/include/linux/i2c.h | |||
@@ -53,6 +53,7 @@ struct i2c_board_info; | |||
53 | * on a bus (or read from them). Apart from two basic transfer functions to | 53 | * on a bus (or read from them). Apart from two basic transfer functions to |
54 | * transmit one message at a time, a more complex version can be used to | 54 | * transmit one message at a time, a more complex version can be used to |
55 | * transmit an arbitrary number of messages without interruption. | 55 | * transmit an arbitrary number of messages without interruption. |
56 | * @count must be be less than 64k since msg.len is u16. | ||
56 | */ | 57 | */ |
57 | extern int i2c_master_send(struct i2c_client *client, const char *buf, | 58 | extern int i2c_master_send(struct i2c_client *client, const char *buf, |
58 | int count); | 59 | int count); |
@@ -110,7 +111,7 @@ extern s32 i2c_smbus_write_i2c_block_data(struct i2c_client *client, | |||
110 | * @driver: Device driver model driver | 111 | * @driver: Device driver model driver |
111 | * @id_table: List of I2C devices supported by this driver | 112 | * @id_table: List of I2C devices supported by this driver |
112 | * @detect: Callback for device detection | 113 | * @detect: Callback for device detection |
113 | * @address_data: The I2C addresses to probe, ignore or force (for detect) | 114 | * @address_list: The I2C addresses to probe (for detect) |
114 | * @clients: List of detected clients we created (for i2c-core use only) | 115 | * @clients: List of detected clients we created (for i2c-core use only) |
115 | * | 116 | * |
116 | * The driver.owner field should be set to the module owner of this driver. | 117 | * The driver.owner field should be set to the module owner of this driver. |
@@ -152,6 +153,13 @@ struct i2c_driver { | |||
152 | int (*suspend)(struct i2c_client *, pm_message_t mesg); | 153 | int (*suspend)(struct i2c_client *, pm_message_t mesg); |
153 | int (*resume)(struct i2c_client *); | 154 | int (*resume)(struct i2c_client *); |
154 | 155 | ||
156 | /* Alert callback, for example for the SMBus alert protocol. | ||
157 | * The format and meaning of the data value depends on the protocol. | ||
158 | * For the SMBus alert protocol, there is a single bit of data passed | ||
159 | * as the alert response's low bit ("event flag"). | ||
160 | */ | ||
161 | void (*alert)(struct i2c_client *, unsigned int data); | ||
162 | |||
155 | /* a ioctl like command that can be used to perform specific functions | 163 | /* a ioctl like command that can be used to perform specific functions |
156 | * with the device. | 164 | * with the device. |
157 | */ | 165 | */ |
@@ -161,8 +169,8 @@ struct i2c_driver { | |||
161 | const struct i2c_device_id *id_table; | 169 | const struct i2c_device_id *id_table; |
162 | 170 | ||
163 | /* Device detection callback for automatic device creation */ | 171 | /* Device detection callback for automatic device creation */ |
164 | int (*detect)(struct i2c_client *, int kind, struct i2c_board_info *); | 172 | int (*detect)(struct i2c_client *, struct i2c_board_info *); |
165 | const struct i2c_client_address_data *address_data; | 173 | const unsigned short *address_list; |
166 | struct list_head clients; | 174 | struct list_head clients; |
167 | }; | 175 | }; |
168 | #define to_i2c_driver(d) container_of(d, struct i2c_driver, driver) | 176 | #define to_i2c_driver(d) container_of(d, struct i2c_driver, driver) |
@@ -338,8 +346,7 @@ struct i2c_adapter { | |||
338 | void *algo_data; | 346 | void *algo_data; |
339 | 347 | ||
340 | /* data fields that are valid for all devices */ | 348 | /* data fields that are valid for all devices */ |
341 | u8 level; /* nesting level for lockdep */ | 349 | struct rt_mutex bus_lock; |
342 | struct mutex bus_lock; | ||
343 | 350 | ||
344 | int timeout; /* in jiffies */ | 351 | int timeout; /* in jiffies */ |
345 | int retries; | 352 | int retries; |
@@ -348,6 +355,8 @@ struct i2c_adapter { | |||
348 | int nr; | 355 | int nr; |
349 | char name[48]; | 356 | char name[48]; |
350 | struct completion dev_released; | 357 | struct completion dev_released; |
358 | |||
359 | struct list_head userspace_clients; | ||
351 | }; | 360 | }; |
352 | #define to_i2c_adapter(d) container_of(d, struct i2c_adapter, dev) | 361 | #define to_i2c_adapter(d) container_of(d, struct i2c_adapter, dev) |
353 | 362 | ||
@@ -367,7 +376,7 @@ static inline void i2c_set_adapdata(struct i2c_adapter *dev, void *data) | |||
367 | */ | 376 | */ |
368 | static inline void i2c_lock_adapter(struct i2c_adapter *adapter) | 377 | static inline void i2c_lock_adapter(struct i2c_adapter *adapter) |
369 | { | 378 | { |
370 | mutex_lock(&adapter->bus_lock); | 379 | rt_mutex_lock(&adapter->bus_lock); |
371 | } | 380 | } |
372 | 381 | ||
373 | /** | 382 | /** |
@@ -376,7 +385,7 @@ static inline void i2c_lock_adapter(struct i2c_adapter *adapter) | |||
376 | */ | 385 | */ |
377 | static inline void i2c_unlock_adapter(struct i2c_adapter *adapter) | 386 | static inline void i2c_unlock_adapter(struct i2c_adapter *adapter) |
378 | { | 387 | { |
379 | mutex_unlock(&adapter->bus_lock); | 388 | rt_mutex_unlock(&adapter->bus_lock); |
380 | } | 389 | } |
381 | 390 | ||
382 | /*flags for the client struct: */ | 391 | /*flags for the client struct: */ |
@@ -392,17 +401,6 @@ static inline void i2c_unlock_adapter(struct i2c_adapter *adapter) | |||
392 | #define I2C_CLASS_DDC (1<<3) /* DDC bus on graphics adapters */ | 401 | #define I2C_CLASS_DDC (1<<3) /* DDC bus on graphics adapters */ |
393 | #define I2C_CLASS_SPD (1<<7) /* SPD EEPROMs and similar */ | 402 | #define I2C_CLASS_SPD (1<<7) /* SPD EEPROMs and similar */ |
394 | 403 | ||
395 | /* i2c_client_address_data is the struct for holding default client | ||
396 | * addresses for a driver and for the parameters supplied on the | ||
397 | * command line | ||
398 | */ | ||
399 | struct i2c_client_address_data { | ||
400 | const unsigned short *normal_i2c; | ||
401 | const unsigned short *probe; | ||
402 | const unsigned short *ignore; | ||
403 | const unsigned short * const *forces; | ||
404 | }; | ||
405 | |||
406 | /* Internal numbers to terminate lists */ | 404 | /* Internal numbers to terminate lists */ |
407 | #define I2C_CLIENT_END 0xfffeU | 405 | #define I2C_CLIENT_END 0xfffeU |
408 | 406 | ||
@@ -580,168 +578,4 @@ union i2c_smbus_data { | |||
580 | #define I2C_SMBUS_BLOCK_PROC_CALL 7 /* SMBus 2.0 */ | 578 | #define I2C_SMBUS_BLOCK_PROC_CALL 7 /* SMBus 2.0 */ |
581 | #define I2C_SMBUS_I2C_BLOCK_DATA 8 | 579 | #define I2C_SMBUS_I2C_BLOCK_DATA 8 |
582 | 580 | ||
583 | |||
584 | #ifdef __KERNEL__ | ||
585 | |||
586 | /* These defines are used for probing i2c client addresses */ | ||
587 | /* The length of the option lists */ | ||
588 | #define I2C_CLIENT_MAX_OPTS 48 | ||
589 | |||
590 | /* Default fill of many variables */ | ||
591 | #define I2C_CLIENT_DEFAULTS {I2C_CLIENT_END, I2C_CLIENT_END, I2C_CLIENT_END, \ | ||
592 | I2C_CLIENT_END, I2C_CLIENT_END, I2C_CLIENT_END, \ | ||
593 | I2C_CLIENT_END, I2C_CLIENT_END, I2C_CLIENT_END, \ | ||
594 | I2C_CLIENT_END, I2C_CLIENT_END, I2C_CLIENT_END, \ | ||
595 | I2C_CLIENT_END, I2C_CLIENT_END, I2C_CLIENT_END, \ | ||
596 | I2C_CLIENT_END, I2C_CLIENT_END, I2C_CLIENT_END, \ | ||
597 | I2C_CLIENT_END, I2C_CLIENT_END, I2C_CLIENT_END, \ | ||
598 | I2C_CLIENT_END, I2C_CLIENT_END, I2C_CLIENT_END, \ | ||
599 | I2C_CLIENT_END, I2C_CLIENT_END, I2C_CLIENT_END, \ | ||
600 | I2C_CLIENT_END, I2C_CLIENT_END, I2C_CLIENT_END, \ | ||
601 | I2C_CLIENT_END, I2C_CLIENT_END, I2C_CLIENT_END, \ | ||
602 | I2C_CLIENT_END, I2C_CLIENT_END, I2C_CLIENT_END, \ | ||
603 | I2C_CLIENT_END, I2C_CLIENT_END, I2C_CLIENT_END, \ | ||
604 | I2C_CLIENT_END, I2C_CLIENT_END, I2C_CLIENT_END, \ | ||
605 | I2C_CLIENT_END, I2C_CLIENT_END, I2C_CLIENT_END, \ | ||
606 | I2C_CLIENT_END, I2C_CLIENT_END, I2C_CLIENT_END} | ||
607 | |||
608 | /* I2C_CLIENT_MODULE_PARM creates a module parameter, and puts it in the | ||
609 | module header */ | ||
610 | |||
611 | #define I2C_CLIENT_MODULE_PARM(var,desc) \ | ||
612 | static unsigned short var[I2C_CLIENT_MAX_OPTS] = I2C_CLIENT_DEFAULTS; \ | ||
613 | static unsigned int var##_num; \ | ||
614 | module_param_array(var, short, &var##_num, 0); \ | ||
615 | MODULE_PARM_DESC(var, desc) | ||
616 | |||
617 | #define I2C_CLIENT_MODULE_PARM_FORCE(name) \ | ||
618 | I2C_CLIENT_MODULE_PARM(force_##name, \ | ||
619 | "List of adapter,address pairs which are " \ | ||
620 | "unquestionably assumed to contain a `" \ | ||
621 | # name "' chip") | ||
622 | |||
623 | |||
624 | #define I2C_CLIENT_INSMOD_COMMON \ | ||
625 | I2C_CLIENT_MODULE_PARM(probe, "List of adapter,address pairs to scan " \ | ||
626 | "additionally"); \ | ||
627 | I2C_CLIENT_MODULE_PARM(ignore, "List of adapter,address pairs not to " \ | ||
628 | "scan"); \ | ||
629 | static const struct i2c_client_address_data addr_data = { \ | ||
630 | .normal_i2c = normal_i2c, \ | ||
631 | .probe = probe, \ | ||
632 | .ignore = ignore, \ | ||
633 | .forces = forces, \ | ||
634 | } | ||
635 | |||
636 | #define I2C_CLIENT_FORCE_TEXT \ | ||
637 | "List of adapter,address pairs to boldly assume to be present" | ||
638 | |||
639 | /* These are the ones you want to use in your own drivers. Pick the one | ||
640 | which matches the number of devices the driver differenciates between. */ | ||
641 | #define I2C_CLIENT_INSMOD \ | ||
642 | I2C_CLIENT_MODULE_PARM(force, I2C_CLIENT_FORCE_TEXT); \ | ||
643 | static const unsigned short * const forces[] = { force, NULL }; \ | ||
644 | I2C_CLIENT_INSMOD_COMMON | ||
645 | |||
646 | #define I2C_CLIENT_INSMOD_1(chip1) \ | ||
647 | enum chips { any_chip, chip1 }; \ | ||
648 | I2C_CLIENT_MODULE_PARM(force, I2C_CLIENT_FORCE_TEXT); \ | ||
649 | I2C_CLIENT_MODULE_PARM_FORCE(chip1); \ | ||
650 | static const unsigned short * const forces[] = { force, \ | ||
651 | force_##chip1, NULL }; \ | ||
652 | I2C_CLIENT_INSMOD_COMMON | ||
653 | |||
654 | #define I2C_CLIENT_INSMOD_2(chip1, chip2) \ | ||
655 | enum chips { any_chip, chip1, chip2 }; \ | ||
656 | I2C_CLIENT_MODULE_PARM(force, I2C_CLIENT_FORCE_TEXT); \ | ||
657 | I2C_CLIENT_MODULE_PARM_FORCE(chip1); \ | ||
658 | I2C_CLIENT_MODULE_PARM_FORCE(chip2); \ | ||
659 | static const unsigned short * const forces[] = { force, \ | ||
660 | force_##chip1, force_##chip2, NULL }; \ | ||
661 | I2C_CLIENT_INSMOD_COMMON | ||
662 | |||
663 | #define I2C_CLIENT_INSMOD_3(chip1, chip2, chip3) \ | ||
664 | enum chips { any_chip, chip1, chip2, chip3 }; \ | ||
665 | I2C_CLIENT_MODULE_PARM(force, I2C_CLIENT_FORCE_TEXT); \ | ||
666 | I2C_CLIENT_MODULE_PARM_FORCE(chip1); \ | ||
667 | I2C_CLIENT_MODULE_PARM_FORCE(chip2); \ | ||
668 | I2C_CLIENT_MODULE_PARM_FORCE(chip3); \ | ||
669 | static const unsigned short * const forces[] = { force, \ | ||
670 | force_##chip1, force_##chip2, force_##chip3, NULL }; \ | ||
671 | I2C_CLIENT_INSMOD_COMMON | ||
672 | |||
673 | #define I2C_CLIENT_INSMOD_4(chip1, chip2, chip3, chip4) \ | ||
674 | enum chips { any_chip, chip1, chip2, chip3, chip4 }; \ | ||
675 | I2C_CLIENT_MODULE_PARM(force, I2C_CLIENT_FORCE_TEXT); \ | ||
676 | I2C_CLIENT_MODULE_PARM_FORCE(chip1); \ | ||
677 | I2C_CLIENT_MODULE_PARM_FORCE(chip2); \ | ||
678 | I2C_CLIENT_MODULE_PARM_FORCE(chip3); \ | ||
679 | I2C_CLIENT_MODULE_PARM_FORCE(chip4); \ | ||
680 | static const unsigned short * const forces[] = { force, \ | ||
681 | force_##chip1, force_##chip2, force_##chip3, \ | ||
682 | force_##chip4, NULL}; \ | ||
683 | I2C_CLIENT_INSMOD_COMMON | ||
684 | |||
685 | #define I2C_CLIENT_INSMOD_5(chip1, chip2, chip3, chip4, chip5) \ | ||
686 | enum chips { any_chip, chip1, chip2, chip3, chip4, chip5 }; \ | ||
687 | I2C_CLIENT_MODULE_PARM(force, I2C_CLIENT_FORCE_TEXT); \ | ||
688 | I2C_CLIENT_MODULE_PARM_FORCE(chip1); \ | ||
689 | I2C_CLIENT_MODULE_PARM_FORCE(chip2); \ | ||
690 | I2C_CLIENT_MODULE_PARM_FORCE(chip3); \ | ||
691 | I2C_CLIENT_MODULE_PARM_FORCE(chip4); \ | ||
692 | I2C_CLIENT_MODULE_PARM_FORCE(chip5); \ | ||
693 | static const unsigned short * const forces[] = { force, \ | ||
694 | force_##chip1, force_##chip2, force_##chip3, \ | ||
695 | force_##chip4, force_##chip5, NULL }; \ | ||
696 | I2C_CLIENT_INSMOD_COMMON | ||
697 | |||
698 | #define I2C_CLIENT_INSMOD_6(chip1, chip2, chip3, chip4, chip5, chip6) \ | ||
699 | enum chips { any_chip, chip1, chip2, chip3, chip4, chip5, chip6 }; \ | ||
700 | I2C_CLIENT_MODULE_PARM(force, I2C_CLIENT_FORCE_TEXT); \ | ||
701 | I2C_CLIENT_MODULE_PARM_FORCE(chip1); \ | ||
702 | I2C_CLIENT_MODULE_PARM_FORCE(chip2); \ | ||
703 | I2C_CLIENT_MODULE_PARM_FORCE(chip3); \ | ||
704 | I2C_CLIENT_MODULE_PARM_FORCE(chip4); \ | ||
705 | I2C_CLIENT_MODULE_PARM_FORCE(chip5); \ | ||
706 | I2C_CLIENT_MODULE_PARM_FORCE(chip6); \ | ||
707 | static const unsigned short * const forces[] = { force, \ | ||
708 | force_##chip1, force_##chip2, force_##chip3, \ | ||
709 | force_##chip4, force_##chip5, force_##chip6, NULL }; \ | ||
710 | I2C_CLIENT_INSMOD_COMMON | ||
711 | |||
712 | #define I2C_CLIENT_INSMOD_7(chip1, chip2, chip3, chip4, chip5, chip6, chip7) \ | ||
713 | enum chips { any_chip, chip1, chip2, chip3, chip4, chip5, chip6, \ | ||
714 | chip7 }; \ | ||
715 | I2C_CLIENT_MODULE_PARM(force, I2C_CLIENT_FORCE_TEXT); \ | ||
716 | I2C_CLIENT_MODULE_PARM_FORCE(chip1); \ | ||
717 | I2C_CLIENT_MODULE_PARM_FORCE(chip2); \ | ||
718 | I2C_CLIENT_MODULE_PARM_FORCE(chip3); \ | ||
719 | I2C_CLIENT_MODULE_PARM_FORCE(chip4); \ | ||
720 | I2C_CLIENT_MODULE_PARM_FORCE(chip5); \ | ||
721 | I2C_CLIENT_MODULE_PARM_FORCE(chip6); \ | ||
722 | I2C_CLIENT_MODULE_PARM_FORCE(chip7); \ | ||
723 | static const unsigned short * const forces[] = { force, \ | ||
724 | force_##chip1, force_##chip2, force_##chip3, \ | ||
725 | force_##chip4, force_##chip5, force_##chip6, \ | ||
726 | force_##chip7, NULL }; \ | ||
727 | I2C_CLIENT_INSMOD_COMMON | ||
728 | |||
729 | #define I2C_CLIENT_INSMOD_8(chip1, chip2, chip3, chip4, chip5, chip6, chip7, chip8) \ | ||
730 | enum chips { any_chip, chip1, chip2, chip3, chip4, chip5, chip6, \ | ||
731 | chip7, chip8 }; \ | ||
732 | I2C_CLIENT_MODULE_PARM(force, I2C_CLIENT_FORCE_TEXT); \ | ||
733 | I2C_CLIENT_MODULE_PARM_FORCE(chip1); \ | ||
734 | I2C_CLIENT_MODULE_PARM_FORCE(chip2); \ | ||
735 | I2C_CLIENT_MODULE_PARM_FORCE(chip3); \ | ||
736 | I2C_CLIENT_MODULE_PARM_FORCE(chip4); \ | ||
737 | I2C_CLIENT_MODULE_PARM_FORCE(chip5); \ | ||
738 | I2C_CLIENT_MODULE_PARM_FORCE(chip6); \ | ||
739 | I2C_CLIENT_MODULE_PARM_FORCE(chip7); \ | ||
740 | I2C_CLIENT_MODULE_PARM_FORCE(chip8); \ | ||
741 | static const unsigned short * const forces[] = { force, \ | ||
742 | force_##chip1, force_##chip2, force_##chip3, \ | ||
743 | force_##chip4, force_##chip5, force_##chip6, \ | ||
744 | force_##chip7, force_##chip8, NULL }; \ | ||
745 | I2C_CLIENT_INSMOD_COMMON | ||
746 | #endif /* __KERNEL__ */ | ||
747 | #endif /* _LINUX_I2C_H */ | 581 | #endif /* _LINUX_I2C_H */ |