2012-10-04 03:15:48

by Fabio Estevam

[permalink] [raw]
Subject: [PATCH 1/6] mfd: da9052-core: Use regmap_irq_get_virq() and fix the probe

From: Fabio Estevam <[email protected]>

On a mx53qsb dt-kernel the da9052-core driver fails to probe as follows:

da9052 1-0048: DA9052 ADC IRQ failed ret=-22

The reason for the error was due to passing only the offset as the interrupt
number in request_threaded_irq() without da9052->irq_base.

The recommended approach though is to use regmap_get_virq() to acquire the
interrupt number and this allows to get rid of da9052->irq_base.

Fix it and allow the driver to probe successfully.

Also provide a few more error logs and change the irq string to "adc-irq", so
that it appears as a single word in 'cat /proc/interrupts'

Signed-off-by: Fabio Estevam <[email protected]>
---
drivers/mfd/da9052-core.c | 34 +++++++++++++++++++---------------
1 file changed, 19 insertions(+), 15 deletions(-)

diff --git a/drivers/mfd/da9052-core.c b/drivers/mfd/da9052-core.c
index a0a62b2..c96cdbc 100644
--- a/drivers/mfd/da9052-core.c
+++ b/drivers/mfd/da9052-core.c
@@ -769,10 +769,15 @@ struct regmap_config da9052_regmap_config = {
};
EXPORT_SYMBOL_GPL(da9052_regmap_config);

