acpi_lid.c revision 1.45
11.45Sthorpej/* $NetBSD: acpi_lid.c,v 1.45 2021/01/29 15:49:55 thorpej Exp $ */ 21.1Sthorpej 31.1Sthorpej/* 41.7Sthorpej * Copyright 2001, 2003 Wasabi Systems, Inc. 51.1Sthorpej * All rights reserved. 61.1Sthorpej * 71.1Sthorpej * Written by Jason R. Thorpe for Wasabi Systems, Inc. 81.1Sthorpej * 91.1Sthorpej * Redistribution and use in source and binary forms, with or without 101.1Sthorpej * modification, are permitted provided that the following conditions 111.1Sthorpej * are met: 121.1Sthorpej * 1. Redistributions of source code must retain the above copyright 131.1Sthorpej * notice, this list of conditions and the following disclaimer. 141.1Sthorpej * 2. Redistributions in binary form must reproduce the above copyright 151.1Sthorpej * notice, this list of conditions and the following disclaimer in the 161.1Sthorpej * documentation and/or other materials provided with the distribution. 171.1Sthorpej * 3. All advertising materials mentioning features or use of this software 181.1Sthorpej * must display the following acknowledgement: 191.1Sthorpej * This product includes software developed for the NetBSD Project by 201.1Sthorpej * Wasabi Systems, Inc. 211.1Sthorpej * 4. The name of Wasabi Systems, Inc. may not be used to endorse 221.1Sthorpej * or promote products derived from this software without specific prior 231.1Sthorpej * written permission. 241.1Sthorpej * 251.1Sthorpej * THIS SOFTWARE IS PROVIDED BY WASABI SYSTEMS, INC. ``AS IS'' AND 261.1Sthorpej * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED 271.1Sthorpej * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 281.1Sthorpej * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL WASABI SYSTEMS, INC 291.1Sthorpej * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 301.1Sthorpej * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 311.1Sthorpej * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 321.1Sthorpej * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 331.1Sthorpej * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 341.1Sthorpej * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 351.1Sthorpej * POSSIBILITY OF SUCH DAMAGE. 361.1Sthorpej */ 371.1Sthorpej 381.1Sthorpej/* 391.1Sthorpej * ACPI Lid Switch driver. 401.1Sthorpej */ 411.3Slukem 421.3Slukem#include <sys/cdefs.h> 431.45Sthorpej__KERNEL_RCSID(0, "$NetBSD: acpi_lid.c,v 1.45 2021/01/29 15:49:55 thorpej Exp $"); 441.1Sthorpej 451.1Sthorpej#include <sys/param.h> 461.1Sthorpej#include <sys/device.h> 471.35Sjruoho#include <sys/module.h> 481.36Sjruoho#include <sys/systm.h> 491.1Sthorpej 501.1Sthorpej#include <dev/acpi/acpireg.h> 511.1Sthorpej#include <dev/acpi/acpivar.h> 521.1Sthorpej 531.34Sjruoho#define _COMPONENT ACPI_LID_COMPONENT 541.34SjruohoACPI_MODULE_NAME ("acpi_lid") 551.32Sjruoho 561.40Sjruoho#define ACPI_NOTIFY_LID 0x80 571.40Sjruoho 581.1Sthorpejstruct acpilid_softc { 591.34Sjruoho struct acpi_devnode *sc_node; 601.34Sjruoho struct sysmon_pswitch sc_smpsw; 611.34Sjruoho uint64_t sc_status; 621.1Sthorpej}; 631.1Sthorpej 641.45Sthorpejstatic const struct device_compatible_entry compat_data[] = { 651.45Sthorpej { .compat = "PNP0C0D" }, 661.45Sthorpej DEVICE_COMPAT_EOL 671.10Skochi}; 681.10Skochi 691.25Sxtraemestatic int acpilid_match(device_t, cfdata_t, void *); 701.25Sxtraemestatic void acpilid_attach(device_t, device_t, void *); 711.26Sdyoungstatic int acpilid_detach(device_t, int); 721.15Skochistatic void acpilid_status_changed(void *); 731.38Sjruohostatic void acpilid_notify_handler(ACPI_HANDLE, uint32_t, void *); 741.22Sjmcneill 751.34SjruohoCFATTACH_DECL_NEW(acpilid, sizeof(struct acpilid_softc), 761.34Sjruoho acpilid_match, acpilid_attach, acpilid_detach, NULL); 771.34Sjruoho 781.1Sthorpej/* 791.1Sthorpej * acpilid_match: 801.1Sthorpej * 811.1Sthorpej * Autoconfiguration `match' routine. 821.1Sthorpej */ 831.15Skochistatic int 841.25Sxtraemeacpilid_match(device_t parent, cfdata_t match, void *aux) 851.1Sthorpej{ 861.1Sthorpej struct acpi_attach_args *aa = aux; 871.1Sthorpej 881.45Sthorpej return acpi_compatible_match(aa, compat_data); 891.1Sthorpej} 901.1Sthorpej 911.1Sthorpej/* 921.1Sthorpej * acpilid_attach: 931.1Sthorpej * 941.1Sthorpej * Autoconfiguration `attach' routine. 951.1Sthorpej */ 961.15Skochistatic void 971.25Sxtraemeacpilid_attach(device_t parent, device_t self, void *aux) 981.1Sthorpej{ 991.25Sxtraeme struct acpilid_softc *sc = device_private(self); 1001.1Sthorpej struct acpi_attach_args *aa = aux; 1011.1Sthorpej 1021.19Skochi aprint_naive(": ACPI Lid Switch\n"); 1031.19Skochi aprint_normal(": ACPI Lid Switch\n"); 1041.1Sthorpej 1051.1Sthorpej sc->sc_node = aa->aa_node; 1061.1Sthorpej 1071.25Sxtraeme sc->sc_smpsw.smpsw_name = device_xname(self); 1081.8Sthorpej sc->sc_smpsw.smpsw_type = PSWITCH_TYPE_LID; 1091.34Sjruoho 1101.37Sjruoho (void)pmf_device_register(self, NULL, NULL); 1111.34Sjruoho (void)sysmon_pswitch_register(&sc->sc_smpsw); 1121.39Sjruoho (void)acpi_register_notify(sc->sc_node, acpilid_notify_handler); 1131.22Sjmcneill} 1141.22Sjmcneill 1151.26Sdyoungstatic int 1161.26Sdyoungacpilid_detach(device_t self, int flags) 1171.26Sdyoung{ 1181.26Sdyoung struct acpilid_softc *sc = device_private(self); 1191.26Sdyoung 1201.26Sdyoung pmf_device_deregister(self); 1211.39Sjruoho acpi_deregister_notify(sc->sc_node); 1221.26Sdyoung sysmon_pswitch_unregister(&sc->sc_smpsw); 1231.26Sdyoung 1241.26Sdyoung return 0; 1251.26Sdyoung} 1261.26Sdyoung 1271.1Sthorpej/* 1281.1Sthorpej * acpilid_status_changed: 1291.1Sthorpej * 1301.1Sthorpej * Get, and possibly display, the lid status, and take action. 1311.1Sthorpej */ 1321.15Skochistatic void 1331.1Sthorpejacpilid_status_changed(void *arg) 1341.1Sthorpej{ 1351.34Sjruoho device_t dv = arg; 1361.34Sjruoho struct acpilid_softc *sc = device_private(dv); 1371.12Smycroft ACPI_STATUS rv; 1381.1Sthorpej 1391.34Sjruoho rv = acpi_eval_integer(sc->sc_node->ad_handle, "_LID", &sc->sc_status); 1401.34Sjruoho 1411.12Smycroft if (ACPI_FAILURE(rv)) 1421.1Sthorpej return; 1431.1Sthorpej 1441.34Sjruoho sysmon_pswitch_event(&sc->sc_smpsw, (sc->sc_status == 0) ? 1451.8Sthorpej PSWITCH_EVENT_PRESSED : PSWITCH_EVENT_RELEASED); 1461.1Sthorpej} 1471.1Sthorpej 1481.1Sthorpej/* 1491.1Sthorpej * acpilid_notify_handler: 1501.1Sthorpej * 1511.1Sthorpej * Callback from ACPI interrupt handler to notify us of an event. 1521.1Sthorpej */ 1531.15Skochistatic void 1541.34Sjruohoacpilid_notify_handler(ACPI_HANDLE handle, uint32_t notify, void *context) 1551.1Sthorpej{ 1561.34Sjruoho static const int handler = OSL_NOTIFY_HANDLER; 1571.25Sxtraeme device_t dv = context; 1581.1Sthorpej 1591.1Sthorpej switch (notify) { 1601.34Sjruoho 1611.40Sjruoho case ACPI_NOTIFY_LID: 1621.34Sjruoho (void)AcpiOsExecute(handler, acpilid_status_changed, dv); 1631.1Sthorpej break; 1641.1Sthorpej 1651.41Sjruoho case ACPI_NOTIFY_DEVICE_WAKE: 1661.41Sjruoho break; 1671.41Sjruoho 1681.1Sthorpej default: 1691.41Sjruoho aprint_debug_dev(dv, "unknown notify 0x%02X\n", notify); 1701.1Sthorpej } 1711.1Sthorpej} 1721.22Sjmcneill 1731.44SpgoyetteMODULE(MODULE_CLASS_DRIVER, acpilid, "sysmon_power"); 1741.35Sjruoho 1751.43Sjruoho#ifdef _MODULE 1761.43Sjruoho#include "ioconf.c" 1771.43Sjruoho#endif 1781.35Sjruoho 1791.35Sjruohostatic int 1801.43Sjruohoacpilid_modcmd(modcmd_t cmd, void *aux) 1811.35Sjruoho{ 1821.43Sjruoho int rv = 0; 1831.35Sjruoho 1841.35Sjruoho switch (cmd) { 1851.35Sjruoho 1861.35Sjruoho case MODULE_CMD_INIT: 1871.35Sjruoho 1881.43Sjruoho#ifdef _MODULE 1891.43Sjruoho rv = config_init_component(cfdriver_ioconf_acpilid, 1901.43Sjruoho cfattach_ioconf_acpilid, cfdata_ioconf_acpilid); 1911.43Sjruoho#endif 1921.43Sjruoho break; 1931.35Sjruoho 1941.35Sjruoho case MODULE_CMD_FINI: 1951.35Sjruoho 1961.43Sjruoho#ifdef _MODULE 1971.43Sjruoho rv = config_fini_component(cfdriver_ioconf_acpilid, 1981.43Sjruoho cfattach_ioconf_acpilid, cfdata_ioconf_acpilid); 1991.43Sjruoho#endif 2001.43Sjruoho break; 2011.35Sjruoho 2021.35Sjruoho default: 2031.43Sjruoho rv = ENOTTY; 2041.35Sjruoho } 2051.43Sjruoho 2061.43Sjruoho return rv; 2071.35Sjruoho} 208