diff options
author | Phil Reid <preid@electromag.com.au> | 2017-08-24 05:31:03 -0400 |
---|---|---|
committer | Wolfram Sang <wsa@the-dreams.de> | 2017-10-28 17:42:47 -0400 |
commit | 69d17246ab255dda8e71c8d65396b4aa6121b7ad (patch) | |
tree | 9ed40351baed0773b7152f1b69996a454ef3b7c3 | |
parent | 3c0a60bee1d157d4ed9ae6a9727d508158d002c7 (diff) |
i2c: i2c-smbus: add of_i2c_setup_smbus_alert
This commit adds of_i2c_setup_smbus_alert which allows the smbalert
driver to be attached to an i2c adapter via the device tree.
Signed-off-by: Phil Reid <preid@electromag.com.au>
Acked-by: Rob Herring <robh@kernel.org>
Signed-off-by: Wolfram Sang <wsa@the-dreams.de>
-rw-r--r-- | Documentation/devicetree/bindings/i2c/i2c.txt | 4 | ||||
-rw-r--r-- | drivers/i2c/i2c-core-smbus.c | 22 | ||||
-rw-r--r-- | drivers/i2c/i2c-smbus.c | 10 | ||||
-rw-r--r-- | include/linux/i2c-smbus.h | 9 |
4 files changed, 42 insertions, 3 deletions
diff --git a/Documentation/devicetree/bindings/i2c/i2c.txt b/Documentation/devicetree/bindings/i2c/i2c.txt index cee9d5055fa2..11263982470e 100644 --- a/Documentation/devicetree/bindings/i2c/i2c.txt +++ b/Documentation/devicetree/bindings/i2c/i2c.txt | |||
@@ -59,8 +59,8 @@ wants to support one of the below features, it should adapt the bindings below. | |||
59 | interrupts used by the device. | 59 | interrupts used by the device. |
60 | 60 | ||
61 | - interrupt-names | 61 | - interrupt-names |
62 | "irq" and "wakeup" names are recognized by I2C core, other names are | 62 | "irq", "wakeup" and "smbus_alert" names are recognized by I2C core, |
63 | left to individual drivers. | 63 | other names are left to individual drivers. |
64 | 64 | ||
65 | - host-notify | 65 | - host-notify |
66 | device uses SMBus host notify protocol instead of interrupt line. | 66 | device uses SMBus host notify protocol instead of interrupt line. |
diff --git a/drivers/i2c/i2c-core-smbus.c b/drivers/i2c/i2c-core-smbus.c index 7f3ec02f085a..4bb9927afd01 100644 --- a/drivers/i2c/i2c-core-smbus.c +++ b/drivers/i2c/i2c-core-smbus.c | |||
@@ -625,3 +625,25 @@ struct i2c_client *i2c_setup_smbus_alert(struct i2c_adapter *adapter, | |||
625 | return i2c_new_device(adapter, &ara_board_info); | 625 | return i2c_new_device(adapter, &ara_board_info); |
626 | } | 626 | } |
627 | EXPORT_SYMBOL_GPL(i2c_setup_smbus_alert); | 627 | EXPORT_SYMBOL_GPL(i2c_setup_smbus_alert); |
628 | |||
629 | #if IS_ENABLED(CONFIG_I2C_SMBUS) && IS_ENABLED(CONFIG_OF) | ||
630 | int of_i2c_setup_smbus_alert(struct i2c_adapter *adapter) | ||
631 | { | ||
632 | struct i2c_client *client; | ||
633 | int irq; | ||
634 | |||
635 | irq = of_property_match_string(adapter->dev.of_node, "interrupt-names", | ||
636 | "smbus_alert"); | ||
637 | if (irq == -EINVAL || irq == -ENODATA) | ||
638 | return 0; | ||
639 | else if (irq < 0) | ||
640 | return irq; | ||
641 | |||
642 | client = i2c_setup_smbus_alert(adapter, NULL); | ||
643 | if (!client) | ||
644 | return -ENODEV; | ||
645 | |||
646 | return 0; | ||
647 | } | ||
648 | EXPORT_SYMBOL_GPL(of_i2c_setup_smbus_alert); | ||
649 | #endif | ||
diff --git a/drivers/i2c/i2c-smbus.c b/drivers/i2c/i2c-smbus.c index d0bb0358b578..5a1dd7f13bac 100644 --- a/drivers/i2c/i2c-smbus.c +++ b/drivers/i2c/i2c-smbus.c | |||
@@ -21,6 +21,7 @@ | |||
21 | #include <linux/interrupt.h> | 21 | #include <linux/interrupt.h> |
22 | #include <linux/kernel.h> | 22 | #include <linux/kernel.h> |
23 | #include <linux/module.h> | 23 | #include <linux/module.h> |
24 | #include <linux/of_irq.h> | ||
24 | #include <linux/slab.h> | 25 | #include <linux/slab.h> |
25 | #include <linux/workqueue.h> | 26 | #include <linux/workqueue.h> |
26 | 27 | ||
@@ -139,7 +140,14 @@ static int smbalert_probe(struct i2c_client *ara, | |||
139 | if (!alert) | 140 | if (!alert) |
140 | return -ENOMEM; | 141 | return -ENOMEM; |
141 | 142 | ||
142 | irq = setup->irq; | 143 | if (setup) { |
144 | irq = setup->irq; | ||
145 | } else { | ||
146 | irq = of_irq_get_byname(adapter->dev.of_node, "smbus_alert"); | ||
147 | if (irq <= 0) | ||
148 | return irq; | ||
149 | } | ||
150 | |||
143 | INIT_WORK(&alert->alert, smbalert_work); | 151 | INIT_WORK(&alert->alert, smbalert_work); |
144 | alert->ara = ara; | 152 | alert->ara = ara; |
145 | 153 | ||
diff --git a/include/linux/i2c-smbus.h b/include/linux/i2c-smbus.h index 19efbd14e812..fb0e040b1abb 100644 --- a/include/linux/i2c-smbus.h +++ b/include/linux/i2c-smbus.h | |||
@@ -49,4 +49,13 @@ struct i2c_client *i2c_setup_smbus_alert(struct i2c_adapter *adapter, | |||
49 | struct i2c_smbus_alert_setup *setup); | 49 | struct i2c_smbus_alert_setup *setup); |
50 | int i2c_handle_smbus_alert(struct i2c_client *ara); | 50 | int i2c_handle_smbus_alert(struct i2c_client *ara); |
51 | 51 | ||
52 | #if IS_ENABLED(CONFIG_I2C_SMBUS) && IS_ENABLED(CONFIG_OF) | ||
53 | int of_i2c_setup_smbus_alert(struct i2c_adapter *adap); | ||
54 | #else | ||
55 | static inline int of_i2c_setup_smbus_alert(struct i2c_adapter *adap) | ||
56 | { | ||
57 | return 0; | ||
58 | } | ||
59 | #endif | ||
60 | |||
52 | #endif /* _LINUX_I2C_SMBUS_H */ | 61 | #endif /* _LINUX_I2C_SMBUS_H */ |