mirror of
https://github.com/torvalds/linux.git
synced 2024-11-22 20:22:09 +00:00
16c9db1dd8
Bring the ACPI path in sync with the device tree path and handle all the IRQ fetching at probe time. This leaves the only IRQ handling at device registration time being that which is passed directly through the board info as either a resource or an actual IRQ number. Reviewed-by: Andy Shevchenko <andriy.shevchenko@linux.intel.com> Signed-off-by: Charles Keepax <ckeepax@opensource.cirrus.com> Reviewed-by: Mika Westerberg <mika.westerberg@linux.intel.com> Signed-off-by: Wolfram Sang <wsa@the-dreams.de>
107 lines
3.3 KiB
C
107 lines
3.3 KiB
C
/*
|
|
* i2c-core.h - interfaces internal to the I2C framework
|
|
*
|
|
* 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.
|
|
*/
|
|
|
|
#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);
|
|
int i2c_dev_irq_from_resources(const struct resource *resources,
|
|
unsigned int num_resources);
|
|
|
|
/*
|
|
* 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);
|
|
|
|
int i2c_acpi_get_irq(struct i2c_client *client);
|
|
#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;
|
|
}
|
|
|
|
static inline int i2c_acpi_get_irq(struct i2c_client *client)
|
|
{
|
|
return 0;
|
|
}
|
|
#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;
|