Merge tag 'u-boot-atmel-fixes-2020.07-a' of https://gitlab.denx.de/u-boot/custodians...
[oweals/u-boot.git] / arch / x86 / lib / interrupts.c
index 04a9c79f9f5ad2acb21149e20c25e2bff46a3019..a81e4291105ec583279bb5908e97395ca685fbf0 100644 (file)
@@ -1,3 +1,4 @@
+// SPDX-License-Identifier: GPL-2.0+
 /*
  * (C) Copyright 2009
  * Graeme Russ, <graeme.russ@gmail.com>
  *
  * (C) Copyright 2001
  * Josh Huber, Mission Critical Linux, Inc, <huber@mclx.com>
- *
- * See file CREDITS for list of people who contributed to this
- * project.
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License as
- * published by the Free Software Foundation; either version 2 of
- * the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston,
- * MA 02111-1307 USA
  */
 
 /*
  */
 
 #include <common.h>
+#include <command.h>
+#include <irq_func.h>
 #include <asm/interrupt.h>
 
+#if !CONFIG_IS_ENABLED(X86_64)
+
 struct irq_action {
        interrupt_handler_t *handler;
        void *arg;
        unsigned int count;
 };
 
-static struct irq_action irq_handlers[CONFIG_SYS_NUM_IRQS] = { {0} };
-static int spurious_irq_cnt = 0;
-static int spurious_irq = 0;
+static struct irq_action irq_handlers[SYS_NUM_IRQS] = { {0} };
+static int spurious_irq_cnt;
+static int spurious_irq;
 
 void irq_install_handler(int irq, interrupt_handler_t *handler, void *arg)
 {
        int status;
 
-       if (irq < 0 || irq >= CONFIG_SYS_NUM_IRQS) {
+       if (irq < 0 || irq >= SYS_NUM_IRQS) {
                printf("irq_install_handler: bad irq number %d\n", irq);
                return;
        }
 
        if (irq_handlers[irq].handler != NULL)
                printf("irq_install_handler: 0x%08lx replacing 0x%08lx\n",
-                      (ulong) handler,
-                      (ulong) irq_handlers[irq].handler);
+                               (ulong) handler,
+                               (ulong) irq_handlers[irq].handler);
 
-       status = disable_interrupts ();
+       status = disable_interrupts();
 
        irq_handlers[irq].handler = handler;
        irq_handlers[irq].arg = arg;
        irq_handlers[irq].count = 0;
 
-       unmask_irq(irq);
+       if (CONFIG_IS_ENABLED(I8259_PIC))
+               unmask_irq(irq);
 
        if (status)
                enable_interrupts();
@@ -91,14 +79,15 @@ void irq_free_handler(int irq)
 {
        int status;
 
-       if (irq < 0 || irq >= CONFIG_SYS_NUM_IRQS) {
+       if (irq < 0 || irq >= SYS_NUM_IRQS) {
                printf("irq_free_handler: bad irq number %d\n", irq);
                return;
        }
 
-       status = disable_interrupts ();
+       status = disable_interrupts();
 
-       mask_irq(irq);
+       if (CONFIG_IS_ENABLED(I8259_PIC))
+               mask_irq(irq);
 
        irq_handlers[irq].handler = NULL;
        irq_handlers[irq].arg = NULL;
@@ -113,20 +102,22 @@ void do_irq(int hw_irq)
 {
        int irq = hw_irq - 0x20;
 
-       if (irq < 0 || irq >= CONFIG_SYS_NUM_IRQS) {
+       if (irq < 0 || irq >= SYS_NUM_IRQS) {
                printf("do_irq: bad irq number %d\n", irq);
                return;
        }
 
        if (irq_handlers[irq].handler) {
-               mask_irq(irq);
+               if (CONFIG_IS_ENABLED(I8259_PIC))
+                       mask_irq(irq);
 
                irq_handlers[irq].handler(irq_handlers[irq].arg);
                irq_handlers[irq].count++;
 
-               unmask_irq(irq);
-               specific_eoi(irq);
-
+               if (CONFIG_IS_ENABLED(I8259_PIC)) {
+                       unmask_irq(irq);
+                       specific_eoi(irq);
+               }
        } else {
                if ((irq & 7) != 7) {
                        spurious_irq_cnt++;
@@ -134,27 +125,30 @@ void do_irq(int hw_irq)
                }
        }
 }
+#endif
 
 #if defined(CONFIG_CMD_IRQ)
-int do_irqinfo(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
+int do_irqinfo(struct cmd_tbl *cmdtp, int flag, int argc, char *const argv[])
 {
+#if !CONFIG_IS_ENABLED(X86_64)
        int irq;
 
        printf("Spurious IRQ: %u, last unknown IRQ: %d\n",
-              spurious_irq_cnt, spurious_irq);
+                       spurious_irq_cnt, spurious_irq);
 
-       printf ("Interrupt-Information:\n");
-       printf ("Nr  Routine   Arg       Count\n");
+       printf("Interrupt-Information:\n");
+       printf("Nr  Routine   Arg       Count\n");
 
-       for (irq = 0; irq <= CONFIG_SYS_NUM_IRQS; irq++) {
+       for (irq = 0; irq < SYS_NUM_IRQS; irq++) {
                if (irq_handlers[irq].handler != NULL) {
-                       printf ("%02d  %08lx  %08lx  %d\n",
+                       printf("%02d  %08lx  %08lx  %d\n",
                                        irq,
                                        (ulong)irq_handlers[irq].handler,
                                        (ulong)irq_handlers[irq].arg,
                                        irq_handlers[irq].count);
                }
        }
+#endif
 
        return 0;
 }