in spmi-pmic-arb.c [702:740]
static int qpnpint_irq_set_type(struct irq_data *d, unsigned int flow_type)
{
struct spmi_pmic_arb_qpnpint_type type = {0};
struct spmi_pmic_arb_qpnpint_type mask;
irq_flow_handler_t flow_handler;
u8 irq_bit = BIT(hwirq_to_irq(d->hwirq));
int rc;
if (flow_type & (IRQF_TRIGGER_RISING | IRQF_TRIGGER_FALLING)) {
type.type = irq_bit;
if (flow_type & IRQF_TRIGGER_RISING)
type.polarity_high = irq_bit;
if (flow_type & IRQF_TRIGGER_FALLING)
type.polarity_low = irq_bit;
flow_handler = handle_edge_irq;
} else {
if ((flow_type & (IRQF_TRIGGER_HIGH)) &&
(flow_type & (IRQF_TRIGGER_LOW)))
return -EINVAL;
if (flow_type & IRQF_TRIGGER_HIGH)
type.polarity_high = irq_bit;
else
type.polarity_low = irq_bit;
flow_handler = handle_level_irq;
}
mask.type = irq_bit;
mask.polarity_high = irq_bit;
mask.polarity_low = irq_bit;
rc = qpnpint_spmi_masked_write(d, QPNPINT_REG_SET_TYPE, &type, &mask,
sizeof(type));
irq_set_handler_locked(d, flow_handler);
return rc;
}