static int pm8xxx_irq_set_type(struct irq_data *d, unsigned int flow_type) { struct pm_irq_chip *chip = irq_data_get_irq_chip_data(d); unsigned int pmirq = d->irq - chip->irq_base; int master, irq_bit; u8 block, config; block = pmirq / 8; master = block / 8; irq_bit = pmirq % 8; chip->config[pmirq] = (irq_bit << PM_IRQF_BITS_SHIFT) | PM_IRQF_MASK_ALL; if (flow_type & (IRQF_TRIGGER_RISING | IRQF_TRIGGER_FALLING)) { if (flow_type & IRQF_TRIGGER_RISING) chip->config[pmirq] &= ~PM_IRQF_MASK_RE; if (flow_type & IRQF_TRIGGER_FALLING) chip->config[pmirq] &= ~PM_IRQF_MASK_FE; } else { chip->config[pmirq] |= PM_IRQF_LVL_SEL; if (flow_type & IRQF_TRIGGER_HIGH) chip->config[pmirq] &= ~PM_IRQF_MASK_RE; else chip->config[pmirq] &= ~PM_IRQF_MASK_FE; } config = chip->config[pmirq] | PM_IRQF_CLR; return pm8xxx_write_config_irq(chip, block, config); }
static void pm8xxx_irq_mask_ack(struct irq_data *d) { struct pm_irq_chip *chip = irq_data_get_irq_chip_data(d); unsigned int pmirq = d->irq - chip->irq_base; int master, irq_bit; u8 block, config; block = pmirq / 8; master = block / 8; irq_bit = pmirq % 8; config = chip->config[pmirq] | PM_IRQF_MASK_ALL | PM_IRQF_CLR; pm8xxx_write_config_irq(chip, block, config); }
static void pm8xxx_irq_unmask(struct irq_data *d) { struct pm_irq_chip *chip = irq_data_get_irq_chip_data(d); unsigned int pmirq = d->irq - chip->irq_base; int master, irq_bit; u8 block, config, hw_conf; block = pmirq / 8; master = block / 8; irq_bit = pmirq % 8; config = chip->config[pmirq]; pm8xxx_read_config_irq(chip, block, config, &hw_conf); /* check if it is masked */ if ((hw_conf & PM_IRQF_MASK_ALL) == PM_IRQF_MASK_ALL) pm8xxx_write_config_irq(chip, block, config); }
static void pm8xxx_irq_mask_ack(struct irq_data *d) { struct pm_irq_chip *chip = irq_data_get_irq_chip_data(d); unsigned int pmirq = d->irq - chip->irq_base; int master, irq_bit; u8 block, config; block = pmirq / 8; master = block / 8; irq_bit = pmirq % 8; if (chip->config[pmirq] == 0) { pr_warn("mask acking rouge irq=%d pmirq=%d\n", d->irq, pmirq); chip->config[pmirq] = irq_bit << PM_IRQF_BITS_SHIFT; } config = chip->config[pmirq] | PM_IRQF_MASK_ALL | PM_IRQF_CLR; pm8xxx_write_config_irq(chip, block, config); }