From: "Rafael J. Wysocki" <rafael@kernel.org>
To: Andy Shevchenko <andriy.shevchenko@linux.intel.com>
Cc: Mika Westerberg <mika.westerberg@linux.intel.com>,
Linus Walleij <linus.walleij@linaro.org>,
"open list:DOCUMENTATION" <linux-doc@vger.kernel.org>,
Linux Kernel Mailing List <linux-kernel@vger.kernel.org>,
"open list:GPIO SUBSYSTEM" <linux-gpio@vger.kernel.org>,
ACPI Devel Maling List <linux-acpi@vger.kernel.org>,
Marc Zyngier <maz@kernel.org>, Jonathan Corbet <corbet@lwn.net>,
Bartosz Golaszewski <bgolaszewski@baylibre.com>,
Thomas Gleixner <tglx@linutronix.de>,
"Rafael J. Wysocki" <rafael@kernel.org>
Subject: Re: [PATCH v3 1/5] irqdomain: Introduce irq_domain_create_simple() API
Date: Fri, 5 Mar 2021 14:34:40 +0100 [thread overview]
Message-ID: <CAJZ5v0io925Fjua0GDKkCLnQZBjg=5ffRFzCc==_+ygSd7t4Ew@mail.gmail.com> (raw)
In-Reply-To: <20210304201253.14652-2-andriy.shevchenko@linux.intel.com>
On Thu, Mar 4, 2021 at 9:13 PM Andy Shevchenko
<andriy.shevchenko@linux.intel.com> wrote:
>
> Linus Walleij pointed out that ird_domain_add_simple() gained
> additional functionality and can't be anymore replaced with
> a simple conditional. In preparation to upgrade GPIO library
> to use fwnode, introduce irq_domain_create_simple() API which is
> functional equivalent to the existing irq_domain_add_simple(),
> but takes a pointer to the struct fwnode_handle as a parameter.
>
> While at it, amend documentation to mention irq_domain_create_*()
> functions where it makes sense.
>
> Signed-off-by: Andy Shevchenko <andriy.shevchenko@linux.intel.com>
This requires an ACK from Marc or Thomas so I can apply it.
> ---
> Documentation/core-api/irq/irq-domain.rst | 22 ++++++++++++----------
> include/linux/irqdomain.h | 19 ++++++++++++++-----
> kernel/irq/irqdomain.c | 20 ++++++++++----------
> 3 files changed, 36 insertions(+), 25 deletions(-)
>
> diff --git a/Documentation/core-api/irq/irq-domain.rst b/Documentation/core-api/irq/irq-domain.rst
> index a77c24c27f7b..8214e215a8bf 100644
> --- a/Documentation/core-api/irq/irq-domain.rst
> +++ b/Documentation/core-api/irq/irq-domain.rst
> @@ -42,10 +42,10 @@ irq_domain usage
> ================
>
> An interrupt controller driver creates and registers an irq_domain by
> -calling one of the irq_domain_add_*() functions (each mapping method
> -has a different allocator function, more on that later). The function
> -will return a pointer to the irq_domain on success. The caller must
> -provide the allocator function with an irq_domain_ops structure.
> +calling one of the irq_domain_add_*() or irq_domain_create_*() functions
> +(each mapping method has a different allocator function, more on that later).
> +The function will return a pointer to the irq_domain on success. The caller
> +must provide the allocator function with an irq_domain_ops structure.
>
> In most cases, the irq_domain will begin empty without any mappings
> between hwirq and IRQ numbers. Mappings are added to the irq_domain
> @@ -147,6 +147,7 @@ Legacy
> irq_domain_add_simple()
> irq_domain_add_legacy()
> irq_domain_add_legacy_isa()
> + irq_domain_create_simple()
> irq_domain_create_legacy()
>
> The Legacy mapping is a special case for drivers that already have a
> @@ -169,13 +170,13 @@ supported. For example, ISA controllers would use the legacy map for
> mapping Linux IRQs 0-15 so that existing ISA drivers get the correct IRQ
> numbers.
>
> -Most users of legacy mappings should use irq_domain_add_simple() which
> -will use a legacy domain only if an IRQ range is supplied by the
> -system and will otherwise use a linear domain mapping. The semantics
> -of this call are such that if an IRQ range is specified then
> +Most users of legacy mappings should use irq_domain_add_simple() or
> +irq_domain_create_simple() which will use a legacy domain only if an IRQ range
> +is supplied by the system and will otherwise use a linear domain mapping.
> +The semantics of this call are such that if an IRQ range is specified then
> descriptors will be allocated on-the-fly for it, and if no range is
> -specified it will fall through to irq_domain_add_linear() which means
> -*no* irq descriptors will be allocated.
> +specified it will fall through to irq_domain_add_linear() or
> +irq_domain_create_linear() which means *no* irq descriptors will be allocated.
>
> A typical use case for simple domains is where an irqchip provider
> is supporting both dynamic and static IRQ assignments.
> @@ -186,6 +187,7 @@ that the driver using the simple domain call irq_create_mapping()
> before any irq_find_mapping() since the latter will actually work
> for the static IRQ assignment case.
>
> +irq_domain_add_simple() and irq_domain_create_simple() as well as
> irq_domain_add_legacy() and irq_domain_create_legacy() are functionally
> equivalent, except for the first argument is different - the former
> accepts an Open Firmware specific 'struct device_node', while the latter
> diff --git a/include/linux/irqdomain.h b/include/linux/irqdomain.h
> index 42d196805f58..6e78f5909723 100644
> --- a/include/linux/irqdomain.h
> +++ b/include/linux/irqdomain.h
> @@ -260,11 +260,11 @@ struct irq_domain *__irq_domain_add(struct fwnode_handle *fwnode, int size,
> irq_hw_number_t hwirq_max, int direct_max,
> const struct irq_domain_ops *ops,
> void *host_data);
> -struct irq_domain *irq_domain_add_simple(struct device_node *of_node,
> - unsigned int size,
> - unsigned int first_irq,
> - const struct irq_domain_ops *ops,
> - void *host_data);
> +struct irq_domain *irq_domain_create_simple(struct fwnode_handle *fwnode,
> + unsigned int size,
> + unsigned int first_irq,
> + const struct irq_domain_ops *ops,
> + void *host_data);
> struct irq_domain *irq_domain_add_legacy(struct device_node *of_node,
> unsigned int size,
> unsigned int first_irq,
> @@ -329,6 +329,15 @@ static inline struct irq_domain *irq_find_host(struct device_node *node)
> return d;
> }
>
> +static inline struct irq_domain *irq_domain_add_simple(struct device_node *of_node,
> + unsigned int size,
> + unsigned int first_irq,
> + const struct irq_domain_ops *ops,
> + void *host_data)
> +{
> + return irq_domain_create_simple(of_node_to_fwnode(of_node), size, first_irq, ops, host_data);
> +}
> +
> /**
> * irq_domain_add_linear() - Allocate and register a linear revmap irq_domain.
> * @of_node: pointer to interrupt controller's device tree node.
> diff --git a/kernel/irq/irqdomain.c b/kernel/irq/irqdomain.c
> index 288151393a06..a7f4028971e4 100644
> --- a/kernel/irq/irqdomain.c
> +++ b/kernel/irq/irqdomain.c
> @@ -295,8 +295,8 @@ void irq_domain_update_bus_token(struct irq_domain *domain,
> EXPORT_SYMBOL_GPL(irq_domain_update_bus_token);
>
> /**
> - * irq_domain_add_simple() - Register an irq_domain and optionally map a range of irqs
> - * @of_node: pointer to interrupt controller's device tree node.
> + * irq_domain_create_simple() - Register an irq_domain and optionally map a range of irqs
> + * @fwnode: firmware node for the interrupt controller
> * @size: total number of irqs in mapping
> * @first_irq: first number of irq block assigned to the domain,
> * pass zero to assign irqs on-the-fly. If first_irq is non-zero, then
> @@ -312,15 +312,15 @@ EXPORT_SYMBOL_GPL(irq_domain_update_bus_token);
> * irqs get mapped dynamically on the fly. However, if the controller requires
> * static virq assignments (non-DT boot) then it will set that up correctly.
> */
> -struct irq_domain *irq_domain_add_simple(struct device_node *of_node,
> - unsigned int size,
> - unsigned int first_irq,
> - const struct irq_domain_ops *ops,
> - void *host_data)
> +struct irq_domain *irq_domain_create_simple(struct fwnode_handle *fwnode,
> + unsigned int size,
> + unsigned int first_irq,
> + const struct irq_domain_ops *ops,
> + void *host_data)
> {
> struct irq_domain *domain;
>
> - domain = __irq_domain_add(of_node_to_fwnode(of_node), size, size, 0, ops, host_data);
> + domain = __irq_domain_add(fwnode, size, size, 0, ops, host_data);
> if (!domain)
> return NULL;
>
> @@ -328,7 +328,7 @@ struct irq_domain *irq_domain_add_simple(struct device_node *of_node,
> if (IS_ENABLED(CONFIG_SPARSE_IRQ)) {
> /* attempt to allocated irq_descs */
> int rc = irq_alloc_descs(first_irq, first_irq, size,
> - of_node_to_nid(of_node));
> + of_node_to_nid(to_of_node(fwnode)));
> if (rc < 0)
> pr_info("Cannot allocate irq_descs @ IRQ%d, assuming pre-allocated\n",
> first_irq);
> @@ -338,7 +338,7 @@ struct irq_domain *irq_domain_add_simple(struct device_node *of_node,
>
> return domain;
> }
> -EXPORT_SYMBOL_GPL(irq_domain_add_simple);
> +EXPORT_SYMBOL_GPL(irq_domain_create_simple);
>
> /**
> * irq_domain_add_legacy() - Allocate and register a legacy revmap irq_domain.
> --
> 2.30.1
>
next prev parent reply other threads:[~2021-03-05 13:35 UTC|newest]
Thread overview: 19+ messages / expand[flat|nested] mbox.gz Atom feed top
2021-03-04 20:12 [PATCH v3 0/5] gpiolib: switch to fwnode in the core Andy Shevchenko
2021-03-04 20:12 ` [PATCH v3 1/5] irqdomain: Introduce irq_domain_create_simple() API Andy Shevchenko
2021-03-05 13:34 ` Rafael J. Wysocki [this message]
2021-03-05 14:20 ` Marc Zyngier
2021-03-10 23:15 ` Linus Walleij
2021-03-11 10:56 ` Andy Shevchenko
2021-03-04 20:12 ` [PATCH v3 2/5] gpiolib: Unify the checks on fwnode type Andy Shevchenko
2021-03-04 20:12 ` [PATCH v3 3/5] gpiolib: Move of_node operations to gpiolib-of and correct fwnode use Andy Shevchenko
2021-03-04 20:12 ` [PATCH v3 4/5] gpiolib: Introduce acpi_gpio_dev_init() and call it from core Andy Shevchenko
2021-03-04 20:12 ` [PATCH v3 5/5] gpiolib: Reuse device's fwnode to create IRQ domain Andy Shevchenko
2021-03-08 18:22 ` [PATCH v3 0/5] gpiolib: switch to fwnode in the core Rafael J. Wysocki
2021-03-08 19:22 ` Bartosz Golaszewski
2021-03-08 19:26 ` Rafael J. Wysocki
2021-03-08 19:29 ` Bartosz Golaszewski
2021-03-08 19:36 ` Andy Shevchenko
2021-03-08 19:52 ` Andy Shevchenko
2021-03-09 8:19 ` Bartosz Golaszewski
2021-03-09 9:41 ` Andy Shevchenko
2021-03-08 19:35 ` 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='CAJZ5v0io925Fjua0GDKkCLnQZBjg=5ffRFzCc==_+ygSd7t4Ew@mail.gmail.com' \
--to=rafael@kernel.org \
--cc=andriy.shevchenko@linux.intel.com \
--cc=bgolaszewski@baylibre.com \
--cc=corbet@lwn.net \
--cc=linus.walleij@linaro.org \
--cc=linux-acpi@vger.kernel.org \
--cc=linux-doc@vger.kernel.org \
--cc=linux-gpio@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=maz@kernel.org \
--cc=mika.westerberg@linux.intel.com \
--cc=tglx@linutronix.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).