forked from torvalds/linux
-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
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]> Acked-by: Arnd Bergmann <[email protected]> Reviewed-by: Mark Brown <[email protected]> Signed-off-by: Samuel Ortiz <[email protected]>
- Loading branch information
Fabio Estevam
authored and
Samuel Ortiz
committed
Nov 20, 2012
1 parent
ffe20b6
commit 8bad1ab
Showing
4 changed files
with
307 additions
and
263 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -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 @@ int da9052_adc_manual_read(struct da9052 *da9052, unsigned char channel) | |
} | ||
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]>"); | ||
|
Oops, something went wrong.