All of lore.kernel.org
 help / color / mirror / Atom feed
From: Alexandre Belloni <alexandre.belloni@bootlin.com>
To: "Jens Emil Schulz Østergaard" <jensemil.schulzostergaard@microchip.com>
Cc: Linus Walleij <linusw@kernel.org>, Rob Herring <robh@kernel.org>,
	Krzysztof Kozlowski <krzk+dt@kernel.org>,
	Conor Dooley <conor+dt@kernel.org>,
	Lars Povlsen <lars.povlsen@microchip.com>,
	Bartosz Golaszewski <brgl@kernel.org>,
	Steen Hegelund <Steen.Hegelund@microchip.com>,
	Daniel Machon <daniel.machon@microchip.com>,
	linux-gpio@vger.kernel.org, devicetree@vger.kernel.org,
	linux-kernel@vger.kernel.org
Subject: Re: [PATCH 2/3] pinctrl: ocelot: Update alt mode reg addr calculation
Date: Mon, 19 Jan 2026 16:10:15 +0100	[thread overview]
Message-ID: <2026011915101544cfdc14@mail.local> (raw)
In-Reply-To: <20260119-pinctrl_ocelot_extend_support_for_lan9645x-v1-2-1228155ed0ee@microchip.com>

On 19/01/2026 16:06:10+0100, Jens Emil Schulz Østergaard wrote:
> Lan9645x is the first chip supported by this driver where the pin stride
> is different from the alt mode stride. With 51 pins and up to 7 alt
> modes, we have stride = 2 and alt_mode_stride = 3.
> 
> The current REG_ALT macro has the implicit assumption that these numbers
> are equal, so it does not work for lan9645x.
> 
> The pin stride is the 'stride' variable in the driver. It is the size
> of certain register groups which depends on the number of pins supported
> by the device. Generally we have stride = DIV_ROUND_UP(npins, 32). E.g:
> 
> GPIO_OUT_SET0
> GPIO_OUT_SET1
> ...
> GPIO_OUT_SETn
> 
> The alt mode registers are further replicated by the number of bits
> necessary to represent the alt mode. For instance if we need 3 bits to
> represent the alt mode:
> 
> GPIO_ALT0[0-2]
> GPIO_ALT1[0-2]
> 
> To set alt mode 3 on pin 12, it is necessary to perform writes
> 
> GPIO_ALT0[0] |= BIT(12)
> GPIO_ALT0[1] |= BIT(12)
> GPIO_ALT0[2] &= ~BIT(12)
> 
> The stride and alt mode stride are used by the REG_ALT macro to
> calculate the alt mode register address for a given pin.
> 
> This adds the option to specify n_alt_modes, which is used to set
> info->altm_stride. The default value is info->stride, to make sure
> existing devices are unaffected by this change.
> 
> Reviewed-by: Steen Hegelund <Steen.Hegelund@microchip.com>
> Reviewed-by: Daniel Machon <daniel.machon@microchip.com>
> Signed-off-by: Jens Emil Schulz Østergaard <jensemil.schulzostergaard@microchip.com>

Reviewed-by: Alexandre Belloni <alexandre.belloni@bootlin.com>

> ---
>  drivers/pinctrl/pinctrl-ocelot.c | 7 ++++++-
>  1 file changed, 6 insertions(+), 1 deletion(-)
> 
> diff --git a/drivers/pinctrl/pinctrl-ocelot.c b/drivers/pinctrl/pinctrl-ocelot.c
> index 70da3f37567a..4db0439ca8c4 100644
> --- a/drivers/pinctrl/pinctrl-ocelot.c
> +++ b/drivers/pinctrl/pinctrl-ocelot.c
> @@ -358,12 +358,14 @@ struct ocelot_pinctrl {
>  	const struct ocelot_pincfg_data *pincfg_data;
>  	struct ocelot_pmx_func func[FUNC_MAX];
>  	u8 stride;
> +	u8 altm_stride;
>  	struct workqueue_struct *wq;
>  };
>  
>  struct ocelot_match_data {
>  	struct pinctrl_desc desc;
>  	struct ocelot_pincfg_data pincfg_data;
> +	unsigned int n_alt_modes;
>  };
>  
>  struct ocelot_irq_work {
> @@ -1362,7 +1364,7 @@ static int ocelot_pin_function_idx(struct ocelot_pinctrl *info,
>  	return -1;
>  }
>  
> -#define REG_ALT(msb, info, p) (OCELOT_GPIO_ALT0 * (info)->stride + 4 * ((msb) + ((info)->stride * ((p) / 32))))
> +#define REG_ALT(msb, info, p) (OCELOT_GPIO_ALT0 * (info)->stride + 4 * ((msb) + ((info)->altm_stride * ((p) / 32))))
>  
>  static int ocelot_pinmux_set_mux(struct pinctrl_dev *pctldev,
>  				 unsigned int selector, unsigned int group)
> @@ -2294,6 +2296,9 @@ static int ocelot_pinctrl_probe(struct platform_device *pdev)
>  	reset_control_reset(reset);
>  
>  	info->stride = 1 + (info->desc->npins - 1) / 32;
> +	info->altm_stride = info->stride;
> +	if (data->n_alt_modes)
> +		info->altm_stride = fls(data->n_alt_modes);
>  
>  	regmap_config.max_register = OCELOT_GPIO_SD_MAP * info->stride + 15 * 4;
>  
> 
> -- 
> 2.34.1
> 

-- 
Alexandre Belloni, co-owner and COO, Bootlin
Embedded Linux and Kernel engineering
https://bootlin.com

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

Thread overview: 7+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2026-01-19 15:06 [PATCH 0/3] pinctrl: ocelot: Extend pinctrl-ocelot driver for lan9645x Jens Emil Schulz Østergaard
2026-01-19 15:06 ` [PATCH 1/3] dt-bindings: pinctrl: ocelot: Add LAN9645x SoC support Jens Emil Schulz Østergaard
2026-01-21 16:46   ` Rob Herring (Arm)
2026-01-19 15:06 ` [PATCH 2/3] pinctrl: ocelot: Update alt mode reg addr calculation Jens Emil Schulz Østergaard
2026-01-19 15:10   ` Alexandre Belloni [this message]
2026-01-19 15:06 ` [PATCH 3/3] pinctrl: ocelot: Extend support for lan9645xf family Jens Emil Schulz Østergaard
2026-01-27  9:04 ` [PATCH 0/3] pinctrl: ocelot: Extend pinctrl-ocelot driver for lan9645x Linus Walleij

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=2026011915101544cfdc14@mail.local \
    --to=alexandre.belloni@bootlin.com \
    --cc=Steen.Hegelund@microchip.com \
    --cc=brgl@kernel.org \
    --cc=conor+dt@kernel.org \
    --cc=daniel.machon@microchip.com \
    --cc=devicetree@vger.kernel.org \
    --cc=jensemil.schulzostergaard@microchip.com \
    --cc=krzk+dt@kernel.org \
    --cc=lars.povlsen@microchip.com \
    --cc=linusw@kernel.org \
    --cc=linux-gpio@vger.kernel.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=robh@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 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.