Skip to content

Commit

Permalink
---
Browse files Browse the repository at this point in the history
yaml
---
r: 330017
b: refs/heads/master
c: 837c829
h: refs/heads/master
i:
  330015: b35a690
v: v3
  • Loading branch information
Haojian Zhuang authored and Samuel Ortiz committed Oct 2, 2012
1 parent 766dd7f commit ab17fff
Show file tree
Hide file tree
Showing 2 changed files with 39 additions and 28 deletions.
2 changes: 1 addition & 1 deletion [refs]
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
---
refs/heads/master: 8284328cd98b9ac9eebf646e6fcb9047bc12bf55
refs/heads/master: 837c8293ba24d08cd7438d82ad9bb8d2fb0f8a5b
65 changes: 38 additions & 27 deletions trunk/drivers/mfd/88pm860x-core.c
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@
#include <linux/i2c.h>
#include <linux/irq.h>
#include <linux/interrupt.h>
#include <linux/irqdomain.h>
#include <linux/platform_device.h>
#include <linux/regmap.h>
#include <linux/slab.h>
Expand Down Expand Up @@ -520,15 +521,12 @@ static void pm860x_irq_sync_unlock(struct irq_data *data)

static void pm860x_irq_enable(struct irq_data *data)
{
struct pm860x_chip *chip = irq_data_get_irq_chip_data(data);
pm860x_irqs[data->irq - chip->irq_base].enable
= pm860x_irqs[data->irq - chip->irq_base].offs;
pm860x_irqs[data->hwirq].enable = pm860x_irqs[data->hwirq].offs;
}

static void pm860x_irq_disable(struct irq_data *data)
{
struct pm860x_chip *chip = irq_data_get_irq_chip_data(data);
pm860x_irqs[data->irq - chip->irq_base].enable = 0;
pm860x_irqs[data->hwirq].enable = 0;
}

static struct irq_chip pm860x_irq_chip = {
Expand All @@ -539,6 +537,25 @@ static struct irq_chip pm860x_irq_chip = {
.irq_disable = pm860x_irq_disable,
};

static int pm860x_irq_domain_map(struct irq_domain *d, unsigned int virq,
irq_hw_number_t hw)
{
irq_set_chip_data(virq, d->host_data);
irq_set_chip_and_handler(virq, &pm860x_irq_chip, handle_edge_irq);
irq_set_nested_thread(virq, 1);
#ifdef CONFIG_ARM
set_irq_flags(virq, IRQF_VALID);
#else
irq_set_noprobe(virq);
#endif
return 0;
}

static struct irq_domain_ops pm860x_irq_domain_ops = {
.map = pm860x_irq_domain_map,
.xlate = irq_domain_xlate_onetwocell,
};

static int __devinit device_gpadc_init(struct pm860x_chip *chip,
struct pm860x_platform_data *pdata)
{
Expand Down Expand Up @@ -593,13 +610,9 @@ static int __devinit device_irq_init(struct pm860x_chip *chip,
: chip->companion;
unsigned char status_buf[INT_STATUS_NUM];
unsigned long flags = IRQF_TRIGGER_FALLING | IRQF_ONESHOT;
int i, data, mask, ret = -EINVAL;
int __irq;

if (!pdata || !pdata->irq_base) {
dev_warn(chip->dev, "No interrupt support on IRQ base\n");
return -EINVAL;
}
int data, mask, ret = -EINVAL;
int nr_irqs, irq_base = -1;
struct device_node *node = i2c->dev.of_node;

mask = PM8607_B0_MISC1_INV_INT | PM8607_B0_MISC1_INT_CLEAR
| PM8607_B0_MISC1_INT_MASK;
Expand Down Expand Up @@ -639,25 +652,23 @@ static int __devinit device_irq_init(struct pm860x_chip *chip,
goto out;

mutex_init(&chip->irq_lock);
chip->irq_base = pdata->irq_base;

if (pdata && pdata->irq_base)
irq_base = pdata->irq_base;
nr_irqs = ARRAY_SIZE(pm860x_irqs);
chip->irq_base = irq_alloc_descs(irq_base, 0, nr_irqs, 0);
if (chip->irq_base < 0) {
dev_err(&i2c->dev, "Failed to allocate interrupts, ret:%d\n",
chip->irq_base);
ret = -EBUSY;
goto out;
}
irq_domain_add_legacy(node, nr_irqs, chip->irq_base, 0,
&pm860x_irq_domain_ops, chip);
chip->core_irq = i2c->irq;
if (!chip->core_irq)
goto out;

/* register IRQ by genirq */
for (i = 0; i < ARRAY_SIZE(pm860x_irqs); i++) {
__irq = i + chip->irq_base;
irq_set_chip_data(__irq, chip);
irq_set_chip_and_handler(__irq, &pm860x_irq_chip,
handle_edge_irq);
irq_set_nested_thread(__irq, 1);
#ifdef CONFIG_ARM
set_irq_flags(__irq, IRQF_VALID);
#else
irq_set_noprobe(__irq);
#endif
}

ret = request_threaded_irq(chip->core_irq, NULL, pm860x_irq, flags | IRQF_ONESHOT,
"88pm860x", chip);
if (ret) {
Expand Down

0 comments on commit ab17fff

Please sign in to comment.