提交 b4f21054 编写于 作者: B Benjamin Tissoires 提交者: Wolfram Sang

i2c: add a protocol parameter to the alert callback

.alert() is meant to be generic, but there is currently no way
for the device driver to know which protocol generated the alert.
Add a parameter in .alert() to help the device driver to understand
what is given in data.

This patch is required to have the support of SMBus Host Notify protocol
through .alert().
Tested-by: NAndrew Duggan <aduggan@synaptics.com>
For hwmon:
Acked-by: NGuenter Roeck <linux@roeck-us.net>
For IPMI:
Acked-by: NCorey Minyard <cminyard@mvista.com>
Signed-off-by: NBenjamin Tissoires <benjamin.tissoires@redhat.com>
Signed-off-by: NWolfram Sang <wsa@the-dreams.de>
上级 33c77abc
...@@ -568,12 +568,16 @@ static void retry_timeout(unsigned long data) ...@@ -568,12 +568,16 @@ static void retry_timeout(unsigned long data)
} }
static void ssif_alert(struct i2c_client *client, unsigned int data) static void ssif_alert(struct i2c_client *client, enum i2c_alert_protocol type,
unsigned int data)
{ {
struct ssif_info *ssif_info = i2c_get_clientdata(client); struct ssif_info *ssif_info = i2c_get_clientdata(client);
unsigned long oflags, *flags; unsigned long oflags, *flags;
bool do_get = false; bool do_get = false;
if (type != I2C_PROTOCOL_SMBUS_ALERT)
return;
ssif_inc_stat(ssif_info, alerts); ssif_inc_stat(ssif_info, alerts);
flags = ipmi_ssif_lock_cond(ssif_info, &oflags); flags = ipmi_ssif_lock_cond(ssif_info, &oflags);
......
...@@ -1624,10 +1624,14 @@ static int lm90_remove(struct i2c_client *client) ...@@ -1624,10 +1624,14 @@ static int lm90_remove(struct i2c_client *client)
return 0; return 0;
} }
static void lm90_alert(struct i2c_client *client, unsigned int flag) static void lm90_alert(struct i2c_client *client, enum i2c_alert_protocol type,
unsigned int flag)
{ {
u16 alarms; u16 alarms;
if (type != I2C_PROTOCOL_SMBUS_ALERT)
return;
if (lm90_is_tripped(client, &alarms)) { if (lm90_is_tripped(client, &alarms)) {
/* /*
* Disable ALERT# output, because these chips don't implement * Disable ALERT# output, because these chips don't implement
......
...@@ -56,7 +56,8 @@ static int smbus_do_alert(struct device *dev, void *addrp) ...@@ -56,7 +56,8 @@ static int smbus_do_alert(struct device *dev, void *addrp)
if (client->dev.driver) { if (client->dev.driver) {
driver = to_i2c_driver(client->dev.driver); driver = to_i2c_driver(client->dev.driver);
if (driver->alert) if (driver->alert)
driver->alert(client, data->flag); driver->alert(client, I2C_PROTOCOL_SMBUS_ALERT,
data->flag);
else else
dev_warn(&client->dev, "no driver alert()!\n"); dev_warn(&client->dev, "no driver alert()!\n");
} else } else
......
...@@ -126,6 +126,10 @@ i2c_smbus_read_i2c_block_data_or_emulated(const struct i2c_client *client, ...@@ -126,6 +126,10 @@ i2c_smbus_read_i2c_block_data_or_emulated(const struct i2c_client *client,
u8 command, u8 length, u8 *values); u8 command, u8 length, u8 *values);
#endif /* I2C */ #endif /* I2C */
enum i2c_alert_protocol {
I2C_PROTOCOL_SMBUS_ALERT,
};
/** /**
* struct i2c_driver - represent an I2C device driver * struct i2c_driver - represent an I2C device driver
* @class: What kind of i2c device we instantiate (for detect) * @class: What kind of i2c device we instantiate (for detect)
...@@ -181,7 +185,8 @@ struct i2c_driver { ...@@ -181,7 +185,8 @@ struct i2c_driver {
* For the SMBus alert protocol, there is a single bit of data passed * For the SMBus alert protocol, there is a single bit of data passed
* as the alert response's low bit ("event flag"). * as the alert response's low bit ("event flag").
*/ */
void (*alert)(struct i2c_client *, unsigned int data); void (*alert)(struct i2c_client *, enum i2c_alert_protocol protocol,
unsigned int data);
/* a ioctl like command that can be used to perform specific functions /* a ioctl like command that can be used to perform specific functions
* with the device. * with the device.
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册