From: Hans de Goede <hdegoede@redhat.com>
To: "Rafael J . Wysocki" <rafael@kernel.org>,
Mark Gross <markgross@kernel.org>,
Andy Shevchenko <andy@kernel.org>, Wolfram Sang <wsa@kernel.org>,
Mika Westerberg <mika.westerberg@linux.intel.com>,
Rob Herring <robh@kernel.org>,
Greg Kroah-Hartman <gregkh@linuxfoundation.org>,
Jiri Slaby <jirislaby@kernel.org>
Cc: Hans de Goede <hdegoede@redhat.com>, Len Brown <lenb@kernel.org>,
linux-acpi@vger.kernel.org, platform-driver-x86@vger.kernel.org,
linux-i2c@vger.kernel.org, Stephan Gerhold <stephan@gerhold.net>,
linux-serial@vger.kernel.org
Subject: [PATCH 05/12] platform/x86: x86-android-tablets: Add support for PMIC interrupts
Date: Thu, 30 Dec 2021 00:14:24 +0100 [thread overview]
Message-ID: <20211229231431.437982-6-hdegoede@redhat.com> (raw)
In-Reply-To: <20211229231431.437982-1-hdegoede@redhat.com>
The Crystal Cove PMIC has a pin which can be used to connect the IRQ of
an external charger IC. On some boards this is used so we need a way to
look this up.
Note that the Intel PMICs have 2 levels of interrupts and thus
2 levels of IRQ domains all tied to a single fwnode.
Level 1 is the irqchip which demultiplexes the actual PMIC interrupt into
interrupts for the various MFD cells. Level 2 are the irqchips used in the
cell drivers which themselves export IRQs, such as the crystal_cove_gpio
driver, which de-multiplexes the level 2 interrupts for the GPIOs into
individual per GPIO IRQs.
The crystal_cove_charger driver registers an irqchip with a single IRQ for
the charger driver to consume. Note the MFD cell IRQ cannot be consumed
directly because the level 2 interrupts must be explicitly acked.
To allow finding the right IRQ domain when looking up the IRQ for
the charger, the crystal_cove_charger driver sets a DOMAIN_BUS_WIRED token
on its IRQ domain.
Add support for looking up the IRQ from the crystal_cove_charger driver.
Signed-off-by: Hans de Goede <hdegoede@redhat.com>
---
drivers/platform/x86/x86-android-tablets.c | 31 +++++++++++++++++++++-
1 file changed, 30 insertions(+), 1 deletion(-)
diff --git a/drivers/platform/x86/x86-android-tablets.c b/drivers/platform/x86/x86-android-tablets.c
index ea033d7f4439..44138882bc9f 100644
--- a/drivers/platform/x86/x86-android-tablets.c
+++ b/drivers/platform/x86/x86-android-tablets.c
@@ -17,6 +17,7 @@
#include <linux/gpio/machine.h>
#include <linux/i2c.h>
#include <linux/irq.h>
+#include <linux/irqdomain.h>
#include <linux/module.h>
#include <linux/mod_devicetable.h>
#include <linux/string.h>
@@ -31,11 +32,13 @@ enum x86_acpi_irq_type {
X86_ACPI_IRQ_TYPE_NONE,
X86_ACPI_IRQ_TYPE_APIC,
X86_ACPI_IRQ_TYPE_GPIOINT,
+ X86_ACPI_IRQ_TYPE_PMIC,
};
struct x86_acpi_irq_data {
- char *chip; /* GPIO chip label (GPIOINT) */
+ char *chip; /* GPIO chip label (GPIOINT) or PMIC ACPI path (PMIC) */
enum x86_acpi_irq_type type;
+ enum irq_domain_bus_token domain;
int index;
int trigger; /* ACPI_EDGE_SENSITIVE / ACPI_LEVEL_SENSITIVE */
int polarity; /* ACPI_ACTIVE_HIGH / ACPI_ACTIVE_LOW / ACPI_ACTIVE_BOTH */
@@ -48,9 +51,14 @@ static int x86_acpi_irq_helper_gpiochip_find(struct gpio_chip *gc, void *data)
static int x86_acpi_irq_helper_get(const struct x86_acpi_irq_data *data)
{
+ struct irq_fwspec fwspec = { };
+ struct irq_domain *domain;
+ struct acpi_device *adev;
struct gpio_desc *gpiod;
struct gpio_chip *chip;
unsigned int irq_type;
+ acpi_handle handle;
+ acpi_status status;
int irq, ret;
switch (data->type) {
@@ -86,6 +94,27 @@ static int x86_acpi_irq_helper_get(const struct x86_acpi_irq_data *data)
irq_set_irq_type(irq, irq_type);
return irq;
+ case X86_ACPI_IRQ_TYPE_PMIC:
+ status = acpi_get_handle(NULL, data->chip, &handle);
+ if (ACPI_FAILURE(status)) {
+ pr_err("error could not get %s handle\n", data->chip);
+ return -ENODEV;
+ }
+
+ acpi_bus_get_device(handle, &adev);
+ if (!adev) {
+ pr_err("error could not get %s adev\n", data->chip);
+ return -ENODEV;
+ }
+
+ fwspec.fwnode = acpi_fwnode_handle(adev);
+ domain = irq_find_matching_fwspec(&fwspec, data->domain);
+ if (!domain) {
+ pr_err("error could not find IRQ domain for %s\n", data->chip);
+ return -ENODEV;
+ }
+
+ return irq_create_mapping(domain, data->index);
default:
return 0;
}
--
2.33.1
next prev parent reply other threads:[~2021-12-29 23:15 UTC|newest]
Thread overview: 19+ messages / expand[flat|nested] mbox.gz Atom feed top
2021-12-29 23:14 [PATCH 00/12] ACPI / pdx86: Add support for x86 Android tablets with broken DSDTs Hans de Goede
2021-12-29 23:14 ` [PATCH 01/12] ACPI / x86: Add acpi_quirk_skip_[i2c_client|serdev]_enumeration() helpers Hans de Goede
2021-12-29 23:14 ` [PATCH 02/12] i2c: acpi: Do not instantiate I2C-clients on boards with known bogus DSDT entries Hans de Goede
2021-12-30 12:03 ` Mika Westerberg
2021-12-30 12:21 ` Wolfram Sang
2021-12-30 12:34 ` Hans de Goede
2021-12-29 23:14 ` [PATCH 03/12] serdev: Do not instantiate serdevs " Hans de Goede
2021-12-30 12:44 ` Greg Kroah-Hartman
2021-12-29 23:14 ` [PATCH 04/12] platform/x86: x86-android-tablets: Don't return -EPROBE_DEFER from a non probe() function Hans de Goede
2021-12-29 23:14 ` Hans de Goede [this message]
2021-12-29 23:14 ` [PATCH 06/12] platform/x86: x86-android-tablets: Add support for instantiating platform-devs Hans de Goede
2021-12-29 23:14 ` [PATCH 07/12] platform/x86: x86-android-tablets: Add support for instantiating serdevs Hans de Goede
2021-12-29 23:14 ` [PATCH 08/12] platform/x86: x86-android-tablets: Add support for registering GPIO lookup tables Hans de Goede
2021-12-29 23:14 ` [PATCH 09/12] platform/x86: x86-android-tablets: Add support for preloading modules Hans de Goede
2021-12-29 23:14 ` [PATCH 10/12] platform/x86: x86-android-tablets: Add Asus TF103C data Hans de Goede
2021-12-29 23:14 ` [PATCH 11/12] platform/x86: x86-android-tablets: Add Asus MeMO Pad 7 ME176C data Hans de Goede
2021-12-29 23:14 ` [PATCH 12/12] platform/x86: x86-android-tablets: Add TM800A550L data Hans de Goede
2021-12-30 11:57 ` [PATCH 00/12] ACPI / pdx86: Add support for x86 Android tablets with broken DSDTs Wolfram Sang
2022-01-03 11:42 ` Hans de Goede
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=20211229231431.437982-6-hdegoede@redhat.com \
--to=hdegoede@redhat.com \
--cc=andy@kernel.org \
--cc=gregkh@linuxfoundation.org \
--cc=jirislaby@kernel.org \
--cc=lenb@kernel.org \
--cc=linux-acpi@vger.kernel.org \
--cc=linux-i2c@vger.kernel.org \
--cc=linux-serial@vger.kernel.org \
--cc=markgross@kernel.org \
--cc=mika.westerberg@linux.intel.com \
--cc=platform-driver-x86@vger.kernel.org \
--cc=rafael@kernel.org \
--cc=robh@kernel.org \
--cc=stephan@gerhold.net \
--cc=wsa@kernel.org \
/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