11.1Skiyohara/* $NetBSD: nbppm.c,v 1.1 2011/08/06 03:53:40 kiyohara Exp $ */ 21.1Skiyohara/* 31.1Skiyohara * Copyright (c) 2011 KIYOHARA Takashi 41.1Skiyohara * All rights reserved. 51.1Skiyohara * 61.1Skiyohara * Redistribution and use in source and binary forms, with or without 71.1Skiyohara * modification, are permitted provided that the following conditions 81.1Skiyohara * are met: 91.1Skiyohara * 1. Redistributions of source code must retain the above copyright 101.1Skiyohara * notice, this list of conditions and the following disclaimer. 111.1Skiyohara * 2. Redistributions in binary form must reproduce the above copyright 121.1Skiyohara * notice, this list of conditions and the following disclaimer in the 131.1Skiyohara * documentation and/or other materials provided with the distribution. 141.1Skiyohara * 151.1Skiyohara * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR 161.1Skiyohara * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED 171.1Skiyohara * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE 181.1Skiyohara * DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, 191.1Skiyohara * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES 201.1Skiyohara * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR 211.1Skiyohara * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 221.1Skiyohara * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, 231.1Skiyohara * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN 241.1Skiyohara * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 251.1Skiyohara * POSSIBILITY OF SUCH DAMAGE. 261.1Skiyohara */ 271.1Skiyohara#include <sys/cdefs.h> 281.1Skiyohara__KERNEL_RCSID(0, "$NetBSD: nbppm.c,v 1.1 2011/08/06 03:53:40 kiyohara Exp $"); 291.1Skiyohara 301.1Skiyohara#include <sys/param.h> 311.1Skiyohara#include <sys/device.h> 321.1Skiyohara#include <sys/errno.h> 331.1Skiyohara 341.1Skiyohara#include <machine/config_hook.h> 351.1Skiyohara 361.1Skiyohara#include <arm/xscale/pxa2x0_gpio.h> 371.1Skiyohara 381.1Skiyohara#include <hpcarm/dev/nbppconvar.h> 391.1Skiyohara 401.1Skiyohara#include "locators.h" 411.1Skiyohara 421.1Skiyoharastruct nbppm_softc { 431.1Skiyohara device_t sc_dev; 441.1Skiyohara device_t sc_parent; 451.1Skiyohara int sc_tag; 461.1Skiyohara}; 471.1Skiyohara 481.1Skiyoharastatic int nbppm_match(device_t, cfdata_t, void *); 491.1Skiyoharastatic void nbppm_attach(device_t, device_t, void *); 501.1Skiyohara 511.1Skiyoharastatic int nbppm_critical_intr(void *); 521.1Skiyoharastatic int nbppm_suspend_intr(void *); 531.1Skiyohara 541.1SkiyoharaCFATTACH_DECL_NEW(nbppm, sizeof(struct nbppm_softc), 551.1Skiyohara nbppm_match, nbppm_attach, NULL, NULL); 561.1Skiyohara 571.1Skiyohara 581.1Skiyohara/* ARGSUSED */ 591.1Skiyoharastatic int 601.1Skiyoharanbppm_match(device_t parent, cfdata_t match, void *aux) 611.1Skiyohara{ 621.1Skiyohara struct nbppcon_attach_args *pcon = aux; 631.1Skiyohara 641.1Skiyohara if (strcmp(pcon->aa_name, match->cf_name) || 651.1Skiyohara pcon->aa_tag == NBPPCONCF_TAG_DEFAULT) 661.1Skiyohara return 0; 671.1Skiyohara 681.1Skiyohara return 1; 691.1Skiyohara} 701.1Skiyohara 711.1Skiyoharastatic void 721.1Skiyoharanbppm_attach(device_t parent, device_t self, void *aux) 731.1Skiyohara{ 741.1Skiyohara struct nbppm_softc *sc = device_private(self); 751.1Skiyohara struct nbppcon_attach_args *pcon = aux; 761.1Skiyohara 771.1Skiyohara aprint_naive("\n"); 781.1Skiyohara aprint_normal("\n"); 791.1Skiyohara 801.1Skiyohara sc->sc_dev = self; 811.1Skiyohara sc->sc_parent = parent; 821.1Skiyohara sc->sc_tag = pcon->aa_tag; 831.1Skiyohara 841.1Skiyohara /* GPIO 0 is Critical Suspend */ 851.1Skiyohara pxa2x0_gpio_set_function(0, GPIO_IN); 861.1Skiyohara if (pxa2x0_gpio_intr_establish(0, IST_EDGE_RISING, IPL_HIGH, 871.1Skiyohara nbppm_critical_intr, sc) == NULL) 881.1Skiyohara aprint_error_dev(self, 891.1Skiyohara "unable to establish critical interrupt\n"); 901.1Skiyohara 911.1Skiyohara /* GPIO 1 is Suspend */ 921.1Skiyohara pxa2x0_gpio_set_function(1, GPIO_IN); 931.1Skiyohara if (pxa2x0_gpio_intr_establish(1, IST_EDGE_BOTH, IPL_HIGH, 941.1Skiyohara nbppm_suspend_intr, sc) == NULL) 951.1Skiyohara aprint_error_dev(self, 961.1Skiyohara "unable to establish suspend interrupt\n"); 971.1Skiyohara 981.1Skiyohara return; 991.1Skiyohara} 1001.1Skiyohara 1011.1Skiyoharastatic int 1021.1Skiyoharanbppm_critical_intr(void *arg) 1031.1Skiyohara{ 1041.1Skiyohara struct nbppm_softc *sc = arg; 1051.1Skiyohara 1061.1Skiyohara aprint_normal_dev(sc->sc_dev, "Battery Low\n"); 1071.1Skiyohara return 0; 1081.1Skiyohara} 1091.1Skiyohara 1101.1Skiyoharastatic int 1111.1Skiyoharanbppm_suspend_intr(void *arg) 1121.1Skiyohara{ 1131.1Skiyohara struct nbppm_softc *sc = arg; 1141.1Skiyohara 1151.1Skiyohara aprint_verbose_dev(sc->sc_dev, "lid closed\n"); 1161.1Skiyohara 1171.1Skiyohara return 0; 1181.1Skiyohara} 119