* [PATCH 1/6] mfd: da9052-core: Use regmap_irq_get_virq() and fix the probe
@ 2012-10-04 3:15 Fabio Estevam
2012-10-04 3:15 ` [PATCH 2/6] mfd: da9052: Introduce da9052-irq.c Fabio Estevam
` (6 more replies)
0 siblings, 7 replies; 22+ messages in thread
From: Fabio Estevam @ 2012-10-04 3:15 UTC (permalink / raw)
To: sameo
Cc: broonie, ashish.jangam, dchen, arnd, kernel, linux-kernel,
Fabio Estevam
From: Fabio Estevam <fabio.estevam@freescale.com>
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 <fabio.estevam@freescale.com>
---
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
^ permalink raw reply related [flat|nested] 22+ messages in thread* [PATCH 2/6] mfd: da9052: Introduce da9052-irq.c 2012-10-04 3:15 [PATCH 1/6] mfd: da9052-core: Use regmap_irq_get_virq() and fix the probe Fabio Estevam @ 2012-10-04 3:15 ` Fabio Estevam 2012-10-04 7:12 ` Arnd Bergmann 2012-10-04 11:25 ` Mark Brown 2012-10-04 3:15 ` [PATCH 3/6] Input: da9052_tsi.c: Fix interrupt handling Fabio Estevam ` (5 subsequent siblings) 6 siblings, 2 replies; 22+ messages in thread From: Fabio Estevam @ 2012-10-04 3:15 UTC (permalink / raw) To: sameo Cc: broonie, ashish.jangam, dchen, arnd, kernel, linux-kernel, Fabio Estevam From: Fabio Estevam <fabio.estevam@freescale.com> 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 <fabio.estevam@freescale.com> --- 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 <dchen@diasemi.com>"); 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 <fabio.estevam@freescale.com> + * Based on arizona-irq.c, which is: + * + * Copyright 2012 Wolfson Microelectronics plc + * + * Author: Mark Brown <broonie@opensource.wolfsonmicro.com> + * + * 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 ^ permalink raw reply related [flat|nested] 22+ messages in thread
* Re: [PATCH 2/6] mfd: da9052: Introduce da9052-irq.c 2012-10-04 3:15 ` [PATCH 2/6] mfd: da9052: Introduce da9052-irq.c Fabio Estevam @ 2012-10-04 7:12 ` Arnd Bergmann 2012-10-04 11:14 ` Mark Brown 2012-10-04 11:25 ` Mark Brown 1 sibling, 1 reply; 22+ messages in thread From: Arnd Bergmann @ 2012-10-04 7:12 UTC (permalink / raw) To: Fabio Estevam Cc: sameo, broonie, ashish.jangam, dchen, kernel, linux-kernel, Fabio Estevam 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 ^ permalink raw reply [flat|nested] 22+ messages in thread
* Re: [PATCH 2/6] mfd: da9052: Introduce da9052-irq.c 2012-10-04 7:12 ` Arnd Bergmann @ 2012-10-04 11:14 ` Mark Brown 2012-10-04 12:17 ` Arnd Bergmann 0 siblings, 1 reply; 22+ messages in thread From: Mark Brown @ 2012-10-04 11:14 UTC (permalink / raw) To: Arnd Bergmann Cc: Fabio Estevam, sameo, ashish.jangam, dchen, kernel, linux-kernel, Fabio Estevam 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. ^ permalink raw reply [flat|nested] 22+ messages in thread
* Re: [PATCH 2/6] mfd: da9052: Introduce da9052-irq.c 2012-10-04 11:14 ` Mark Brown @ 2012-10-04 12:17 ` Arnd Bergmann 0 siblings, 0 replies; 22+ messages in thread From: Arnd Bergmann @ 2012-10-04 12:17 UTC (permalink / raw) To: Mark Brown Cc: Fabio Estevam, sameo, ashish.jangam, dchen, kernel, linux-kernel, Fabio Estevam 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 <arnd@arndb.de> ^ permalink raw reply [flat|nested] 22+ messages in thread
* Re: [PATCH 2/6] mfd: da9052: Introduce da9052-irq.c 2012-10-04 3:15 ` [PATCH 2/6] mfd: da9052: Introduce da9052-irq.c Fabio Estevam 2012-10-04 7:12 ` Arnd Bergmann @ 2012-10-04 11:25 ` Mark Brown 1 sibling, 0 replies; 22+ messages in thread From: Mark Brown @ 2012-10-04 11:25 UTC (permalink / raw) To: Fabio Estevam Cc: sameo, ashish.jangam, dchen, arnd, kernel, linux-kernel, Fabio Estevam On Thu, Oct 04, 2012 at 12:15:05AM -0300, Fabio Estevam wrote: > From: Fabio Estevam <fabio.estevam@freescale.com> > > 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 <broonie@opensource.wolfsonmicro.com> ^ permalink raw reply [flat|nested] 22+ messages in thread
* [PATCH 3/6] Input: da9052_tsi.c: Fix interrupt handling 2012-10-04 3:15 [PATCH 1/6] mfd: da9052-core: Use regmap_irq_get_virq() and fix the probe Fabio Estevam 2012-10-04 3:15 ` [PATCH 2/6] mfd: da9052: Introduce da9052-irq.c Fabio Estevam @ 2012-10-04 3:15 ` Fabio Estevam 2012-10-04 3:15 ` [PATCH 4/6] Input: da9052_onkey.c: Convert to the new da9052 interrupt functions Fabio Estevam ` (4 subsequent siblings) 6 siblings, 0 replies; 22+ messages in thread From: Fabio Estevam @ 2012-10-04 3:15 UTC (permalink / raw) To: sameo Cc: broonie, ashish.jangam, dchen, arnd, kernel, linux-kernel, Fabio Estevam, Dmitry Torokhov, linux-input From: Fabio Estevam <fabio.estevam@freescale.com> 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 <dmitry.torokhov@gmail.com> Cc: <linux-input@vger.kernel.org> Signed-off-by: Fabio Estevam <fabio.estevam@freescale.com> --- 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 ^ permalink raw reply related [flat|nested] 22+ messages in thread
* [PATCH 4/6] Input: da9052_onkey.c: Convert to the new da9052 interrupt functions. 2012-10-04 3:15 [PATCH 1/6] mfd: da9052-core: Use regmap_irq_get_virq() and fix the probe Fabio Estevam 2012-10-04 3:15 ` [PATCH 2/6] mfd: da9052: Introduce da9052-irq.c Fabio Estevam 2012-10-04 3:15 ` [PATCH 3/6] Input: da9052_tsi.c: Fix interrupt handling Fabio Estevam @ 2012-10-04 3:15 ` Fabio Estevam 2012-10-05 18:57 ` Mark Brown 2012-10-04 3:15 ` [PATCH 5/6] power: da9052-battery: " Fabio Estevam ` (3 subsequent siblings) 6 siblings, 1 reply; 22+ messages in thread From: Fabio Estevam @ 2012-10-04 3:15 UTC (permalink / raw) To: sameo Cc: broonie, ashish.jangam, dchen, arnd, kernel, linux-kernel, Fabio Estevam, Dmitry Torokhov, linux-input From: Fabio Estevam <fabio.estevam@freescale.com> Use the new da9052 irq functions and allow the driver to probe successfully. Cc: Dmitry Torokhov <dmitry.torokhov@gmail.com> Cc: <linux-input@vger.kernel.org> Signed-off-by: Fabio Estevam <fabio.estevam@freescale.com> --- 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 ^ permalink raw reply related [flat|nested] 22+ messages in thread
* Re: [PATCH 4/6] Input: da9052_onkey.c: Convert to the new da9052 interrupt functions. 2012-10-04 3:15 ` [PATCH 4/6] Input: da9052_onkey.c: Convert to the new da9052 interrupt functions Fabio Estevam @ 2012-10-05 18:57 ` Mark Brown 0 siblings, 0 replies; 22+ messages in thread From: Mark Brown @ 2012-10-05 18:57 UTC (permalink / raw) To: Fabio Estevam Cc: sameo, ashish.jangam, dchen, arnd, kernel, linux-kernel, Fabio Estevam, Dmitry Torokhov, linux-input On Thu, Oct 04, 2012 at 12:15:07AM -0300, Fabio Estevam wrote: > From: Fabio Estevam <fabio.estevam@freescale.com> > > Use the new da9052 irq functions and allow the driver to probe successfully. Reviewed-by: Mark Brown <broonie@opensource.wolfsonmicro.com> ^ permalink raw reply [flat|nested] 22+ messages in thread
* [PATCH 5/6] power: da9052-battery: Convert to the new da9052 interrupt functions 2012-10-04 3:15 [PATCH 1/6] mfd: da9052-core: Use regmap_irq_get_virq() and fix the probe Fabio Estevam ` (2 preceding siblings ...) 2012-10-04 3:15 ` [PATCH 4/6] Input: da9052_onkey.c: Convert to the new da9052 interrupt functions Fabio Estevam @ 2012-10-04 3:15 ` Fabio Estevam 2012-10-05 18:58 ` Mark Brown 2012-11-18 4:20 ` Anton Vorontsov 2012-10-04 3:15 ` [PATCH 6/6] gpio: gpio-da9052: " Fabio Estevam ` (2 subsequent siblings) 6 siblings, 2 replies; 22+ messages in thread From: Fabio Estevam @ 2012-10-04 3:15 UTC (permalink / raw) To: sameo Cc: broonie, ashish.jangam, dchen, arnd, kernel, linux-kernel, Fabio Estevam, Anton Vorontsov From: Fabio Estevam <fabio.estevam@freescale.com> Convert to the new da9052 interrupt functions, so that we can get rid of irq_base references. Cc: Anton Vorontsov <cbou@mail.ru> Signed-off-by: Fabio Estevam <fabio.estevam@freescale.com> --- 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 ^ permalink raw reply related [flat|nested] 22+ messages in thread
* Re: [PATCH 5/6] power: da9052-battery: Convert to the new da9052 interrupt functions 2012-10-04 3:15 ` [PATCH 5/6] power: da9052-battery: " Fabio Estevam @ 2012-10-05 18:58 ` Mark Brown 2012-11-18 4:20 ` Anton Vorontsov 1 sibling, 0 replies; 22+ messages in thread From: Mark Brown @ 2012-10-05 18:58 UTC (permalink / raw) To: Fabio Estevam Cc: sameo, ashish.jangam, dchen, arnd, kernel, linux-kernel, Fabio Estevam, Anton Vorontsov On Thu, Oct 04, 2012 at 12:15:08AM -0300, Fabio Estevam wrote: > From: Fabio Estevam <fabio.estevam@freescale.com> > > Convert to the new da9052 interrupt functions, so that we can get rid of > irq_base references. Reviewed-by: Mark Brown <broonie@opensource.wolfsonmicro.com> ^ permalink raw reply [flat|nested] 22+ messages in thread
* Re: [PATCH 5/6] power: da9052-battery: Convert to the new da9052 interrupt functions 2012-10-04 3:15 ` [PATCH 5/6] power: da9052-battery: " Fabio Estevam 2012-10-05 18:58 ` Mark Brown @ 2012-11-18 4:20 ` Anton Vorontsov 2012-11-18 12:30 ` Fabio Estevam 1 sibling, 1 reply; 22+ messages in thread From: Anton Vorontsov @ 2012-11-18 4:20 UTC (permalink / raw) To: Fabio Estevam Cc: sameo, broonie, ashish.jangam, dchen, arnd, kernel, linux-kernel, Fabio Estevam On Thu, Oct 04, 2012 at 12:15:08AM -0300, Fabio Estevam wrote: > From: Fabio Estevam <fabio.estevam@freescale.com> > > Convert to the new da9052 interrupt functions, so that we can get rid of > irq_base references. > > Cc: Anton Vorontsov <cbou@mail.ru> > Signed-off-by: Fabio Estevam <fabio.estevam@freescale.com> > --- 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 <cbouatmailru@gmail.com> ^ permalink raw reply [flat|nested] 22+ messages in thread
* Re: [PATCH 5/6] power: da9052-battery: Convert to the new da9052 interrupt functions 2012-11-18 4:20 ` Anton Vorontsov @ 2012-11-18 12:30 ` Fabio Estevam 0 siblings, 0 replies; 22+ messages in thread From: Fabio Estevam @ 2012-11-18 12:30 UTC (permalink / raw) To: Anton Vorontsov Cc: sameo, broonie, ashish.jangam, dchen, arnd, kernel, linux-kernel, Fabio Estevam On Sun, Nov 18, 2012 at 2:20 AM, Anton Vorontsov <cbouatmailru@gmail.com> 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 <cbouatmailru@gmail.com> Thanks, Anton. Yes, the mfd patches still need to be applied by Samuel so that all dependencies can be resolved. Samuel? Thanks, Fabio Estevam ^ permalink raw reply [flat|nested] 22+ messages in thread
* [PATCH 6/6] gpio: gpio-da9052: Convert to the new da9052 interrupt functions 2012-10-04 3:15 [PATCH 1/6] mfd: da9052-core: Use regmap_irq_get_virq() and fix the probe Fabio Estevam ` (3 preceding siblings ...) 2012-10-04 3:15 ` [PATCH 5/6] power: da9052-battery: " Fabio Estevam @ 2012-10-04 3:15 ` Fabio Estevam 2012-10-04 11:26 ` Mark Brown 2012-10-08 6:20 ` Linus Walleij 2012-10-04 11:26 ` [PATCH 1/6] mfd: da9052-core: Use regmap_irq_get_virq() and fix the probe Mark Brown 2012-11-18 23:44 ` Samuel Ortiz 6 siblings, 2 replies; 22+ messages in thread From: Fabio Estevam @ 2012-10-04 3:15 UTC (permalink / raw) To: sameo Cc: broonie, ashish.jangam, dchen, arnd, kernel, linux-kernel, Fabio Estevam, Grant Likely, Linus Walleij From: Fabio Estevam <fabio.estevam@freescale.com> Convert to the new da9052 interrupt functions, so that we can get rid of irq_base references. Cc: Grant Likely <grant.likely@secretlab.ca> Cc: Linus Walleij <linus.walleij@linaro.org> Signed-off-by: Fabio Estevam <fabio.estevam@freescale.com> --- 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 ^ permalink raw reply related [flat|nested] 22+ messages in thread
* Re: [PATCH 6/6] gpio: gpio-da9052: Convert to the new da9052 interrupt functions 2012-10-04 3:15 ` [PATCH 6/6] gpio: gpio-da9052: " Fabio Estevam @ 2012-10-04 11:26 ` Mark Brown 2012-10-08 6:20 ` Linus Walleij 1 sibling, 0 replies; 22+ messages in thread From: Mark Brown @ 2012-10-04 11:26 UTC (permalink / raw) To: Fabio Estevam Cc: sameo, ashish.jangam, dchen, arnd, kernel, linux-kernel, Fabio Estevam, Grant Likely, Linus Walleij On Thu, Oct 04, 2012 at 12:15:09AM -0300, Fabio Estevam wrote: > From: Fabio Estevam <fabio.estevam@freescale.com> > > Convert to the new da9052 interrupt functions, so that we can get rid of > irq_base references. Reviewed-by: Mark Brown <broonie@opensource.wolfsonmicro.com> ^ permalink raw reply [flat|nested] 22+ messages in thread
* Re: [PATCH 6/6] gpio: gpio-da9052: Convert to the new da9052 interrupt functions 2012-10-04 3:15 ` [PATCH 6/6] gpio: gpio-da9052: " Fabio Estevam 2012-10-04 11:26 ` Mark Brown @ 2012-10-08 6:20 ` Linus Walleij 2012-10-08 10:40 ` Fabio Estevam 1 sibling, 1 reply; 22+ messages in thread From: Linus Walleij @ 2012-10-08 6:20 UTC (permalink / raw) To: Fabio Estevam Cc: sameo, broonie, ashish.jangam, dchen, arnd, kernel, linux-kernel, Fabio Estevam, Grant Likely On Thu, Oct 4, 2012 at 5:15 AM, Fabio Estevam <festevam@gmail.com> wrote: > From: Fabio Estevam <fabio.estevam@freescale.com> > > Convert to the new da9052 interrupt functions, so that we can get rid of > irq_base references. > > Cc: Grant Likely <grant.likely@secretlab.ca> > Cc: Linus Walleij <linus.walleij@linaro.org> > Signed-off-by: Fabio Estevam <fabio.estevam@freescale.com> Applied to my GPIO tree with Mark's ACK. Yours, Linus Walleij ^ permalink raw reply [flat|nested] 22+ messages in thread
* Re: [PATCH 6/6] gpio: gpio-da9052: Convert to the new da9052 interrupt functions 2012-10-08 6:20 ` Linus Walleij @ 2012-10-08 10:40 ` Fabio Estevam 2012-10-09 12:04 ` Linus Walleij 0 siblings, 1 reply; 22+ messages in thread From: Fabio Estevam @ 2012-10-08 10:40 UTC (permalink / raw) To: Linus Walleij Cc: sameo, broonie, ashish.jangam, dchen, arnd, kernel, linux-kernel, Fabio Estevam, Grant Likely Hi Linus, On Mon, Oct 8, 2012 at 3:20 AM, Linus Walleij <linus.walleij@linaro.org> wrote: > On Thu, Oct 4, 2012 at 5:15 AM, Fabio Estevam <festevam@gmail.com> wrote: > >> From: Fabio Estevam <fabio.estevam@freescale.com> >> >> Convert to the new da9052 interrupt functions, so that we can get rid of >> irq_base references. >> >> Cc: Grant Likely <grant.likely@secretlab.ca> >> Cc: Linus Walleij <linus.walleij@linaro.org> >> Signed-off-by: Fabio Estevam <fabio.estevam@freescale.com> > > 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 ^ permalink raw reply [flat|nested] 22+ messages in thread
* Re: [PATCH 6/6] gpio: gpio-da9052: Convert to the new da9052 interrupt functions 2012-10-08 10:40 ` Fabio Estevam @ 2012-10-09 12:04 ` Linus Walleij 2012-10-09 12:19 ` Fabio Estevam 0 siblings, 1 reply; 22+ messages in thread From: Linus Walleij @ 2012-10-09 12:04 UTC (permalink / raw) To: Fabio Estevam Cc: sameo, broonie, ashish.jangam, dchen, arnd, kernel, linux-kernel, Fabio Estevam, Grant Likely On Mon, Oct 8, 2012 at 12:40 PM, Fabio Estevam <festevam@gmail.com> wrote: > Hi Linus, > On Mon, Oct 8, 2012 at 3:20 AM, Linus Walleij <linus.walleij@linaro.org> wrote: >> On Thu, Oct 4, 2012 at 5:15 AM, Fabio Estevam <festevam@gmail.com> wrote: >> >>> From: Fabio Estevam <fabio.estevam@freescale.com> >>> >>> Convert to the new da9052 interrupt functions, so that we can get rid of >>> irq_base references. >>> >>> Cc: Grant Likely <grant.likely@secretlab.ca> >>> Cc: Linus Walleij <linus.walleij@linaro.org> >>> Signed-off-by: Fabio Estevam <fabio.estevam@freescale.com> >> >> 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 <linus.walleij@linaro.org> Linus Walleij ^ permalink raw reply [flat|nested] 22+ messages in thread
* Re: [PATCH 6/6] gpio: gpio-da9052: Convert to the new da9052 interrupt functions 2012-10-09 12:04 ` Linus Walleij @ 2012-10-09 12:19 ` Fabio Estevam 0 siblings, 0 replies; 22+ messages in thread From: Fabio Estevam @ 2012-10-09 12:19 UTC (permalink / raw) To: Linus Walleij Cc: sameo, broonie, ashish.jangam, dchen, arnd, kernel, linux-kernel, Fabio Estevam, Grant Likely On Tue, Oct 9, 2012 at 9:04 AM, Linus Walleij <linus.walleij@linaro.org> 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 <linus.walleij@linaro.org> Sascha/Samuel/Arnd, Which tree could take this patch series, please? Thanks, Fabio Estevam ^ permalink raw reply [flat|nested] 22+ messages in thread
* Re: [PATCH 1/6] mfd: da9052-core: Use regmap_irq_get_virq() and fix the probe 2012-10-04 3:15 [PATCH 1/6] mfd: da9052-core: Use regmap_irq_get_virq() and fix the probe Fabio Estevam ` (4 preceding siblings ...) 2012-10-04 3:15 ` [PATCH 6/6] gpio: gpio-da9052: " Fabio Estevam @ 2012-10-04 11:26 ` Mark Brown 2012-11-12 16:22 ` Fabio Estevam 2012-11-18 23:44 ` Samuel Ortiz 6 siblings, 1 reply; 22+ messages in thread From: Mark Brown @ 2012-10-04 11:26 UTC (permalink / raw) To: Fabio Estevam Cc: sameo, ashish.jangam, dchen, arnd, kernel, linux-kernel, Fabio Estevam On Thu, Oct 04, 2012 at 12:15:04AM -0300, Fabio Estevam wrote: > From: Fabio Estevam <fabio.estevam@freescale.com> > > 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 <broonie@opensource.wolfsonmicro.com> ^ permalink raw reply [flat|nested] 22+ messages in thread
* Re: [PATCH 1/6] mfd: da9052-core: Use regmap_irq_get_virq() and fix the probe 2012-10-04 11:26 ` [PATCH 1/6] mfd: da9052-core: Use regmap_irq_get_virq() and fix the probe Mark Brown @ 2012-11-12 16:22 ` Fabio Estevam 0 siblings, 0 replies; 22+ messages in thread From: Fabio Estevam @ 2012-11-12 16:22 UTC (permalink / raw) To: Mark Brown, sameo Cc: ashish.jangam, dchen, arnd, kernel, linux-kernel, Fabio Estevam Hi Samuel, On Thu, Oct 4, 2012 at 8:26 AM, Mark Brown <broonie@opensource.wolfsonmicro.com> wrote: > On Thu, Oct 04, 2012 at 12:15:04AM -0300, Fabio Estevam wrote: >> From: Fabio Estevam <fabio.estevam@freescale.com> >> >> 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 <broonie@opensource.wolfsonmicro.com> Could this series be applied, please? Thanks, Fabio Estevam ^ permalink raw reply [flat|nested] 22+ messages in thread
* Re: [PATCH 1/6] mfd: da9052-core: Use regmap_irq_get_virq() and fix the probe 2012-10-04 3:15 [PATCH 1/6] mfd: da9052-core: Use regmap_irq_get_virq() and fix the probe Fabio Estevam ` (5 preceding siblings ...) 2012-10-04 11:26 ` [PATCH 1/6] mfd: da9052-core: Use regmap_irq_get_virq() and fix the probe Mark Brown @ 2012-11-18 23:44 ` Samuel Ortiz 6 siblings, 0 replies; 22+ messages in thread From: Samuel Ortiz @ 2012-11-18 23:44 UTC (permalink / raw) To: Fabio Estevam Cc: broonie, ashish.jangam, dchen, arnd, kernel, linux-kernel, Fabio Estevam Hi Fabio, On Thu, Oct 04, 2012 at 12:15:04AM -0300, Fabio Estevam wrote: > From: Fabio Estevam <fabio.estevam@freescale.com> > > 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 <fabio.estevam@freescale.com> > --- > 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/ ^ permalink raw reply [flat|nested] 22+ messages in thread
end of thread, other threads:[~2012-11-18 23:44 UTC | newest] Thread overview: 22+ messages (download: mbox.gz follow: Atom feed -- links below jump to the message on this page -- 2012-10-04 3:15 [PATCH 1/6] mfd: da9052-core: Use regmap_irq_get_virq() and fix the probe Fabio Estevam 2012-10-04 3:15 ` [PATCH 2/6] mfd: da9052: Introduce da9052-irq.c Fabio Estevam 2012-10-04 7:12 ` Arnd Bergmann 2012-10-04 11:14 ` Mark Brown 2012-10-04 12:17 ` Arnd Bergmann 2012-10-04 11:25 ` Mark Brown 2012-10-04 3:15 ` [PATCH 3/6] Input: da9052_tsi.c: Fix interrupt handling Fabio Estevam 2012-10-04 3:15 ` [PATCH 4/6] Input: da9052_onkey.c: Convert to the new da9052 interrupt functions Fabio Estevam 2012-10-05 18:57 ` Mark Brown 2012-10-04 3:15 ` [PATCH 5/6] power: da9052-battery: " Fabio Estevam 2012-10-05 18:58 ` Mark Brown 2012-11-18 4:20 ` Anton Vorontsov 2012-11-18 12:30 ` Fabio Estevam 2012-10-04 3:15 ` [PATCH 6/6] gpio: gpio-da9052: " Fabio Estevam 2012-10-04 11:26 ` Mark Brown 2012-10-08 6:20 ` Linus Walleij 2012-10-08 10:40 ` Fabio Estevam 2012-10-09 12:04 ` Linus Walleij 2012-10-09 12:19 ` Fabio Estevam 2012-10-04 11:26 ` [PATCH 1/6] mfd: da9052-core: Use regmap_irq_get_virq() and fix the probe Mark Brown 2012-11-12 16:22 ` Fabio Estevam 2012-11-18 23:44 ` Samuel Ortiz
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox; as well as URLs for NNTP newsgroup(s).