1 1.19 matt /* $NetBSD: power.c,v 1.19 2012/07/29 00:04:05 matt Exp $ */ 2 1.1 pk 3 1.1 pk /* 4 1.1 pk * Copyright (c) 1996 5 1.2 abrown * The President and Fellows of Harvard College. All rights reserved. 6 1.1 pk * 7 1.1 pk * All advertising materials mentioning features or use of this software 8 1.1 pk * must display the following acknowledgement: 9 1.1 pk * This product includes software developed by Aaron Brown and 10 1.1 pk * Harvard University. 11 1.1 pk * 12 1.1 pk * Redistribution and use in source and binary forms, with or without 13 1.1 pk * modification, are permitted provided that the following conditions 14 1.1 pk * are met: 15 1.1 pk * 16 1.1 pk * 1. Redistributions of source code must retain the above copyright 17 1.1 pk * notice, this list of conditions and the following disclaimer. 18 1.1 pk * 2. Redistributions in binary form must reproduce the above copyright 19 1.1 pk * notice, this list of conditions and the following disclaimer in the 20 1.1 pk * documentation and/or other materials provided with the distribution. 21 1.1 pk * 3. All advertising materials mentioning features or use of this software 22 1.1 pk * must display the following acknowledgement: 23 1.1 pk * This product includes software developed by Harvard University 24 1.1 pk * and its contributors. 25 1.1 pk * 4. Neither the name of the University nor the names of its contributors 26 1.1 pk * may be used to endorse or promote products derived from this software 27 1.1 pk * without specific prior written permission. 28 1.1 pk * 29 1.1 pk * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND 30 1.1 pk * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 31 1.1 pk * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 32 1.1 pk * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE 33 1.1 pk * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 34 1.1 pk * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 35 1.1 pk * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 36 1.1 pk * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 37 1.1 pk * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 38 1.1 pk * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 39 1.1 pk * SUCH DAMAGE. 40 1.1 pk */ 41 1.16 lukem 42 1.16 lukem #include <sys/cdefs.h> 43 1.19 matt __KERNEL_RCSID(0, "$NetBSD: power.c,v 1.19 2012/07/29 00:04:05 matt Exp $"); 44 1.1 pk 45 1.1 pk #include <sys/param.h> 46 1.1 pk #include <sys/device.h> 47 1.1 pk #include <sys/kernel.h> 48 1.1 pk #include <sys/systm.h> 49 1.1 pk 50 1.1 pk #include <machine/autoconf.h> 51 1.1 pk 52 1.1 pk #include <sparc/dev/power.h> 53 1.1 pk 54 1.19 matt volatile uint8_t *power_reg; 55 1.19 matt 56 1.18 mrg static int powermatch(device_t, cfdata_t, void *); 57 1.18 mrg static void powerattach(device_t, device_t, void *); 58 1.1 pk 59 1.18 mrg CFATTACH_DECL_NEW(power, 0, powermatch, powerattach, NULL, NULL); 60 1.1 pk 61 1.1 pk /* 62 1.1 pk * This is the driver for the "power" register available on some Sun4m 63 1.1 pk * machines. This allows the machine to remove power automatically when 64 1.1 pk * shutdown or halted or whatever. 65 1.1 pk */ 66 1.1 pk 67 1.1 pk static int 68 1.18 mrg powermatch(device_t parent, cfdata_t cf, void *aux) 69 1.1 pk { 70 1.9 pk union obio_attach_args *uoba = aux; 71 1.9 pk struct sbus_attach_args *sa = &uoba->uoba_sbus; 72 1.1 pk 73 1.9 pk if (uoba->uoba_isobio4 != 0) 74 1.9 pk return (0); 75 1.1 pk 76 1.9 pk return (strcmp("power", sa->sa_name) == 0); 77 1.1 pk } 78 1.1 pk 79 1.1 pk /* ARGSUSED */ 80 1.1 pk static void 81 1.18 mrg powerattach(device_t parent, device_t self, void *aux) 82 1.1 pk { 83 1.9 pk union obio_attach_args *uoba = aux; 84 1.9 pk struct sbus_attach_args *sa = &uoba->uoba_sbus; 85 1.9 pk bus_space_handle_t bh; 86 1.9 pk 87 1.9 pk /* Map the power configuration register. */ 88 1.9 pk if (sbus_bus_map(sa->sa_bustag, 89 1.17 uwe sa->sa_slot, sa->sa_offset, sizeof(uint8_t), 90 1.12 pk BUS_SPACE_MAP_LINEAR, &bh) != 0) { 91 1.18 mrg printf("%s: cannot map register\n", device_xname(self)); 92 1.9 pk return; 93 1.9 pk } 94 1.17 uwe power_reg = (volatile uint8_t *)bh; 95 1.1 pk 96 1.5 christos printf("\n"); 97 1.1 pk } 98 1.1 pk 99 1.1 pk void 100 1.17 uwe powerdown(void) 101 1.1 pk { 102 1.10 thorpej /* Only try if the power node was attached. */ 103 1.10 thorpej if (power_reg != NULL) 104 1.10 thorpej *POWER_REG |= POWER_OFF; 105 1.11 fair 106 1.11 fair /* 107 1.11 fair * don't return too quickly; the PROMs on some sparcs 108 1.11 fair * report the powerdown as failed if we do. 109 1.11 fair */ 110 1.11 fair DELAY(1000000); 111 1.1 pk } 112