@@ -24,6 +24,8 @@
#include <linux/mfd/arizona/core.h>
#include <linux/mfd/arizona/registers.h>
+#include <linux/acpi.h>
+#include "../gpio/gpiolib.h"
#include "arizona.h"
static int arizona_map_irq(struct arizona *arizona, int irq)
@@ -190,6 +192,7 @@ int arizona_irq_init(struct arizona *arizona)
int ret, i;
const struct regmap_irq_chip *aod, *irq;
struct irq_data *irq_data;
+ struct gpio_desc *acpi_gpio;
arizona->ctrlif_error = true;
@@ -334,6 +337,15 @@ int arizona_irq_init(struct arizona *arizona)
}
/* Used to emulate edge trigger and to work around broken pinmux */
+
+ /* If the irq is not defined by pdata, but is defined in ACPI, set the gpio number
+ into the pdata to fix the pinmux */
+ if (arizona->pdata.irq_gpio <= 0) {
+ acpi_gpio=acpi_get_gpiod_by_index(ACPI_COMPANION(arizona->dev),NULL,0,NULL);
+ if (!IS_ERR(acpi_gpio))
+ arizona->pdata.irq_gpio=desc_to_gpio(acpi_gpio);
+ }
+
if (arizona->pdata.irq_gpio) {
if (gpio_to_irq(arizona->pdata.irq_gpio) != arizona->irq) {
dev_warn(arizona->dev, "IRQ %d is not GPIO %d (%d)\n",