+static int da9052_map_irq(struct da9052 *da9052, int irq)
+{
+ return regmap_irq_get_virq(da9052->irq_data, irq);
+}
+
int __devinit da9052_device_init(struct da9052 *da9052, u8 chip_id)
{
struct da9052_pdata *pdata = da9052->dev->platform_data;
- int ret;
+ int ret, i;

mutex_init(&da9052->auxadc_lock);
init_completion(&da9052->done);
@@ -782,35 +787,34 @@ int __devinit da9052_device_init(struct da9052 *da9052, u8 chip_id)

da9052->chip_id = chip_id;

- if (!pdata || !pdata->irq_base)
- da9052->irq_base = -1;
- else
- da9052->irq_base = pdata->irq_base;
-
ret = regmap_add_irq_chip(da9052->regmap, da9052->chip_irq,
IRQF_TRIGGER_LOW | IRQF_ONESHOT,
- da9052->irq_base, &da9052_regmap_irq_chip,
+ -1, &da9052_regmap_irq_chip,
&da9052->irq_data);
- if (ret < 0)
+ if (ret < 0) {
+ dev_err(da9052->dev, "regmap_add_irq_chip failed: %d\n", ret);
goto regmap_err;
+ }

- da9052->irq_base = regmap_irq_chip_get_base(da9052->irq_data);
-
- ret = request_threaded_irq(DA9052_IRQ_ADC_EOM, NULL, da9052_auxadc_irq,
+ i = da9052_map_irq(da9052, DA9052_IRQ_ADC_EOM);
+ ret = request_threaded_irq(i, NULL, da9052_auxadc_irq,
IRQF_TRIGGER_LOW | IRQF_ONESHOT,
- "adc irq", da9052);
+ "adc-irq", da9052);
if (ret != 0)
dev_err(da9052->dev, "DA9052 ADC IRQ failed ret=%d\n", ret);

ret = mfd_add_devices(da9052->dev, -1, da9052_subdev_info,
ARRAY_SIZE(da9052_subdev_info), NULL, 0, NULL);
- if (ret)
+ if (ret) {
+ dev_err(da9052->dev, "mfd_add_devices failed: %d\n", ret);
goto err;
+ }

return 0;

err:
- free_irq(DA9052_IRQ_ADC_EOM, da9052);
+ free_irq(da9052_map_irq(da9052, DA9052_IRQ_ADC_EOM), da9052);
+ regmap_del_irq_chip(da9052->chip_irq, da9052->irq_data);
mfd_remove_devices(da9052->dev);
regmap_err:
return ret;
@@ -818,7 +822,7 @@ regmap_err:

void da9052_device_exit(struct da9052 *da9052)
{
- free_irq(DA9052_IRQ_ADC_EOM, da9052);
+ free_irq(da9052_map_irq(da9052, DA9052_IRQ_ADC_EOM), da9052);
regmap_del_irq_chip(da9052->chip_irq, da9052->irq_data);
mfd_remove_devices(da9052->dev);
}
--
1.7.9.5


2012-10-04 03:15:54

by Fabio Estevam

[permalink] [raw]
Subject: [PATCH 2/6] mfd: da9052: Introduce da9052-irq.c

From: Fabio Estevam <[email protected]>

Create a da9052-irq.c file so that it can handle interrupt related functions.

This is useful for allowing the da9052 drivers to use such functions
when dealing with da9052 interrupts.

Signed-off-by: Fabio Estevam <[email protected]>
---
drivers/mfd/Makefile | 1 +
drivers/mfd/da9052-core.c | 271 ++--------------------------------
drivers/mfd/da9052-irq.c | 288 +++++++++++++++++++++++++++++++++++++
include/linux/mfd/da9052/da9052.h | 10 ++
4 files changed, 307 insertions(+), 263 deletions(-)
create mode 100644 drivers/mfd/da9052-irq.c

diff --git a/drivers/mfd/Makefile b/drivers/mfd/Makefile
index 083acf9..1b0e56f 100644
--- a/drivers/mfd/Makefile
+++ b/drivers/mfd/Makefile
@@ -85,6 +85,7 @@ obj-$(CONFIG_UCB1400_CORE) += ucb1400_core.o

obj-$(CONFIG_PMIC_DA903X) += da903x.o

+obj-$(CONFIG_PMIC_DA9052) += da9052-irq.o
obj-$(CONFIG_PMIC_DA9052) += da9052-core.o
obj-$(CONFIG_MFD_DA9052_SPI) += da9052-spi.o
obj-$(CONFIG_MFD_DA9052_I2C) += da9052-i2c.o
diff --git a/drivers/mfd/da9052-core.c b/drivers/mfd/da9052-core.c
index c96cdbc..2153f9bb 100644
--- a/drivers/mfd/da9052-core.c
+++ b/drivers/mfd/da9052-core.c
@@ -15,7 +15,6 @@
#include <linux/delay.h>
#include <linux/input.h>
#include <linux/interrupt.h>
-#include <linux/irq.h>
#include <linux/mfd/core.h>
#include <linux/slab.h>
#include <linux/module.h>
@@ -24,16 +23,6 @@
#include <linux/mfd/da9052/pdata.h>
#include <linux/mfd/da9052/reg.h>

-#define DA9052_NUM_IRQ_REGS 4
-#define DA9052_IRQ_MASK_POS_1 0x01
-#define DA9052_IRQ_MASK_POS_2 0x02
-#define DA9052_IRQ_MASK_POS_3 0x04
-#define DA9052_IRQ_MASK_POS_4 0x08
-#define DA9052_IRQ_MASK_POS_5 0x10
-#define DA9052_IRQ_MASK_POS_6 0x20
-#define DA9052_IRQ_MASK_POS_7 0x40
-#define DA9052_IRQ_MASK_POS_8 0x80
-
static bool da9052_reg_readable(struct device *dev, unsigned int reg)
{
switch (reg) {
@@ -425,15 +414,6 @@ err:
}
EXPORT_SYMBOL_GPL(da9052_adc_manual_read);

-static irqreturn_t da9052_auxadc_irq(int irq, void *irq_data)
-{
- struct da9052 *da9052 = irq_data;
-
- complete(&da9052->done);
-
- return IRQ_HANDLED;
-}
-
int da9052_adc_read_temp(struct da9052 *da9052)
{
int tbat;
@@ -447,74 +427,6 @@ int da9052_adc_read_temp(struct da9052 *da9052)
}
EXPORT_SYMBOL_GPL(da9052_adc_read_temp);

-static struct resource da9052_rtc_resource = {
- .name = "ALM",
- .start = DA9052_IRQ_ALARM,
- .end = DA9052_IRQ_ALARM,
- .flags = IORESOURCE_IRQ,
-};
-
-static struct resource da9052_onkey_resource = {
- .name = "ONKEY",
- .start = DA9052_IRQ_NONKEY,
- .end = DA9052_IRQ_NONKEY,
- .flags = IORESOURCE_IRQ,
-};
-
-static struct resource da9052_bat_resources[] = {
- {
- .name = "BATT TEMP",
- .start = DA9052_IRQ_TBAT,
- .end = DA9052_IRQ_TBAT,
- .flags = IORESOURCE_IRQ,
- },
- {
- .name = "DCIN DET",
- .start = DA9052_IRQ_DCIN,
- .end = DA9052_IRQ_DCIN,
- .flags = IORESOURCE_IRQ,
- },
- {
- .name = "DCIN REM",
- .start = DA9052_IRQ_DCINREM,
- .end = DA9052_IRQ_DCINREM,
- .flags = IORESOURCE_IRQ,
- },
- {
- .name = "VBUS DET",
- .start = DA9052_IRQ_VBUS,
- .end = DA9052_IRQ_VBUS,
- .flags = IORESOURCE_IRQ,
- },
- {
- .name = "VBUS REM",
- .start = DA9052_IRQ_VBUSREM,
- .end = DA9052_IRQ_VBUSREM,
- .flags = IORESOURCE_IRQ,
- },
- {
- .name = "CHG END",
- .start = DA9052_IRQ_CHGEND,
- .end = DA9052_IRQ_CHGEND,
- .flags = IORESOURCE_IRQ,
- },
-};
-
-static struct resource da9052_tsi_resources[] = {
- {
- .name = "PENDWN",
- .start = DA9052_IRQ_PENDOWN,
- .end = DA9052_IRQ_PENDOWN,
- .flags = IORESOURCE_IRQ,
- },
- {
- .name = "TSIRDY",
- .start = DA9052_IRQ_TSIREADY,
- .end = DA9052_IRQ_TSIREADY,
- .flags = IORESOURCE_IRQ,
- },
-};
-
static struct mfd_cell __devinitdata da9052_subdev_info[] = {
{
.name = "da9052-regulator",
@@ -574,13 +486,9 @@ static struct mfd_cell __devinitdata da9052_subdev_info[] = {
},
{
.name = "da9052-onkey",
- .resources = &da9052_onkey_resource,
- .num_resources = 1,
},
{
.name = "da9052-rtc",
- .resources = &da9052_rtc_resource,
- .num_resources = 1,
},
{
.name = "da9052-gpio",
@@ -602,160 +510,15 @@ static struct mfd_cell __devinitdata da9052_subdev_info[] = {
},
{
.name = "da9052-tsi",
- .resources = da9052_tsi_resources,
- .num_resources = ARRAY_SIZE(da9052_tsi_resources),
},
{
.name = "da9052-bat",
- .resources = da9052_bat_resources,
- .num_resources = ARRAY_SIZE(da9052_bat_resources),
},
{
.name = "da9052-watchdog",
},
};

-static struct regmap_irq da9052_irqs[] = {
- [DA9052_IRQ_DCIN] = {
- .reg_offset = 0,
- .mask = DA9052_IRQ_MASK_POS_1,
- },
- [DA9052_IRQ_VBUS] = {
- .reg_offset = 0,
- .mask = DA9052_IRQ_MASK_POS_2,
- },
- [DA9052_IRQ_DCINREM] = {
- .reg_offset = 0,
- .mask = DA9052_IRQ_MASK_POS_3,
- },
- [DA9052_IRQ_VBUSREM] = {
- .reg_offset = 0,
- .mask = DA9052_IRQ_MASK_POS_4,
- },
- [DA9052_IRQ_VDDLOW] = {
- .reg_offset = 0,
- .mask = DA9052_IRQ_MASK_POS_5,
- },
- [DA9052_IRQ_ALARM] = {
- .reg_offset = 0,
- .mask = DA9052_IRQ_MASK_POS_6,
- },
- [DA9052_IRQ_SEQRDY] = {
- .reg_offset = 0,
- .mask = DA9052_IRQ_MASK_POS_7,
- },
- [DA9052_IRQ_COMP1V2] = {
- .reg_offset = 0,
- .mask = DA9052_IRQ_MASK_POS_8,
- },
- [DA9052_IRQ_NONKEY] = {
- .reg_offset = 1,
- .mask = DA9052_IRQ_MASK_POS_1,
- },
- [DA9052_IRQ_IDFLOAT] = {
- .reg_offset = 1,
- .mask = DA9052_IRQ_MASK_POS_2,
- },
- [DA9052_IRQ_IDGND] = {
- .reg_offset = 1,
- .mask = DA9052_IRQ_MASK_POS_3,
- },
- [DA9052_IRQ_CHGEND] = {
- .reg_offset = 1,
- .mask = DA9052_IRQ_MASK_POS_4,
- },
- [DA9052_IRQ_TBAT] = {
- .reg_offset = 1,
- .mask = DA9052_IRQ_MASK_POS_5,
- },
- [DA9052_IRQ_ADC_EOM] = {
- .reg_offset = 1,
- .mask = DA9052_IRQ_MASK_POS_6,
- },
- [DA9052_IRQ_PENDOWN] = {
- .reg_offset = 1,
- .mask = DA9052_IRQ_MASK_POS_7,
- },
- [DA9052_IRQ_TSIREADY] = {
- .reg_offset = 1,
- .mask = DA9052_IRQ_MASK_POS_8,
- },
- [DA9052_IRQ_GPI0] = {
- .reg_offset = 2,
- .mask = DA9052_IRQ_MASK_POS_1,
- },
- [DA9052_IRQ_GPI1] = {
- .reg_offset = 2,
- .mask = DA9052_IRQ_MASK_POS_2,
- },
- [DA9052_IRQ_GPI2] = {
- .reg_offset = 2,
- .mask = DA9052_IRQ_MASK_POS_3,
- },
- [DA9052_IRQ_GPI3] = {
- .reg_offset = 2,
- .mask = DA9052_IRQ_MASK_POS_4,
- },
- [DA9052_IRQ_GPI4] = {
- .reg_offset = 2,
- .mask = DA9052_IRQ_MASK_POS_5,
- },
- [DA9052_IRQ_GPI5] = {
- .reg_offset = 2,
- .mask = DA9052_IRQ_MASK_POS_6,
- },
- [DA9052_IRQ_GPI6] = {
- .reg_offset = 2,
- .mask = DA9052_IRQ_MASK_POS_7,
- },
- [DA9052_IRQ_GPI7] = {
- .reg_offset = 2,
- .mask = DA9052_IRQ_MASK_POS_8,
- },
- [DA9052_IRQ_GPI8] = {
- .reg_offset = 3,
- .mask = DA9052_IRQ_MASK_POS_1,
- },
- [DA9052_IRQ_GPI9] = {
- .reg_offset = 3,
- .mask = DA9052_IRQ_MASK_POS_2,
- },
- [DA9052_IRQ_GPI10] = {
- .reg_offset = 3,
- .mask = DA9052_IRQ_MASK_POS_3,
- },
- [DA9052_IRQ_GPI11] = {
- .reg_offset = 3,
- .mask = DA9052_IRQ_MASK_POS_4,
- },
- [DA9052_IRQ_GPI12] = {
- .reg_offset = 3,
- .mask = DA9052_IRQ_MASK_POS_5,
- },
- [DA9052_IRQ_GPI13] = {
- .reg_offset = 3,
- .mask = DA9052_IRQ_MASK_POS_6,
- },
- [DA9052_IRQ_GPI14] = {
- .reg_offset = 3,
- .mask = DA9052_IRQ_MASK_POS_7,
- },
- [DA9052_IRQ_GPI15] = {
- .reg_offset = 3,
- .mask = DA9052_IRQ_MASK_POS_8,
- },
-};
-
-static struct regmap_irq_chip da9052_regmap_irq_chip = {
- .name = "da9052_irq",
- .status_base = DA9052_EVENT_A_REG,
- .mask_base = DA9052_IRQ_MASK_A_REG,
- .ack_base = DA9052_EVENT_A_REG,
- .num_regs = DA9052_NUM_IRQ_REGS,
- .irqs = da9052_irqs,
- .num_irqs = ARRAY_SIZE(da9052_irqs),
-};
-
struct regmap_config da9052_regmap_config = {
.reg_bits = 8,
.val_bits = 8,
@@ -769,15 +532,10 @@ struct regmap_config da9052_regmap_config = {
};
EXPORT_SYMBOL_GPL(da9052_regmap_config);

-static int da9052_map_irq(struct da9052 *da9052, int irq)
-{
- return regmap_irq_get_virq(da9052->irq_data, irq);
-}
-
int __devinit da9052_device_init(struct da9052 *da9052, u8 chip_id)
{
struct da9052_pdata *pdata = da9052->dev->platform_data;
- int ret, i;
+ int ret;

mutex_init(&da9052->auxadc_lock);
init_completion(&da9052->done);
@@ -787,22 +545,12 @@ int __devinit da9052_device_init(struct da9052 *da9052, u8 chip_id)

da9052->chip_id = chip_id;

- ret = regmap_add_irq_chip(da9052->regmap, da9052->chip_irq,
- IRQF_TRIGGER_LOW | IRQF_ONESHOT,
- -1, &da9052_regmap_irq_chip,
- &da9052->irq_data);
- if (ret < 0) {
- dev_err(da9052->dev, "regmap_add_irq_chip failed: %d\n", ret);
- goto regmap_err;
+ ret = da9052_irq_init(da9052);
+ if (ret != 0) {
+ dev_err(da9052->dev, "da9052_irq_init failed: %d\n", ret);
+ return ret;
}

- i = da9052_map_irq(da9052, DA9052_IRQ_ADC_EOM);
- ret = request_threaded_irq(i, NULL, da9052_auxadc_irq,
- IRQF_TRIGGER_LOW | IRQF_ONESHOT,
- "adc-irq", da9052);
- if (ret != 0)
- dev_err(da9052->dev, "DA9052 ADC IRQ failed ret=%d\n", ret);
-
ret = mfd_add_devices(da9052->dev, -1, da9052_subdev_info,
ARRAY_SIZE(da9052_subdev_info), NULL, 0, NULL);
if (ret) {
@@ -813,18 +561,15 @@ int __devinit da9052_device_init(struct da9052 *da9052, u8 chip_id)
return 0;

err:
- free_irq(da9052_map_irq(da9052, DA9052_IRQ_ADC_EOM), da9052);
- regmap_del_irq_chip(da9052->chip_irq, da9052->irq_data);
- mfd_remove_devices(da9052->dev);
-regmap_err:
+ da9052_irq_exit(da9052);
+
return ret;
}

void da9052_device_exit(struct da9052 *da9052)
{
- free_irq(da9052_map_irq(da9052, DA9052_IRQ_ADC_EOM), da9052);
- regmap_del_irq_chip(da9052->chip_irq, da9052->irq_data);
mfd_remove_devices(da9052->dev);
+ da9052_irq_exit(da9052);
}

MODULE_AUTHOR("David Dajun Chen <[email protected]>");
diff --git a/drivers/mfd/da9052-irq.c b/drivers/mfd/da9052-irq.c
new file mode 100644
index 0000000..22bfe33
--- /dev/null
+++ b/drivers/mfd/da9052-irq.c
@@ -0,0 +1,288 @@
+/*
+ * DA9052 interrupt support
+ *
+ * Author: Fabio Estevam <[email protected]>
+ * Based on arizona-irq.c, which is:
+ *
+ * Copyright 2012 Wolfson Microelectronics plc
+ *
+ * Author: Mark Brown <[email protected]>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation.
+ */
+
+#include <linux/device.h>
+#include <linux/delay.h>
+#include <linux/input.h>
+#include <linux/interrupt.h>
+#include <linux/irq.h>
+#include <linux/irqdomain.h>
+#include <linux/slab.h>
+#include <linux/module.h>
+
+#include <linux/mfd/da9052/da9052.h>
+#include <linux/mfd/da9052/reg.h>
+
+#define DA9052_NUM_IRQ_REGS 4
+#define DA9052_IRQ_MASK_POS_1 0x01
+#define DA9052_IRQ_MASK_POS_2 0x02
+#define DA9052_IRQ_MASK_POS_3 0x04
+#define DA9052_IRQ_MASK_POS_4 0x08
+#define DA9052_IRQ_MASK_POS_5 0x10
+#define DA9052_IRQ_MASK_POS_6 0x20
+#define DA9052_IRQ_MASK_POS_7 0x40
+#define DA9052_IRQ_MASK_POS_8 0x80
+
+static struct regmap_irq da9052_irqs[] = {
+ [DA9052_IRQ_DCIN] = {
+ .reg_offset = 0,
+ .mask = DA9052_IRQ_MASK_POS_1,
+ },
+ [DA9052_IRQ_VBUS] = {
+ .reg_offset = 0,
+ .mask = DA9052_IRQ_MASK_POS_2,
+ },
+ [DA9052_IRQ_DCINREM] = {
+ .reg_offset = 0,
+ .mask = DA9052_IRQ_MASK_POS_3,
+ },
+ [DA9052_IRQ_VBUSREM] = {
+ .reg_offset = 0,
+ .mask = DA9052_IRQ_MASK_POS_4,
+ },
+ [DA9052_IRQ_VDDLOW] = {
+ .reg_offset = 0,
+ .mask = DA9052_IRQ_MASK_POS_5,
+ },
+ [DA9052_IRQ_ALARM] = {
+ .reg_offset = 0,
+ .mask = DA9052_IRQ_MASK_POS_6,
+ },
+ [DA9052_IRQ_SEQRDY] = {
+ .reg_offset = 0,
+ .mask = DA9052_IRQ_MASK_POS_7,
+ },
+ [DA9052_IRQ_COMP1V2] = {
+ .reg_offset = 0,
+ .mask = DA9052_IRQ_MASK_POS_8,
+ },
+ [DA9052_IRQ_NONKEY] = {
+ .reg_offset = 1,
+ .mask = DA9052_IRQ_MASK_POS_1,
+ },
+ [DA9052_IRQ_IDFLOAT] = {
+ .reg_offset = 1,
+ .mask = DA9052_IRQ_MASK_POS_2,
+ },
+ [DA9052_IRQ_IDGND] = {
+ .reg_offset = 1,
+ .mask = DA9052_IRQ_MASK_POS_3,
+ },
+ [DA9052_IRQ_CHGEND] = {
+ .reg_offset = 1,
+ .mask = DA9052_IRQ_MASK_POS_4,
+ },
+ [DA9052_IRQ_TBAT] = {
+ .reg_offset = 1,
+ .mask = DA9052_IRQ_MASK_POS_5,
+ },
+ [DA9052_IRQ_ADC_EOM] = {
+ .reg_offset = 1,
+ .mask = DA9052_IRQ_MASK_POS_6,
+ },
+ [DA9052_IRQ_PENDOWN] = {
+ .reg_offset = 1,
+ .mask = DA9052_IRQ_MASK_POS_7,
+ },
+ [DA9052_IRQ_TSIREADY] = {
+ .reg_offset = 1,
+ .mask = DA9052_IRQ_MASK_POS_8,
+ },
+ [DA9052_IRQ_GPI0] = {
+ .reg_offset = 2,
+ .mask = DA9052_IRQ_MASK_POS_1,
+ },
+ [DA9052_IRQ_GPI1] = {
+ .reg_offset = 2,
+ .mask = DA9052_IRQ_MASK_POS_2,
+ },
+ [DA9052_IRQ_GPI2] = {
+ .reg_offset = 2,
+ .mask = DA9052_IRQ_MASK_POS_3,
+ },
+ [DA9052_IRQ_GPI3] = {
+ .reg_offset = 2,
+ .mask = DA9052_IRQ_MASK_POS_4,
+ },
+ [DA9052_IRQ_GPI4] = {
+ .reg_offset = 2,
+ .mask = DA9052_IRQ_MASK_POS_5,
+ },
+ [DA9052_IRQ_GPI5] = {
+ .reg_offset = 2,
+ .mask = DA9052_IRQ_MASK_POS_6,
+ },
+ [DA9052_IRQ_GPI6] = {
+ .reg_offset = 2,
+ .mask = DA9052_IRQ_MASK_POS_7,
+ },
+ [DA9052_IRQ_GPI7] = {
+ .reg_offset = 2,
+ .mask = DA9052_IRQ_MASK_POS_8,
+ },
+ [DA9052_IRQ_GPI8] = {
+ .reg_offset = 3,
+ .mask = DA9052_IRQ_MASK_POS_1,
+ },
+ [DA9052_IRQ_GPI9] = {
+ .reg_offset = 3,
+ .mask = DA9052_IRQ_MASK_POS_2,
+ },
+ [DA9052_IRQ_GPI10] = {
+ .reg_offset = 3,
+ .mask = DA9052_IRQ_MASK_POS_3,
+ },
+ [DA9052_IRQ_GPI11] = {
+ .reg_offset = 3,
+ .mask = DA9052_IRQ_MASK_POS_4,
+ },
+ [DA9052_IRQ_GPI12] = {
+ .reg_offset = 3,
+ .mask = DA9052_IRQ_MASK_POS_5,
+ },
+ [DA9052_IRQ_GPI13] = {
+ .reg_offset = 3,
+ .mask = DA9052_IRQ_MASK_POS_6,
+ },
+ [DA9052_IRQ_GPI14] = {
+ .reg_offset = 3,
+ .mask = DA9052_IRQ_MASK_POS_7,
+ },
+ [DA9052_IRQ_GPI15] = {
+ .reg_offset = 3,
+ .mask = DA9052_IRQ_MASK_POS_8,
+ },
+};
+
+static struct regmap_irq_chip da9052_regmap_irq_chip = {
+ .name = "da9052_irq",
+ .status_base = DA9052_EVENT_A_REG,
+ .mask_base = DA9052_IRQ_MASK_A_REG,
+ .ack_base = DA9052_EVENT_A_REG,
+ .num_regs = DA9052_NUM_IRQ_REGS,
+ .irqs = da9052_irqs,
+ .num_irqs = ARRAY_SIZE(da9052_irqs),
+};
+
+static int da9052_map_irq(struct da9052 *da9052, int irq)
+{
+ return regmap_irq_get_virq(da9052->irq_data, irq);
+}
+
+int da9052_enable_irq(struct da9052 *da9052, int irq)
+{
+ irq = da9052_map_irq(da9052, irq);
+ if (irq < 0)
+ return irq;
+
+ enable_irq(irq);
+
+ return 0;
+}
+EXPORT_SYMBOL_GPL(da9052_enable_irq);
+
+int da9052_disable_irq(struct da9052 *da9052, int irq)
+{
+ irq = da9052_map_irq(da9052, irq);
+ if (irq < 0)
+ return irq;
+
+ disable_irq(irq);
+
+ return 0;
+}
+EXPORT_SYMBOL_GPL(da9052_disable_irq);
+
+int da9052_disable_irq_nosync(struct da9052 *da9052, int irq)
+{
+ irq = da9052_map_irq(da9052, irq);
+ if (irq < 0)
+ return irq;
+
+ disable_irq_nosync(irq);
+
+ return 0;
+}
+EXPORT_SYMBOL_GPL(da9052_disable_irq_nosync);
+
+int da9052_request_irq(struct da9052 *da9052, int irq, char *name,
+ irq_handler_t handler, void *data)
+{
+ irq = da9052_map_irq(da9052, irq);
+ if (irq < 0)
+ return irq;
+
+ return request_threaded_irq(irq, NULL, handler,
+ IRQF_TRIGGER_LOW | IRQF_ONESHOT,
+ name, data);
+}
+EXPORT_SYMBOL_GPL(da9052_request_irq);
+
+void da9052_free_irq(struct da9052 *da9052, int irq, void *data)
+{
+ irq = da9052_map_irq(da9052, irq);
+ if (irq < 0)
+ return;
+
+ free_irq(irq, data);
+}
+EXPORT_SYMBOL_GPL(da9052_free_irq);
+
+static irqreturn_t da9052_auxadc_irq(int irq, void *irq_data)
+{
+ struct da9052 *da9052 = irq_data;
+
+ complete(&da9052->done);
+
+ return IRQ_HANDLED;
+}
+
+int da9052_irq_init(struct da9052 *da9052)
+{
+ int ret;
+
+ ret = regmap_add_irq_chip(da9052->regmap, da9052->chip_irq,
+ IRQF_TRIGGER_LOW | IRQF_ONESHOT,
+ -1, &da9052_regmap_irq_chip,
+ &da9052->irq_data);
+ if (ret < 0) {
+ dev_err(da9052->dev, "regmap_add_irq_chip failed: %d\n", ret);
+ goto regmap_err;
+ }
+
+ ret = da9052_request_irq(da9052, DA9052_IRQ_ADC_EOM, "adc-irq",
+ da9052_auxadc_irq, da9052);
+
+ if (ret != 0) {
+ dev_err(da9052->dev, "DA9052_IRQ_ADC_EOM failed: %d\n", ret);
+ goto request_irq_err;
+ }
+
+ return 0;
+
+request_irq_err:
+ regmap_del_irq_chip(da9052->chip_irq, da9052->irq_data);
+regmap_err:
+ return ret;
+
+}
+
+int da9052_irq_exit(struct da9052 *da9052)
+{
+ da9052_free_irq(da9052, DA9052_IRQ_ADC_EOM , da9052);
+ regmap_del_irq_chip(da9052->chip_irq, da9052->irq_data);
+
+ return 0;
+}
diff --git a/include/linux/mfd/da9052/da9052.h b/include/linux/mfd/da9052/da9052.h
index 0507c4c..86dd93d 100644
--- a/include/linux/mfd/da9052/da9052.h
+++ b/include/linux/mfd/da9052/da9052.h
@@ -146,4 +146,14 @@ void da9052_device_exit(struct da9052 *da9052);

extern struct regmap_config da9052_regmap_config;

+int da9052_irq_init(struct da9052 *da9052);
+int da9052_irq_exit(struct da9052 *da9052);
+int da9052_request_irq(struct da9052 *da9052, int irq, char *name,
+ irq_handler_t handler, void *data);
+void da9052_free_irq(struct da9052 *da9052, int irq, void *data);
+
+int da9052_enable_irq(struct da9052 *da9052, int irq);
+int da9052_disable_irq(struct da9052 *da9052, int irq);
+int da9052_disable_irq_nosync(struct da9052 *da9052, int irq);
+
#endif /* __MFD_DA9052_DA9052_H */
--
1.7.9.5

2012-10-04 03:16:06

by Fabio Estevam

[permalink] [raw]
Subject: [PATCH 5/6] power: da9052-battery: Convert to the new da9052 interrupt functions

From: Fabio Estevam <[email protected]>

Convert to the new da9052 interrupt functions, so that we can get rid of
irq_base references.

Cc: Anton Vorontsov <[email protected]>
Signed-off-by: Fabio Estevam <[email protected]>
---
Build tested only.
drivers/power/da9052-battery.c | 44 +++++++++++++++++++++++-----------------
1 file changed, 25 insertions(+), 19 deletions(-)

diff --git a/drivers/power/da9052-battery.c b/drivers/power/da9052-battery.c
index d9d034d..73cec97 100644
--- a/drivers/power/da9052-battery.c
+++ b/drivers/power/da9052-battery.c
@@ -440,8 +440,10 @@ static int da9052_bat_check_health(struct da9052_battery *bat, int *health)
static irqreturn_t da9052_bat_irq(int irq, void *data)
{
struct da9052_battery *bat = data;
+ int virq;

- irq -= bat->da9052->irq_base;
+ virq = regmap_irq_get_virq(bat->da9052->irq_data, irq);
+ irq -= virq;

if (irq == DA9052_IRQ_CHGEND)
bat->status = POWER_SUPPLY_STATUS_FULL;
@@ -567,7 +569,7 @@ static struct power_supply template_battery = {
.get_property = da9052_bat_get_property,
};

-static const char *const da9052_bat_irqs[] = {
+static char *da9052_bat_irqs[] = {
"BATT TEMP",
"DCIN DET",
"DCIN REM",
@@ -576,12 +578,20 @@ static const char *const da9052_bat_irqs[] = {
"CHG END",
};

+static int da9052_bat_irq_bits[] = {
+ DA9052_IRQ_TBAT,
+ DA9052_IRQ_DCIN,
+ DA9052_IRQ_DCINREM,
+ DA9052_IRQ_VBUS,
+ DA9052_IRQ_VBUSREM,
+ DA9052_IRQ_CHGEND,
+};
+
static s32 __devinit da9052_bat_probe(struct platform_device *pdev)
{
struct da9052_pdata *pdata;
struct da9052_battery *bat;
int ret;
- int irq;
int i;

bat = kzalloc(sizeof(struct da9052_battery), GFP_KERNEL);
@@ -602,15 +612,14 @@ static s32 __devinit da9052_bat_probe(struct platform_device *pdev)
bat->psy.use_for_apm = 1;

for (i = 0; i < ARRAY_SIZE(da9052_bat_irqs); i++) {
- irq = platform_get_irq_byname(pdev, da9052_bat_irqs[i]);
- ret = request_threaded_irq(bat->da9052->irq_base + irq,
- NULL, da9052_bat_irq,
- IRQF_TRIGGER_LOW | IRQF_ONESHOT,
- da9052_bat_irqs[i], bat);
+ ret = da9052_request_irq(bat->da9052,
+ da9052_bat_irq_bits[i], da9052_bat_irqs[i],
+ da9052_bat_irq, bat);
+
if (ret != 0) {
dev_err(bat->da9052->dev,
- "DA9052 failed to request %s IRQ %d: %d\n",
- da9052_bat_irqs[i], irq, ret);
+ "DA9052 failed to request %s IRQ: %d\n",
+ da9052_bat_irqs[i], ret);
goto err;
}
}
@@ -623,23 +632,20 @@ static s32 __devinit da9052_bat_probe(struct platform_device *pdev)
return 0;

err:
- while (--i >= 0) {
- irq = platform_get_irq_byname(pdev, da9052_bat_irqs[i]);
- free_irq(bat->da9052->irq_base + irq, bat);
- }
+ while (--i >= 0)
+ da9052_free_irq(bat->da9052, da9052_bat_irq_bits[i], bat);
+
kfree(bat);
return ret;
}
static int __devexit da9052_bat_remove(struct platform_device *pdev)
{
int i;
- int irq;
struct da9052_battery *bat = platform_get_drvdata(pdev);

- for (i = 0; i < ARRAY_SIZE(da9052_bat_irqs); i++) {
- irq = platform_get_irq_byname(pdev, da9052_bat_irqs[i]);
- free_irq(bat->da9052->irq_base + irq, bat);
- }
+ for (i = 0; i < ARRAY_SIZE(da9052_bat_irqs); i++)
+ da9052_free_irq(bat->da9052, da9052_bat_irq_bits[i], bat);
+
power_supply_unregister(&bat->psy);
kfree(bat);

--
1.7.9.5

2012-10-04 03:16:03

by Fabio Estevam

[permalink] [raw]
Subject: [PATCH 4/6] Input: da9052_onkey.c: Convert to the new da9052 interrupt functions.

From: Fabio Estevam <[email protected]>

Use the new da9052 irq functions and allow the driver to probe successfully.

Cc: Dmitry Torokhov <[email protected]>
Cc: <[email protected]>
Signed-off-by: Fabio Estevam <[email protected]>
---
drivers/input/misc/da9052_onkey.c | 22 +++++-----------------
1 file changed, 5 insertions(+), 17 deletions(-)

diff --git a/drivers/input/misc/da9052_onkey.c b/drivers/input/misc/da9052_onkey.c
index 3c843cd..3be3acc 100644
--- a/drivers/input/misc/da9052_onkey.c
+++ b/drivers/input/misc/da9052_onkey.c
@@ -24,7 +24,6 @@ struct da9052_onkey {
struct da9052 *da9052;
struct input_dev *input;
struct delayed_work work;
- unsigned int irq;
};

static void da9052_onkey_query(struct da9052_onkey *onkey)
@@ -76,7 +75,6 @@ static int __devinit da9052_onkey_probe(struct platform_device *pdev)
struct da9052 *da9052 = dev_get_drvdata(pdev->dev.parent);
struct da9052_onkey *onkey;
struct input_dev *input_dev;
- int irq;
int error;

if (!da9052) {
@@ -84,13 +82,6 @@ static int __devinit da9052_onkey_probe(struct platform_device *pdev)
return -EINVAL;
}

- irq = platform_get_irq_byname(pdev, "ONKEY");
- if (irq < 0) {
- dev_err(&pdev->dev,
- "Failed to get an IRQ for input device, %d\n", irq);
- return -EINVAL;
- }
-
onkey = kzalloc(sizeof(*onkey), GFP_KERNEL);
input_dev = input_allocate_device();
if (!onkey || !input_dev) {
@@ -101,7 +92,6 @@ static int __devinit da9052_onkey_probe(struct platform_device *pdev)

onkey->input = input_dev;
onkey->da9052 = da9052;
- onkey->irq = irq;
INIT_DELAYED_WORK(&onkey->work, da9052_onkey_work);

input_dev->name = "da9052-onkey";
@@ -111,13 +101,11 @@ static int __devinit da9052_onkey_probe(struct platform_device *pdev)
input_dev->evbit[0] = BIT_MASK(EV_KEY);
__set_bit(KEY_POWER, input_dev->keybit);

- error = request_threaded_irq(onkey->irq, NULL, da9052_onkey_irq,
- IRQF_TRIGGER_LOW | IRQF_ONESHOT,
- "ONKEY", onkey);
+ error = da9052_request_irq(onkey->da9052, DA9052_IRQ_NONKEY, "ONKEY",
+ da9052_onkey_irq, onkey);
if (error < 0) {
dev_err(onkey->da9052->dev,
- "Failed to register ONKEY IRQ %d, error = %d\n",
- onkey->irq, error);
+ "Failed to register ONKEY IRQ: %d\n", error);
goto err_free_mem;
}

@@ -132,7 +120,7 @@ static int __devinit da9052_onkey_probe(struct platform_device *pdev)
return 0;

err_free_irq:
- free_irq(onkey->irq, onkey);
+ da9052_free_irq(onkey->da9052, DA9052_IRQ_NONKEY, onkey);
cancel_delayed_work_sync(&onkey->work);
err_free_mem:
input_free_device(input_dev);
@@ -145,7 +133,7 @@ static int __devexit da9052_onkey_remove(struct platform_device *pdev)
{
struct da9052_onkey *onkey = platform_get_drvdata(pdev);

- free_irq(onkey->irq, onkey);
+ da9052_free_irq(onkey->da9052, DA9052_IRQ_NONKEY, onkey);
cancel_delayed_work_sync(&onkey->work);

input_unregister_device(onkey->input);
--
1.7.9.5

2012-10-04 03:16:40

by Fabio Estevam

[permalink] [raw]
Subject: [PATCH 6/6] gpio: gpio-da9052: Convert to the new da9052 interrupt functions

From: Fabio Estevam <[email protected]>

Convert to the new da9052 interrupt functions, so that we can get rid of
irq_base references.

Cc: Grant Likely <[email protected]>
Cc: Linus Walleij <[email protected]>
Signed-off-by: Fabio Estevam <[email protected]>
---
Build tested only.
drivers/gpio/gpio-da9052.c | 6 +++++-
1 file changed, 5 insertions(+), 1 deletion(-)

diff --git a/drivers/gpio/gpio-da9052.c b/drivers/gpio/gpio-da9052.c
index 24b8c29..3837072 100644
--- a/drivers/gpio/gpio-da9052.c
+++ b/drivers/gpio/gpio-da9052.c
@@ -185,7 +185,11 @@ static int da9052_gpio_to_irq(struct gpio_chip *gc, u32 offset)
struct da9052_gpio *gpio = to_da9052_gpio(gc);
struct da9052 *da9052 = gpio->da9052;

- return da9052->irq_base + DA9052_IRQ_GPI0 + offset;
+ int irq;
+
+ irq = regmap_irq_get_virq(da9052->irq_data, DA9052_IRQ_GPI0 + offset);
+
+ return irq;
}

static struct gpio_chip reference_gp __devinitdata = {
--
1.7.9.5

2012-10-04 03:16:58

by Fabio Estevam

[permalink] [raw]
Subject: [PATCH 3/6] Input: da9052_tsi.c: Fix interrupt handling

From: Fabio Estevam <[email protected]>

Currently da9062_tsi does not probe and it fails as follows:

da9052 1-0048: Unable to determine device interrupts

Use the new da9052 irq functions and allow the driver to probe and operate
correctly.

Tested on mx53qsb board using 'evtest' tool.

Cc: Dmitry Torokhov <[email protected]>
Cc: <[email protected]>
Signed-off-by: Fabio Estevam <[email protected]>
---
drivers/input/touchscreen/da9052_tsi.c | 17 ++++++++---------
1 file changed, 8 insertions(+), 9 deletions(-)

diff --git a/drivers/input/touchscreen/da9052_tsi.c b/drivers/input/touchscreen/da9052_tsi.c
index 71f6165..33fd3fa 100644
--- a/drivers/input/touchscreen/da9052_tsi.c
+++ b/drivers/input/touchscreen/da9052_tsi.c
@@ -274,16 +274,16 @@ static int __devinit da9052_ts_probe(struct platform_device *pdev)
/* Disable ADC */
da9052_ts_adc_toggle(tsi, false);

- error = da9052_request_irq(tsi->da9052, DA9052_IRQ_PENDOWN, "pendown-irq",
- da9052_ts_pendwn_irq, tsi);
+ error = da9052_request_irq(tsi->da9052, DA9052_IRQ_PENDOWN,
+ "pendown-irq", da9052_ts_pendwn_irq, tsi);
if (error) {
dev_err(tsi->da9052->dev,
"Failed to register PENDWN IRQ: %d\n", error);
goto err_free_mem;
}

- error = da9052_request_irq(tsi->da9052, DA9052_IRQ_TSIREADY, "tsiready-irq",
- da9052_ts_datardy_irq, tsi);
+ error = da9052_request_irq(tsi->da9052, DA9052_IRQ_TSIREADY,
+ "tsiready-irq", da9052_ts_datardy_irq, tsi);
if (error) {
dev_err(tsi->da9052->dev,
"Failed to register TSIRDY IRQ :%d\n", error);
@@ -307,9 +307,9 @@ static int __devinit da9052_ts_probe(struct platform_device *pdev)
return 0;

err_free_datardy_irq:
- da9052_free_irq(da9052, DA9052_IRQ_TSIREADY, da9052);
+ da9052_free_irq(tsi->da9052, DA9052_IRQ_TSIREADY, tsi);
err_free_pendwn_irq:
- da9052_free_irq(da9052, DA9052_IRQ_PENDOWN, da9052);
+ da9052_free_irq(tsi->da9052, DA9052_IRQ_PENDOWN, tsi);
err_free_mem:
kfree(tsi);
input_free_device(input_dev);
@@ -320,12 +320,11 @@ err_free_mem:
static int __devexit da9052_ts_remove(struct platform_device *pdev)
{
struct da9052_tsi *tsi = platform_get_drvdata(pdev);
- struct da9052 *da9052 = dev_get_drvdata(pdev->dev.parent);

da9052_reg_write(tsi->da9052, DA9052_LDO9_REG, 0x19);

- da9052_free_irq(da9052, DA9052_IRQ_TSIREADY, da9052);
- da9052_free_irq(da9052, DA9052_IRQ_PENDOWN, da9052);
+ da9052_free_irq(tsi->da9052, DA9052_IRQ_TSIREADY, tsi);
+ da9052_free_irq(tsi->da9052, DA9052_IRQ_PENDOWN, tsi);

input_unregister_device(tsi->dev);
kfree(tsi);
--
1.7.9.5

2012-10-04 07:12:59

by Arnd Bergmann

[permalink] [raw]
Subject: Re: [PATCH 2/6] mfd: da9052: Introduce da9052-irq.c

On Thursday 04 October 2012, Fabio Estevam wrote:
> +static int da9052_map_irq(struct da9052 *da9052, int irq)
> +{
> + return regmap_irq_get_virq(da9052->irq_data, irq);
> +}
> +
> +int da9052_enable_irq(struct da9052 *da9052, int irq)
> +{
> + irq = da9052_map_irq(da9052, irq);
> + if (irq < 0)
> + return irq;
> +
> + enable_irq(irq);
> +
> + return 0;
> +}
> +EXPORT_SYMBOL_GPL(da9052_enable_irq);

This looks correct, but I'm not sure it's actually simpler
than letting the sub-drivers deal with calling regmap_irq_get_virq().

Can't each driver just call regmap_irq_get_virq once at init time and
then call the regular irq management functions?

Maybe I just don't see the real purpose of these functions. If I'm
contradicting what Mark said, listen to him instead.

Arnd

2012-10-04 11:14:16

by Mark Brown

[permalink] [raw]
Subject: Re: [PATCH 2/6] mfd: da9052: Introduce da9052-irq.c

On Thu, Oct 04, 2012 at 07:12:48AM +0000, Arnd Bergmann wrote:
> On Thursday 04 October 2012, Fabio Estevam wrote:

> > +int da9052_enable_irq(struct da9052 *da9052, int irq)
> > +{
> > + irq = da9052_map_irq(da9052, irq);
> > + if (irq < 0)
> > + return irq;
> > +
> > + enable_irq(irq);
> > +
> > + return 0;
> > +}
> > +EXPORT_SYMBOL_GPL(da9052_enable_irq);

> This looks correct, but I'm not sure it's actually simpler
> than letting the sub-drivers deal with calling regmap_irq_get_virq().

> Can't each driver just call regmap_irq_get_virq once at init time and
> then call the regular irq management functions?

> Maybe I just don't see the real purpose of these functions. If I'm
> contradicting what Mark said, listen to him instead.

Aside from hiding the lookup of the irqdomian a bit there's a couple of
reasons for existing devices having them:

- With some devices like WM8994 the interrupts are optional so it's
useful to eat errors due to the interrupts not existing. With the
ability to use linear domains this doesn't matter terribly much as we
can just allocate the interrupts even if there's no way they can
fire, it was more of an issue when irqdomain wasn't available.

- With Arizona we've actually got a bunch of interrupt controllers the
interrupts might be allocated to and these functions allow us to hide
this mapping from the subdrivers. This is pretty specialist though.

but if the interrupts are always requestable it really makes little
odds, just a matter of taste.

2012-10-04 11:25:54

by Mark Brown

[permalink] [raw]
Subject: Re: [PATCH 2/6] mfd: da9052: Introduce da9052-irq.c

On Thu, Oct 04, 2012 at 12:15:05AM -0300, Fabio Estevam wrote:
> From: Fabio Estevam <[email protected]>
>
> Create a da9052-irq.c file so that it can handle interrupt related functions.
>
> This is useful for allowing the da9052 drivers to use such functions
> when dealing with da9052 interrupts.

Reviewed-by: Mark Brown <[email protected]>

2012-10-04 11:26:27

by Mark Brown

[permalink] [raw]
Subject: Re: [PATCH 1/6] mfd: da9052-core: Use regmap_irq_get_virq() and fix the probe

On Thu, Oct 04, 2012 at 12:15:04AM -0300, Fabio Estevam wrote:
> From: Fabio Estevam <[email protected]>
>
> On a mx53qsb dt-kernel the da9052-core driver fails to probe as follows:
>
> da9052 1-0048: DA9052 ADC IRQ failed ret=-22
>
> The reason for the error was due to passing only the offset as the interrupt
> number in request_threaded_irq() without da9052->irq_base.

Reviwed-by: Mark Brown <[email protected]>

2012-10-04 11:26:50

by Mark Brown

[permalink] [raw]
Subject: Re: [PATCH 6/6] gpio: gpio-da9052: Convert to the new da9052 interrupt functions

On Thu, Oct 04, 2012 at 12:15:09AM -0300, Fabio Estevam wrote:
> From: Fabio Estevam <[email protected]>
>
> Convert to the new da9052 interrupt functions, so that we can get rid of
> irq_base references.

Reviewed-by: Mark Brown <[email protected]>

2012-10-04 12:17:40

by Arnd Bergmann

[permalink] [raw]
Subject: Re: [PATCH 2/6] mfd: da9052: Introduce da9052-irq.c

On Thursday 04 October 2012, Mark Brown wrote:
> Aside from hiding the lookup of the irqdomian a bit there's a couple of
> reasons for existing devices having them:
>
> - With some devices like WM8994 the interrupts are optional so it's
> useful to eat errors due to the interrupts not existing. With the
> ability to use linear domains this doesn't matter terribly much as we
> can just allocate the interrupts even if there's no way they can
> fire, it was more of an issue when irqdomain wasn't available.
>
> - With Arizona we've actually got a bunch of interrupt controllers the
> interrupts might be allocated to and these functions allow us to hide
> this mapping from the subdrivers. This is pretty specialist though.
>
> but if the interrupts are always requestable it really makes little
> odds, just a matter of taste.

Ok, thanks for the explanation. Since this was my only concern on this
version of the series:

Acked-by: Arnd Bergmann <[email protected]>

2012-10-05 18:57:41

by Mark Brown

[permalink] [raw]
Subject: Re: [PATCH 4/6] Input: da9052_onkey.c: Convert to the new da9052 interrupt functions.

On Thu, Oct 04, 2012 at 12:15:07AM -0300, Fabio Estevam wrote:
> From: Fabio Estevam <[email protected]>
>
> Use the new da9052 irq functions and allow the driver to probe successfully.

Reviewed-by: Mark Brown <[email protected]>

2012-10-05 18:58:42

by Mark Brown

[permalink] [raw]
Subject: Re: [PATCH 5/6] power: da9052-battery: Convert to the new da9052 interrupt functions

On Thu, Oct 04, 2012 at 12:15:08AM -0300, Fabio Estevam wrote:
> From: Fabio Estevam <[email protected]>
>
> Convert to the new da9052 interrupt functions, so that we can get rid of
> irq_base references.

Reviewed-by: Mark Brown <[email protected]>

2012-10-08 06:20:49

by Linus Walleij

[permalink] [raw]
Subject: Re: [PATCH 6/6] gpio: gpio-da9052: Convert to the new da9052 interrupt functions

On Thu, Oct 4, 2012 at 5:15 AM, Fabio Estevam <[email protected]> wrote:

> From: Fabio Estevam <[email protected]>
>
> Convert to the new da9052 interrupt functions, so that we can get rid of
> irq_base references.
>
> Cc: Grant Likely <[email protected]>
> Cc: Linus Walleij <[email protected]>
> Signed-off-by: Fabio Estevam <[email protected]>

Applied to my GPIO tree with Mark's ACK.

Yours,
Linus Walleij

2012-10-08 10:40:28

by Fabio Estevam

[permalink] [raw]
Subject: Re: [PATCH 6/6] gpio: gpio-da9052: Convert to the new da9052 interrupt functions

Hi Linus,

On Mon, Oct 8, 2012 at 3:20 AM, Linus Walleij <[email protected]> wrote:
> On Thu, Oct 4, 2012 at 5:15 AM, Fabio Estevam <[email protected]> wrote:
>
>> From: Fabio Estevam <[email protected]>
>>
>> Convert to the new da9052 interrupt functions, so that we can get rid of
>> irq_base references.
>>
>> Cc: Grant Likely <[email protected]>
>> Cc: Linus Walleij <[email protected]>
>> Signed-off-by: Fabio Estevam <[email protected]>
>
> Applied to my GPIO tree with Mark's ACK.

Patches 1/6 and 2/6 are also needed, otherwise it breaks the build if
only this one gets applied.

Thanks,

Fabio Estevam

2012-10-09 12:04:39

by Linus Walleij

[permalink] [raw]
Subject: Re: [PATCH 6/6] gpio: gpio-da9052: Convert to the new da9052 interrupt functions

On Mon, Oct 8, 2012 at 12:40 PM, Fabio Estevam <[email protected]> wrote:

> Hi Linus,
> On Mon, Oct 8, 2012 at 3:20 AM, Linus Walleij <[email protected]> wrote:
>> On Thu, Oct 4, 2012 at 5:15 AM, Fabio Estevam <[email protected]> wrote:
>>
>>> From: Fabio Estevam <[email protected]>
>>>
>>> Convert to the new da9052 interrupt functions, so that we can get rid of
>>> irq_base references.
>>>
>>> Cc: Grant Likely <[email protected]>
>>> Cc: Linus Walleij <[email protected]>
>>> Signed-off-by: Fabio Estevam <[email protected]>
>>
>> Applied to my GPIO tree with Mark's ACK.
>
> Patches 1/6 and 2/6 are also needed, otherwise it breaks the build if
> only this one gets applied.

Ah OK I'll take it out again. Push this through whatever tree you
want (maybe the i.MX or MFD tree then?)

Reviewed-by: Linus Walleij <[email protected]>

Linus Walleij

2012-10-09 12:19:19

by Fabio Estevam

[permalink] [raw]
Subject: Re: [PATCH 6/6] gpio: gpio-da9052: Convert to the new da9052 interrupt functions

On Tue, Oct 9, 2012 at 9:04 AM, Linus Walleij <[email protected]> wrote:

> Ah OK I'll take it out again. Push this through whatever tree you
> want (maybe the i.MX or MFD tree then?)
>
> Reviewed-by: Linus Walleij <[email protected]>

Sascha/Samuel/Arnd,

Which tree could take this patch series, please?

Thanks,

Fabio Estevam

2012-11-12 16:22:28

by Fabio Estevam

[permalink] [raw]
Subject: Re: [PATCH 1/6] mfd: da9052-core: Use regmap_irq_get_virq() and fix the probe

Hi Samuel,

On Thu, Oct 4, 2012 at 8:26 AM, Mark Brown
<[email protected]> wrote:
> On Thu, Oct 04, 2012 at 12:15:04AM -0300, Fabio Estevam wrote:
>> From: Fabio Estevam <[email protected]>
>>
>> On a mx53qsb dt-kernel the da9052-core driver fails to probe as follows:
>>
>> da9052 1-0048: DA9052 ADC IRQ failed ret=-22
>>
>> The reason for the error was due to passing only the offset as the interrupt
>> number in request_threaded_irq() without da9052->irq_base.
>
> Reviwed-by: Mark Brown <[email protected]>

Could this series be applied, please?

Thanks,

Fabio Estevam

2012-11-18 04:24:00

by Anton Vorontsov

[permalink] [raw]
Subject: Re: [PATCH 5/6] power: da9052-battery: Convert to the new da9052 interrupt functions

On Thu, Oct 04, 2012 at 12:15:08AM -0300, Fabio Estevam wrote:
> From: Fabio Estevam <[email protected]>
>
> Convert to the new da9052 interrupt functions, so that we can get rid of
> irq_base references.
>
> Cc: Anton Vorontsov <[email protected]>
> Signed-off-by: Fabio Estevam <[email protected]>
> ---

It seems that the patch depends on other patches in this series.

I don't see it linux-next, so if anything, for the drivers/power part:

Acked-by: Anton Vorontsov <[email protected]>

2012-11-18 12:30:51

by Fabio Estevam

[permalink] [raw]
Subject: Re: [PATCH 5/6] power: da9052-battery: Convert to the new da9052 interrupt functions

On Sun, Nov 18, 2012 at 2:20 AM, Anton Vorontsov <[email protected]> wrote:

> It seems that the patch depends on other patches in this series.
>
> I don't see it linux-next, so if anything, for the drivers/power part:
>
> Acked-by: Anton Vorontsov <[email protected]>

Thanks, Anton. Yes, the mfd patches still need to be applied by Samuel
so that all dependencies can be resolved.

Samuel?

Thanks,

Fabio Estevam

2012-11-18 23:44:56

by Samuel Ortiz

[permalink] [raw]
Subject: Re: [PATCH 1/6] mfd: da9052-core: Use regmap_irq_get_virq() and fix the probe

Hi Fabio,

On Thu, Oct 04, 2012 at 12:15:04AM -0300, Fabio Estevam wrote:
> From: Fabio Estevam <[email protected]>
>
> On a mx53qsb dt-kernel the da9052-core driver fails to probe as follows:
>
> da9052 1-0048: DA9052 ADC IRQ failed ret=-22
>
> The reason for the error was due to passing only the offset as the interrupt
> number in request_threaded_irq() without da9052->irq_base.
>
> The recommended approach though is to use regmap_get_virq() to acquire the
> interrupt number and this allows to get rid of da9052->irq_base.
>
> Fix it and allow the driver to probe successfully.
>
> Also provide a few more error logs and change the irq string to "adc-irq", so
> that it appears as a single word in 'cat /proc/interrupts'
>
> Signed-off-by: Fabio Estevam <[email protected]>
> ---
> drivers/mfd/da9052-core.c | 34 +++++++++++++++++++---------------
> 1 file changed, 19 insertions(+), 15 deletions(-)
This patch and the next 5 ones are now applied to my for-next branch.

Cheers,
Samuel.

--
Intel Open Source Technology Centre
http://oss.intel.com/