acpiconf.c revision 68475
165283Siwasaki/*- 265283Siwasaki * Copyright (c) 1999 Mitsuru IWASAKI <iwasaki@FreeBSD.org> 365283Siwasaki * All rights reserved. 465283Siwasaki * 565283Siwasaki * Redistribution and use in source and binary forms, with or without 665283Siwasaki * modification, are permitted provided that the following conditions 765283Siwasaki * are met: 865283Siwasaki * 1. Redistributions of source code must retain the above copyright 965283Siwasaki * notice, this list of conditions and the following disclaimer. 1065283Siwasaki * 2. Redistributions in binary form must reproduce the above copyright 1165283Siwasaki * notice, this list of conditions and the following disclaimer in the 1265283Siwasaki * documentation and/or other materials provided with the distribution. 1365283Siwasaki * 1465283Siwasaki * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND 1565283Siwasaki * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 1665283Siwasaki * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 1765283Siwasaki * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE 1865283Siwasaki * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 1965283Siwasaki * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 2065283Siwasaki * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 2165283Siwasaki * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 2265283Siwasaki * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 2365283Siwasaki * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 2465283Siwasaki * SUCH DAMAGE. 2565283Siwasaki * 2665283Siwasaki * $Id: acpiconf.c,v 1.5 2000/08/08 14:12:19 iwasaki Exp $ 2765283Siwasaki * $FreeBSD: head/usr.sbin/acpi/acpiconf/acpiconf.c 68475 2000-11-08 02:37:00Z iwasaki $ 2865283Siwasaki */ 2965283Siwasaki 3065283Siwasaki#include <sys/param.h> 3165283Siwasaki 3265283Siwasaki#include <err.h> 3365283Siwasaki#include <fcntl.h> 3465283Siwasaki#include <stdio.h> 3566490Smsmith#include <sys/ioctl.h> 3665283Siwasaki#include <unistd.h> 3765283Siwasaki 3868475Siwasaki#include <dev/acpica/acpiio.h> 3966490Smsmith 4068475Siwasaki#include <contrib/dev/acpica/Subsystem/Include/acgcc.h> 4168475Siwasaki#include <contrib/dev/acpica/Subsystem/Include/actypes.h> 4268475Siwasaki 4365283Siwasaki#define ACPIDEV "/dev/acpi" 4465283Siwasaki 4565283Siwasakistatic int 4665283Siwasakiacpi_enable_disable(int enable) 4765283Siwasaki{ 4865283Siwasaki int fd; 4965283Siwasaki 5065283Siwasaki fd = open(ACPIDEV, O_RDWR); 5165283Siwasaki if (fd == -1) { 5265283Siwasaki err(1, NULL); 5365283Siwasaki } 5465283Siwasaki if (ioctl(fd, enable, NULL) == -1) { 5565283Siwasaki err(1, NULL); 5665283Siwasaki } 5765283Siwasaki close(fd); 5865283Siwasaki 5965283Siwasaki return (0); 6065283Siwasaki} 6165283Siwasaki 6265283Siwasakistatic int 6365283Siwasakiacpi_sleep(int sleep_type) 6465283Siwasaki{ 6565283Siwasaki int fd; 6665283Siwasaki 6765283Siwasaki fd = open(ACPIDEV, O_RDWR); 6865283Siwasaki if (fd == -1) { 6965283Siwasaki err(1, NULL); 7065283Siwasaki } 7165283Siwasaki if (ioctl(fd, ACPIIO_SETSLPSTATE, &sleep_type) == -1) { 7265283Siwasaki err(1, NULL); 7365283Siwasaki } 7465283Siwasaki close(fd); 7565283Siwasaki 7665283Siwasaki return (0); 7765283Siwasaki} 7865283Siwasaki 7968475Siwasakistatic void 8068475Siwasakiusage(const char* prog) 8168475Siwasaki{ 8268475Siwasaki printf("usage: %s [-deh] [-s [1|2|3|4|4b|5]]\n", prog); 8368475Siwasaki exit(0); 8468475Siwasaki} 8568475Siwasaki 8665283Siwasakiint 8765283Siwasakimain(int argc, char *argv[]) 8865283Siwasaki{ 8968475Siwasaki char c, *prog; 9065283Siwasaki int sleep_type; 9165283Siwasaki 9268475Siwasaki prog = argv[0]; 9365283Siwasaki sleep_type = -1; 9468475Siwasaki while ((c = getopt(argc, argv, "dehs:")) != -1) { 9565283Siwasaki switch (c) { 9668475Siwasaki case 'd': 9768475Siwasaki acpi_enable_disable(ACPIIO_DISABLE); 9868475Siwasaki break; 9968475Siwasaki 10065283Siwasaki case 'e': 10165283Siwasaki acpi_enable_disable(ACPIIO_ENABLE); 10265283Siwasaki break; 10365283Siwasaki 10468475Siwasaki case 'h': 10568475Siwasaki usage(prog); 10665283Siwasaki break; 10765283Siwasaki 10865283Siwasaki case 's': 10968475Siwasaki sleep_type = optarg[0] - '0'; 11068475Siwasaki if (sleep_type < 0 || sleep_type > 5) { 11165283Siwasaki fprintf(stderr, "%s: invalid sleep type (%d)\n", 11265283Siwasaki argv[0], sleep_type); 11365283Siwasaki return -1; 11465283Siwasaki } 11568475Siwasaki 11668475Siwasaki /* convert sleep type value to ACPICA format */ 11768475Siwasaki switch (sleep_type) { 11868475Siwasaki case 4: 11968475Siwasaki if (optarg[1] == 'b') { 12068475Siwasaki sleep_type = ACPI_STATE_S4BIOS; 12168475Siwasaki } 12268475Siwasaki break; 12368475Siwasaki 12468475Siwasaki case 5: 12568475Siwasaki sleep_type = ACPI_STATE_S5; 12668475Siwasaki break; 12768475Siwasaki 12868475Siwasaki default: 12968475Siwasaki break; 13068475Siwasaki } 13165283Siwasaki break; 13265283Siwasaki default: 13365283Siwasaki argc -= optind; 13465283Siwasaki argv += optind; 13565283Siwasaki } 13665283Siwasaki } 13765283Siwasaki 13865283Siwasaki if (sleep_type != -1) { 13965283Siwasaki sleep(1); /* wait 1 sec. for key-release event */ 14065283Siwasaki acpi_sleep(sleep_type); 14165283Siwasaki } 14265283Siwasaki return (0); 14365283Siwasaki} 144