Ejemplo n.º 1
0
void __init msp_vsmp_int_init(void)
{
	set_vi_handler(MIPS_CPU_IPI_RESCHED_IRQ, ipi_resched_dispatch);
	set_vi_handler(MIPS_CPU_IPI_CALL_IRQ, ipi_call_dispatch);
	arch_init_ipiirq(MIPS_CPU_IPI_RESCHED_IRQ, &irq_resched);
	arch_init_ipiirq(MIPS_CPU_IPI_CALL_IRQ, &irq_call);
}
Ejemplo n.º 2
0
void __init arch_init_irq(void)
{
	int i;
	unsigned int gic_rev;

	mips_cpu_irq_init();

	if (cpu_has_vint)
		set_vi_handler(cp0_compare_irq, mips_timer_dispatch);

	if (gcmp_present) {
		GCMPGCB(GICBA) = GIC_BASE_ADDR | GCMP_GCB_GICBA_EN_MSK;
		gic_present = 1;
	}

	if (gic_present) {
#if defined (CONFIG_MIPS_GIC_IPI)
		gic_call_int_base = GIC_IPI_CALL_VPE0;
		gic_resched_int_base = GIC_IPI_RESCHED_VPE0;
		fill_ipi_map();
#endif
		gic_init(GIC_BASE_ADDR, GIC_ADDRSPACE_SZ, gic_intr_map,
				ARRAY_SIZE(gic_intr_map), MIPS_GIC_IRQ_BASE);

		GICREAD(GIC_REG(SHARED, GIC_SH_REVISIONID), gic_rev);
		printk("MIPS GIC RevID: %d.%d\n", (gic_rev >> 8) & 0xff, gic_rev & 0xff);

		if (cpu_has_vint) {
			pr_info("Setting up vectored interrupts\n");
			set_vi_handler(2 + GIC_CPU_INT0, gic_irq_dispatch);	// CPU
#if defined (CONFIG_MIPS_GIC_IPI)
			set_vi_handler(2 + GIC_CPU_INT1, gic_irq_dispatch);	// IPI resched
			set_vi_handler(2 + GIC_CPU_INT2, gic_irq_dispatch);	// IPI call
#endif
			set_vi_handler(2 + GIC_CPU_INT3, gic_irq_dispatch);	// FE
			set_vi_handler(2 + GIC_CPU_INT4, gic_irq_dispatch);	// PCIe
		}

#if defined (CONFIG_MIPS_GIC_IPI)
		set_c0_status(STATUSF_IP7 | STATUSF_IP6 | STATUSF_IP5 | STATUSF_IP2 |
			      STATUSF_IP4 | STATUSF_IP3);
		
		/* setup ipi interrupts */
		for (i = 0; i < nr_cpu_ids; i++) {
			arch_init_ipiirq(MIPS_GIC_IRQ_BASE + GIC_RESCHED_INT(i), &irq_resched);
			arch_init_ipiirq(MIPS_GIC_IRQ_BASE + GIC_CALL_INT(i), &irq_call);
		}
#else
		set_c0_status(STATUSF_IP7 | STATUSF_IP6 | STATUSF_IP5 | STATUSF_IP2);
#endif
		/* set hardware irq, mapped to GIC shared (skip 0, 1, 2, 5, 7) */
		for (i = 3; i <= 31; i++) {
			if (i != 5 && i != 7)
				irq_set_handler(MIPS_GIC_IRQ_BASE + i, handle_level_irq);
		}
		
	} else {
Ejemplo n.º 3
0
void __init arch_init_irq(void)
{
#if (defined (CONFIG_IRQ_GIC) && defined(CONFIG_MIPS_MT_SMP)) || !defined (CONFIG_IRQ_GIC)
	int i;
#endif
	/*
	 * Mask out all interrupt by writing "1" to all bit position in
	 * the interrupt reset reg.
	 */
#if 0
	int mips_cp0_cause, mips_cp0_status;
        mips_cp0_cause = read_32bit_cp0_register(CP0_CAUSE);
        mips_cp0_status = read_32bit_cp0_register(CP0_STATUS);
        printk("cause = %x, status = %x\n", mips_cp0_cause, mips_cp0_status);
        mips_cp0_status= mips_cp0_status& ~(CAUSEF_IP0|CAUSEF_IP1|CAUSEF_IP2|CAUSEF_IP3|CAUSEF_IP4|CAUSEF_IP5|CAUSEF_IP6|CAUSEF_IP7);
        write_32bit_cp0_register(CP0_STATUS, mips_cp0_status);
#endif
	mips_cpu_irq_init();

#if defined (CONFIG_IRQ_GIC)
	if (gcmp_present)  {
		GCMPGCB(GICBA) = GIC_BASE_ADDR | GCMP_GCB_GICBA_EN_MSK;
                gic_present = 1;
	}

	if (gic_present) {
#if defined(CONFIG_MIPS_MT_SMP)
                gic_call_int_base = GIC_NUM_INTRS - NR_CPUS;
                gic_resched_int_base = gic_call_int_base - NR_CPUS;
                fill_ipi_map();
#endif
		gic_init(GIC_BASE_ADDR, GIC_ADDRSPACE_SZ, gic_intr_map,
				ARRAY_SIZE(gic_intr_map), MIPS_GIC_IRQ_BASE);
#if defined(CONFIG_MIPS_MT_SMP)
		set_c0_status(STATUSF_IP7 | STATUSF_IP6 | STATUSF_IP5 | STATUSF_IP4 | STATUSF_IP3 | STATUSF_IP2);
                
		/* set up ipi interrupts */
                for (i = 0; i < NR_CPUS; i++) {
                        arch_init_ipiirq(MIPS_GIC_IRQ_BASE + GIC_RESCHED_INT(i), &irq_resched);
                        arch_init_ipiirq(MIPS_GIC_IRQ_BASE + GIC_CALL_INT(i), &irq_call);
                }
#else
		set_c0_status(STATUSF_IP7 | STATUSF_IP6 | STATUSF_IP5 | STATUSF_IP2);
#endif

	}

	irq_set_handler(SURFBOARDINT_PCIE0, handle_level_irq);
	irq_set_handler(SURFBOARDINT_PCIE1, handle_level_irq);
	irq_set_handler(SURFBOARDINT_PCIE2, handle_level_irq);
	irq_set_handler(SURFBOARDINT_FE, handle_level_irq);
	irq_set_handler(SURFBOARDINT_USB, handle_level_irq);
	irq_set_handler(SURFBOARDINT_SYSCTL, handle_level_irq);
	irq_set_handler(SURFBOARDINT_DRAMC, handle_level_irq);
	irq_set_handler(SURFBOARDINT_PCM, handle_level_irq);
	irq_set_handler(SURFBOARDINT_HSGDMA, handle_level_irq);
	irq_set_handler(SURFBOARDINT_GPIO, handle_level_irq);
	irq_set_handler(SURFBOARDINT_DMA, handle_level_irq);
	irq_set_handler(SURFBOARDINT_NAND, handle_level_irq);
	irq_set_handler(SURFBOARDINT_I2S, handle_level_irq);
	irq_set_handler(SURFBOARDINT_SPI, handle_level_irq);
	irq_set_handler(SURFBOARDINT_SPDIF, handle_level_irq);
	irq_set_handler(SURFBOARDINT_CRYPTO, handle_level_irq);
	irq_set_handler(SURFBOARDINT_SDXC, handle_level_irq);
	irq_set_handler(SURFBOARDINT_PCTRL, handle_level_irq);
	irq_set_handler(SURFBOARDINT_ESW, handle_level_irq);
	irq_set_handler(SURFBOARDINT_UART_LITE1, handle_level_irq);
	irq_set_handler(SURFBOARDINT_UART_LITE2, handle_level_irq);
	irq_set_handler(SURFBOARDINT_UART_LITE3, handle_level_irq);
	irq_set_handler(SURFBOARDINT_NAND_ECC, handle_level_irq);
	irq_set_handler(SURFBOARDINT_I2C, handle_level_irq);
	irq_set_handler(SURFBOARDINT_WDG, handle_level_irq);
	irq_set_handler(SURFBOARDINT_TIMER0, handle_level_irq);
	irq_set_handler(SURFBOARDINT_TIMER1, handle_level_irq);



#else
	for (i = 0; i <= SURFBOARDINT_END; i++) {
		irq_set_chip_and_handler(i, &surfboard_irq_type, handle_level_irq);
	}

	/* Enable global interrupt bit */
	*(volatile u32 *)(RALINK_INTENA) = M_SURFBOARD_GLOBAL_INT;
    /* hua: 7621 uses GIC -> SURFBOARDINT_PCTRL, which is done by code above */
	cp0_perfcount_irq = SURFBOARDINT_PC;
	set_c0_status(ST0_IM);
#endif // CONFIG_IRQ_GIC //

#ifdef CONFIG_RALINK_GPIO
	ralink_gpio_init_irq();
#endif

#ifdef CONFIG_KGDB
	if (remote_debug) {
		set_debug_traps();
		breakpoint();
	}
#endif
}
Ejemplo n.º 4
0
Archivo: irq.c Proyecto: 4oh4ed/linux
int __init icu_of_init(struct device_node *node, struct device_node *parent)
{
	struct device_node *eiu_node;
	struct resource res;
	int i, ret;

	for (i = 0; i < MAX_IM; i++) {
		if (of_address_to_resource(node, i, &res))
			panic("Failed to get icu memory range");

		if (request_mem_region(res.start, resource_size(&res),
					res.name) < 0)
			pr_err("Failed to request icu memory");

		ltq_icu_membase[i] = ioremap_nocache(res.start,
					resource_size(&res));
		if (!ltq_icu_membase[i])
			panic("Failed to remap icu memory");
	}

	/* the external interrupts are optional and xway only */
	eiu_node = of_find_compatible_node(NULL, NULL, "lantiq,eiu-xway");
	if (eiu_node && !of_address_to_resource(eiu_node, 0, &res)) {
		/* find out how many external irq sources we have */
		exin_avail = of_irq_count(eiu_node);

		if (exin_avail > MAX_EIU)
			exin_avail = MAX_EIU;

		ret = of_irq_to_resource_table(eiu_node,
						ltq_eiu_irq, exin_avail);
		if (ret != exin_avail)
			panic("failed to load external irq resources");

		if (request_mem_region(res.start, resource_size(&res),
							res.name) < 0)
			pr_err("Failed to request eiu memory");

		ltq_eiu_membase = ioremap_nocache(res.start,
							resource_size(&res));
		if (!ltq_eiu_membase)
			panic("Failed to remap eiu memory");
	}

	/* turn off all irqs by default */
	for (i = 0; i < MAX_IM; i++) {
		/* make sure all irqs are turned off by default */
		ltq_icu_w32(i, 0, LTQ_ICU_IM0_IER);
		/* clear all possibly pending interrupts */
		ltq_icu_w32(i, ~0, LTQ_ICU_IM0_ISR);
	}

	mips_cpu_irq_init();

	for (i = 0; i < MAX_IM; i++)
		setup_irq(i + 2, &cascade);

	if (cpu_has_vint) {
		pr_info("Setting up vectored interrupts\n");
		set_vi_handler(2, ltq_hw0_irqdispatch);
		set_vi_handler(3, ltq_hw1_irqdispatch);
		set_vi_handler(4, ltq_hw2_irqdispatch);
		set_vi_handler(5, ltq_hw3_irqdispatch);
		set_vi_handler(6, ltq_hw4_irqdispatch);
		set_vi_handler(7, ltq_hw5_irqdispatch);
	}

	ltq_domain = irq_domain_add_linear(node,
		(MAX_IM * INT_NUM_IM_OFFSET) + MIPS_CPU_IRQ_CASCADE,
		&irq_domain_ops, 0);

#if defined(CONFIG_MIPS_MT_SMP)
	if (cpu_has_vint) {
		pr_info("Setting up IPI vectored interrupts\n");
		set_vi_handler(MIPS_CPU_IPI_RESCHED_IRQ, ltq_sw0_irqdispatch);
		set_vi_handler(MIPS_CPU_IPI_CALL_IRQ, ltq_sw1_irqdispatch);
	}
	arch_init_ipiirq(MIPS_CPU_IRQ_BASE + MIPS_CPU_IPI_RESCHED_IRQ,
		&irq_resched);
	arch_init_ipiirq(MIPS_CPU_IRQ_BASE + MIPS_CPU_IPI_CALL_IRQ, &irq_call);
#endif

#if !defined(CONFIG_MIPS_MT_SMP) && !defined(CONFIG_MIPS_MT_SMTC)
	set_c0_status(IE_IRQ0 | IE_IRQ1 | IE_IRQ2 |
		IE_IRQ3 | IE_IRQ4 | IE_IRQ5);
#else
	set_c0_status(IE_SW0 | IE_SW1 | IE_IRQ0 | IE_IRQ1 |
		IE_IRQ2 | IE_IRQ3 | IE_IRQ4 | IE_IRQ5);
#endif

	/* tell oprofile which irq to use */
	cp0_perfcount_irq = irq_create_mapping(ltq_domain, LTQ_PERF_IRQ);

	/*
	 * if the timer irq is not one of the mips irqs we need to
	 * create a mapping
	 */
	if (MIPS_CPU_TIMER_IRQ != 7)
		irq_create_mapping(ltq_domain, MIPS_CPU_TIMER_IRQ);

	return 0;
}
Ejemplo n.º 5
0
void __init arch_init_irq(void)
{
    int corehi_irq;

    i8259_set_poll(mips_pcibios_iack);
    irqchip_init();

    switch (mips_revision_sconid) {
    case MIPS_REVISION_SCON_SOCIT:
    case MIPS_REVISION_SCON_ROCIT:
        if (cpu_has_veic)
            init_msc_irqs(MIPS_MSC01_IC_REG_BASE,
                          MSC01E_INT_BASE, msc_eicirqmap,
                          msc_nr_eicirqs);
        else
            init_msc_irqs(MIPS_MSC01_IC_REG_BASE,
                          MSC01C_INT_BASE, msc_irqmap,
                          msc_nr_irqs);
        break;

    case MIPS_REVISION_SCON_SOCITSC:
    case MIPS_REVISION_SCON_SOCITSCP:
        if (cpu_has_veic)
            init_msc_irqs(MIPS_SOCITSC_IC_REG_BASE,
                          MSC01E_INT_BASE, msc_eicirqmap,
                          msc_nr_eicirqs);
        else
            init_msc_irqs(MIPS_SOCITSC_IC_REG_BASE,
                          MSC01C_INT_BASE, msc_irqmap,
                          msc_nr_irqs);
    }

    if (gic_present) {
        corehi_irq = MIPS_CPU_IRQ_BASE + MIPSCPU_INT_COREHI;
    } else {
#if defined(CONFIG_MIPS_MT_SMP)
        /* set up ipi interrupts */
        if (cpu_has_veic) {
            set_vi_handler (MSC01E_INT_SW0, ipi_resched_dispatch);
            set_vi_handler (MSC01E_INT_SW1, ipi_call_dispatch);
            cpu_ipi_resched_irq = MSC01E_INT_SW0;
            cpu_ipi_call_irq = MSC01E_INT_SW1;
        } else {
            cpu_ipi_resched_irq = MIPS_CPU_IRQ_BASE +
                                  MIPS_CPU_IPI_RESCHED_IRQ;
            cpu_ipi_call_irq = MIPS_CPU_IRQ_BASE +
                               MIPS_CPU_IPI_CALL_IRQ;
        }
        arch_init_ipiirq(cpu_ipi_resched_irq, &irq_resched);
        arch_init_ipiirq(cpu_ipi_call_irq, &irq_call);
#endif
        if (cpu_has_veic) {
            set_vi_handler(MSC01E_INT_COREHI,
                           corehi_irqdispatch);
            corehi_irq = MSC01E_INT_BASE + MSC01E_INT_COREHI;
        } else {
            corehi_irq = MIPS_CPU_IRQ_BASE + MIPSCPU_INT_COREHI;
        }
    }

    setup_irq(corehi_irq, &corehi_irqaction);
}