1226449Snwhitehorn/*- 2226449Snwhitehorn * Copyright (c) 2011, Justin Hibbits. 3226449Snwhitehorn * Copyright (c) 2002, Miodrag Vallat. 4226449Snwhitehorn * Copyright (C) 1999 Tsubai Masanari. All rights reserved. 5226449Snwhitehorn * 6226449Snwhitehorn * Redistribution and use in source and binary forms, with or without 7226449Snwhitehorn * modification, are permitted provided that the following conditions 8226449Snwhitehorn * are met: 9226449Snwhitehorn * 1. Redistributions of source code must retain the above copyright 10226449Snwhitehorn * notice, this list of conditions and the following disclaimer. 11226449Snwhitehorn * 2. Redistributions in binary form must reproduce the above copyright 12226449Snwhitehorn * notice, this list of conditions and the following disclaimer in the 13226449Snwhitehorn * documentation and/or other materials provided with the distribution. 14226449Snwhitehorn * 3. The name of the author may not be used to endorse or promote products 15226449Snwhitehorn * derived from this software without specific prior written permission. 16226449Snwhitehorn * 17226449Snwhitehorn * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR 18226449Snwhitehorn * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES 19226449Snwhitehorn * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. 20226449Snwhitehorn * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, 21226449Snwhitehorn * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT 22226449Snwhitehorn * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 23226449Snwhitehorn * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 24226449Snwhitehorn * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 25226449Snwhitehorn * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 26226449Snwhitehorn * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 27226449Snwhitehorn * 28226449Snwhitehorn * OpenBSD: abtn.c,v 1.12 2009/01/10 18:00:59 robert Exp 29226449Snwhitehorn * NetBSD: abtn.c,v 1.1 1999/07/12 17:48:26 tsubai Exp 30226449Snwhitehorn * 31226449Snwhitehorn * $FreeBSD$ 32226449Snwhitehorn */ 33226449Snwhitehorn 34226449Snwhitehorn#include <sys/param.h> 35226449Snwhitehorn#include <sys/systm.h> 36226449Snwhitehorn#include <sys/module.h> 37226449Snwhitehorn#include <sys/kernel.h> 38226449Snwhitehorn#include <sys/bus.h> 39226449Snwhitehorn 40226449Snwhitehorn#include <machine/bus.h> 41226449Snwhitehorn 42226449Snwhitehorn#include <dev/ofw/openfirm.h> 43226449Snwhitehorn#include <machine/ofw_machdep.h> 44226449Snwhitehorn 45226449Snwhitehorn#include <dev/adb/adb.h> 46226449Snwhitehorn 47226449Snwhitehorn#define ABTN_HANDLER_ID 31 48226449Snwhitehorn 49226449Snwhitehornstruct abtn_softc { 50226449Snwhitehorn device_t sc_dev; 51226449Snwhitehorn 52226449Snwhitehorn int handler_id; 53226449Snwhitehorn}; 54226449Snwhitehorn 55226449Snwhitehornstatic int abtn_probe(device_t dev); 56226449Snwhitehornstatic int abtn_attach(device_t dev); 57226449Snwhitehornstatic u_int abtn_receive_packet(device_t dev, u_char status, 58226449Snwhitehorn u_char command, u_char reg, int len, u_char *data); 59226449Snwhitehorn 60226449Snwhitehornstatic device_method_t abtn_methods[] = { 61226449Snwhitehorn /* Device interface */ 62226449Snwhitehorn DEVMETHOD(device_probe, abtn_probe), 63226449Snwhitehorn DEVMETHOD(device_attach, abtn_attach), 64226449Snwhitehorn DEVMETHOD(device_shutdown, bus_generic_shutdown), 65226449Snwhitehorn DEVMETHOD(device_suspend, bus_generic_suspend), 66226449Snwhitehorn DEVMETHOD(device_resume, bus_generic_resume), 67226449Snwhitehorn 68226449Snwhitehorn /* ADB interface */ 69226449Snwhitehorn DEVMETHOD(adb_receive_packet, abtn_receive_packet), 70226449Snwhitehorn 71226449Snwhitehorn { 0, 0 } 72226449Snwhitehorn}; 73226449Snwhitehorn 74226449Snwhitehornstatic driver_t abtn_driver = { 75226449Snwhitehorn "abtn", 76226449Snwhitehorn abtn_methods, 77226449Snwhitehorn sizeof(struct abtn_softc), 78226449Snwhitehorn}; 79226449Snwhitehorn 80226449Snwhitehornstatic devclass_t abtn_devclass; 81226449Snwhitehorn 82226449SnwhitehornDRIVER_MODULE(abtn, adb, abtn_driver, abtn_devclass, 0, 0); 83226449Snwhitehorn 84226449Snwhitehornstatic int 85226449Snwhitehornabtn_probe(device_t dev) 86226449Snwhitehorn{ 87226449Snwhitehorn uint8_t type; 88226449Snwhitehorn 89226449Snwhitehorn type = adb_get_device_type(dev); 90226449Snwhitehorn 91226449Snwhitehorn if (type != ADB_DEVICE_MISC) 92226449Snwhitehorn return (ENXIO); 93226449Snwhitehorn 94226449Snwhitehorn device_set_desc(dev, "ADB Brightness/Volume/Eject Buttons"); 95226449Snwhitehorn return (0); 96226449Snwhitehorn} 97226449Snwhitehorn 98226449Snwhitehornstatic int 99226449Snwhitehornabtn_attach(device_t dev) 100226449Snwhitehorn{ 101226449Snwhitehorn struct abtn_softc *sc; 102226449Snwhitehorn 103226449Snwhitehorn sc = device_get_softc(dev); 104226449Snwhitehorn sc->sc_dev = dev; 105226449Snwhitehorn 106226449Snwhitehorn sc->handler_id = adb_get_device_handler(dev); 107226449Snwhitehorn 108226449Snwhitehorn return 0; 109226449Snwhitehorn} 110226449Snwhitehorn 111226449Snwhitehornstatic u_int 112226449Snwhitehornabtn_receive_packet(device_t dev, u_char status, 113226449Snwhitehorn u_char command, u_char reg, int len, u_char *data) 114226449Snwhitehorn{ 115226449Snwhitehorn u_int cmd; 116226449Snwhitehorn 117226449Snwhitehorn cmd = data[0]; 118226449Snwhitehorn 119226449Snwhitehorn switch (cmd) { 120226449Snwhitehorn case 0x0a: /* decrease brightness */ 121226449Snwhitehorn if (devctl_process_running()) 122226449Snwhitehorn devctl_notify("PMU", "keys", "brightness", 123226449Snwhitehorn "notify=down"); 124226449Snwhitehorn break; 125226449Snwhitehorn 126226449Snwhitehorn case 0x09: /* increase brightness */ 127226449Snwhitehorn if (devctl_process_running()) 128226449Snwhitehorn devctl_notify("PMU", "keys", "brightness", "notify=up"); 129226449Snwhitehorn break; 130226449Snwhitehorn 131226449Snwhitehorn case 0x08: /* mute */ 132226449Snwhitehorn case 0x01: /* mute, AV hardware */ 133226449Snwhitehorn if (devctl_process_running()) 134226449Snwhitehorn devctl_notify("PMU", "keys", "mute", NULL); 135226449Snwhitehorn break; 136226449Snwhitehorn case 0x07: /* decrease volume */ 137226449Snwhitehorn case 0x02: /* decrease volume, AV hardware */ 138226449Snwhitehorn if (devctl_process_running()) 139226449Snwhitehorn devctl_notify("PMU", "keys", "volume", "notify=down"); 140226449Snwhitehorn break; 141226449Snwhitehorn case 0x06: /* increase volume */ 142226449Snwhitehorn case 0x03: /* increase volume, AV hardware */ 143226449Snwhitehorn if (devctl_process_running()) 144226449Snwhitehorn devctl_notify("PMU", "keys", "volume", "notify=up"); 145226449Snwhitehorn break; 146226449Snwhitehorn case 0x0c: /* mirror display key */ 147226449Snwhitehorn /* Need callback to do something with this */ 148226449Snwhitehorn break; 149226449Snwhitehorn case 0x0b: /* eject tray */ 150226449Snwhitehorn if (devctl_process_running()) 151226449Snwhitehorn devctl_notify("PMU", "keys", "eject", NULL); 152226449Snwhitehorn case 0x7f: /* numlock */ 153226449Snwhitehorn /* Need callback to do something with this */ 154226449Snwhitehorn break; 155226449Snwhitehorn 156226449Snwhitehorn default: 157226449Snwhitehorn#ifdef DEBUG 158226449Snwhitehorn if ((cmd & ~0x7f) == 0) 159226449Snwhitehorn device_printf(dev, "unknown ADB button 0x%x\n", cmd); 160226449Snwhitehorn#endif 161226449Snwhitehorn break; 162226449Snwhitehorn } 163226449Snwhitehorn return 0; 164226449Snwhitehorn} 165226449Snwhitehorn 166