summaryrefslogtreecommitdiffstats
path: root/sys/i386/acpica
diff options
context:
space:
mode:
authorphilip <philip@FreeBSD.org>2004-08-03 22:37:09 +0000
committerphilip <philip@FreeBSD.org>2004-08-03 22:37:09 +0000
commit11953c7462c6ef276367b1a14ad9d47c9ce1fe61 (patch)
tree3218200203bf8786d7aec5d1800e4252285b1ef1 /sys/i386/acpica
parentcc6a920fbfdf5037a841f9f5d54a587ffad360cd (diff)
downloadFreeBSD-src-11953c7462c6ef276367b1a14ad9d47c9ce1fe61.zip
FreeBSD-src-11953c7462c6ef276367b1a14ad9d47c9ce1fe61.tar.gz
Further cleanup: merge the three led toggling functions
into a single general function to handle all leds. Approved by: njl
Diffstat (limited to 'sys/i386/acpica')
-rw-r--r--sys/i386/acpica/acpi_asus.c96
1 files changed, 55 insertions, 41 deletions
diff --git a/sys/i386/acpica/acpi_asus.c b/sys/i386/acpica/acpi_asus.c
index da76d09..1e56980 100644
--- a/sys/i386/acpica/acpi_asus.c
+++ b/sys/i386/acpica/acpi_asus.c
@@ -30,7 +30,7 @@ __FBSDID("$FreeBSD$");
/*
* Driver for extra ACPI-controlled gadgets (hotkeys, leds, etc) found on
- * recent Asus (and Medion) laptops. Inspired by the Acpi4Asus project which
+ * recent Asus (and Medion) laptops. Inspired by the acpi4asus project which
* implements these features in the Linux kernel.
*
* <http://sourceforge.net/projects/acpi4asus/>
@@ -75,6 +75,16 @@ struct acpi_asus_model {
char *disp_set;
};
+struct acpi_asus_led {
+ struct cdev *cdev;
+ device_t dev;
+ enum {
+ ACPI_ASUS_LED_MLED,
+ ACPI_ASUS_LED_TLED,
+ ACPI_ASUS_LED_WLED,
+ } type;
+};
+
struct acpi_asus_softc {
device_t dev;
ACPI_HANDLE handle;
@@ -83,9 +93,9 @@ struct acpi_asus_softc {
struct sysctl_ctx_list sysctl_ctx;
struct sysctl_oid *sysctl_tree;
- struct cdev *s_mled;
- struct cdev *s_tled;
- struct cdev *s_wled;
+ struct acpi_asus_led s_mled;
+ struct acpi_asus_led s_tled;
+ struct acpi_asus_led s_wled;
int s_brn;
int s_disp;
@@ -170,9 +180,7 @@ static int acpi_asus_probe(device_t dev);
static int acpi_asus_attach(device_t dev);
static int acpi_asus_detach(device_t dev);
-static void acpi_asus_mled(device_t dev, int state);
-static void acpi_asus_tled(device_t dev, int state);
-static void acpi_asus_wled(device_t dev, int state);
+static void acpi_asus_led(struct acpi_asus_led *led, int state);
static int acpi_asus_sysctl_brn(SYSCTL_HANDLER_ARGS);
static int acpi_asus_sysctl_lcd(SYSCTL_HANDLER_ARGS);
@@ -281,14 +289,26 @@ acpi_asus_attach(device_t dev)
OID_AUTO, "asus", CTLFLAG_RD, 0, "");
/* Attach leds */
- if (sc->model->mled_set)
- sc->s_mled = led_create((led_t *)acpi_asus_mled, dev, "mled");
+ if (sc->model->mled_set) {
+ sc->s_mled.dev = dev;
+ sc->s_mled.type = ACPI_ASUS_LED_MLED;
+ sc->s_mled.cdev =
+ led_create((led_t *)acpi_asus_led, &sc->s_mled, "mled");
+ }
- if (sc->model->tled_set)
- sc->s_tled = led_create((led_t *)acpi_asus_tled, dev, "tled");
+ if (sc->model->tled_set) {
+ sc->s_tled.dev = dev;
+ sc->s_tled.type = ACPI_ASUS_LED_TLED;
+ sc->s_tled.cdev =
+ led_create((led_t *)acpi_asus_led, &sc->s_tled, "tled");
+ }
- if (sc->model->wled_set)
- sc->s_wled = led_create((led_t *)acpi_asus_wled, dev, "wled");
+ if (sc->model->wled_set) {
+ sc->s_wled.dev = dev;
+ sc->s_wled.type = ACPI_ASUS_LED_WLED;
+ sc->s_wled.cdev =
+ led_create((led_t *)acpi_asus_led, &sc->s_wled, "wled");
+ }
/* Attach brightness for GPLV/SPLV models */
if (sc->model->brn_get && ACPI_SUCCESS(acpi_GetInteger(sc->handle,
@@ -376,13 +396,13 @@ acpi_asus_detach(device_t dev)
/* Turn the lights off */
if (sc->model->mled_set)
- led_destroy(sc->s_mled);
+ led_destroy(sc->s_mled.cdev);
if (sc->model->tled_set)
- led_destroy(sc->s_tled);
+ led_destroy(sc->s_tled.cdev);
if (sc->model->wled_set)
- led_destroy(sc->s_wled);
+ led_destroy(sc->s_wled.cdev);
/* Remove notify handler */
AcpiRemoveNotifyHandler(sc->handle, ACPI_SYSTEM_NOTIFY,
@@ -395,37 +415,31 @@ acpi_asus_detach(device_t dev)
}
static void
-acpi_asus_mled(device_t dev, int state)
+acpi_asus_led(struct acpi_asus_led *led, int state)
{
struct acpi_asus_softc *sc;
+ char *method;
ACPI_FUNCTION_TRACE((char *)(uintptr_t)__func__);
- /* Note that the MLED value is inverted. */
- sc = device_get_softc(dev);
- acpi_SetInteger(sc->handle, sc->model->mled_set, !state);
-}
-
-static void
-acpi_asus_tled(device_t dev, int state)
-{
- struct acpi_asus_softc *sc;
-
- ACPI_FUNCTION_TRACE((char *)(uintptr_t)__func__);
-
- sc = device_get_softc(dev);
- acpi_SetInteger(sc->handle, sc->model->tled_set, state);
-}
-
-static void
-acpi_asus_wled(device_t dev, int state)
-{
- struct acpi_asus_softc *sc;
-
- ACPI_FUNCTION_TRACE((char *)(uintptr_t)__func__);
+ sc = device_get_softc(led->dev);
+
+ switch (led->type) {
+ case ACPI_ASUS_LED_MLED:
+ method = sc->model->mled_set;
+
+ /* Note: inverted */
+ state = !state;
+ break;
+ case ACPI_ASUS_LED_TLED:
+ method = sc->model->tled_set;
+ break;
+ case ACPI_ASUS_LED_WLED:
+ method = sc->model->wled_set;
+ break;
+ }
- sc = device_get_softc(dev);
- acpi_SetInteger(sc->handle, sc->model->wled_set, state);
+ acpi_SetInteger(sc->handle, method, state);
}
static int
OpenPOWER on IntegriCloud