[PATCH v2 08/13] dm: irq: Add support for requesting interrupts
Simon Glass
sjg at chromium.org
Tue Feb 4 01:18:47 CET 2020
Hi Bin,
On Mon, 3 Feb 2020 at 10:05, Bin Meng <bmeng.cn at gmail.com> wrote:
>
> Hi Simon,
>
> On Sun, Dec 22, 2019 at 2:16 AM Simon Glass <sjg at chromium.org> wrote:
> >
> > At present driver model supports the IRQ uclass but there is no way to
> > request a particular interrupt for a driver.
> >
> > Add a mechanism, similar to clock and reset, to read the interrupts
> > required by a device from the device tree and to request those interrupts.
> >
> > U-Boot itself does not have interrupt-driven handlers, so just provide a
> > means to read and clear an interrupt. This can be useful to handle
> > peripherals which must use an interrupt to determine when data is
> > available, for example.
> >
> > Bring over the basic binding file as well, from Linux v5.4. Note that the
> > older binding is not supported in U-Boot; the newer 'special form' must be
> > used.
> >
> > Add a simple test of the new functionality.
> >
> > Signed-off-by: Simon Glass <sjg at chromium.org>
> > ---
> >
> > Changes in v2: None
> >
> > arch/sandbox/dts/test.dts | 5 +-
> > .../interrupt-controller/interrupts.txt | 131 ++++++++++++++++++
> > drivers/misc/irq-uclass.c | 116 ++++++++++++++++
> > drivers/misc/irq_sandbox.c | 41 ++++++
> > include/irq.h | 115 +++++++++++++++
> > test/dm/irq.c | 31 +++++
> > 6 files changed, 438 insertions(+), 1 deletion(-)
> > create mode 100644 doc/device-tree-bindings/interrupt-controller/interrupts.txt
> >
[..]
> > diff --git a/drivers/misc/irq-uclass.c b/drivers/misc/irq-uclass.c
> > index 38498a66a4..7d65192858 100644
> > --- a/drivers/misc/irq-uclass.c
> > +++ b/drivers/misc/irq-uclass.c
> > @@ -4,8 +4,11 @@
> > * Written by Simon Glass <sjg at chromium.org>
> > */
> >
> > +#define LOG_CATEGORY UCLASS_IRQ
> > +
> > #include <common.h>
> > #include <dm.h>
> > +#include <dt-structs.h>
> > #include <irq.h>
> > #include <dm/device-internal.h>
> >
> > @@ -49,6 +52,119 @@ int irq_restore_polarities(struct udevice *dev)
> > return ops->restore_polarities(dev);
> > }
> >
> > +int irq_read_and_clear(struct irq *irq)
> > +{
> > + const struct irq_ops *ops = irq_get_ops(irq->dev);
> > +
> > + if (!ops->read_and_clear)
> > + return -ENOSYS;
> > +
> > + return ops->read_and_clear(irq);
> > +}
> > +
> > +#if CONFIG_IS_ENABLED(OF_PLATDATA)
> > +int irq_get_by_index_platdata(struct udevice *dev, int index,
> > + struct phandle_1_arg *cells, struct irq *irq)
> > +{
> > + int ret;
> > +
> > + if (index != 0)
> > + return -ENOSYS;
> > + ret = uclass_get_device(UCLASS_IRQ, 0, &irq->dev);
> > + if (ret)
> > + return ret;
> > + irq->id = cells[0].arg[0];
> > +
> > + return 0;
> > +}
> > +#else
> > +static int irq_of_xlate_default(struct irq *irq,
> > + struct ofnode_phandle_args *args)
> > +{
> > + log_debug("(irq=%p)\n", irq);
> > +
> > + if (args->args_count > 1) {
> > + log_debug("Invaild args_count: %d\n", args->args_count);
> > + return -EINVAL;
> > + }
> > +
> > + if (args->args_count)
> > + irq->id = args->args[0];
> > + else
> > + irq->id = 0;
> > +
> > + return 0;
> > +}
> > +
> > +static int irq_get_by_index_tail(int ret, ofnode node,
>
> It's odd to pass the return value of some other functions to this
> function and check it here. Can we please remove ret, and check its
> value at where we get that?
This pattern is similar to how it is done in DM core. It routes all
return paths through a single function where you can do error
checking, etc. So I think this is better than the alternative. The
only strange thing here is that this function is only used one. I did
this since I suspected there would be others coming. But I could
inline if it you like..
[..]
> > +static int sandbox_irq_of_xlate(struct irq *irq,
> > + struct ofnode_phandle_args *args)
> > +{
> > + irq->id = args->args[0];
> > +
> > + return 0;
> > +}
>
> This
...?
Regards,
Simon
More information about the U-Boot
mailing list