mfd: axp20x: Use IRQF_TRIGGER_LOW on the axp288
authorHans de Goede <hdegoede@redhat.com>
Wed, 14 Dec 2016 13:52:05 +0000 (14:52 +0100)
committerLee Jones <lee.jones@linaro.org>
Mon, 13 Feb 2017 09:29:40 +0000 (09:29 +0000)
The interrupt line of the entire family of axp2xx pmics is active-low,
for devicetree enumerated irqs, this is dealt with in the devicetree.

ACPI irq resources have a flag field for this too, I tried using this
on my CUBE iwork8 Air tablet, but it does not contain the right data.

The dstd shows the irq listed as either ActiveLow or ActiveHigh,
depending on the OSID variable, which seems to be set by the
"OS IMAGE ID" in the BIOS/EFI setup screen.

Since the acpi-resource info is no good, simply pass in IRQF_TRIGGER_LOW
on the axp288.

Together with the other axp288 fixes in this series, this fixes the axp288
irq contineously triggering.

Signed-off-by: Hans de Goede <hdegoede@redhat.com>
Acked-by: Chen-Yu Tsai <wens@csie.org>
Signed-off-by: Lee Jones <lee.jones@linaro.org>
drivers/mfd/axp20x.c
include/linux/mfd/axp20x.h

index ed918de84238c33d83c9f60f26db069bec14a82d..f124bc36f65d6acee54abc42ad10993f4a8cf681 100644 (file)
@@ -802,6 +802,7 @@ int axp20x_match_device(struct axp20x_dev *axp20x)
                axp20x->nr_cells = ARRAY_SIZE(axp288_cells);
                axp20x->regmap_cfg = &axp288_regmap_config;
                axp20x->regmap_irq_chip = &axp288_regmap_irq_chip;
+               axp20x->irq_flags = IRQF_TRIGGER_LOW;
                break;
        case AXP806_ID:
                axp20x->nr_cells = ARRAY_SIZE(axp806_cells);
@@ -831,9 +832,8 @@ int axp20x_device_probe(struct axp20x_dev *axp20x)
        int ret;
 
        ret = regmap_add_irq_chip(axp20x->regmap, axp20x->irq,
-                                 IRQF_ONESHOT | IRQF_SHARED, -1,
-                                 axp20x->regmap_irq_chip,
-                                 &axp20x->regmap_irqc);
+                         IRQF_ONESHOT | IRQF_SHARED | axp20x->irq_flags,
+                          -1, axp20x->regmap_irq_chip, &axp20x->regmap_irqc);
        if (ret) {
                dev_err(axp20x->dev, "failed to add irq chip: %d\n", ret);
                return ret;
index 39f1da18c9175c53da4066146d1386dc0cb6b132..6d5dd3f96d330d4f6eb4a512909cec1ec6a7e9e9 100644 (file)
@@ -523,6 +523,7 @@ enum axp809_irqs {
 struct axp20x_dev {
        struct device                   *dev;
        int                             irq;
+       unsigned long                   irq_flags;
        struct regmap                   *regmap;
        struct regmap_irq_chip_data     *regmap_irqc;
        long                            variant;