From: Mika Westerberg <mika.westerberg@linux.intel.com>
To: Andy Shevchenko <andriy.shevchenko@linux.intel.com>
Cc: linux-gpio@vger.kernel.org, linux-kernel@vger.kernel.org,
Andy Shevchenko <andy@kernel.org>,
Linus Walleij <linus.walleij@linaro.org>,
Heiner Kallweit <hkallweit1@gmail.com>
Subject: Re: [PATCH v2 6/6] pinctrl: intel: Introduce for_each_intel_gpio_group() helper et al.
Date: Fri, 30 Aug 2024 07:50:39 +0300 [thread overview]
Message-ID: <20240830045039.GU1532424@black.fi.intel.com> (raw)
In-Reply-To: <20240829140406.357612-7-andriy.shevchenko@linux.intel.com>
On Thu, Aug 29, 2024 at 04:59:20PM +0300, Andy Shevchenko wrote:
> Introduce a helper macro for_each_intel_gpio_group() et al.
> With those in place, update the users.
>
> It reduces the C code base as well as shrinks the binary:
>
> add/remove: 0/0 grow/shrink: 4/21 up/down: 39/-621 (-582)
> Total: Before=15942, After=15360, chg -3.65%
>
> Signed-off-by: Andy Shevchenko <andriy.shevchenko@linux.intel.com>
> ---
> drivers/pinctrl/intel/pinctrl-intel.c | 125 ++++++++++----------------
> 1 file changed, 46 insertions(+), 79 deletions(-)
>
> diff --git a/drivers/pinctrl/intel/pinctrl-intel.c b/drivers/pinctrl/intel/pinctrl-intel.c
> index e8dbaf3964dc..75201d5c52a1 100644
> --- a/drivers/pinctrl/intel/pinctrl-intel.c
> +++ b/drivers/pinctrl/intel/pinctrl-intel.c
> @@ -114,13 +114,16 @@ struct intel_community_context {
> #define pin_to_padno(c, p) ((p) - (c)->pin_base)
> #define padgroup_offset(g, p) ((p) - (g)->base)
>
> +#define for_each_intel_pin_community(pctrl, community) \
> + for (unsigned int __ci = 0; \
> + __ci < pctrl->ncommunities && (community = &pctrl->communities[__ci]); \
> + __ci++) \
> +
These look more readable, thanks. Just one comment. Can you move all
them here at the top of the file so all the variants are close to each
other? You can do that while applying.
> const struct intel_community *intel_get_community(struct intel_pinctrl *pctrl, unsigned int pin)
> {
> const struct intel_community *community;
> - int i;
>
> - for (i = 0; i < pctrl->ncommunities; i++) {
> - community = &pctrl->communities[i];
> + for_each_intel_pin_community(pctrl, community) {
> if (pin >= community->pin_base &&
> pin < community->pin_base + community->npins)
> return community;
> @@ -131,15 +134,18 @@ const struct intel_community *intel_get_community(struct intel_pinctrl *pctrl, u
> }
> EXPORT_SYMBOL_NS_GPL(intel_get_community, PINCTRL_INTEL);
>
> +#define for_each_intel_community_pad_group(community, grp) \
> + for (unsigned int __gi = 0; \
> + __gi < community->ngpps && (grp = &community->gpps[__gi]); \
> + __gi++) \
> +
> static const struct intel_padgroup *
> intel_community_get_padgroup(const struct intel_community *community,
> unsigned int pin)
> {
> - int i;
> -
> - for (i = 0; i < community->ngpps; i++) {
> - const struct intel_padgroup *padgrp = &community->gpps[i];
> + const struct intel_padgroup *padgrp;
>
> + for_each_intel_community_pad_group(community, padgrp) {
> if (pin >= padgrp->base && pin < padgrp->base + padgrp->size)
> return padgrp;
> }
> @@ -924,6 +930,14 @@ static const struct pinctrl_desc intel_pinctrl_desc = {
> .owner = THIS_MODULE,
> };
>
> +#define for_each_intel_pad_group(pctrl, community, grp) \
> + for_each_intel_pin_community(pctrl, community) \
> + for_each_intel_community_pad_group(community, grp)
> +
> +#define for_each_intel_gpio_group(pctrl, community, grp) \
> + for_each_intel_pad_group(pctrl, community, grp) \
> + if (grp->gpio_base == INTEL_GPIO_BASE_NOMAP) {} else
> +
> /**
> * intel_gpio_to_pin() - Translate from GPIO offset to pin number
> * @pctrl: Pinctrl structure
> @@ -942,30 +956,17 @@ static int intel_gpio_to_pin(struct intel_pinctrl *pctrl, unsigned int offset,
> const struct intel_community **community,
> const struct intel_padgroup **padgrp)
> {
> - int i;
> + const struct intel_community *comm;
> + const struct intel_padgroup *grp;
>
> - for (i = 0; i < pctrl->ncommunities; i++) {
> - const struct intel_community *comm = &pctrl->communities[i];
> - int j;
> + for_each_intel_gpio_group(pctrl, comm, grp) {
> + if (offset >= grp->gpio_base && offset < grp->gpio_base + grp->size) {
> + if (community)
> + *community = comm;
> + if (padgrp)
> + *padgrp = grp;
>
> - for (j = 0; j < comm->ngpps; j++) {
> - const struct intel_padgroup *pgrp = &comm->gpps[j];
> -
> - if (pgrp->gpio_base == INTEL_GPIO_BASE_NOMAP)
> - continue;
> -
> - if (offset >= pgrp->gpio_base &&
> - offset < pgrp->gpio_base + pgrp->size) {
> - int pin;
> -
> - pin = pgrp->base + offset - pgrp->gpio_base;
> - if (community)
> - *community = comm;
> - if (padgrp)
> - *padgrp = pgrp;
> -
> - return pin;
> - }
> + return grp->base + offset - grp->gpio_base;
> }
> }
>
> @@ -1258,12 +1259,11 @@ static const struct irq_chip intel_gpio_irq_chip = {
> static int intel_gpio_community_irq_handler(struct intel_pinctrl *pctrl,
> const struct intel_community *community)
> {
> + const struct intel_padgroup *padgrp;
> struct gpio_chip *gc = &pctrl->chip;
> - unsigned int gpp;
> int ret = 0;
>
> - for (gpp = 0; gpp < community->ngpps; gpp++) {
> - const struct intel_padgroup *padgrp = &community->gpps[gpp];
> + for_each_intel_community_pad_group(community, padgrp) {
> unsigned long pending, enabled;
> unsigned int gpp, gpp_offset;
> void __iomem *reg, *is;
> @@ -1294,29 +1294,23 @@ static irqreturn_t intel_gpio_irq(int irq, void *data)
> {
> const struct intel_community *community;
> struct intel_pinctrl *pctrl = data;
> - unsigned int i;
> int ret = 0;
>
> /* Need to check all communities for pending interrupts */
> - for (i = 0; i < pctrl->ncommunities; i++) {
> - community = &pctrl->communities[i];
> + for_each_intel_pin_community(pctrl, community)
> ret += intel_gpio_community_irq_handler(pctrl, community);
> - }
>
> return IRQ_RETVAL(ret);
> }
>
> static void intel_gpio_irq_init(struct intel_pinctrl *pctrl)
> {
> - int i;
> + const struct intel_community *community;
>
> - for (i = 0; i < pctrl->ncommunities; i++) {
> - const struct intel_community *community;
> + for_each_intel_pin_community(pctrl, community) {
> void __iomem *reg, *is;
> unsigned int gpp;
>
> - community = &pctrl->communities[i];
> -
> for (gpp = 0; gpp < community->ngpps; gpp++) {
> reg = community->regs + community->ie_offset + gpp * 4;
> is = community->regs + community->is_offset + gpp * 4;
> @@ -1341,36 +1335,17 @@ static int intel_gpio_irq_init_hw(struct gpio_chip *gc)
> return 0;
> }
>
> -static int intel_gpio_add_community_ranges(struct intel_pinctrl *pctrl,
> - const struct intel_community *community)
> -{
> - int ret = 0, i;
> -
> - for (i = 0; i < community->ngpps; i++) {
> - const struct intel_padgroup *gpp = &community->gpps[i];
> -
> - if (gpp->gpio_base == INTEL_GPIO_BASE_NOMAP)
> - continue;
> -
> - ret = gpiochip_add_pin_range(&pctrl->chip, dev_name(pctrl->dev),
> - gpp->gpio_base, gpp->base,
> - gpp->size);
> - if (ret)
> - return ret;
> - }
> -
> - return ret;
> -}
> -
> static int intel_gpio_add_pin_ranges(struct gpio_chip *gc)
> {
> struct intel_pinctrl *pctrl = gpiochip_get_data(gc);
> - int ret, i;
> + const struct intel_community *community;
> + const struct intel_padgroup *grp;
> + int ret;
>
> - for (i = 0; i < pctrl->ncommunities; i++) {
> - const struct intel_community *community = &pctrl->communities[i];
> -
> - ret = intel_gpio_add_community_ranges(pctrl, community);
> + for_each_intel_gpio_group(pctrl, community, grp) {
> + ret = gpiochip_add_pin_range(&pctrl->chip, dev_name(pctrl->dev),
> + grp->gpio_base, grp->base,
> + grp->size);
> if (ret) {
> dev_err(pctrl->dev, "failed to add GPIO pin range\n");
> return ret;
> @@ -1383,20 +1358,12 @@ static int intel_gpio_add_pin_ranges(struct gpio_chip *gc)
> static unsigned int intel_gpio_ngpio(const struct intel_pinctrl *pctrl)
> {
> const struct intel_community *community;
> + const struct intel_padgroup *grp;
> unsigned int ngpio = 0;
> - int i, j;
>
> - for (i = 0; i < pctrl->ncommunities; i++) {
> - community = &pctrl->communities[i];
> - for (j = 0; j < community->ngpps; j++) {
> - const struct intel_padgroup *gpp = &community->gpps[j];
> -
> - if (gpp->gpio_base == INTEL_GPIO_BASE_NOMAP)
> - continue;
> -
> - if (gpp->gpio_base + gpp->size > ngpio)
> - ngpio = gpp->gpio_base + gpp->size;
> - }
> + for_each_intel_gpio_group(pctrl, community, grp) {
> + if (grp->gpio_base + grp->size > ngpio)
> + ngpio = grp->gpio_base + grp->size;
> }
>
> return ngpio;
> --
> 2.43.0.rc1.1336.g36b5255a03ac
next prev parent reply other threads:[~2024-08-30 4:50 UTC|newest]
Thread overview: 10+ messages / expand[flat|nested] mbox.gz Atom feed top
2024-08-29 13:59 [PATCH v2 0/6] pinctrl: intel: High impedance impl. and cleanups Andy Shevchenko
2024-08-29 13:59 ` [PATCH v2 1/6] pinctrl: intel: Move debounce validation out of the lock Andy Shevchenko
2024-08-29 13:59 ` [PATCH v2 2/6] pinctrl: intel: Refactor __intel_gpio_set_direction() to be more useful Andy Shevchenko
2024-08-29 13:59 ` [PATCH v2 3/6] pinctrl: intel: Add __intel_gpio_get_direction() helper Andy Shevchenko
2024-08-29 13:59 ` [PATCH v2 4/6] pinctrl: intel: Implement high impedance support Andy Shevchenko
2024-08-29 13:59 ` [PATCH v2 5/6] pinctrl: intel: Constify intel_get_community() returned object Andy Shevchenko
2024-08-29 13:59 ` [PATCH v2 6/6] pinctrl: intel: Introduce for_each_intel_gpio_group() helper et al Andy Shevchenko
2024-08-30 4:50 ` Mika Westerberg [this message]
2024-08-30 18:53 ` Andy Shevchenko
2024-08-30 4:51 ` [PATCH v2 0/6] pinctrl: intel: High impedance impl. and cleanups Mika Westerberg
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=20240830045039.GU1532424@black.fi.intel.com \
--to=mika.westerberg@linux.intel.com \
--cc=andriy.shevchenko@linux.intel.com \
--cc=andy@kernel.org \
--cc=hkallweit1@gmail.com \
--cc=linus.walleij@linaro.org \
--cc=linux-gpio@vger.kernel.org \
--cc=linux-kernel@vger.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