static void qpnpint_irq_unmask(struct irq_data *d) { struct q_irq_data *irq_d = irq_data_get_irq_chip_data(d); struct q_chip_data *chip_d = irq_d->chip_d; struct q_perip_data *per_d = irq_d->per_d; struct qpnp_irq_spec q_spec; int rc; pr_debug("hwirq %lu irq: %d\n", d->hwirq, d->irq); if (chip_d->cb.unmask) { rc = qpnpint_decode_hwirq(d->hwirq, &q_spec); if (rc) pr_err("decode failed on hwirq %lu\n", d->hwirq); else chip_d->cb.unmask(chip_d->spmi_ctrl, &q_spec, irq_d->priv_d); } per_d->int_en |= irq_d->mask_shift; rc = qpnpint_spmi_write(irq_d, QPNPINT_REG_EN_SET, &irq_d->mask_shift, 1); if (rc) pr_err("spmi failure on irq %d\n", d->irq); }
static int qpnpint_init_irq_data(struct q_chip_data *chip_d, struct q_irq_data *irq_d, unsigned long hwirq) { struct qpnp_irq_spec q_spec; int rc; irq_d->mask_shift = 1 << (hwirq & 0x7); rc = qpnpint_decode_hwirq(hwirq, &q_spec); if (rc < 0) return rc; irq_d->spmi_slave = q_spec.slave; irq_d->spmi_offset = q_spec.per << 8; irq_d->chip_d = chip_d; irq_d->priv_d = QPNPINT_INVALID_DATA; if (chip_d->cb && chip_d->cb->register_priv_data) { rc = chip_d->cb->register_priv_data(chip_d->spmi_ctrl, &q_spec, &irq_d->priv_d); if (rc) return rc; } irq_d->per_d->use_count++; return 0; }
static int qpnpint_arbiter_op(struct irq_data *d, struct q_irq_data *irq_d, int (*arb_op)(struct spmi_controller *, struct qpnp_irq_spec *, uint32_t)) { struct q_chip_data *chip_d = irq_d->chip_d; struct qpnp_irq_spec q_spec; int rc; if (!arb_op) return 0; if (!chip_d->cb->register_priv_data) { pr_warn_ratelimited("No ability to register arbiter registration data\n"); return -ENODEV; } rc = qpnpint_decode_hwirq(d->hwirq, &q_spec); if (rc) { pr_err_ratelimited("%s: decode failed on hwirq %lu\n", __func__, d->hwirq); return rc; } else { if (irq_d->priv_d == QPNPINT_INVALID_DATA) { rc = chip_d->cb->register_priv_data(chip_d->spmi_ctrl, &q_spec, &irq_d->priv_d); if (rc) { pr_err_ratelimited( "%s: decode failed on hwirq %lu\n", __func__, d->hwirq); return rc; } } arb_op(chip_d->spmi_ctrl, &q_spec, irq_d->priv_d); } return 0; }