All of lore.kernel.org
 help / color / mirror / Atom feed
From: Aidan MacDonald <aidanmacdonald.0x0@gmail.com>
To: Mark Brown <broonie@kernel.org>
Cc: linus.walleij@linaro.org, brgl@bgdev.pl, robh+dt@kernel.org,
	krzysztof.kozlowski+dt@linaro.org, wens@csie.org,
	jic23@kernel.org, lee.jones@linaro.org, sre@kernel.org,
	gregkh@linuxfoundation.org, lgirdwood@gmail.com, lars@metafoo.de,
	rafael@kernel.org, quic_gurus@quicinc.com,
	linux-gpio@vger.kernel.org, devicetree@vger.kernel.org,
	linux-kernel@vger.kernel.org, linux-iio@vger.kernel.org,
	linux-pm@vger.kernel.org
Subject: Re: [PATCH v2 02/17] regmap-irq: Add get_irq_reg to support unusual register layouts
Date: Fri, 10 Jun 2022 16:40:20 +0100	[thread overview]
Message-ID: <6YJcC5wyOg6x6Ny4Os8ujFbK2qB4alkU@localhost> (raw)
In-Reply-To: <YqDLflKTsYaupArl@sirena.org.uk>


Mark Brown <broonie@kernel.org> writes:

