mirror of https://lore.kernel.org/lkml/
 help / color / mirror / Atom feed
From: Andy Shevchenko <andriy.shevchenko@linux.intel.com>
To: longzhao@ambarella.com
Cc: Bartosz Golaszewski <brgl@kernel.org>,
	linux-gpio@vger.kernel.org, Linus Walleij <linusw@kernel.org>,
	Michael Walle <mwalle@kernel.org>, Rob Herring <robh@kernel.org>,
	Krzysztof Kozlowski <krzk@kernel.org>,
	Krzysztof Kozlowski <krzk+dt@kernel.org>,
	Krzysztof Kozlowski <krzysztof.kozlowski@oss.qualcomm.com>,
	Conor Dooley <conor+dt@kernel.org>,
	devicetree@vger.kernel.org, Long Zhao <zl020895@163.com>,
	linux-kernel@vger.kernel.org
Subject: Re: [PATCH v10 7/8] gpio: pl061: switch data path to gpio-regmap
Date: Thu, 15 Oct 2026 22:48:30 +0300	[thread overview]
Message-ID: <atEuDjC9bXHbWyNZ@ashevche-desk.local> (raw)
In-Reply-To: <20261015-cv75-gpio-v10-7-3fe3eb315a55@ambarella.com>

On Thu, Oct 15, 2026 at 06:53:34PM +0800, Long Zhao via B4 Relay wrote:

> Move get, set and direction onto gpio-regmap. ARM PL061 sets
> GPIO_REGMAP_QUIRK_SET_AFTER_DIR so the output value is written
> after the direction change.
> 
> Keep a custom irqchip and irq domain. Create the domain with
> the PL061 private data and let gpio-regmap attach it.
> 
> Check the chained-handler regmap_read() return and always run
> chained_irq_exit(). irq_type still ignores MMIO write returns.
> 
> irq_set_parent() nests the GPIO irq_desc under the AMBA parent
> for irq_set_wake() and lockdep; checked with PROVE_LOCKING on
> CV75.

...

> -#define GPIODIR 0x400
> -#define GPIOIS  0x404
> -#define GPIOIBE 0x408
> -#define GPIOIEV 0x40C
> -#define GPIOIE  0x410
> -#define GPIORIS 0x414
> -#define GPIOMIS 0x418
> -#define GPIOIC  0x41C

> +#define PL061_DIR		0x400
> +#define PL061_IS		0x404
> +#define PL061_IBE		0x408
> +#define PL061_IEV		0x40c
> +#define PL061_IE		0x410
> +#define PL061_MIS		0x418
> +#define PL061_IC		0x41c

If you want this rename, it should be done separately, otherwise it sounds like
an unneeded churn (at least for now).

...

> +struct pl061_drvdata {
> +	const struct regmap_config *regmap_config;
> +	const struct pl061_regs *regs;
> +	unsigned int ngpio;
> +	unsigned long quirks;
> +	bool clear_irq_on_type;
> +	bool pm;
> +	int (*reg_mask_xlate)(struct gpio_regmap *gpio, unsigned int base,
> +			      unsigned int offset, unsigned int *reg,
> +			      unsigned int *mask);

Split this logically

	int (*reg_mask_xlate)(struct gpio_regmap *gpio,
			      unsigned int base, unsigned int offset,
			      unsigned int *reg, unsigned int *mask);

>  };

...

>  struct pl061 {
>  	raw_spinlock_t		lock;

> +	struct device		*dev;

Why? Can't you derive this from regmap?

>  	struct regmap		*regmap;
> -	struct gpio_chip	gc;
> +	const struct pl061_drvdata *data;
> +	struct irq_domain	*irq_domain;
>  	int			parent_irq;
>  
> -	struct pl061_context_save_regs csave_regs;
> +	u32			saved_dat;
>  };

> -static int pl061_get_direction(struct gpio_chip *gc, unsigned offset)
> -{
> -	struct pl061 *pl061 = gpiochip_get_data(gc);
> -	int ret;
> -
> -	ret = regmap_test_bits(pl061->regmap, GPIODIR, BIT(offset));
> -	if (ret < 0)
> -		return ret;
> -
> -	if (ret)
> -		return GPIO_LINE_DIRECTION_OUT;
> -
> -	return GPIO_LINE_DIRECTION_IN;
> -}
> -
> -static int pl061_direction_input(struct gpio_chip *gc, unsigned offset)
> -{
> -	struct pl061 *pl061 = gpiochip_get_data(gc);
> -
> -	guard(raw_spinlock_irqsave)(&pl061->lock);
> -
> -	regmap_clear_bits(pl061->regmap, GPIODIR, BIT(offset));
> -
> -	return 0;
> -}
> -
> -static int pl061_direction_output(struct gpio_chip *gc, unsigned offset,
> -		int value)
> -{
> -	struct pl061 *pl061 = gpiochip_get_data(gc);
> -	unsigned int mask = BIT(offset);
> -
> -	guard(raw_spinlock_irqsave)(&pl061->lock);
> -
> -	regmap_assign_bits(pl061->regmap, BIT(offset + PL061_DATA_OFFSET),
> -			   BIT(offset), value);
> -	regmap_set_bits(pl061->regmap, GPIODIR, mask);
> -
> -	/*
> -	 * gpio value is set again, because pl061 doesn't allow to set value of
> -	 * a gpio pin before configuring it in OUT mode.
> -	 */
> -	regmap_assign_bits(pl061->regmap, BIT(offset + PL061_DATA_OFFSET),
> -			   BIT(offset), value);
> -
> -	return 0;
> -}
> -
> -static int pl061_get_value(struct gpio_chip *gc, unsigned offset)
>  {
> -	struct pl061 *pl061 = gpiochip_get_data(gc);
> -
> -	return regmap_test_bits(pl061->regmap,
> -				BIT(offset + PL061_DATA_OFFSET),
> -				BIT(offset));
>  }
>  
> -static int pl061_set_value(struct gpio_chip *gc, unsigned int offset, int value)
>  {
> -	struct pl061 *pl061 = gpiochip_get_data(gc);
> -
> -	regmap_assign_bits(pl061->regmap, BIT(offset + PL061_DATA_OFFSET),
> -			   BIT(offset), value);
>  
>  	return 0;
>  }

