1 /* SPDX-License-Identifier: GPL-2.0-or-later */ 2 /* 3 * i2c-core.h - interfaces internal to the I2C framework 4 */ 5 6 #include <linux/rwsem.h> 7 8 struct i2c_devinfo { 9 struct list_head list; 10 int busnum; 11 struct i2c_board_info board_info; 12 }; 13 14 /* board_lock protects board_list and first_dynamic_bus_num. 15 * only i2c core components are allowed to use these symbols. 16 */ 17 extern struct rw_semaphore __i2c_board_lock; 18 extern struct list_head __i2c_board_list; 19 extern int __i2c_first_dynamic_bus_num; 20 21 int i2c_check_7bit_addr_validity_strict(unsigned short addr); 22 23 /* 24 * We only allow atomic transfers for very late communication, e.g. to send 25 * the powerdown command to a PMIC. Atomic transfers are a corner case and not 26 * for generic use! 27 */ 28 static inline bool i2c_in_atomic_xfer_mode(void) 29 { 30 return system_state > SYSTEM_RUNNING && irqs_disabled(); 31 } 32 33 static inline int __i2c_lock_bus_helper(struct i2c_adapter *adap) 34 { 35 int ret = 0; 36 37 if (i2c_in_atomic_xfer_mode()) { 38 WARN(!adap->algo->master_xfer_atomic && !adap->algo->smbus_xfer_atomic, 39 "No atomic I2C transfer handler for '%s'\n", dev_name(&adap->dev)); 40 ret = i2c_trylock_bus(adap, I2C_LOCK_SEGMENT) ? 0 : -EAGAIN; 41 } else { 42 i2c_lock_bus(adap, I2C_LOCK_SEGMENT); 43 } 44 45 return ret; 46 } 47 48 static inline int __i2c_check_suspended(struct i2c_adapter *adap) 49 { 50 if (test_bit(I2C_ALF_IS_SUSPENDED, &adap->locked_flags)) { 51 if (!test_and_set_bit(I2C_ALF_SUSPEND_REPORTED, &adap->locked_flags)) 52 dev_WARN(&adap->dev, "Transfer while suspended\n"); 53 return -ESHUTDOWN; 54 } 55 56 return 0; 57 } 58 59 #ifdef CONFIG_ACPI 60 const struct acpi_device_id * 61 i2c_acpi_match_device(const struct acpi_device_id *matches, 62 struct i2c_client *client); 63 void i2c_acpi_register_devices(struct i2c_adapter *adap); 64 #else /* CONFIG_ACPI */ 65 static inline void i2c_acpi_register_devices(struct i2c_adapter *adap) { } 66 static inline const struct acpi_device_id * 67 i2c_acpi_match_device(const struct acpi_device_id *matches, 68 struct i2c_client *client) 69 { 70 return NULL; 71 } 72 #endif /* CONFIG_ACPI */ 73 extern struct notifier_block i2c_acpi_notifier; 74 75 #ifdef CONFIG_ACPI_I2C_OPREGION 76 int i2c_acpi_install_space_handler(struct i2c_adapter *adapter); 77 void i2c_acpi_remove_space_handler(struct i2c_adapter *adapter); 78 #else /* CONFIG_ACPI_I2C_OPREGION */ 79 static inline int i2c_acpi_install_space_handler(struct i2c_adapter *adapter) { return 0; } 80 static inline void i2c_acpi_remove_space_handler(struct i2c_adapter *adapter) { } 81 #endif /* CONFIG_ACPI_I2C_OPREGION */ 82 83 #ifdef CONFIG_OF 84 void of_i2c_register_devices(struct i2c_adapter *adap); 85 #else 86 static inline void of_i2c_register_devices(struct i2c_adapter *adap) { } 87 #endif 88 extern struct notifier_block i2c_of_notifier; 89