From: David Cohen <david.a.cohen@linux.intel.com>
To: Linus Walleij <linus.walleij@linaro.org>
Cc: linux-gpio@vger.kernel.org,
Alexandre Courbot <acourbot@nvidia.com>,
"xinhui.pan" <xinhuiX.pan@intel.com>
Subject: Re: [PATCH] gpio: intel-mid: switch to using gpiolib irqchip helpers
Date: Mon, 2 Jun 2014 15:38:02 -0700 [thread overview]
Message-ID: <20140602223802.GA24043@psi-dev26.jf.intel.com> (raw)
In-Reply-To: <1401375653-12758-1-git-send-email-linus.walleij@linaro.org>
Hi Linus,
On Thu, May 29, 2014 at 05:00:53PM +0200, Linus Walleij wrote:
> This switches the Intel MID GPIO driver over to using the gpiolib
> irqchip helpers in the gpiolib core.
>
> Cc: David Cohen <david.a.cohen@linux.intel.com>
> Cc: xinhui.pan <xinhuiX.pan@intel.com>
> Signed-off-by: Linus Walleij <linus.walleij@linaro.org>
Acked-by: David Cohen <david.a.cohen@linux.intel.com>
> ---
> David can you test this? It's probably easiest for you to just
> pull in this branch from my GPIO tree and test, because of
> dependencies:
>
> git://git.kernel.org/pub/scm/linux/kernel/git/linusw/linux-gpio.git#intel-mid-irqchip-helpers
>
> THANKS!
> ---
> drivers/gpio/gpio-intel-mid.c | 86 +++++++++++++------------------------------
> 1 file changed, 25 insertions(+), 61 deletions(-)
>
> diff --git a/drivers/gpio/gpio-intel-mid.c b/drivers/gpio/gpio-intel-mid.c
> index 118a6bf455d9..aa28c65eb6b4 100644
> --- a/drivers/gpio/gpio-intel-mid.c
> +++ b/drivers/gpio/gpio-intel-mid.c
> @@ -28,12 +28,10 @@
> #include <linux/stddef.h>
> #include <linux/interrupt.h>
> #include <linux/init.h>
> -#include <linux/irq.h>
> #include <linux/io.h>
> -#include <linux/gpio.h>
> +#include <linux/gpio/driver.h>
> #include <linux/slab.h>
> #include <linux/pm_runtime.h>
> -#include <linux/irqdomain.h>
>
> #define INTEL_MID_IRQ_TYPE_EDGE (1 << 0)
> #define INTEL_MID_IRQ_TYPE_LEVEL (1 << 1)
> @@ -78,10 +76,12 @@ struct intel_mid_gpio {
> void __iomem *reg_base;
> spinlock_t lock;
> struct pci_dev *pdev;
> - struct irq_domain *domain;
> };
>
> -#define to_intel_gpio_priv(chip) container_of(chip, struct intel_mid_gpio, chip)
> +static inline struct intel_mid_gpio *to_intel_gpio_priv(struct gpio_chip *gc)
> +{
> + return container_of(gc, struct intel_mid_gpio, chip);
> +}
>
> static void __iomem *gpio_reg(struct gpio_chip *chip, unsigned offset,
> enum GPIO_REG reg_type)
> @@ -182,15 +182,10 @@ static int intel_gpio_direction_output(struct gpio_chip *chip,
> return 0;
> }
>
> -static int intel_gpio_to_irq(struct gpio_chip *chip, unsigned offset)
> -{
> - struct intel_mid_gpio *priv = to_intel_gpio_priv(chip);
> - return irq_create_mapping(priv->domain, offset);
> -}
> -
> static int intel_mid_irq_type(struct irq_data *d, unsigned type)
> {
> - struct intel_mid_gpio *priv = irq_data_get_irq_chip_data(d);
> + struct gpio_chip *gc = irq_data_get_irq_chip_data(d);
> + struct intel_mid_gpio *priv = to_intel_gpio_priv(gc);
> u32 gpio = irqd_to_hwirq(d);
> unsigned long flags;
> u32 value;
> @@ -231,33 +226,11 @@ static void intel_mid_irq_mask(struct irq_data *d)
> {
> }
>
> -static int intel_mid_irq_reqres(struct irq_data *d)
> -{
> - struct intel_mid_gpio *priv = irq_data_get_irq_chip_data(d);
> -
> - if (gpio_lock_as_irq(&priv->chip, irqd_to_hwirq(d))) {
> - dev_err(priv->chip.dev,
> - "unable to lock HW IRQ %lu for IRQ\n",
> - irqd_to_hwirq(d));
> - return -EINVAL;
> - }
> - return 0;
> -}
> -
> -static void intel_mid_irq_relres(struct irq_data *d)
> -{
> - struct intel_mid_gpio *priv = irq_data_get_irq_chip_data(d);
> -
> - gpio_unlock_as_irq(&priv->chip, irqd_to_hwirq(d));
> -}
> -
> static struct irq_chip intel_mid_irqchip = {
> .name = "INTEL_MID-GPIO",
> .irq_mask = intel_mid_irq_mask,
> .irq_unmask = intel_mid_irq_unmask,
> .irq_set_type = intel_mid_irq_type,
> - .irq_request_resources = intel_mid_irq_reqres,
> - .irq_release_resources = intel_mid_irq_relres,
> };
>
> static const struct intel_mid_gpio_ddata gpio_lincroft = {
> @@ -330,8 +303,9 @@ MODULE_DEVICE_TABLE(pci, intel_gpio_ids);
>
> static void intel_mid_irq_handler(unsigned irq, struct irq_desc *desc)
> {
> + struct gpio_chip *gc = irq_desc_get_handler_data(desc);
> + struct intel_mid_gpio *priv = to_intel_gpio_priv(gc);
> struct irq_data *data = irq_desc_get_irq_data(desc);
> - struct intel_mid_gpio *priv = irq_data_get_irq_handler_data(data);
> struct irq_chip *chip = irq_data_get_irq_chip(data);
> u32 base, gpio, mask;
> unsigned long pending;
> @@ -345,7 +319,7 @@ static void intel_mid_irq_handler(unsigned irq, struct irq_desc *desc)
> mask = BIT(gpio);
> /* Clear before handling so we can't lose an edge */
> writel(mask, gedr);
> - generic_handle_irq(irq_find_mapping(priv->domain,
> + generic_handle_irq(irq_find_mapping(gc->irqdomain,
> base + gpio));
> }
> }
> @@ -371,23 +345,6 @@ static void intel_mid_irq_init_hw(struct intel_mid_gpio *priv)
> }
> }
>
> -static int intel_gpio_irq_map(struct irq_domain *d, unsigned int irq,
> - irq_hw_number_t hwirq)
> -{
> - struct intel_mid_gpio *priv = d->host_data;
> -
> - irq_set_chip_and_handler(irq, &intel_mid_irqchip, handle_simple_irq);
> - irq_set_chip_data(irq, priv);
> - irq_set_irq_type(irq, IRQ_TYPE_NONE);
> -
> - return 0;
> -}
> -
> -static const struct irq_domain_ops intel_gpio_irq_ops = {
> - .map = intel_gpio_irq_map,
> - .xlate = irq_domain_xlate_twocell,
> -};
> -
> static int intel_gpio_runtime_idle(struct device *dev)
> {
> int err = pm_schedule_suspend(dev, 500);
> @@ -441,7 +398,6 @@ static int intel_gpio_probe(struct pci_dev *pdev,
> priv->chip.direction_output = intel_gpio_direction_output;
> priv->chip.get = intel_gpio_get;
> priv->chip.set = intel_gpio_set;
> - priv->chip.to_irq = intel_gpio_to_irq;
> priv->chip.base = gpio_base;
> priv->chip.ngpio = ddata->ngpio;
> priv->chip.can_sleep = false;
> @@ -449,11 +405,6 @@ static int intel_gpio_probe(struct pci_dev *pdev,
>
> spin_lock_init(&priv->lock);
>
> - priv->domain = irq_domain_add_simple(pdev->dev.of_node, ddata->ngpio,
> - irq_base, &intel_gpio_irq_ops, priv);
> - if (!priv->domain)
> - return -ENOMEM;
> -
> pci_set_drvdata(pdev, priv);
> retval = gpiochip_add(&priv->chip);
> if (retval) {
> @@ -461,10 +412,23 @@ static int intel_gpio_probe(struct pci_dev *pdev,
> return retval;
> }
>
> + retval = gpiochip_irqchip_add(&priv->chip,
> + &intel_mid_irqchip,
> + irq_base,
> + handle_simple_irq,
> + IRQ_TYPE_NONE);
> + if (retval) {
> + dev_err(&pdev->dev,
> + "could not connect irqchip to gpiochip\n");
> + return retval;
> + }
> +
> intel_mid_irq_init_hw(priv);
>
> - irq_set_handler_data(pdev->irq, priv);
> - irq_set_chained_handler(pdev->irq, intel_mid_irq_handler);
> + gpiochip_set_chained_irqchip(&priv->chip,
> + &intel_mid_irqchip,
> + pdev->irq,
> + intel_mid_irq_handler);
>
> pm_runtime_put_noidle(&pdev->dev);
> pm_runtime_allow(&pdev->dev);
> --
> 1.9.3
>
prev parent reply other threads:[~2014-06-02 22:38 UTC|newest]
Thread overview: 3+ messages / expand[flat|nested] mbox.gz Atom feed top
2014-05-29 15:00 [PATCH] gpio: intel-mid: switch to using gpiolib irqchip helpers Linus Walleij
2014-05-30 16:45 ` David Cohen
2014-06-02 22:38 ` David Cohen [this message]
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20140602223802.GA24043@psi-dev26.jf.intel.com \
--to=david.a.cohen@linux.intel.com \
--cc=acourbot@nvidia.com \
--cc=linus.walleij@linaro.org \
--cc=linux-gpio@vger.kernel.org \
--cc=xinhuiX.pan@intel.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.