summaryrefslogtreecommitdiff
path: root/sys
diff options
context:
space:
mode:
authorDale Rahn <drahn@cvs.openbsd.org>2001-03-29 19:28:05 +0000
committerDale Rahn <drahn@cvs.openbsd.org>2001-03-29 19:28:05 +0000
commit2f8bad020a03b04a7888749571df44212e01da9f (patch)
treea6a93bdbbd1e657219df60eb5e7ddcebf06ed1df /sys
parent756bcc57aabdc1ac4617ff0957485f25d7cc472f (diff)
Add ADB "button" driver. used for brightness/volume control on some systems.
From Nbsd.
Diffstat (limited to 'sys')
-rw-r--r--sys/arch/powerpc/mac/abtn.c128
1 files changed, 128 insertions, 0 deletions
diff --git a/sys/arch/powerpc/mac/abtn.c b/sys/arch/powerpc/mac/abtn.c
new file mode 100644
index 00000000000..8a9d2a2dbf9
--- /dev/null
+++ b/sys/arch/powerpc/mac/abtn.c
@@ -0,0 +1,128 @@
+/* $NetBSD: abtn.c,v 1.1 1999/07/12 17:48:26 tsubai Exp $ */
+
+/*-
+ * Copyright (C) 1999 Tsubai Masanari. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * 3. The name of the author may not be used to endorse or promote products
+ * derived from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+ * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+ * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include <sys/param.h>
+#include <sys/device.h>
+#include <sys/systm.h>
+
+#include <powerpc/mac/adbvar.h>
+
+#define NVRAM_BRIGHTNESS 0x140e
+#define ABTN_HANDLER_ID 31
+
+struct abtn_softc {
+ struct device sc_dev;
+
+ int origaddr; /* ADB device type */
+ int adbaddr; /* current ADB address */
+ int handler_id;
+
+ int brightness; /* backlight brightness */
+ int volume; /* speaker volume (not yet) */
+};
+
+static int abtn_match __P((struct device *, void *, void *));
+static void abtn_attach __P((struct device *, struct device *, void *));
+static void abtn_adbcomplete __P((caddr_t, caddr_t, int));
+
+struct cfattach abtn_ca = {
+ sizeof(struct abtn_softc), abtn_match, abtn_attach
+};
+struct cfdriver abtn_cd = {
+ NULL, "abtn", DV_DULL
+};
+
+int
+abtn_match(parent, cf, aux)
+ struct device *parent;
+ void *cf;
+ void *aux;
+{
+ struct adb_attach_args *aa = aux;
+
+ if (aa->origaddr == ADBADDR_MISC &&
+ aa->handler_id == ABTN_HANDLER_ID)
+ return 1;
+
+ return 0;
+}
+
+void
+abtn_attach(parent, self, aux)
+ struct device *parent, *self;
+ void *aux;
+{
+ struct abtn_softc *sc = (struct abtn_softc *)self;
+ struct adb_attach_args *aa = aux;
+ ADBSetInfoBlock adbinfo;
+ int bright;
+
+ printf("brightness/volume button\n");
+
+ bright = pm_read_nvram(NVRAM_BRIGHTNESS);
+ pm_set_brightness(bright);
+ sc->brightness = bright;
+
+ sc->origaddr = aa->origaddr;
+ sc->adbaddr = aa->adbaddr;
+ sc->handler_id = aa->handler_id;
+
+ adbinfo.siServiceRtPtr = (Ptr)abtn_adbcomplete;
+ adbinfo.siDataAreaAddr = (caddr_t)sc;
+
+ SetADBInfo(&adbinfo, sc->adbaddr);
+}
+
+void
+abtn_adbcomplete(buffer, data, adb_command)
+ caddr_t buffer, data;
+ int adb_command;
+{
+ struct abtn_softc *sc = (struct abtn_softc *)data;
+ u_int cmd;
+
+ cmd = buffer[1];
+
+ switch (cmd) {
+ case 0x0a:
+ sc->brightness -= 8;
+ if (sc->brightness < 8)
+ sc->brightness = 8;
+ pm_set_brightness(sc->brightness);
+ pm_write_nvram(NVRAM_BRIGHTNESS, sc->brightness);
+ break;
+
+ case 0x09:
+ sc->brightness += 8;
+ if (sc->brightness > 0x78)
+ sc->brightness = 0x78;
+ pm_set_brightness(sc->brightness);
+ pm_write_nvram(NVRAM_BRIGHTNESS, sc->brightness);
+ break;
+ }
+}