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: 18+ 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
[not found] ` <20260604100619.75EC51F00893@smtp.kernel.org>
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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox