From: "Uwe Kleine-König" <ukleinek@kernel.org>
To: Biju <biju.das.au@gmail.com>
Cc: Geert Uytterhoeven <geert+renesas@glider.be>,
Magnus Damm <magnus.damm@gmail.com>,
Biju Das <biju.das.jz@bp.renesas.com>,
linux-pwm@vger.kernel.org, linux-kernel@vger.kernel.org,
linux-renesas-soc@vger.kernel.org,
Prabhakar Mahadev Lad <prabhakar.mahadev-lad.rj@bp.renesas.com>
Subject: Re: [PATCH v6 03/11] pwm: rzg2l-gpt: Add support for gpt linking with poeg
Date: Thu, 16 Jul 2026 10:25:43 +0200 [thread overview]
Message-ID: <aliNlCVK5qrZKPWi@monoceros> (raw)
In-Reply-To: <20260604095647.108654-4-biju.das.jz@bp.renesas.com>
[-- Attachment #1: Type: text/plain, Size: 4506 bytes --]
Hello Biju,
On Thu, Jun 04, 2026 at 10:56:33AM +0100, Biju wrote:
> From: Biju Das <biju.das.jz@bp.renesas.com>
>
> The General PWM Timer (GPT) is capable of detecting "dead time error
> and short-circuits between output pins" and send Output disable
> request to poeg(Port Output Enable for GPT).
What is a dead time error?
> Add support for linking poeg group with gpt, so that gpt can control
> the output disable function by adding rzg2l_gpt_poeg_init() to parse
> the renesas,poegs device tree property and establish links between POEG
> groups (A–D) and GPT hardware channels (0–7). For each valid, enabled
> POEG phandle entry, the driver:
> - Reads the renesas,poeg-id from the POEG node and validates it against
> the supported range
> - Records the GPT–POEG association in a per-chip bitmap (poeg_gpt_link)
> - Configures GTINTAD to route the output disable request to the correct
> POEG group
> - Configures GTIOR (OADF/OBDF fields) to set both output pins to
> high-impedance on an output disable event
For my understanding: If GPT is linked to a POEG, an error detected by
GPT makes the pin High-Z?
> +/*
> + * This function links a POEG group{A,B,C,D} with a GPT channel{0..7} and
> + * configures the pin for output disable.
> + */
> +static int rzg2l_gpt_poeg_init(struct platform_device *pdev,
> + struct rzg2l_gpt_chip *rzg2l_gpt)
> +{
> + const char *poeg_name = "renesas,poegs";
> + struct of_phandle_args of_args;
> + struct property *poegs;
> + unsigned int i;
> + u32 poeg_grp;
> + u32 bitpos;
> + int cells;
> + int ret;
> +
> + poegs = of_find_property(pdev->dev.of_node, poeg_name, NULL);
> + if (!poegs)
> + return 0;
> +
> + cells = of_property_count_u32_elems(pdev->dev.of_node, poeg_name);
It's a bit sad that of_find_property() is called twice here. But I
didn't spot a function that implements what
of_property_count_u32_elems() does for a given struct property*.
> + if (cells < 0)
> + return cells;
> +
> + if (cells & 1)
Maybe add a comment here like:
/* poegs is a list of pairs, so cells must be even */
> + return -EINVAL;
> +
> + cells >>= 1;
I think a better name for `cells` from here on would be beneficial,
something like `num_poeg_pairs`. For before here the name isn't optimal,
but I don't have a spontanious suggestion here. `len` comes to mind.
> + for (i = 0; i < cells; i++) {
> + ret = of_parse_phandle_with_fixed_args(pdev->dev.of_node,
> + poeg_name, 1, i,
> + &of_args);
> + if (ret)
> + return ret;
> +
> + if (of_args.args[0] >= RZG2L_MAX_HW_CHANNELS) {
> + dev_err(&pdev->dev, "Invalid channel %u >= %u\n",
> + of_args.args[0], RZG2L_MAX_HW_CHANNELS);
Given that rzg2l_gpt_poeg_init() is called from .probe() only, use
dev_err_probe() here.
> + goto err_of_node;
> + }
> +
> + if (!of_device_is_available(of_args.np)) {
> + /* It's fine to have a phandle to a non-enabled poeg. */
> + of_node_put(of_args.np);
> + continue;
> + }
> +
> + if (!of_property_read_u32(of_args.np, "renesas,poeg-id", &poeg_grp)) {
> + if (poeg_grp > RZG2L_LAST_POEG_GROUP) {
> + dev_err(&pdev->dev, "Invalid poeg group %u > %u\n",
> + poeg_grp, RZG2L_LAST_POEG_GROUP);
> + goto err_of_node;
> + }
> +
> + bitpos = of_args.args[0] + poeg_grp * RZG2L_MAX_HW_CHANNELS;
> + set_bit(bitpos, rzg2l_gpt->poeg_gpt_link);
> +
> + rzg2l_gpt_modify(rzg2l_gpt, RZG2L_GTINTAD(of_args.args[0]),
> + RZG2L_GTINTAD_GRP_MASK, poeg_grp << 24);
> +
> + rzg2l_gpt_modify(rzg2l_gpt, RZG2L_GTIOR(of_args.args[0]),
> + RZG2L_GTIOR_OBDF | RZG2L_GTIOR_OADF,
> + RZG2L_GTIOR_PIN_DISABLE_SETTING);
> + }
> +
> + of_node_put(of_args.np);
> + }
> +
> + return 0;
> +
> +err_of_node:
> + of_node_put(of_args.np);
Would be great if this could be prettified using __free.
> + return -EINVAL;
> +}
> +
> static int rzg2l_gpt_probe(struct platform_device *pdev)
> {
> struct rzg2l_gpt_chip *rzg2l_gpt;
> @@ -426,6 +515,10 @@ static int rzg2l_gpt_probe(struct platform_device *pdev)
> if (rzg2l_gpt->rate_khz * KILO != rate)
> return dev_err_probe(dev, -EINVAL, "Rate is not multiple of 1000");
>
> + ret = rzg2l_gpt_poeg_init(pdev, rzg2l_gpt);
> + if (ret)
> + return dev_err_probe(dev, ret, "Failed to link gpt with poeg\n");
> +
> mutex_init(&rzg2l_gpt->lock);
>
> chip->ops = &rzg2l_gpt_ops;
Best regards
Uwe
[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 488 bytes --]
next prev parent reply other threads:[~2026-07-16 8:25 UTC|newest]
Thread overview: 19+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-06-04 9:56 [PATCH v6 00/11] Add Renesas RZ/G3E GPT support Biju
2026-06-04 9:56 ` [PATCH v6 01/11] pwm: rzg2l-gpt: Fix period_ticks type from u32 to u64 Biju
2026-06-09 13:42 ` Uwe Kleine-König
2026-06-04 9:56 ` [PATCH v6 02/11] dt-bindings: pwm: rzg2l-gpt: Document renesas,poegs property Biju
2026-06-04 10:06 ` sashiko-bot
2026-07-16 7:50 ` Uwe Kleine-König
2026-06-04 9:56 ` [PATCH v6 03/11] pwm: rzg2l-gpt: Add support for gpt linking with poeg Biju
2026-07-16 8:25 ` Uwe Kleine-König [this message]
2026-06-04 9:56 ` [PATCH v6 04/11] pwm: rzg2l-gpt: Add missing newlines to dev_err_probe() messages Biju
2026-06-09 13:50 ` Uwe Kleine-König
2026-06-04 9:56 ` [PATCH v6 05/11] pwm: rzg2l-gpt: Drop unused rzg2l_gpt_chip parameter from rzg2l_gpt_calculate_prescale() Biju
2026-07-16 8:29 ` Uwe Kleine-König
2026-06-04 9:56 ` [PATCH v6 06/11] pwm: rzg2l-gpt: Convert to waveform callbacks Biju
2026-07-16 8:47 ` Uwe Kleine-König
2026-06-04 9:56 ` [PATCH v6 07/11] pwm: rzg2l-gpt: Add info variable to struct rzg2l_gpt_chip Biju
2026-06-04 9:56 ` [PATCH v6 08/11] pwm: rzg2l-gpt: Add prescale_mult variable to struct rzg2l_gpt_info Biju
2026-06-04 9:56 ` [PATCH v6 09/11] pwm: rzg2l-gpt: Add calculate_prescale() callback " Biju
2026-06-04 9:56 ` [PATCH v6 10/11] dt-bindings: pwm: Document RZ/G3E GPT support Biju
2026-06-04 9:56 ` [PATCH v6 11/11] pwm: rzg2l-gpt: Add RZ/G3E support Biju
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=aliNlCVK5qrZKPWi@monoceros \
--to=ukleinek@kernel.org \
--cc=biju.das.au@gmail.com \
--cc=biju.das.jz@bp.renesas.com \
--cc=geert+renesas@glider.be \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-pwm@vger.kernel.org \
--cc=linux-renesas-soc@vger.kernel.org \
--cc=magnus.damm@gmail.com \
--cc=prabhakar.mahadev-lad.rj@bp.renesas.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 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.