summaryrefslogtreecommitdiffstats
path: root/c/src/lib/libbsp/sparc/shared/irq/genirq.c
diff options
context:
space:
mode:
Diffstat (limited to 'c/src/lib/libbsp/sparc/shared/irq/genirq.c')
-rw-r--r--c/src/lib/libbsp/sparc/shared/irq/genirq.c243
1 files changed, 0 insertions, 243 deletions
diff --git a/c/src/lib/libbsp/sparc/shared/irq/genirq.c b/c/src/lib/libbsp/sparc/shared/irq/genirq.c
deleted file mode 100644
index bba642e701..0000000000
--- a/c/src/lib/libbsp/sparc/shared/irq/genirq.c
+++ /dev/null
@@ -1,243 +0,0 @@
-/*
- * Generic interrupt helpers mainly for GRLIB PCI peripherals
- *
- * COPYRIGHT (c) 2008.
- * Cobham Gaisler AB.
- *
- * The license and distribution terms for this file may be
- * found in the file LICENSE in this distribution or at
- * http://www.rtems.org/license/LICENSE.
- */
-
-#include <rtems.h>
-#include <rtems/bspIo.h>
-#include <stdlib.h>
-#include <string.h>
-#include <bsp/genirq.h>
-
-struct genirq_handler_entry {
- struct genirq_handler_entry *next; /* Next ISR entry for this IRQ number */
- genirq_handler isr; /* ISR function called upon IRQ */
- void *arg; /* custom argument to ISR */
- int enabled; /* Inidicates if IRQ is enabled */
-};
-
-struct genirq_irq_entry {
- struct genirq_handler_entry *head;
- struct genirq_stats stats;
-};
-
-struct genirq_priv {
- /* Maximum number of interrupt */
- int genirq_max;
- /* IRQ Table index N reflect IRQ number N */
- struct genirq_irq_entry genirq_table[1]; /* Length depends on */
-};
-
-genirq_t genirq_init(int number_of_irqs)
-{
- int size;
- struct genirq_priv *priv;
-
- size = sizeof(int) +
- number_of_irqs * sizeof(struct genirq_irq_entry);
-
- priv = (struct genirq_priv *)malloc(size);
- if ( !priv )
- return NULL;
- memset(priv, 0, size);
- priv->genirq_max = number_of_irqs - 1;
-
- return priv;
-}
-
-void genirq_destroy(genirq_t d)
-{
- struct genirq_priv *priv = d;
- struct genirq_irq_entry *irqentry;
- struct genirq_handler_entry *isrentry, *tmp;
- int i;
-
- /* Free all registered interrupts */
- for ( i=0; i<priv->genirq_max; i++) {
- irqentry = &priv->genirq_table[i];
- isrentry = irqentry->head;
- while ( isrentry ) {
- tmp = isrentry;
- isrentry = isrentry->next;
- genirq_free_handler(tmp);
- }
- }
-
- free(priv);
-}
-
-int genirq_check(genirq_t d, int irq)
-{
- struct genirq_priv *priv = d;
-
- if ( (irq <= 0) || (irq > priv->genirq_max) )
- return -1;
- else
- return 0;
-}
-
-void *genirq_alloc_handler(genirq_handler isr, void *arg)
-{
- struct genirq_handler_entry *newentry;
-
- newentry = malloc(sizeof(struct genirq_handler_entry));
- if ( newentry ) {
- /* Initialize ISR entry */
- newentry->isr = isr;
- newentry->arg = arg;
- newentry->enabled = 0;
- }
- return newentry;
-}
-
-int genirq_register(genirq_t d, int irq, void *handler)
-{
- struct genirq_priv *priv = d;
- struct genirq_irq_entry *irqentry;
- struct genirq_handler_entry *isrentry, *newentry = handler;
-
- if ( genirq_check(d, irq) )
- return -1;
-
- /* Insert new ISR entry first into table */
- irqentry = &priv->genirq_table[irq];
- isrentry = irqentry->head;
- irqentry->head = newentry;
- newentry->next = isrentry;
-
- if ( isrentry )
- return 1; /* This is the first handler on this IRQ */
- return 0;
-}
-
-void *genirq_unregister(genirq_t d, int irq, genirq_handler isr, void *arg)
-{
- struct genirq_priv *priv = d;
- struct genirq_irq_entry *irqentry;
- struct genirq_handler_entry *isrentry, **prev;
- void *ret;
-
- if ( genirq_check(d, irq) )
- return NULL;
-
- /* Remove isr[arg] from ISR list */
- irqentry = &priv->genirq_table[irq];
- ret = NULL;
-
- prev = &irqentry->head;
- isrentry = irqentry->head;
- while ( isrentry ) {
- if ( (isrentry->arg == arg) && (isrentry->isr == isr) ) {
- /* Found ISR, remove it from list */
- if ( isrentry->enabled ) {
- /* Can not remove enabled ISRs, disable first */
- ret = NULL;
- break;
- }
- *prev = isrentry->next;
- ret = isrentry;
- break;
- }
- prev = &isrentry->next;
- isrentry = isrentry->next;
- }
-
- return ret;
-}
-
-/* Enables or Disables ISR handler. Internal function to reduce footprint
- * of enable/disable functions.
- *
- * \param action 1=enable, 0=disable ISR
- */
-static int genirq_set_active(
- struct genirq_priv *priv,
- int irq,
- genirq_handler isr,
- void *arg,
- int action)
-{
- struct genirq_irq_entry *irqentry;
- struct genirq_handler_entry *isrentry, *e = NULL;
- int enabled;
-
- if ( genirq_check(priv, irq) )
- return -1;
-
- /* Find isr[arg] in ISR list */
- irqentry = &priv->genirq_table[irq];
- enabled = 0;
-
- isrentry = irqentry->head;
- while ( isrentry ) {
- if ( (isrentry->arg == arg) && (isrentry->isr == isr) ) {
- /* Found ISR */
- if ( isrentry->enabled == action ) {
- /* The ISR is already enabled or disabled
- * depending on request, neccessary actions
- * were taken last time the same action was
- * requested.
- */
- return 1;
- }
- e = isrentry;
- } else {
- enabled += isrentry->enabled;
- }
- isrentry = isrentry->next;
- }
-
- if ( !e )
- return -1;
-
- e->enabled = action;
-
- return enabled;
-}
-
-int genirq_enable(genirq_t d, int irq, genirq_handler isr, void *arg)
-{
- struct genirq_priv *priv = d;
- return genirq_set_active(priv, irq, isr, arg, 1);
-}
-
-int genirq_disable(genirq_t d, int irq, genirq_handler isr, void *arg)
-{
- struct genirq_priv *priv = d;
- return genirq_set_active(priv, irq, isr, arg, 0);
-}
-
-void genirq_doirq(genirq_t d, int irq)
-{
- struct genirq_priv *priv = d;
- struct genirq_irq_entry *irqentry;
- struct genirq_handler_entry *isrentry;
- int enabled;
-
- irqentry = &priv->genirq_table[irq];
- irqentry->stats.irq_cnt++;
-
- enabled = 0;
-
- isrentry = irqentry->head;
- while ( isrentry ) {
- if ( isrentry->enabled ) {
- enabled = 1;
- /* Call the ISR */
- isrentry->isr(isrentry->arg);
- }
- isrentry = isrentry->next;
- }
-
- /* Was the IRQ an IRQ without source? */
- if ( enabled == 0 ) {
- /* This should not happen */
- printk("Spurious IRQ happened on IRQ %d\n", irq);
- }
-}