Exemplo n.º 1
0
static void combiner_handle_cascade_irq(unsigned int irq, struct irq_desc *desc)
{
	struct combiner_chip_data *chip_data = irq_get_handler_data(irq);
	struct irq_chip *chip = irq_get_chip(irq);
	unsigned int cascade_irq, combiner_irq;
	unsigned long status;

	chained_irq_enter(chip, desc);

	spin_lock(&irq_controller_lock);
	status = __raw_readl(chip_data->base + COMBINER_INT_STATUS);
	spin_unlock(&irq_controller_lock);
	status &= chip_data->irq_mask;

	if (status == 0) {
		do_bad_IRQ(irq, desc);
		goto out;
	}

	combiner_irq = __ffs(status);

	cascade_irq = combiner_irq + (chip_data->irq_offset & ~31);
	if (unlikely(cascade_irq >= NR_IRQS))
		do_bad_IRQ(cascade_irq, desc);
	else
		generic_handle_irq(cascade_irq);

 out:
	chained_irq_exit(chip, desc);
}
Exemplo n.º 2
0
static void gic_handle_cascade_irq(unsigned int irq, struct irq_desc *desc)
{
    struct gic_chip_data *chip_data = get_irq_data(irq);
    struct irq_chip *chip = get_irq_chip(irq);
    unsigned int cascade_irq, gic_irq;
    unsigned long status;

    /* primary controller ack'ing */
    chip->ack(irq);

    spin_lock(&irq_controller_lock);
    status = readl(chip_data->cpu_base + GIC_CPU_INTACK);
    spin_unlock(&irq_controller_lock);

    gic_irq = (status & 0x3ff);
    if (gic_irq == 1023)
        goto out;

    cascade_irq = gic_irq + chip_data->irq_offset;
    if (unlikely(gic_irq < 32 || gic_irq > 1020 || cascade_irq >= NR_IRQS))
        do_bad_IRQ(cascade_irq, desc);
    else
        generic_handle_irq(cascade_irq);

out:
    /* primary controller unmasking */
    chip->unmask(irq);
}
Exemplo n.º 3
0
static void gic_handle_cascade_irq(unsigned int irq, struct irq_desc *desc)
{
	struct gic_chip_data *chip_data = irq_get_handler_data(irq);
	struct irq_chip *chip = irq_get_chip(irq);
	unsigned int cascade_irq, gic_irq;
	unsigned long status;

	chained_irq_enter(chip, desc);

	raw_spin_lock(&irq_controller_lock);
	status = readl_relaxed(chip_data->cpu_base + GIC_CPU_INTACK);
	raw_spin_unlock(&irq_controller_lock);

	gic_irq = (status & 0x3ff);
	if (gic_irq == 1023)
		goto out;

	cascade_irq = gic_irq + chip_data->irq_offset;
	if (unlikely(gic_irq < 32 || gic_irq > 1020 || cascade_irq >= NR_IRQS))
		do_bad_IRQ(cascade_irq, desc);
	else
		generic_handle_irq(cascade_irq);

 out:
	chained_irq_exit(chip, desc);
}
Exemplo n.º 4
0
static void combiner_handle_cascade_irq(unsigned int irq, struct irq_desc *desc)
{
	struct combiner_chip_data *chip_data = irq_get_handler_data(irq);
	struct irq_chip *chip = irq_get_chip(irq);
	unsigned int cascade_irq, combiner_irq;
	unsigned long status;

	chained_irq_enter(chip, desc);

	spin_lock(&irq_controller_lock);
	status = readl_relaxed(chip_data->base + COMBINER_INT_STATUS);
	spin_unlock(&irq_controller_lock);
	status &= chip_data->irq_mask;

	if (status == 0)
		goto out;

	combiner_irq = chip_data->hwirq_offset + __ffs(status);
	cascade_irq = irq_find_mapping(combiner_irq_domain, combiner_irq);

	if (unlikely(!cascade_irq))
		do_bad_IRQ(irq, desc);
	else
		generic_handle_irq(cascade_irq);

 out:
	chained_irq_exit(chip, desc);
}
Exemplo n.º 5
0
static void s5p_irq_demux_eint16_31(unsigned int irq, struct irq_desc *desc)
{
    u32 a16_23, a24_31;

    a16_23 = s5p_irq_demux_eint(IRQ_EINT(16));
    a24_31 = s5p_irq_demux_eint(IRQ_EINT(24));

    if (!a16_23 && !a24_31)
        do_bad_IRQ(irq, desc);
}
Exemplo n.º 6
0
static void
isa_irq_handler(unsigned int irq, struct irq_desc *desc)
{
	unsigned int isa_irq = *(unsigned char *)PCIIACK_BASE;

	if (isa_irq < _ISA_IRQ(0) || isa_irq >= _ISA_IRQ(16)) {
		do_bad_IRQ(isa_irq, desc);
		return;
	}

	generic_handle_irq(isa_irq);
}
Exemplo n.º 7
0
static void
isa_irq_handler(unsigned int irq, struct irqdesc *desc, struct pt_regs *regs)
{
	unsigned int isa_irq = *(unsigned char *)PCIIACK_BASE;

	if (isa_irq < _ISA_IRQ(0) || isa_irq >= _ISA_IRQ(16)) {
		do_bad_IRQ(isa_irq, desc, regs);
		return;
	}

	desc = irq_desc + isa_irq;
	desc->handle(isa_irq, desc, regs);
}
Exemplo n.º 8
0
static void exynos_irq_demux_eint16_31(unsigned int irq, struct irq_desc *desc)
{
	struct irq_chip *chip = irq_get_chip(irq);
	u32 a16_23, a24_31;

	chained_irq_enter(chip, desc);
	a16_23 = exynos_irq_demux_eint(IRQ_EINT(16));
	a24_31 = exynos_irq_demux_eint(IRQ_EINT(24));
	chained_irq_exit(chip, desc);

	if (!a16_23 && !a24_31)
		do_bad_IRQ(irq, desc);
}
static void fpga_irq_handle(unsigned int irq, struct irq_desc *desc)
{
	struct fpga_irq_data *f = irq_desc_get_handler_data(desc);
	u32 status = readl(f->base + IRQ_STATUS);

	if (status == 0) {
		do_bad_IRQ(irq, desc);
		return;
	}

	do {
		irq = ffs(status) - 1;
		status &= ~(1 << irq);
		generic_handle_irq(irq_find_mapping(f->domain, irq));
	} while (status);
}
Exemplo n.º 10
0
static void s5pv310_irq_demux_eint16_31(unsigned int irq, struct irq_desc *desc)
{
	struct irq_chip *chip = get_irq_chip(irq);
	u32 a16_23, a24_31;

	if (chip->ack)
		chip->ack(irq);

	a16_23 = s5pv310_irq_demux_eint(irq, IRQ_EINT(16));
	a24_31 = s5pv310_irq_demux_eint(irq, IRQ_EINT(24));
		
	if (!a16_23 && !a24_31)
		do_bad_IRQ(irq, desc);

	chip->unmask(irq);
}
Exemplo n.º 11
0
static void pmu_irq_handler(unsigned int irq, struct irq_desc *desc)
{
	unsigned long cause = readl(PMU_INTERRUPT_CAUSE);

	cause &= readl(PMU_INTERRUPT_MASK);
	if (cause == 0) {
		do_bad_IRQ(irq, desc);
		return;
	}

	for (irq = 0; irq < NR_PMU_IRQS; irq++) {
		if (!(cause & (1 << irq)))
			continue;
		irq = pmu_to_irq(irq);
		generic_handle_irq(irq);
	}
}
Exemplo n.º 12
0
static void
sic_handle_irq(unsigned int irq, struct irq_desc *desc)
{
	unsigned long status = readl(VA_SIC_BASE + SIC_IRQ_STATUS);

	if (status == 0) {
		do_bad_IRQ(irq, desc);
		return;
	}

	do {
		irq = ffs(status) - 1;
		status &= ~(1 << irq);

		irq += IRQ_SIC_START;

		generic_handle_irq(irq);
	} while (status);
}
Exemplo n.º 13
0
static void s5pv310_irq_eint0_15(unsigned int irq, struct irq_desc *desc)
{
	u32 i;
	struct irq_chip *chip = get_irq_chip(irq);

	if (chip->ack)
		chip->ack(irq);

	for (i = 0; i <= 15; i++) {
		if (irq == s5pv310_get_irq_nr(i)) {
			generic_handle_irq(IRQ_EINT(i));
			goto out;
		}
	}
	
	do_bad_IRQ(irq, desc);
out:
	chip->unmask(irq);
}
Exemplo n.º 14
0
static void
sic_handle_irq(unsigned int irq, struct irqdesc *desc, struct pt_regs *regs)
{
	unsigned long status = sic_readl(INTCP_VA_SIC_BASE + IRQ_STATUS);

	if (status == 0) {
		do_bad_IRQ(irq, desc, regs);
		return;
	}

	do {
		irq = ffs(status) - 1;
		status &= ~(1 << irq);

		irq += IRQ_SIC_START;

		desc = irq_desc + irq;
		desc->handle(irq, desc, regs);
	} while (status);
}
Exemplo n.º 15
0
/*
 * Note that this 'irq' is the real repesentative irq for GPIO
 *
 * To reduce the register access, use the valid group cache.
 * first check the valid groups. if failed, scan all groups fully.
 */
