Author: rpaulo
Date: Wed Apr 24 01:36:35 2013
New Revision: 249826
URL: http://svnweb.freebsd.org/changeset/base/249826

Log:
  Handle the IRQ for the reset button.

Modified:
  head/sys/powerpc/wii/wii_bus.c
  head/sys/powerpc/wii/wii_pic.c
  head/sys/powerpc/wii/wii_picreg.h

Modified: head/sys/powerpc/wii/wii_bus.c
==============================================================================
--- head/sys/powerpc/wii/wii_bus.c      Wed Apr 24 01:20:10 2013        
(r249825)
+++ head/sys/powerpc/wii/wii_bus.c      Wed Apr 24 01:36:35 2013        
(r249826)
@@ -157,7 +157,7 @@ wiibus_attach(device_t self)
        /* Nintendo PIC */
        dinfo = malloc(sizeof(*dinfo), M_WIIBUS, M_WAITOK | M_ZERO);
        wiibus_init_device_resources(&sc->sc_rman, dinfo, 0, WIIPIC_REG_ADDR,
-           WIIPIC_REG_LEN, 0);
+           WIIPIC_REG_LEN, 1);
        cdev = BUS_ADD_CHILD(self, 0, "wiipic", 0);
        device_set_ivars(cdev, dinfo);
 

Modified: head/sys/powerpc/wii/wii_pic.c
==============================================================================
--- head/sys/powerpc/wii/wii_pic.c      Wed Apr 24 01:20:10 2013        
(r249825)
+++ head/sys/powerpc/wii/wii_pic.c      Wed Apr 24 01:36:35 2013        
(r249826)
@@ -34,6 +34,7 @@ __FBSDID("$FreeBSD$");
 #include <sys/kernel.h>
 #include <sys/malloc.h>
 #include <sys/rman.h>
+#include <sys/reboot.h>
 
 #include <machine/bus.h>
 #include <machine/platform.h>
@@ -51,6 +52,7 @@ static void   wiipic_enable(device_t, unsi
 static void    wiipic_eoi(device_t, unsigned int);
 static void    wiipic_mask(device_t, unsigned int);
 static void    wiipic_unmask(device_t, unsigned int);
+static void    wiipic_intr(void *);
 
 struct wiipic_softc {
        device_t                 sc_dev;
@@ -58,6 +60,9 @@ struct wiipic_softc {
        bus_space_tag_t          sc_bt;
        bus_space_handle_t       sc_bh;
        int                      sc_rrid;
+       int                      sc_irqid;
+       struct resource         *sc_irq;
+       void                    *sc_irqctx;
        int                      sc_vector[WIIPIC_NIRQ];
 };
 
@@ -146,6 +151,19 @@ wiipic_attach(device_t dev)
 
        powerpc_register_pic(dev, 0, WIIPIC_NIRQ, 0, FALSE);
 
+       /*
+        * Setup the interrupt handler.
+        */
+       sc->sc_irqid = 0;
+       sc->sc_irq = bus_alloc_resource_any(dev, SYS_RES_IRQ, &sc->sc_irqid,
+           RF_ACTIVE);
+       if (sc->sc_irq == NULL) {
+               device_printf(dev, "could not alloc IRQ resource\n");
+               return (ENXIO);
+       }
+       bus_setup_intr(dev, sc->sc_irq, INTR_TYPE_MISC | INTR_MPSAFE,
+           NULL, wiipic_intr, sc, &sc->sc_irqctx);
+
        return (0);
 }
 
@@ -210,3 +228,17 @@ wiipic_unmask(device_t dev, unsigned int
        imr |= (1 << irq);
        wiipic_imr_write(sc, imr);
 }
+
+/*
+ * Reset button interrupt.
+ */
+static void
+wiipic_intr(void *xsc)
+{
+       struct wiipic_softc *sc;
+
+       sc = (struct wiipic_softc *)xsc;
+       if (wiipic_icr_read(sc) & WIIPIC_RBS)
+               shutdown_nice(RB_AUTOBOOT);
+}
+

Modified: head/sys/powerpc/wii/wii_picreg.h
==============================================================================
--- head/sys/powerpc/wii/wii_picreg.h   Wed Apr 24 01:20:10 2013        
(r249825)
+++ head/sys/powerpc/wii/wii_picreg.h   Wed Apr 24 01:36:35 2013        
(r249826)
@@ -30,9 +30,10 @@
 #define        _POWERPC_WII_WII_PICREG_H
 
 #define        WIIPIC_REG_ADDR         0x0c003000
-#define        WIIPIC_REG_LEN          0x08
+#define        WIIPIC_REG_LEN          0x28
 
 #define        WIIPIC_ICR              0x00
+#define        WIIPIC_RBS              0x10000
 #define        WIIPIC_IMR              0x04
 #define        WIIPIC_RESET            0x24
 
_______________________________________________
[email protected] mailing list
http://lists.freebsd.org/mailman/listinfo/svn-src-all
To unsubscribe, send any mail to "[email protected]"

Reply via email to