...

> -		dev_dbg(gc->parent, "line %d: IRQ on both edges\n", offset);
> +		dev_dbg(pl061->dev, "line %d: IRQ on both edges\n", offset);

To avoid this type of churn, introduce a local variable to keep parent

	struct device *parent = gc->parent;

and convert the lines in a separate patch. So this one will have much less
unneeded changes.

...

> +	if (irq) {
> +		pl061->irq_domain = irq_domain_create_linear(dev_fwnode(dev),
> +							     data->ngpio,
> +							     &pl061_irq_domain_ops,
> +							     pl061);
> +		if (!pl061->irq_domain)
> +			return -ENOMEM;
> +	}

We have devm_irq_domain_instantiate(). Can't use it? Why?

...

> +	for_each_set_bit(offset, &dir_mask, pl061->data->ngpio)

> +		regmap_write(pl061->regmap,
> +			     BIT(offset + PL061_DATA_OFFSET),

You have room. Please, check your editor settings and keep in mind that the
strict limit is 80 characters (inclusive), so lines may have 80 characters.
In some cases (when readability may be increased) even slightly more.

> +			     !!(pl061->saved_dat & BIT(offset)) << offset);

This is simply

			     pl061->saved_dat & BIT(offset));

no?

-- 
With Best Regards,
Andy Shevchenko



  reply	other threads:[~2026-10-15 19:48 UTC|newest]

Thread overview: 16+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2026-10-15 10:53 [PATCH v10 0/8] gpio: add Ambarella CV75 PL061 support Long Zhao via B4 Relay
2026-10-15 10:53 ` [PATCH v10 1/8] dt-bindings: gpio: pl061: add Ambarella CV75 variant Long Zhao via B4 Relay
2026-10-16 13:24   ` Linus Walleij
2026-10-15 10:53 ` [PATCH v10 2/8] gpiolib: regmap: add GPIO_REGMAP_QUIRK_SET_AFTER_DIR Long Zhao via B4 Relay
2026-10-16 13:25   ` Linus Walleij
2026-10-15 10:53 ` [PATCH v10 3/8] gpio: pl061: drop redundant pending check in the IRQ handler Long Zhao via B4 Relay
2026-10-15 19:21   ` Andy Shevchenko
2026-10-16 13:29   ` Linus Walleij
2026-10-15 10:53 ` [PATCH v10 4/8] gpio: pl061: convert register access to regmap Long Zhao via B4 Relay
2026-10-15 19:28   ` Andy Shevchenko
2026-10-15 10:53 ` [PATCH v10 5/8] gpio: pl061: use IRQ_TYPE_LEVEL_MASK and IRQ_TYPE_EDGE_BOTH Long Zhao via B4 Relay
2026-10-15 10:53 ` [PATCH v10 6/8] gpio: pl061: use cleanup helpers for locks Long Zhao via B4 Relay
2026-10-15 19:31   ` Andy Shevchenko
2026-10-15 10:53 ` [PATCH v10 7/8] gpio: pl061: switch data path to gpio-regmap Long Zhao via B4 Relay
2026-10-15 19:48   ` Andy Shevchenko [this message]
2026-10-15 10:53 ` [PATCH v10 8/8] gpio: pl061: add Ambarella register-layout variant Long Zhao via B4 Relay

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=atEuDjC9bXHbWyNZ@ashevche-desk.local \
    --to=andriy.shevchenko@linux.intel.com \
    --cc=brgl@kernel.org \
    --cc=conor+dt@kernel.org \
    --cc=devicetree@vger.kernel.org \
    --cc=krzk+dt@kernel.org \
    --cc=krzk@kernel.org \
    --cc=krzysztof.kozlowski@oss.qualcomm.com \
    --cc=linusw@kernel.org \
    --cc=linux-gpio@vger.kernel.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=longzhao@ambarella.com \
    --cc=mwalle@kernel.org \
    --cc=robh@kernel.org \
    --cc=zl020895@163.com \
    /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

all inboxes | Powered by JetHome®