Subject: [PATCH] acpi ec] Add basic GPE handling - Create drivers/acpi/drivers/ec/gpe.c - Add ec_gpe_{init,exit)(), use them to register/unregister basic gpe callback. - Call from ec_{start,stop}() Signed-off-by: Patrick Mochel --- drivers/acpi/drivers/ec/Makefile | 2 +- drivers/acpi/drivers/ec/driver.c | 7 +++++- drivers/acpi/drivers/ec/ec.h | 5 +++++ drivers/acpi/drivers/ec/gpe.c | 42 ++++++++++++++++++++++++++++++++++++++ 4 files changed, 54 insertions(+), 2 deletions(-) create mode 100644 drivers/acpi/drivers/ec/gpe.c applies-to: 2ef3b01e9ec596102b7b848af7c2ac65fa4cfb6d dc69107ea6b29cd02a9bd8c9f0d890a309aecfbe diff --git a/drivers/acpi/drivers/ec/Makefile b/drivers/acpi/drivers/ec/Makefile index 6afe4ad..c2ee992 100644 --- a/drivers/acpi/drivers/ec/Makefile +++ b/drivers/acpi/drivers/ec/Makefile @@ -2,7 +2,7 @@ obj-$(CONFIG_ACPI_EC) += ec.o ec-y := driver.o device.o event.o poll.o intr.o ec-y += setup.o -ec-y += resource.o +ec-y += resource.o gpe.o ec-$(CONFIG_ACPI_DM_PROC) += proc.o ec-$(CONFIG_ACPI_DM_SYSFS) += sysfs.o diff --git a/drivers/acpi/drivers/ec/driver.c b/drivers/acpi/drivers/ec/driver.c index 7ba4bd8..6526b99 100644 --- a/drivers/acpi/drivers/ec/driver.c +++ b/drivers/acpi/drivers/ec/driver.c @@ -68,12 +68,17 @@ static int ec_remove(struct acpi_dev * a static int ec_start(struct acpi_dev * ad) { - return 0; + struct acpi_ec * ec = dev_get_drvdata(&ad->dev); + + return ec_gpe_init(ec); } static int ec_stop(struct acpi_dev * ad) { + struct acpi_ec * ec = dev_get_drvdata(&ad->dev); + + ec_gpe_exit(ec); return 0; } diff --git a/drivers/acpi/drivers/ec/ec.h b/drivers/acpi/drivers/ec/ec.h index 0fd508b..b72ce55 100644 --- a/drivers/acpi/drivers/ec/ec.h +++ b/drivers/acpi/drivers/ec/ec.h @@ -76,3 +76,8 @@ extern int ec_resource_init(struct acpi_ extern int ec_poll_init(struct acpi_ec * ec); extern int ec_intr_init(struct acpi_ec * ec); +/* + * gpe.c + */ +extern int ec_gpe_init(struct acpi_ec * ec); +extern void ec_gpe_exit(struct acpi_ec * ec); diff --git a/drivers/acpi/drivers/ec/gpe.c b/drivers/acpi/drivers/ec/gpe.c new file mode 100644 index 0000000..4fb07b6 --- /dev/null +++ b/drivers/acpi/drivers/ec/gpe.c @@ -0,0 +1,42 @@ +/*** + * drivers/acpi/drivers/ec/poll.c - Polling-driven EC driver + * + * Copyright (C) 2006 Patrick Mochel + * + * Based on drivers/acpi/ec.c, which was + * + * Copyright (C) 2004 Luming Yu + * Copyright (C) 2001, 2002 Andy Grover + * Copyright (C) 2001, 2002 Paul Diefenbaugh + * + * This file is released under the GPLv2. + */ + +#include "ec.h" + +static u32 gpe_callback(void * data) +{ + struct acpi_ec * ec = data; + + acpi_disable_gpe(NULL, ec->e_gpe_bit, ACPI_ISR); + + return ACPI_INTERRUPT_HANDLED; +} + +int ec_gpe_init(struct acpi_ec * ec) +{ + acpi_status status; + + status = acpi_install_gpe_handler(NULL, ec->e_gpe_bit, + ACPI_GPE_EDGE_TRIGGERED, + gpe_callback, ec); + acpi_set_gpe_type(NULL, ec->e_gpe_bit, ACPI_GPE_TYPE_RUNTIME); + acpi_enable_gpe(NULL, ec->e_gpe_bit, ACPI_NOT_ISR); + + return ACPI_SUCCESS(status) ? 0 : -ENODEV; +} + +void gpe_exit(struct acpi_ec * ec) +{ + acpi_remove_gpe_handler(NULL, ec->e_gpe_bit, gpe_callback); +} --- 0.99.9.GIT