示例#1
0
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;
}
示例#3
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;
}