|
@@ -89,6 +89,7 @@
|
|
|
#include <linux/err.h>
|
|
|
#include <linux/mutex.h>
|
|
|
#include <linux/sysfs.h>
|
|
|
+#include <linux/interrupt.h>
|
|
|
|
|
|
/*
|
|
|
* Addresses to scan
|
|
@@ -1445,6 +1446,17 @@ static bool lm90_is_tripped(struct i2c_client *client, u16 *status)
|
|
|
return true;
|
|
|
}
|
|
|
|
|
|
+static irqreturn_t lm90_irq_thread(int irq, void *dev_id)
|
|
|
+{
|
|
|
+ struct i2c_client *client = dev_id;
|
|
|
+ u16 status;
|
|
|
+
|
|
|
+ if (lm90_is_tripped(client, &status))
|
|
|
+ return IRQ_HANDLED;
|
|
|
+ else
|
|
|
+ return IRQ_NONE;
|
|
|
+}
|
|
|
+
|
|
|
static int lm90_probe(struct i2c_client *client,
|
|
|
const struct i2c_device_id *id)
|
|
|
{
|
|
@@ -1521,6 +1533,18 @@ static int lm90_probe(struct i2c_client *client,
|
|
|
goto exit_remove_files;
|
|
|
}
|
|
|
|
|
|
+ if (client->irq) {
|
|
|
+ dev_dbg(dev, "IRQ: %d\n", client->irq);
|
|
|
+ err = devm_request_threaded_irq(dev, client->irq,
|
|
|
+ NULL, lm90_irq_thread,
|
|
|
+ IRQF_TRIGGER_LOW | IRQF_ONESHOT,
|
|
|
+ "lm90", client);
|
|
|
+ if (err < 0) {
|
|
|
+ dev_err(dev, "cannot request IRQ %d\n", client->irq);
|
|
|
+ goto exit_remove_files;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
return 0;
|
|
|
|
|
|
exit_remove_files:
|