[BACK]Return to power.c CVS log [TXT][DIR] Up to [local] / sys / arch / hppa64 / dev

Annotation of sys/arch/hppa64/dev/power.c, Revision 1.1.1.1

1.1       nbrk        1: /*     $OpenBSD: power.c,v 1.1 2005/04/01 10:40:47 mickey Exp $        */
                      2:
                      3: /*
                      4:  * Copyright (c) 2005 Michael Shalayeff
                      5:  * All rights reserved.
                      6:  *
                      7:  * Permission to use, copy, modify, and distribute this software for any
                      8:  * purpose with or without fee is hereby granted, provided that the above
                      9:  * copyright notice and this permission notice appear in all copies.
                     10:  *
                     11:  * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
                     12:  * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
                     13:  * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
                     14:  * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
                     15:  * WHATSOEVER RESULTING FROM LOSS OF MIND, USE, DATA OR PROFITS, WHETHER IN
                     16:  * AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT
                     17:  * OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
                     18:  */
                     19:
                     20: #include <sys/param.h>
                     21: #include <sys/kernel.h>
                     22: #include <sys/systm.h>
                     23: #include <sys/reboot.h>
                     24: #include <sys/device.h>
                     25: #include <sys/kthread.h>
                     26:
                     27: #include <machine/reg.h>
                     28: #include <machine/pdc.h>
                     29: #include <machine/autoconf.h>
                     30:
                     31: struct power_softc {
                     32:        struct device sc_dev;
                     33:        void *sc_ih;
                     34:
                     35:        struct proc *sc_thread;
                     36:        void (*sc_kicker)(void *);
                     37:
                     38:        int sc_dr_cnt;
                     39:        paddr_t sc_pwr_reg;
                     40:        volatile int sc_interrupted;
                     41: };
                     42:
                     43: int    powermatch(struct device *, void *, void *);
                     44: void   powerattach(struct device *, struct device *, void *);
                     45:
                     46: struct cfattach power_ca = {
                     47:        sizeof(struct power_softc), powermatch, powerattach
                     48: };
                     49:
                     50: struct cfdriver power_cd = {
                     51:        NULL, "power", DV_DULL
                     52: };
                     53:
                     54: void power_thread_create(void *v);
                     55: void power_thread_reg(void *v);
                     56: void power_cold_hook_reg(int);
                     57: int power_intr(void *);
                     58:
                     59: int
                     60: powermatch(struct device *parent, void *cfdata, void *aux)
                     61: {
                     62:        struct cfdata *cf = cfdata;
                     63:        struct confargs *ca = aux;
                     64:
                     65:        if (cf->cf_unit > 0 && !strcmp(ca->ca_name, "power"))
                     66:                return (0);
                     67:
                     68:        return (1);
                     69: }
                     70:
                     71: void
                     72: powerattach(struct device *parent, struct device *self, void *aux)
                     73: {
                     74:        struct power_softc *sc = (struct power_softc *)self;
                     75:        struct confargs *ca = aux;
                     76:
                     77:        if (ca->ca_hpa) {
                     78:                extern void (*cold_hook)(int);
                     79:
                     80:                sc->sc_pwr_reg = ca->ca_hpa;
                     81:                cold_hook = power_cold_hook_reg;
                     82:                sc->sc_kicker = power_thread_reg;
                     83:                printf("\n");
                     84:        } else
                     85:                printf(": not available\n");
                     86:
                     87:        if (ca->ca_irq >= 0)
                     88:                sc->sc_ih = cpu_intr_establish(IPL_CLOCK, ca->ca_irq,
                     89:                    power_intr, sc, sc->sc_dev.dv_xname);
                     90:
                     91:        if (sc->sc_kicker)
                     92:                kthread_create_deferred(power_thread_create, sc);
                     93: }
                     94:
                     95: int
                     96: power_intr(void *v)
                     97: {
                     98:        struct power_softc *sc = v;
                     99:
                    100:        sc->sc_interrupted = 1;
                    101:
                    102:        return (1);
                    103: }
                    104:
                    105: void
                    106: power_thread_create(void *v)
                    107: {
                    108:        struct power_softc *sc = v;
                    109:
                    110:        if (kthread_create(sc->sc_kicker, sc, &sc->sc_thread,
                    111:            sc->sc_dev.dv_xname))
                    112:                printf("WARNING: failed to create kernel power thread\n");
                    113: }
                    114:
                    115: void
                    116: power_thread_reg(void *v)
                    117: {
                    118:        struct power_softc *sc = v;
                    119:        u_int32_t r;
                    120:
                    121:        for (;;) {
                    122:                __asm __volatile("ldwas 0(%1), %0"
                    123:                    : "=&r" (r) : "r" (sc->sc_pwr_reg));
                    124:
                    125:                if (!(r & 1))
                    126:                        boot(RB_POWERDOWN | RB_HALT);
                    127:
                    128:                tsleep(v, PWAIT, "regpower", 10);
                    129:        }
                    130: }
                    131:
                    132: void
                    133: power_cold_hook_reg(int on)
                    134: {
                    135:        extern struct pdc_power_info pdc_power_info;    /* machdep.c */
                    136:        int error;
                    137:
                    138:        if ((error = pdc_call((iodcio_t)pdc, 0, PDC_SOFT_POWER,
                    139:            PDC_SOFT_POWER_ENABLE, &pdc_power_info,
                    140:            on == HPPA_COLD_HOT)))
                    141:                printf("power_cold_hook_reg: failed (%d)\n", error);
                    142: }

CVSweb