> On Tue, Jun 07, 2022 at 04:53:09PM +0100, Aidan MacDonald wrote:
>
>> -	if (!chip->sub_reg_offsets || !chip->not_fixed_stride) {
>> +	if (chip->get_irq_reg) {
>> +		reg = chip->get_irq_reg(base_reg, i);
>> +	} else if (!chip->sub_reg_offsets || !chip->not_fixed_stride) {
>
> It seems like it would be cleaner and clearer to refactor things so that
> we always have a get_irq_reg() with standard chips getting given a
> default implementation which implements the current behaviour.

I don't think that is a good way to clean things up. I only intended
get_irq_reg() to be a quick hack to solve a problem; in my opinion it
would be a poor abstraction to base the API around.

What I'd suggest is something that will simplify regmap-irq. Instead of
defining the base registers, etc. in the chip, introduce a new struct
to describe a register group:

    struct regmap_irq_reg_group {
        unsigned int status_base;
        unsigned int mask_base;
        ...

        unsigned int irq_reg_stride;

        int num_regs;
    };

The idea is that the registers in a group are linearly mapped using the
formula "base + (i * irq_reg_stride)". Then it's possible to allow for
multiple register groups in regmap_irq_chip:

    struct regmap_irq_chip {
        const struct regmap_irq_reg_group *groups;
        unsigned int num_groups;

        unsigned int main_status_base;
        unsigned int num_main_status_bits;
        int num_main_regs;

        ...
    };

It should be straightforward to fit existing chips into this model.

- "Normal" chips which do not use sub_reg_offsets or not_fixed_stride
  will have a single register group describing their register layout.

- Chips which use not_fixed_stride=1 (eg. qcom-pm8008.c) will define
  multiple register groups instead of using sub_reg_offsets, so they
  will look more like a normal chip.

- Chips that use a main status + sub-block IRQ layout will define
  one register group for each sub-block and continue to describe the
  location of the main status registers inside of regmap_irq_chip.
  A group will only get polled if the corresponding main status bit
  is set -- n'th group is polled if n'th bit is set.

I think this scheme is easier to understand than having three or four
different hacks to deal with minor deviations from the simple cases.
It's also more flexible because groups do not need to be homogenous,
unlike the way sub_reg_offsets works.

For the AXP192, I'd just need to add two register groups, one for IRQ0-3
and another with IRQ4 off by itself. So this would remove the need for
get_irq_reg() entirely.

On the other hand, basing the public API around get_irq_reg() doesn't
appear to simplify any existing use case.

What do you think? If you're happy with the idea I don't mind doing the
refactoring in a separate patch series.

I had hoped to avoid a big refactor just to add one chip, though.

Best regards,
Aidan

  reply	other threads:[~2022-06-10 15:39 UTC|newest]

Thread overview: 44+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2022-06-07 15:53 [PATCH v2 00/17] Add support for AXP192 PMIC Aidan MacDonald
2022-06-07 15:53 ` [PATCH v2 01/17] regmap-irq: Use sub_irq_reg() to calculate unmask register address Aidan MacDonald
2022-06-09 16:39   ` Guru Das Srinagesh
2022-06-11 14:32     ` Aidan MacDonald
2022-06-07 15:53 ` [PATCH v2 02/17] regmap-irq: Add get_irq_reg to support unusual register layouts Aidan MacDonald
2022-06-08 16:17   ` Mark Brown
2022-06-10 15:40     ` Aidan MacDonald [this message]
2022-06-10 16:47       ` Mark Brown
2022-06-11 14:22         ` Aidan MacDonald
2022-06-23  8:54       ` Matti Vaittinen
2022-06-23 20:35         ` Aidan MacDonald
2022-06-07 15:53 ` [PATCH v2 03/17] dt-bindings: mfd: add bindings for AXP192 MFD device Aidan MacDonald
2022-06-08 10:48   ` Krzysztof Kozlowski
2022-06-09 17:52     ` Aidan MacDonald
2022-06-07 15:53 ` [PATCH v2 04/17] dt-bindings: iio: adc: axp209: Add AXP192 compatible Aidan MacDonald
2022-06-08 10:49   ` Krzysztof Kozlowski
2022-06-07 15:53 ` [PATCH v2 05/17] dt-bindings: power: supply: axp20x: " Aidan MacDonald
2022-06-08 10:50   ` Krzysztof Kozlowski
2022-06-07 15:53 ` [PATCH v2 06/17] dt-bindings: gpio: Add AXP192 GPIO bindings Aidan MacDonald
2022-06-09 20:24   ` Rob Herring
2022-06-07 15:53 ` [PATCH v2 07/17] dt-bindings: power: axp20x-battery: Add AXP192 compatible Aidan MacDonald
2022-06-09 20:24   ` Rob Herring
2022-06-07 15:53 ` [PATCH v2 08/17] mfd: axp20x: Add support for AXP192 Aidan MacDonald
2022-06-07 15:53 ` [PATCH v2 09/17] regulator: " Aidan MacDonald
2022-06-07 15:53 ` [PATCH v2 10/17] iio: adc: axp20x_adc: Minor code cleanups Aidan MacDonald
2022-06-08 13:22   ` Jonathan Cameron
2022-06-08 22:58     ` Aidan MacDonald
2022-06-07 15:53 ` [PATCH v2 11/17] iio: adc: axp20x_adc: Consolidate ADC raw read functions Aidan MacDonald
2022-06-08 13:28   ` Jonathan Cameron
2022-06-08 23:13     ` Aidan MacDonald
2022-06-11 18:23       ` Jonathan Cameron
2022-06-08 13:30   ` Jonathan Cameron
2022-06-07 15:53 ` [PATCH v2 12/17] iio: adc: axp20x_adc: Add support for AXP192 Aidan MacDonald
2022-06-08 13:35   ` Jonathan Cameron
2022-06-07 15:53 ` [PATCH v2 13/17] power: supply: axp20x_usb_power: " Aidan MacDonald
2022-06-09 20:53   ` Sebastian Reichel
2022-06-07 15:53 ` [PATCH v2 14/17] pinctrl: Add AXP192 pin control driver Aidan MacDonald
2022-06-07 15:53 ` [PATCH v2 15/17] power: axp20x_battery: Add constant charge current table Aidan MacDonald
2022-06-09 21:11   ` Sebastian Reichel
2022-06-10 15:40     ` Aidan MacDonald
2022-06-07 15:53 ` [PATCH v2 16/17] power: axp20x_battery: Support battery status without fuel gauge Aidan MacDonald
2022-06-09 21:11   ` Sebastian Reichel
2022-06-07 15:53 ` [PATCH v2 17/17] power: axp20x_battery: Add support for AXP192 Aidan MacDonald
2022-06-09 21:12   ` Sebastian Reichel

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=6YJcC5wyOg6x6Ny4Os8ujFbK2qB4alkU@localhost \
    --to=aidanmacdonald.0x0@gmail.com \
    --cc=brgl@bgdev.pl \
    --cc=broonie@kernel.org \
    --cc=devicetree@vger.kernel.org \
    --cc=gregkh@linuxfoundation.org \
    --cc=jic23@kernel.org \
    --cc=krzysztof.kozlowski+dt@linaro.org \
    --cc=lars@metafoo.de \
    --cc=lee.jones@linaro.org \
    --cc=lgirdwood@gmail.com \
    --cc=linus.walleij@linaro.org \
    --cc=linux-gpio@vger.kernel.org \
    --cc=linux-iio@vger.kernel.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-pm@vger.kernel.org \
    --cc=quic_gurus@quicinc.com \
    --cc=rafael@kernel.org \
    --cc=robh+dt@kernel.org \
    --cc=sre@kernel.org \
    --cc=wens@csie.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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.