mirror of
https://mirrors.bfsu.edu.cn/git/linux.git
synced 2024-12-14 06:24:53 +08:00
c942fddf87
Based on 3 normalized pattern(s): this program is free software you can redistribute it and or modify it under the terms of the gnu general public license as published by the free software foundation either version 2 of the license or at your option any later version this program is distributed in the hope that it will be useful but without any warranty without even the implied warranty of merchantability or fitness for a particular purpose see the gnu general public license for more details this program is free software you can redistribute it and or modify it under the terms of the gnu general public license as published by the free software foundation either version 2 of the license or at your option any later version [author] [kishon] [vijay] [abraham] [i] [kishon]@[ti] [com] this program is distributed in the hope that it will be useful but without any warranty without even the implied warranty of merchantability or fitness for a particular purpose see the gnu general public license for more details this program is free software you can redistribute it and or modify it under the terms of the gnu general public license as published by the free software foundation either version 2 of the license or at your option any later version [author] [graeme] [gregory] [gg]@[slimlogic] [co] [uk] [author] [kishon] [vijay] [abraham] [i] [kishon]@[ti] [com] [based] [on] [twl6030]_[usb] [c] [author] [hema] [hk] [hemahk]@[ti] [com] this program is distributed in the hope that it will be useful but without any warranty without even the implied warranty of merchantability or fitness for a particular purpose see the gnu general public license for more details extracted by the scancode license scanner the SPDX license identifier GPL-2.0-or-later has been chosen to replace the boilerplate/reference in 1105 file(s). Signed-off-by: Thomas Gleixner <tglx@linutronix.de> Reviewed-by: Allison Randal <allison@lohutok.net> Reviewed-by: Richard Fontana <rfontana@redhat.com> Reviewed-by: Kate Stewart <kstewart@linuxfoundation.org> Cc: linux-spdx@vger.kernel.org Link: https://lkml.kernel.org/r/20190527070033.202006027@linutronix.de Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
89 lines
2.6 KiB
C
89 lines
2.6 KiB
C
/* SPDX-License-Identifier: GPL-2.0-or-later */
|
|
/*
|
|
* i2c-core.h - interfaces internal to the I2C framework
|
|
*/
|
|
|
|
#include <linux/rwsem.h>
|
|
|
|
struct i2c_devinfo {
|
|
struct list_head list;
|
|
int busnum;
|
|
struct i2c_board_info board_info;
|
|
};
|
|
|
|
/* board_lock protects board_list and first_dynamic_bus_num.
|
|
* only i2c core components are allowed to use these symbols.
|
|
*/
|
|
extern struct rw_semaphore __i2c_board_lock;
|
|
extern struct list_head __i2c_board_list;
|
|
extern int __i2c_first_dynamic_bus_num;
|
|
|
|
int i2c_check_7bit_addr_validity_strict(unsigned short addr);
|
|
|
|
/*
|
|
* We only allow atomic transfers for very late communication, e.g. to send
|
|
* the powerdown command to a PMIC. Atomic transfers are a corner case and not
|
|
* for generic use!
|
|
*/
|
|
static inline bool i2c_in_atomic_xfer_mode(void)
|
|
{
|
|
return system_state > SYSTEM_RUNNING && irqs_disabled();
|
|
}
|
|
|
|
static inline int __i2c_lock_bus_helper(struct i2c_adapter *adap)
|
|
{
|
|
int ret = 0;
|
|
|
|
if (i2c_in_atomic_xfer_mode()) {
|
|
WARN(!adap->algo->master_xfer_atomic && !adap->algo->smbus_xfer_atomic,
|
|
"No atomic I2C transfer handler for '%s'\n", dev_name(&adap->dev));
|
|
ret = i2c_trylock_bus(adap, I2C_LOCK_SEGMENT) ? 0 : -EAGAIN;
|
|
} else {
|
|
i2c_lock_bus(adap, I2C_LOCK_SEGMENT);
|
|
}
|
|
|
|
return ret;
|
|
}
|
|
|
|
static inline int __i2c_check_suspended(struct i2c_adapter *adap)
|
|
{
|
|
if (test_bit(I2C_ALF_IS_SUSPENDED, &adap->locked_flags)) {
|
|
if (!test_and_set_bit(I2C_ALF_SUSPEND_REPORTED, &adap->locked_flags))
|
|
dev_WARN(&adap->dev, "Transfer while suspended\n");
|
|
return -ESHUTDOWN;
|
|
}
|
|
|
|
return 0;
|
|
}
|
|
|
|
#ifdef CONFIG_ACPI
|
|
const struct acpi_device_id *
|
|
i2c_acpi_match_device(const struct acpi_device_id *matches,
|
|
struct i2c_client *client);
|
|
void i2c_acpi_register_devices(struct i2c_adapter *adap);
|
|
#else /* CONFIG_ACPI */
|
|
static inline void i2c_acpi_register_devices(struct i2c_adapter *adap) { }
|
|
static inline const struct acpi_device_id *
|
|
i2c_acpi_match_device(const struct acpi_device_id *matches,
|
|
struct i2c_client *client)
|
|
{
|
|
return NULL;
|
|
}
|
|
#endif /* CONFIG_ACPI */
|
|
extern struct notifier_block i2c_acpi_notifier;
|
|
|
|
#ifdef CONFIG_ACPI_I2C_OPREGION
|
|
int i2c_acpi_install_space_handler(struct i2c_adapter *adapter);
|
|
void i2c_acpi_remove_space_handler(struct i2c_adapter *adapter);
|
|
#else /* CONFIG_ACPI_I2C_OPREGION */
|
|
static inline int i2c_acpi_install_space_handler(struct i2c_adapter *adapter) { return 0; }
|
|
static inline void i2c_acpi_remove_space_handler(struct i2c_adapter *adapter) { }
|
|
#endif /* CONFIG_ACPI_I2C_OPREGION */
|
|
|
|
#ifdef CONFIG_OF
|
|
void of_i2c_register_devices(struct i2c_adapter *adap);
|
|
#else
|
|
static inline void of_i2c_register_devices(struct i2c_adapter *adap) { }
|
|
#endif
|
|
extern struct notifier_block i2c_of_notifier;
|