static void samsung_irq_gpio_handler(unsigned int irq, struct irq_desc *desc)
{
	struct samsung_irq_gpio *gpio;
	int group, n, offset;
	int start, end, pend, mask, handled = 0, action = 0;
	struct irq_chip *chip = get_irq_chip(irq);

	gpio = get_irq_data(irq);
	start = gpio->start;
	end = gpio->nr_groups;

	/* primary controller ack'ing */
	if (chip->ack)
		chip->ack(irq);

	/* Check the valid group first */
	for (group = 0; group <= end; group++) {
		if (!test_bit(group, &gpio->valid_groups))
			continue;

		offset = REG_OFFSET(group);	/* 4 bytes offset */
		pend = __raw_readl(gpio->base + PEND_OFFSET + offset);
		if (!pend)
			continue;

		mask = __raw_readl(gpio->base + MASK_OFFSET + offset);
		pend &= ~mask;
		if (!pend)
			continue;

		while (pend) {
			n = fls(pend) - 1;
			generic_handle_irq(IRQ_GPIO_GROUP(start + group) + n);
			pend &= ~BIT(n);
			++action;
		}

		handled = 1;
	}

	if (handled)
		goto out;

	/* Okay we can't find a proper handler. Scan fully */
	for (group = 0; group <= end; group++) {
		offset = REG_OFFSET(group);	/* 4 bytes offset */
		pend = __raw_readl(gpio->base + PEND_OFFSET + offset);
		if (!pend)
			continue;

		mask = __raw_readl(gpio->base + MASK_OFFSET + offset);
		pend &= ~mask;

		while (pend) {
			n = fls(pend) - 1;
			generic_handle_irq(IRQ_GPIO_GROUP(start + group) + n);
			pend &= ~BIT(n);
			++action;
		}

		/* It found the valid group */
		set_bit(group, &gpio->valid_groups);
	}

out:
		if (!action)
			do_bad_IRQ(irq, desc);
			
	/* primary controller unmasking */
	chip->unmask(irq);
}