From: Hans de Goede <hdegoede@redhat.com>
To: Andy Shevchenko <andriy.shevchenko@linux.intel.com>,
"Rafael J . Wysocki" <rjw@rjwysocki.net>,
Linus Walleij <linus.walleij@linaro.org>,
Alexandre Courbot <gnurou@gmail.com>
Cc: linux-acpi@vger.kernel.org, linux-gpio@vger.kernel.org,
joeyli <jlee@suse.com>, Takashi Iwai <tiwai@suse.de>
Subject: Re: [PATCH v4] gpio: Add driver for ACPI INT0002 Virtual GPIO device
Date: Wed, 24 May 2017 12:40:30 +0200 [thread overview]
Message-ID: <d271bc6b-995e-e850-c090-0975d4796907@redhat.com> (raw)
In-Reply-To: <1495621671.6967.88.camel@linux.intel.com>
Hi,
On 24-05-17 12:27, Andy Shevchenko wrote:
> On Wed, 2017-05-24 at 09:58 +0200, Hans de Goede wrote:
>> Some peripherals on Bay Trail and Cherry Trail platforms signal PME to
>> the
>> PMC to wakeup the system. When this happens software needs to clear
>> the
>> PME_B0_STS bit in the GPE0a_STS register to avoid an IRQ storm on IRQ
>> 9.
>>
>> This is modeled in ACPI through the INT0002 ACPI Virtual GPIO device.
>>
>> This commit adds a driver which registers the Virtual GPIOs expected
>> by the DSDT on these devices, letting gpiolib-acpi claim the
>> virtual GPIO and install a GPIO-interrupt handler which call the _L02
>> handler as it would for a real GPIO controller.
>
> Some issues below, after addressing them
> Reviewed-by: Andy Shevchenko <andriy.shevchenko@linux.intel.com>
>
>> +config GPIO_INT0002
>> + tristate "Intel ACPI INT0002 Virtual GPIO"
>> + depends on ACPI
>
> && X86 (see below why)
This is part of:
menu "Port-mapped I/O GPIO drivers"
depends on X86 # Unconditional I/O space access
So that is already required, which is why I dropped it
(previous versions did have it).
>
>> +#include <asm/cpu_device_id.h>
>> +#include <asm/intel-family.h>
>
> Please, move this after <linux/*> headers with empty line in between.
I'm using alphabetic sort for #includes, I don't see
how these are special its not like they are "local" headers,
e.g. drivers/gpio/gpio-aspeed.c does the same. What if this
driver were to also need acpi/ headers should those go
in their block too, etc. ?
>
> Because you are using specific x86 headers you must depend on X86.
>
>> +#include <linux/acpi.h>
>> +#include <linux/gpio.h>
>> +#include <linux/interrupt.h>
>> +#include <linux/io.h>
>> +#include <linux/kernel.h>
>> +#include <linux/module.h>
>> +#include <linux/platform_device.h>
>> +#include <linux/slab.h>
>> +#include <linux/suspend.h>
>
>> +
>> +/* For some reason the virtual GPIO pin tied to the GPE is numbered
>> pin 2 */
>> +#define GPE0A_PME_B0_VIRT_GPIO_PIN 2
>> +
>
>> +#define GPE0A_PME_B0_STS_BIT 0x2000
>> +#define GPE0A_PME_B0_EN_BIT 0x2000
>
> BIT() ?
Ack.
>
>> +#define GPE0A_STS_PORT 0x420
>> +#define GPE0A_EN_PORT 0x428
>> +
>
>> +static int int0002_probe(struct platform_device *pdev)
>> +{
>> + struct device *dev = &pdev->dev;
>> + const struct x86_cpu_id *cpu_id;
>> + struct gpio_chip *chip;
>> + int i, irq, ret;
>> +
>
>> + /* Menlow has a different INT0002 device? <sigh> */
>
> Perhaps we can remove that all code. I will look at it when I have spare
> time.
Even if we remove the code for the INT0002 Menlow device we
still don't want to bind to it, or are you talking about
dropping Menlow support in such a way that newer kernels
will not boot on Menlow at all anymore ?
> For now we may go with your code as is.
>
>> + cpu_id = x86_match_cpu(int0002_cpu_ids);
>> + if (!cpu_id)
>> + return -ENODEV;
>> +
>> + irq = platform_get_irq(pdev, 0);
>> + if (irq < 0) {
>> + dev_err(dev, "Error getting IRQ: %d\n", irq);
>> + return irq;
>> + }
>> +
>> + chip = devm_kzalloc(dev, sizeof(*chip), GFP_KERNEL);
>> + if (!chip)
>> + return -ENOMEM;
>> +
>> + chip->label = DRV_NAME;
>> + chip->parent = dev;
>> + chip->owner = THIS_MODULE;
>> + chip->get = int0002_gpio_get;
>> + chip->set = int0002_gpio_set;
>> + chip->direction_input = int0002_gpio_get;
>> + chip->direction_output = int0002_gpio_direction_output;
>> + chip->base = -1;
>> + chip->ngpio = GPE0A_PME_B0_VIRT_GPIO_PIN + 1;
>> + chip->irq_need_valid_mask = true;
>> +
>> + ret = devm_gpiochip_add_data(&pdev->dev, chip, NULL);
>> + if (ret) {
>> + dev_err(dev, "Error adding gpio chip: %d\n", ret);
>> + return ret;
>> + }
>> +
>> + for (i = 0; i < GPE0A_PME_B0_VIRT_GPIO_PIN; i++)
>> + clear_bit(i, chip->irq_valid_mask);
>> +
>> + /*
>> + * We manually request the irq here instead of passing a
>> flow-handler
>> + * to gpiochip_set_chained_irqchip, because the irq is
>> shared.
>> + */
>
> Linus, I'm just wondering if we can provide generic solution for such
> cases (AFAIU this is copied from some of Intel pin control driver, so,
> we have two or more users already).
>
> For now let's go with current proposal.
>
>> + ret = devm_request_irq(dev, irq, int0002_irq,
>> + IRQF_SHARED | IRQF_NO_THREAD,
>> "INT0002", chip);
>> + if (ret) {
>> + dev_err(dev, "Error requesting IRQ %d: %d\n", irq,
>> ret);
>> + return ret;
>> + }
>> +
>>
>
>> +
>> +static const struct acpi_device_id int0002_acpi_ids[] = {
>> + { "INT0002", 0 },
>> + { },
>> +};
>> +MODULE_DEVICE_TABLE(acpi, int0002_acpi_ids);
>> +
>> +static struct platform_driver int0002_driver = {
>> + .driver = {
>> + .name = DRV_NAME,
>> + .acpi_match_table =
>
>> ACPI_PTR(int0002_acpi_ids),
>
> No #ifdef, so ACPI_PTR can be dropped.
Ack.
>
>> + },
>> + .probe = int0002_probe,
>> +};
>
Regards,
Hans
next prev parent reply other threads:[~2017-05-24 10:40 UTC|newest]
Thread overview: 5+ messages / expand[flat|nested] mbox.gz Atom feed top
2017-05-24 7:58 [PATCH v4 0/1] gpio: Add driver for ACPI INT0002 Virtual GPIO device Hans de Goede
2017-05-24 7:58 ` [PATCH v4] " Hans de Goede
2017-05-24 10:27 ` Andy Shevchenko
2017-05-24 10:40 ` Hans de Goede [this message]
2017-05-24 11:10 ` Andy Shevchenko
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=d271bc6b-995e-e850-c090-0975d4796907@redhat.com \
--to=hdegoede@redhat.com \
--cc=andriy.shevchenko@linux.intel.com \
--cc=gnurou@gmail.com \
--cc=jlee@suse.com \
--cc=linus.walleij@linaro.org \
--cc=linux-acpi@vger.kernel.org \
--cc=linux-gpio@vger.kernel.org \
--cc=rjw@rjwysocki.net \
--cc=tiwai@suse.de \
/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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).