cachepc-linux

Fork of AMDESE/linux with modifications for CachePC side-channel attack
git clone https://git.sinitax.com/sinitax/cachepc-linux
Log | Files | Refs | README | LICENSE | sfeed.txt

i2c-core.h (2820B)


      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
      8struct 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 */
     17extern struct rw_semaphore	__i2c_board_lock;
     18extern struct list_head	__i2c_board_list;
     19extern int		__i2c_first_dynamic_bus_num;
     20
     21int i2c_check_7bit_addr_validity_strict(unsigned short addr);
     22int 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 */
     30static inline bool i2c_in_atomic_xfer_mode(void)
     31{
     32	return system_state > SYSTEM_RUNNING && irqs_disabled();
     33}
     34
     35static inline int __i2c_lock_bus_helper(struct i2c_adapter *adap)
     36{
     37	int ret = 0;
     38
     39	if (i2c_in_atomic_xfer_mode()) {
     40		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		ret = i2c_trylock_bus(adap, I2C_LOCK_SEGMENT) ? 0 : -EAGAIN;
     43	} else {
     44		i2c_lock_bus(adap, I2C_LOCK_SEGMENT);
     45	}
     46
     47	return ret;
     48}
     49
     50static inline int __i2c_check_suspended(struct i2c_adapter *adap)
     51{
     52	if (test_bit(I2C_ALF_IS_SUSPENDED, &adap->locked_flags)) {
     53		if (!test_and_set_bit(I2C_ALF_SUSPEND_REPORTED, &adap->locked_flags))
     54			dev_WARN(&adap->dev, "Transfer while suspended\n");
     55		return -ESHUTDOWN;
     56	}
     57
     58	return 0;
     59}
     60
     61#ifdef CONFIG_ACPI
     62void i2c_acpi_register_devices(struct i2c_adapter *adap);
     63
     64int i2c_acpi_get_irq(struct i2c_client *client);
     65#else /* CONFIG_ACPI */
     66static inline void i2c_acpi_register_devices(struct i2c_adapter *adap) { }
     67
     68static inline int i2c_acpi_get_irq(struct i2c_client *client)
     69{
     70	return 0;
     71}
     72#endif /* CONFIG_ACPI */
     73extern struct notifier_block i2c_acpi_notifier;
     74
     75#ifdef CONFIG_ACPI_I2C_OPREGION
     76int i2c_acpi_install_space_handler(struct i2c_adapter *adapter);
     77void i2c_acpi_remove_space_handler(struct i2c_adapter *adapter);
     78#else /* CONFIG_ACPI_I2C_OPREGION */
     79static inline int i2c_acpi_install_space_handler(struct i2c_adapter *adapter) { return 0; }
     80static inline void i2c_acpi_remove_space_handler(struct i2c_adapter *adapter) { }
     81#endif /* CONFIG_ACPI_I2C_OPREGION */
     82
     83#ifdef CONFIG_OF
     84void of_i2c_register_devices(struct i2c_adapter *adap);
     85#else
     86static inline void of_i2c_register_devices(struct i2c_adapter *adap) { }
     87#endif
     88extern struct notifier_block i2c_of_notifier;
     89
     90#if IS_ENABLED(CONFIG_I2C_SMBUS)
     91int i2c_setup_smbus_alert(struct i2c_adapter *adap);
     92#else
     93static inline int i2c_setup_smbus_alert(struct i2c_adapter *adap)
     94{
     95	return 0;
     96}
     97#endif