mfd: max77686: Do not enforce (incorrect) interrupt trigger type
authorKrzysztof Kozlowski <krzk@kernel.org>
Wed, 2 Jun 2021 11:04:43 +0000 (13:04 +0200)
committerLee Jones <lee.jones@linaro.org>
Fri, 5 Nov 2021 14:40:06 +0000 (14:40 +0000)
Interrupt line can be configured on different hardware in different way,
even inverted.  Therefore driver should not enforce specific trigger
type - edge falling - but instead rely on Devicetree to configure it.

The Maxim 77686 datasheet describes the interrupt line as active low
with a requirement of acknowledge from the CPU therefore the edge
falling is not correct.

The interrupt line is shared between PMIC and RTC driver, so using level
sensitive interrupt is here especially important to avoid races.  With
an edge configuration in case if first PMIC signals interrupt followed
shortly after by the RTC, the interrupt might not be yet cleared/acked
thus the second one would not be noticed.

Signed-off-by: Krzysztof Kozlowski <krzk@kernel.org>
Acked-by: Rob Herring <robh@kernel.org>
Signed-off-by: Lee Jones <lee.jones@linaro.org>
Link: https://lore.kernel.org/r/20210602110445.33536-2-krzysztof.kozlowski@canonical.com
Documentation/devicetree/bindings/clock/maxim,max77686.txt
Documentation/devicetree/bindings/mfd/max77686.txt
Documentation/devicetree/bindings/regulator/max77686.txt
drivers/mfd/max77686.c

index 3472b461ca9354c6dda17b585dfeb6a0ec202375..c10849efb4440cd0008b8010feb0cc08194e11d5 100644 (file)
@@ -49,7 +49,7 @@ Example:
                max77686: max77686@9 {
                        compatible = "maxim,max77686";
                        interrupt-parent = <&wakeup_eint>;
-                       interrupts = <26 0>;
+                       interrupts = <26 IRQ_TYPE_LEVEL_LOW>;
                        reg = <0x09>;
                        #clock-cells = <1>;
 
@@ -74,7 +74,7 @@ Example:
                max77802: max77802@9 {
                        compatible = "maxim,max77802";
                        interrupt-parent = <&wakeup_eint>;
-                       interrupts = <26 0>;
+                       interrupts = <26 IRQ_TYPE_LEVEL_LOW>;
                        reg = <0x09>;
                        #clock-cells = <1>;
 
index 42968b7144e009fe618e523e7720d91618945c26..4447d074894a29b6efee8ee5d9476a6a559b2ea0 100644 (file)
@@ -21,6 +21,6 @@ Example:
        max77686: pmic@9 {
                compatible = "maxim,max77686";
                interrupt-parent = <&wakeup_eint>;
-               interrupts = <26 0>;
+               interrupts = <26 IRQ_TYPE_LEVEL_LOW>;
                reg = <0x09>;
        };
index e9f7578ca09a2babc5c0a87e75bde6eb0ee2af37..ff3d2dec8c4ba4dd43db720d3a78aa5aea074bdd 100644 (file)
@@ -43,7 +43,7 @@ Example:
        max77686: pmic@9 {
                compatible = "maxim,max77686";
                interrupt-parent = <&wakeup_eint>;
-               interrupts = <26 IRQ_TYPE_NONE>;
+               interrupts = <26 IRQ_TYPE_LEVEL_LOW>;
                reg = <0x09>;
 
                voltage-regulators {
index 2ad554b921d96ad0dffe4c204e1ee353abd444e5..f9e12ab2bc7584ddfa55c24c29a3c2ada1a285e3 100644 (file)
@@ -209,8 +209,7 @@ static int max77686_i2c_probe(struct i2c_client *i2c)
 
        ret = devm_regmap_add_irq_chip(&i2c->dev, max77686->regmap,
                                       max77686->irq,
-                                      IRQF_TRIGGER_FALLING | IRQF_ONESHOT |
-                                      IRQF_SHARED, 0, irq_chip,
+                                      IRQF_ONESHOT | IRQF_SHARED, 0, irq_chip,
                                       &max77686->irq_data);
        if (ret < 0) {
                dev_err(&i2c->dev, "failed to add PMIC irq chip: %d\n", ret);