static int regmap_irq_set_type(struct irq_data *data, unsigned int type) { struct regmap_irq_chip_data *d = irq_data_get_irq_chip_data(data); struct regmap *map = d->map; const struct regmap_irq *irq_data = irq_to_regmap_irq(d, data->hwirq); int reg = irq_data->type_reg_offset / map->reg_stride; if (!(irq_data->type_rising_mask | irq_data->type_falling_mask)) return 0; d->type_buf[reg] &= ~(irq_data->type_falling_mask | irq_data->type_rising_mask); switch (type) { case IRQ_TYPE_EDGE_FALLING: d->type_buf[reg] |= irq_data->type_falling_mask; break; case IRQ_TYPE_EDGE_RISING: d->type_buf[reg] |= irq_data->type_rising_mask; break; case IRQ_TYPE_EDGE_BOTH: d->type_buf[reg] |= (irq_data->type_falling_mask | irq_data->type_rising_mask); break; default: return -EINVAL; } return 0; }
static void regmap_irq_disable(struct irq_data *data) { struct regmap_irq_chip_data *d = irq_data_get_irq_chip_data(data); const struct regmap_irq *irq_data = irq_to_regmap_irq(d, data->irq); d->mask_buf[irq_data->reg_offset] |= irq_data->mask; }
static void regmap_irq_disable(struct irq_data *data) { struct regmap_irq_chip_data *d = irq_data_get_irq_chip_data(data); struct regmap *map = d->map; const struct regmap_irq *irq_data = irq_to_regmap_irq(d, data->hwirq); d->mask_buf[irq_data->reg_offset / map->reg_stride] |= irq_data->mask; }
static int regmap_irq_set_wake(struct irq_data *data, unsigned int on) { struct regmap_irq_chip_data *d = irq_data_get_irq_chip_data(data); struct regmap *map = d->map; const struct regmap_irq *irq_data = irq_to_regmap_irq(d, data->hwirq); if (on) { if (d->wake_buf) d->wake_buf[irq_data->reg_offset / map->reg_stride] &= ~irq_data->mask; d->wake_count++; } else { if (d->wake_buf) d->wake_buf[irq_data->reg_offset / map->reg_stride] |= irq_data->mask; d->wake_count--; } return 0; }