--- zzzz-none-000/linux-3.10.107/kernel/irq/manage.c 2017-06-27 09:49:32.000000000 +0000 +++ vr9-7490-729/linux-3.10.107/kernel/irq/manage.c 2021-11-10 11:53:56.000000000 +0000 @@ -7,6 +7,12 @@ * This file contains driver APIs to the irq subsystem. */ +/** + * Some part of this file is modified by Ikanos Communications. + * + * Copyright (C) 2013-2014 Ikanos Communications. + */ + #define pr_fmt(fmt) "genirq: " fmt #include @@ -21,6 +27,10 @@ #include "internals.h" +#if defined (CONFIG_FUSIV_VX185) && defined (CONFIG_CPU_MIPSR2_IRQ_VI) +#include +#endif + #ifdef CONFIG_IRQ_FORCED_THREADING __read_mostly bool force_irqthreads; @@ -1341,6 +1351,19 @@ #endif kfree(__free_irq(irq, dev_id)); +#if defined (CONFIG_FUSIV_VX185) && defined(CONFIG_CPU_MIPSR2_IRQ_VI) + if(cpu_has_vint) { + struct irq_desc *idesc; + struct irq_data *idata; + + idesc = irq_to_desc(((fusiv_irq_params_t *) dev_id)->ipc_src ); + idata = irq_desc_get_irq_data(idesc); + if(dev_id != NULL) + shutdown_ipc_src(idata); + else + printk(KERN_ERR "%s: ERROR unable to free ipc source...\n", __FUNCTION__); + } +#endif /* CONFIG_FUSIV_VX185 && CONFIG_CPU_MIPSR2_IRQ_VI */ } EXPORT_SYMBOL(free_irq); @@ -1453,6 +1476,18 @@ enable_irq(irq); } #endif +#if defined(CONFIG_FUSIV_VX185) && defined (CONFIG_CPU_MIPSR2_IRQ_VI) + if(cpu_has_vint) { + struct irq_desc *idesc; + struct irq_data *idata; + + printk("\nThe devId registered is %s ipc_src: %d \n",devname, ((fusiv_irq_params_t *) dev_id)->ipc_src); + idesc = irq_to_desc(((fusiv_irq_params_t *) dev_id)->ipc_src ); + idata = irq_desc_get_irq_data(idesc); + if (!retval) + startup_ipc_src(idata); + } +#endif /* CONFIG_FUSIV_VX185 && CONFIG_CPU_MIPSR2_IRQ_VI */ return retval; } EXPORT_SYMBOL(request_threaded_irq); @@ -1494,6 +1529,19 @@ } EXPORT_SYMBOL_GPL(request_any_context_irq); +void irq_set_pending(unsigned int irq) +{ + struct irq_desc *desc = irq_to_desc(irq); + unsigned long flags; + + if (desc) { + raw_spin_lock_irqsave(&desc->lock, flags); + desc->istate |= IRQS_PENDING; + raw_spin_unlock_irqrestore(&desc->lock, flags); + } +} +EXPORT_SYMBOL_GPL(irq_set_pending); + void enable_percpu_irq(unsigned int irq, unsigned int type) { unsigned int cpu = smp_processor_id();