Line data Source code
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 : int i2c_dev_irq_from_resources(const struct resource *resources, 23 : unsigned int num_resources); 24 : 25 : /* 26 : * We only allow atomic transfers for very late communication, e.g. to access a 27 : * PMIC when powering down. Atomic transfers are a corner case and not for 28 : * generic use! 29 : */ 30 : static inline bool i2c_in_atomic_xfer_mode(void) 31 : { 32 0 : return system_state > SYSTEM_RUNNING && irqs_disabled(); 33 : } 34 : 35 0 : static inline int __i2c_lock_bus_helper(struct i2c_adapter *adap) 36 : { 37 0 : int ret = 0; 38 : 39 0 : if (i2c_in_atomic_xfer_mode()) { 40 0 : WARN(!adap->algo->master_xfer_atomic && !adap->algo->smbus_xfer_atomic, 41 : "No atomic I2C transfer handler for '%s'\n", dev_name(&adap->dev)); 42 0 : ret = i2c_trylock_bus(adap, I2C_LOCK_SEGMENT) ? 0 : -EAGAIN; 43 : } else { 44 : i2c_lock_bus(adap, I2C_LOCK_SEGMENT); 45 : } 46 : 47 0 : return ret; 48 : } 49 : 50 0 : static inline int __i2c_check_suspended(struct i2c_adapter *adap) 51 : { 52 0 : if (test_bit(I2C_ALF_IS_SUSPENDED, &adap->locked_flags)) { 53 0 : if (!test_and_set_bit(I2C_ALF_SUSPEND_REPORTED, &adap->locked_flags)) 54 0 : dev_WARN(&adap->dev, "Transfer while suspended\n"); 55 : return -ESHUTDOWN; 56 : } 57 : 58 : return 0; 59 : } 60 : 61 : #ifdef CONFIG_ACPI 62 : void i2c_acpi_register_devices(struct i2c_adapter *adap); 63 : 64 : int i2c_acpi_get_irq(struct i2c_client *client, bool *wake_capable); 65 : #else /* CONFIG_ACPI */ 66 : static inline void i2c_acpi_register_devices(struct i2c_adapter *adap) { } 67 : 68 : static inline int i2c_acpi_get_irq(struct i2c_client *client, bool *wake_capable) 69 : { 70 : return 0; 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 : 90 : #if IS_ENABLED(CONFIG_I2C_SMBUS) 91 : int i2c_setup_smbus_alert(struct i2c_adapter *adap); 92 : #else 93 : static inline int i2c_setup_smbus_alert(struct i2c_adapter *adap) 94 : { 95 : return 0; 96 : } 97 : #endif