Skip to content

Commit

Permalink
gpio / ACPI: register to ACPI events automatically
Browse files Browse the repository at this point in the history
Instead of asking each driver to register to ACPI events we can just call
acpi_gpiochip_register_interrupts() for each chip that has an ACPI handle.
The function checks chip->to_irq and if it is set to NULL (a GPIO driver
that doesn't do interrupts) the function does nothing.

We also add the a new header drivers/gpio/gpiolib.h that is used for
functions internal to gpiolib and add ACPI GPIO chip registering functions
to that header.

Once that is done we can remove call to acpi_gpiochip_register_interrupts()
from its only user, pinctrl-baytrail.c

Signed-off-by: Mika Westerberg <mika.westerberg@linux.intel.com>
Acked-by: Rafael J. Wysocki <rafael.j.wysocki@intel.com>
Signed-off-by: Linus Walleij <linus.walleij@linaro.org>
  • Loading branch information
Mika Westerberg authored and Linus Walleij committed Jan 8, 2014
1 parent 8787565 commit 664e3e5
Show file tree
Hide file tree
Showing 5 changed files with 39 additions and 14 deletions.
16 changes: 12 additions & 4 deletions drivers/gpio/gpiolib-acpi.c
Original file line number Diff line number Diff line change
Expand Up @@ -94,7 +94,7 @@ static void acpi_gpio_evt_dh(acpi_handle handle, void *data)
* gpio pins have acpi event methods and assigns interrupt handlers that calls
* the acpi event methods for those pins.
*/
void acpi_gpiochip_request_interrupts(struct gpio_chip *chip)
static void acpi_gpiochip_request_interrupts(struct gpio_chip *chip)
{
struct acpi_buffer buf = {ACPI_ALLOCATE_BUFFER, NULL};
struct acpi_resource *res;
Expand Down Expand Up @@ -192,7 +192,6 @@ void acpi_gpiochip_request_interrupts(struct gpio_chip *chip)
irq);
}
}
EXPORT_SYMBOL(acpi_gpiochip_request_interrupts);

/**
* acpi_gpiochip_free_interrupts() - Free GPIO _EVT ACPI event interrupts.
Expand All @@ -203,7 +202,7 @@ EXPORT_SYMBOL(acpi_gpiochip_request_interrupts);
* The remaining ACPI event interrupts associated with the chip are freed
* automatically.
*/
void acpi_gpiochip_free_interrupts(struct gpio_chip *chip)
static void acpi_gpiochip_free_interrupts(struct gpio_chip *chip)
{
acpi_handle handle;
acpi_status status;
Expand All @@ -230,7 +229,6 @@ void acpi_gpiochip_free_interrupts(struct gpio_chip *chip)
acpi_detach_data(handle, acpi_gpio_evt_dh);
kfree(evt_pins);
}
EXPORT_SYMBOL(acpi_gpiochip_free_interrupts);

struct acpi_gpio_lookup {
struct acpi_gpio_info info;
Expand Down Expand Up @@ -310,3 +308,13 @@ struct gpio_desc *acpi_get_gpiod_by_index(struct device *dev, int index,
return lookup.desc ? lookup.desc : ERR_PTR(-ENOENT);
}
EXPORT_SYMBOL_GPL(acpi_get_gpiod_by_index);

void acpi_gpiochip_add(struct gpio_chip *chip)
{
acpi_gpiochip_request_interrupts(chip);
}

void acpi_gpiochip_remove(struct gpio_chip *chip)
{
acpi_gpiochip_free_interrupts(chip);
}
4 changes: 4 additions & 0 deletions drivers/gpio/gpiolib.c
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,8 @@
#include <linux/acpi.h>
#include <linux/gpio/driver.h>

#include "gpiolib.h"

#define CREATE_TRACE_POINTS
#include <trace/events/gpio.h>

Expand Down Expand Up @@ -1226,6 +1228,7 @@ int gpiochip_add(struct gpio_chip *chip)
#endif

of_gpiochip_add(chip);
acpi_gpiochip_add(chip);

if (status)
goto fail;
Expand Down Expand Up @@ -1267,6 +1270,7 @@ int gpiochip_remove(struct gpio_chip *chip)

gpiochip_remove_pin_ranges(chip);
of_gpiochip_remove(chip);
acpi_gpiochip_remove(chip);

for (id = 0; id < chip->ngpio; id++) {
if (test_bit(FLAG_REQUESTED, &chip->desc[id].flags)) {
Expand Down
23 changes: 23 additions & 0 deletions drivers/gpio/gpiolib.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
/*
* Internal GPIO functions.
*
* Copyright (C) 2013, Intel Corporation
* Author: Mika Westerberg <mika.westerberg@linux.intel.com>
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License version 2 as
* published by the Free Software Foundation.
*/

#ifndef GPIOLIB_H
#define GPIOLIB_H

#ifdef CONFIG_ACPI
void acpi_gpiochip_add(struct gpio_chip *chip);
void acpi_gpiochip_remove(struct gpio_chip *chip);
#else
static inline void acpi_gpiochip_add(struct gpio_chip *chip) { }
static inline void acpi_gpiochip_remove(struct gpio_chip *chip) { }
#endif

#endif /* GPIOLIB_H */
4 changes: 0 additions & 4 deletions drivers/pinctrl/pinctrl-baytrail.c
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,6 @@
#include <linux/gpio.h>
#include <linux/irqdomain.h>
#include <linux/acpi.h>
#include <linux/acpi_gpio.h>
#include <linux/platform_device.h>
#include <linux/seq_file.h>
#include <linux/io.h>
Expand Down Expand Up @@ -485,9 +484,6 @@ static int byt_gpio_probe(struct platform_device *pdev)

irq_set_handler_data(hwirq, vg);
irq_set_chained_handler(hwirq, byt_gpio_irq_handler);

/* Register interrupt handlers for gpio signaled acpi events */
acpi_gpiochip_request_interrupts(gc);
}

pm_runtime_enable(dev);
Expand Down
6 changes: 0 additions & 6 deletions include/linux/acpi_gpio.h
Original file line number Diff line number Diff line change
Expand Up @@ -21,9 +21,6 @@ struct acpi_gpio_info {

struct gpio_desc *acpi_get_gpiod_by_index(struct device *dev, int index,
struct acpi_gpio_info *info);
void acpi_gpiochip_request_interrupts(struct gpio_chip *chip);
void acpi_gpiochip_free_interrupts(struct gpio_chip *chip);

#else /* CONFIG_GPIO_ACPI */

static inline struct gpio_desc *
Expand All @@ -33,9 +30,6 @@ acpi_get_gpiod_by_index(struct device *dev, int index,
return ERR_PTR(-ENOSYS);
}

static inline void acpi_gpiochip_request_interrupts(struct gpio_chip *chip) { }
static inline void acpi_gpiochip_free_interrupts(struct gpio_chip *chip) { }

#endif /* CONFIG_GPIO_ACPI */

static inline int acpi_get_gpio_by_index(struct device *dev, int index,
Expand Down

0 comments on commit 664e3e5

Please sign in to comment.