提交 1cb39a6c 编写于 作者: L Linus Torvalds

Merge tag 'gpio-for-v3.11-3' of git://git.kernel.org/pub/scm/linux/kernel/git/linusw/linux-gpio

Pull GPIO fixes from Linus Walleij:
 "Yet another GPIO pull request, fixing the fix from the last one.  It
  turns out that fixing the boot path for device tree boots on OMAP
  breaks out antique systems (such as OMAP1) and we need to find a
  better way.  So we're reverting that "fix" for the moment and thinking
  about something better.

  Also fixing a build issue on the MSM driver"

* tag 'gpio-for-v3.11-3' of git://git.kernel.org/pub/scm/linux/kernel/git/linusw/linux-gpio:
  gpio_msm: Fix build error due to missing err.h
  Revert "gpio/omap: don't create an IRQ mapping for every GPIO on DT"
  Revert "gpio/omap: auto request GPIO as input if used as IRQ via DT"
  Revert "gpio/omap: fix build error when OF_GPIO is not defined."
...@@ -21,6 +21,7 @@ ...@@ -21,6 +21,7 @@
#include <linux/module.h> #include <linux/module.h>
#include <linux/device.h> #include <linux/device.h>
#include <linux/platform_device.h> #include <linux/platform_device.h>
#include <linux/err.h>
#include <mach/msm_gpiomux.h> #include <mach/msm_gpiomux.h>
......
...@@ -1037,18 +1037,6 @@ omap_mpuio_alloc_gc(struct gpio_bank *bank, unsigned int irq_start, ...@@ -1037,18 +1037,6 @@ omap_mpuio_alloc_gc(struct gpio_bank *bank, unsigned int irq_start,
IRQ_NOREQUEST | IRQ_NOPROBE, 0); IRQ_NOREQUEST | IRQ_NOPROBE, 0);
} }
#if defined(CONFIG_OF_GPIO)
static inline bool omap_gpio_chip_boot_dt(struct gpio_chip *chip)
{
return chip->of_node != NULL;
}
#else
static inline bool omap_gpio_chip_boot_dt(struct gpio_chip *chip)
{
return false;
}
#endif
static void omap_gpio_chip_init(struct gpio_bank *bank) static void omap_gpio_chip_init(struct gpio_bank *bank)
{ {
int j; int j;
...@@ -1080,68 +1068,24 @@ static void omap_gpio_chip_init(struct gpio_bank *bank) ...@@ -1080,68 +1068,24 @@ static void omap_gpio_chip_init(struct gpio_bank *bank)
gpiochip_add(&bank->chip); gpiochip_add(&bank->chip);
/* for (j = 0; j < bank->width; j++) {
* REVISIT these explicit calls to irq_create_mapping() int irq = irq_create_mapping(bank->domain, j);
* to do the GPIO to IRQ domain mapping for each GPIO in irq_set_lockdep_class(irq, &gpio_lock_class);
* the bank can be removed once all OMAP platforms have irq_set_chip_data(irq, bank);
* been migrated to Device Tree boot only. if (bank->is_mpuio) {
* Since in DT boot irq_create_mapping() is called from omap_mpuio_alloc_gc(bank, irq, bank->width);
* irq_create_of_mapping() only for the GPIO lines that } else {
* are used as interrupts. irq_set_chip_and_handler(irq, &gpio_irq_chip,
*/ handle_simple_irq);
if (!omap_gpio_chip_boot_dt(&bank->chip)) set_irq_flags(irq, IRQF_VALID);
for (j = 0; j < bank->width; j++) }
irq_create_mapping(bank->domain, j); }
irq_set_chained_handler(bank->irq, gpio_irq_handler); irq_set_chained_handler(bank->irq, gpio_irq_handler);
irq_set_handler_data(bank->irq, bank); irq_set_handler_data(bank->irq, bank);
} }
static const struct of_device_id omap_gpio_match[]; static const struct of_device_id omap_gpio_match[];
static int omap_gpio_irq_map(struct irq_domain *d, unsigned int virq,
irq_hw_number_t hwirq)
{
struct gpio_bank *bank = d->host_data;
int gpio;
int ret;
if (!bank)
return -EINVAL;
irq_set_lockdep_class(virq, &gpio_lock_class);
irq_set_chip_data(virq, bank);
if (bank->is_mpuio) {
omap_mpuio_alloc_gc(bank, virq, bank->width);
} else {
irq_set_chip_and_handler(virq, &gpio_irq_chip,
handle_simple_irq);
set_irq_flags(virq, IRQF_VALID);
}
/*
* REVISIT most GPIO IRQ chip drivers need to call
* gpio_request() before a GPIO line can be used as an
* IRQ. Ideally this should be handled by the IRQ core
* but until then this has to be done on a per driver
* basis. Remove this once this is managed by the core.
*/
if (omap_gpio_chip_boot_dt(&bank->chip)) {
gpio = irq_to_gpio(bank, hwirq);
ret = gpio_request_one(gpio, GPIOF_IN, NULL);
if (ret) {
dev_err(bank->dev, "Could not request GPIO%d\n", gpio);
return ret;
}
}
return 0;
}
static struct irq_domain_ops omap_gpio_irq_ops = {
.xlate = irq_domain_xlate_onetwocell,
.map = omap_gpio_irq_map,
};
static int omap_gpio_probe(struct platform_device *pdev) static int omap_gpio_probe(struct platform_device *pdev)
{ {
struct device *dev = &pdev->dev; struct device *dev = &pdev->dev;
...@@ -1207,10 +1151,10 @@ static int omap_gpio_probe(struct platform_device *pdev) ...@@ -1207,10 +1151,10 @@ static int omap_gpio_probe(struct platform_device *pdev)
} }
bank->domain = irq_domain_add_legacy(node, bank->width, irq_base, bank->domain = irq_domain_add_legacy(node, bank->width, irq_base,
0, &omap_gpio_irq_ops, bank); 0, &irq_domain_simple_ops, NULL);
#else #else
bank->domain = irq_domain_add_linear(node, bank->width, bank->domain = irq_domain_add_linear(node, bank->width,
&omap_gpio_irq_ops, bank); &irq_domain_simple_ops, NULL);
#endif #endif
if (!bank->domain) { if (!bank->domain) {
dev_err(dev, "Couldn't register an IRQ domain\n"); dev_err(dev, "Couldn't register an IRQ domain\n");
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册