[PATCH v2 04/35] irq: Add a method to convert an interrupt to ACPI
Simon Glass
sjg at chromium.org
Thu May 14 18:02:04 CEST 2020
Hi Wolfgang,
On Wed, 13 May 2020 at 07:01, Wolfgang Wallner
<wolfgang.wallner at br-automation.com> wrote:
>
> Hi Simon,
>
> -----"Simon Glass" <sjg at chromium.org> schrieb: -----
> >Betreff: [PATCH v2 04/35] irq: Add a method to convert an interrupt
> >to ACPI
> >
> >When generating ACPI tables we need to convert IRQs in U-Boot to the
> >ACPI
> >structures required by ACPI. This is a SoC-specific conversion and
> >cannot
> >be handled by generic code, so add a new IRQ method to do the
> >conversion.
> >
> >Signed-off-by: Simon Glass <sjg at chromium.org>
> >---
> >
> >Changes in v2: None
> >Changes in v1:
> >- Fix 'the an' typo
> >- Move header definitions into this patch
> >
> > drivers/misc/irq-uclass.c | 18 ++++++++++--
> > drivers/misc/irq_sandbox.c | 16 +++++++++++
> > include/acpi/acpi_device.h | 59
> >++++++++++++++++++++++++++++++++++++++
> > include/irq.h | 43 +++++++++++++++++++++++++++
> > test/dm/irq.c | 22 ++++++++++++++
> > 5 files changed, 156 insertions(+), 2 deletions(-)
> >
> >diff --git a/drivers/misc/irq-uclass.c b/drivers/misc/irq-uclass.c
> >index 16dc0be75c..98bc79eaba 100644
> >--- a/drivers/misc/irq-uclass.c
> >+++ b/drivers/misc/irq-uclass.c
> >@@ -154,8 +154,6 @@ int irq_request(struct udevice *dev, struct irq
> >*irq)
> > const struct irq_ops *ops;
> >
> > log_debug("(dev=%p, irq=%p)\n", dev, irq);
> >- if (!irq)
> >- return 0;
>
> Why are these lines dropped?
Because we are not allowed to pass a NULL irq to this function. That
check should not have been there.
>
> As far as I understand the code they can be dropped, I just fail
> to see how that is related to the ACPI changes.
>
> > ops = irq_get_ops(dev);
> >
> > irq->dev = dev;
> >@@ -177,6 +175,22 @@ int irq_first_device_type(enum irq_dev_t type,
> >struct udevice **devp)
> > return 0;
> > }
> >
> >+#if CONFIG_IS_ENABLED(ACPIGEN)
> >+int irq_get_acpi(const struct irq *irq, struct acpi_irq *acpi_irq)
> >+{
> >+ struct irq_ops *ops;
> >+
> >+ if (!irq_is_valid(irq))
> >+ return -EINVAL;
> >+
> >+ ops = irq_get_ops(irq->dev);
> >+ if (!ops->get_acpi)
> >+ return -ENOSYS;
> >+
> >+ return ops->get_acpi(irq, acpi_irq);
> >+}
> >+#endif
> >+
> > UCLASS_DRIVER(irq) = {
> > .id = UCLASS_IRQ,
> > .name = "irq",
> >diff --git a/drivers/misc/irq_sandbox.c b/drivers/misc/irq_sandbox.c
> >index 54bc47c8d8..a2511b32fc 100644
> >--- a/drivers/misc/irq_sandbox.c
> >+++ b/drivers/misc/irq_sandbox.c
> >@@ -8,6 +8,7 @@
> > #include <common.h>
> > #include <dm.h>
> > #include <irq.h>
> >+#include <acpi/acpi_device.h>
> > #include <asm/test.h>
> >
> > /**
> >@@ -73,6 +74,18 @@ static int sandbox_irq_of_xlate(struct irq *irq,
> > return 0;
> > }
> >
> >+static __maybe_unused int sandbox_get_acpi(const struct irq *irq,
> >+ struct acpi_irq *acpi_irq)
> >+{
> >+ acpi_irq->pin = irq->id;
> >+ acpi_irq->mode = ACPI_IRQ_LEVEL_TRIGGERED;
> >+ acpi_irq->polarity = ACPI_IRQ_ACTIVE_HIGH;
> >+ acpi_irq->shared = ACPI_IRQ_SHARED;
> >+ acpi_irq->wake = ACPI_IRQ_WAKE;
> >+
> >+ return 0;
> >+}
> >+
> > static const struct irq_ops sandbox_irq_ops = {
> > .route_pmc_gpio_gpe = sandbox_route_pmc_gpio_gpe,
> > .set_polarity = sandbox_set_polarity,
> >@@ -80,6 +93,9 @@ static const struct irq_ops sandbox_irq_ops = {
> > .restore_polarities = sandbox_restore_polarities,
> > .read_and_clear = sandbox_irq_read_and_clear,
> > .of_xlate = sandbox_irq_of_xlate,
> >+#if CONFIG_IS_ENABLED(ACPIGEN)
> >+ .get_acpi = sandbox_get_acpi,
> >+#endif
> > };
> >
> > static const struct udevice_id sandbox_irq_ids[] = {
> >diff --git a/include/acpi/acpi_device.h b/include/acpi/acpi_device.h
> >index 09c227489a..24895de0da 100644
> >--- a/include/acpi/acpi_device.h
> >+++ b/include/acpi/acpi_device.h
> >@@ -13,6 +13,12 @@
> >
> > struct udevice;
> >
> >+/* ACPI descriptor values for common descriptors: SERIAL_BUS means
> >I2C */
>
> I don't understand the comment above. Why does SERIAL_BUS mean I2C?
> It could also mean SPI, or am I missing something?
Just that descriptor 14 is used for serial bus (UART, SPI, I2C) and in
this code it is used for I2C. I didn't want to call it I2C since that
would be inaccurate, hence the comment.
>
> >+#define ACPI_DESCRIPTOR_LARGE BIT(7)
> >+#define ACPI_DESCRIPTOR_INTERRUPT (ACPI_DESCRIPTOR_LARGE | 9)
> >+#define ACPI_DESCRIPTOR_GPIO (ACPI_DESCRIPTOR_LARGE | 12)
> >+#define ACPI_DESCRIPTOR_SERIAL_BUS (ACPI_DESCRIPTOR_LARGE | 14)
> >+
Regards,
Simon
More information about the U-Boot
mailing list