|
@@ -17,6 +17,7 @@
|
|
|
#include <linux/device.h>
|
|
|
#include <linux/err.h>
|
|
|
#include <linux/i2c.h>
|
|
|
+#include <linux/i2c-smbus.h>
|
|
|
|
|
|
#define CREATE_TRACE_POINTS
|
|
|
#include <trace/events/smbus.h>
|
|
@@ -592,3 +593,35 @@ s32 i2c_smbus_read_i2c_block_data_or_emulated(const struct i2c_client *client,
|
|
|
return i;
|
|
|
}
|
|
|
EXPORT_SYMBOL(i2c_smbus_read_i2c_block_data_or_emulated);
|
|
|
+
|
|
|
+/**
|
|
|
+ * i2c_setup_smbus_alert - Setup SMBus alert support
|
|
|
+ * @adapter: the target adapter
|
|
|
+ * @setup: setup data for the SMBus alert handler
|
|
|
+ * Context: can sleep
|
|
|
+ *
|
|
|
+ * Setup handling of the SMBus alert protocol on a given I2C bus segment.
|
|
|
+ *
|
|
|
+ * Handling can be done either through our IRQ handler, or by the
|
|
|
+ * adapter (from its handler, periodic polling, or whatever).
|
|
|
+ *
|
|
|
+ * NOTE that if we manage the IRQ, we *MUST* know if it's level or
|
|
|
+ * edge triggered in order to hand it to the workqueue correctly.
|
|
|
+ * If triggering the alert seems to wedge the system, you probably
|
|
|
+ * should have said it's level triggered.
|
|
|
+ *
|
|
|
+ * This returns the ara client, which should be saved for later use with
|
|
|
+ * i2c_handle_smbus_alert() and ultimately i2c_unregister_device(); or NULL
|
|
|
+ * to indicate an error.
|
|
|
+ */
|
|
|
+struct i2c_client *i2c_setup_smbus_alert(struct i2c_adapter *adapter,
|
|
|
+ struct i2c_smbus_alert_setup *setup)
|
|
|
+{
|
|
|
+ struct i2c_board_info ara_board_info = {
|
|
|
+ I2C_BOARD_INFO("smbus_alert", 0x0c),
|
|
|
+ .platform_data = setup,
|
|
|
+ };
|
|
|
+
|
|
|
+ return i2c_new_device(adapter, &ara_board_info);
|
|
|
+}
|
|
|
+EXPORT_SYMBOL_GPL(i2c_setup_smbus_alert);
|