From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from bombadil.infradead.org (bombadil.infradead.org [198.137.202.133]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.lore.kernel.org (Postfix) with ESMTPS id B8525C5AD49 for ; Mon, 26 May 2025 09:33:14 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=lists.infradead.org; s=bombadil.20210309; h=Sender:List-Subscribe:List-Help :List-Post:List-Archive:List-Unsubscribe:List-Id:Content-Type: Content-Transfer-Encoding:MIME-Version:References:In-Reply-To:Message-ID:Date :Subject:Cc:To:From:Reply-To:Content-ID:Content-Description:Resent-Date: Resent-From:Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID:List-Owner; bh=Z6te812vgyS+SyE7SWT04/qWDSaGg86QzX952wROxNE=; b=jWE8CoJPUZ6tN0JCJ+sdR+hn7H r//AgmjE23Rpbk765qCIenDmW8h5V8Ho/o6kQ64RiQupTQvWvz/za0EKleBAdkkJTxmKvRA9M+x+K YDhj6ewW49Emk9jlSa56yLqmkNpoztNbciz8D3eqmHStJH6GA810Z8/NoCFjLfTQ2dyRNOsZMZKcm 3Q4X4reUV8LzuOtQGDAgEVGySYqg+TurM6+mYq44Ibzr90e5IBT7wMPK3WyYDYFaPjKNBLoEP47u/ sZH4U5mdGgspElKjY+EFjIYcmfdB75eMy2yTxlHl3QEl2dyUOEW+ybD1i3acfeeMYNZ4nL2nZn5f3 YWb/zQrQ==; Received: from localhost ([::1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.98.2 #2 (Red Hat Linux)) id 1uJUCf-00000008WMP-1cBf; Mon, 26 May 2025 09:33:05 +0000 Received: from sender4-pp-f112.zoho.com ([136.143.188.112]) by bombadil.infradead.org with esmtps (Exim 4.98.2 #2 (Red Hat Linux)) id 1uJUAW-00000008W1j-10Ed; Mon, 26 May 2025 09:30:53 +0000 ARC-Seal: i=1; a=rsa-sha256; t=1748251834; cv=none; d=zohomail.com; s=zohoarc; b=SBEsJcZHWSkaR/fROh7J9MBU8lIVoJhe/jejF9Fmga+ZTXxvyjrPzhu6rHxiv1vCK11NegL2g6dqlS6gnl4WnRCRGDDG+y9rxMj6TyngCdv8zJqGPYh0xaXWtg0TGoscHFXafDDcG4iS5QjSr7St017bDhuBrfMyFgbjd3IfOUI= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1748251834; h=Content-Type:Content-Transfer-Encoding:Cc:Cc:Date:Date:From:From:In-Reply-To:MIME-Version:Message-ID:References:Subject:Subject:To:To:Message-Id:Reply-To; bh=Z6te812vgyS+SyE7SWT04/qWDSaGg86QzX952wROxNE=; b=hY5XCU5tJIb2v7vLhdFphnAMf1VaCYsVNJ22OV70w65U5iSJff+f2vgmGp4sdtGpO6tIo47RbtO7leAgcPis4RnLZpo+sucy+kDAdER7BCk345pTH53/d/YBjjags9NA23VsX+viIfdH/AD8xcwTFOValbM/4o8vWeYbNXV5haM= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass header.i=collabora.com; spf=pass smtp.mailfrom=nicolas.frattaroli@collabora.com; dmarc=pass header.from= DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; t=1748251834; s=zohomail; d=collabora.com; i=nicolas.frattaroli@collabora.com; h=From:From:To:To:Cc:Cc:Subject:Subject:Date:Date:Message-ID:In-Reply-To:References:MIME-Version:Content-Transfer-Encoding:Content-Type:Message-Id:Reply-To; bh=Z6te812vgyS+SyE7SWT04/qWDSaGg86QzX952wROxNE=; b=Wg7XJSmrHb2OeyYw0MSH1bN4dcN1cXuBbrfJdY/qn3fyDkYZ7LdooXNVLExuQvu6 a/MqqbSNJlfNNT0AmmMhsh2wj3GB2drEP7po1/EWw9J7Fc+8QAXXQJs0J5AhAyfKNYq O7ANIVOUFI7Y4sstGl+ZdmkgTiEf+caRFoU/HHOs= Received: by mx.zohomail.com with SMTPS id 1748251831359884.8119171996467; Mon, 26 May 2025 02:30:31 -0700 (PDT) From: Nicolas Frattaroli To: Uwe =?UTF-8?B?S2xlaW5lLUvDtm5pZw==?= Cc: Linus Walleij , Rob Herring , Krzysztof Kozlowski , Conor Dooley , Heiko Stuebner , William Breathitt Gray , Sebastian Reichel , Kever Yang , linux-gpio@vger.kernel.org, devicetree@vger.kernel.org, linux-arm-kernel@lists.infradead.org, linux-rockchip@lists.infradead.org, linux-kernel@vger.kernel.org, linux-pwm@vger.kernel.org, linux-iio@vger.kernel.org, kernel@collabora.com, Jonas Karlman , Detlev Casanova Subject: Re: [PATCH 5/7] pwm: Add rockchip PWMv4 driver Date: Mon, 26 May 2025 11:30:25 +0200 Message-ID: <10663552.nUPlyArG6x@workhorse> In-Reply-To: References: <20250408-rk3576-pwm-v1-0-a49286c2ca8e@collabora.com> <4313739.kQq0lBPeGt@workhorse> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20250526_023052_378030_FED9E37A X-CRM114-Status: GOOD ( 71.28 ) X-BeenThere: linux-arm-kernel@lists.infradead.org X-Mailman-Version: 2.1.34 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Sender: "linux-arm-kernel" Errors-To: linux-arm-kernel-bounces+linux-arm-kernel=archiver.kernel.org@lists.infradead.org Hi Uwe, On Friday, 23 May 2025 17:02:34 Central European Summer Time Uwe Kleine-K= =C3=B6nig wrote: > [Dropped Jonas Karlman from Cc as his email address doesn't work.] Strange, I don't think I got any bounces, and your reply still has him in the Cc ;) Just letting you know so that it doesn't look like I re-added him. > Hello Nicolas, >=20 > On Thu, May 22, 2025 at 03:02:29PM +0200, Nicolas Frattaroli wrote: > > On Tuesday, 13 May 2025 19:26:31 Central European Summer Time Uwe Klein= e-K=C3=B6nig wrote: > > > On Tue, Apr 08, 2025 at 02:32:17PM +0200, Nicolas Frattaroli wrote: > > > > The Rockchip RK3576 brings with it a new PWM IP, in downstream code > > > > referred to as "v4". This new IP is different enough from the previ= ous > > > > Rockchip IP that I felt it necessary to add a new driver for it, in= stead > > > > of shoehorning it in the old one. > > > >=20 > > > > Add this new driver, based on the PWM core's waveform APIs. Its pla= tform > > > > device is registered by the parent mfpwm driver, from which it also > > > > receives a little platform data struct, so that mfpwm can guarantee= that > > > > all the platform device drivers spread across different subsystems = for > > > > this specific hardware IP do not interfere with each other. > > > >=20 > > > > Signed-off-by: Nicolas Frattaroli > > > > --- > > > > MAINTAINERS | 1 + > > > > drivers/pwm/Kconfig | 13 ++ > > > > drivers/pwm/Makefile | 1 + > > > > drivers/pwm/pwm-rockchip-v4.c | 336 ++++++++++++++++++++++++++++++= ++++++++++++ > > > > 4 files changed, 351 insertions(+) > > > >=20 > > > > diff --git a/MAINTAINERS b/MAINTAINERS > > > > index e6a9347be1e7889089e1d9e655cb23c2d8399b40..3ddd245fd4ad8d9ed2e= 762910a7a1f6436f93e34 100644 > > > > --- a/MAINTAINERS > > > > +++ b/MAINTAINERS > > > > @@ -20891,6 +20891,7 @@ L: linux-rockchip@lists.infradead.org > > > > L: linux-pwm@vger.kernel.org > > > > S: Maintained > > > > F: Documentation/devicetree/bindings/pwm/rockchip,rk3576-pwm.yaml > > > > +F: drivers/pwm/pwm-rockchip-v4.c > > > > F: drivers/soc/rockchip/mfpwm.c > > > > F: include/soc/rockchip/mfpwm.h > > > > =20 > > > > diff --git a/drivers/pwm/Kconfig b/drivers/pwm/Kconfig > > > > index 4731d5b90d7edcc61138e4a5bf7e98906953ece4..242039f62ab091cea33= 7bf27ef310bcf696b6ed0 100644 > > > > --- a/drivers/pwm/Kconfig > > > > +++ b/drivers/pwm/Kconfig > > > > @@ -540,6 +540,19 @@ config PWM_ROCKCHIP > > > > Generic PWM framework driver for the PWM controller found on > > > > Rockchip SoCs. > > > > =20 > > > > +config PWM_ROCKCHIP_V4 > > > > + tristate "Rockchip PWM v4 support" > > > > + depends on ARCH_ROCKCHIP || COMPILE_TEST > > > > + depends on ROCKCHIP_MFPWM > > > > + depends on HAS_IOMEM > > > > + help > > > > + Generic PWM framework driver for the PWM controller found on > > > > + later Rockchip SoCs such as the RK3576. > > > > + > > > > + Uses the Rockchip Multi-function PWM controller driver infrastr= ucture > > > > + to guarantee fearlessly concurrent operation with other functio= ns of > > > > + the same device implemented by drivers in other subsystems. > > > > + > > > > config PWM_RZ_MTU3 > > > > tristate "Renesas RZ/G2L MTU3a PWM Timer support" > > > > depends on RZ_MTU3 > > > > diff --git a/drivers/pwm/Makefile b/drivers/pwm/Makefile > > > > index 539e0def3f82fcb866ab83a0346a15f7efdd7127..b5aca7ff58ac83f8445= 81df526624617025291de 100644 > > > > --- a/drivers/pwm/Makefile > > > > +++ b/drivers/pwm/Makefile > > > > @@ -49,6 +49,7 @@ obj-$(CONFIG_PWM_RASPBERRYPI_POE) +=3D pwm-raspbe= rrypi-poe.o > > > > obj-$(CONFIG_PWM_RCAR) +=3D pwm-rcar.o > > > > obj-$(CONFIG_PWM_RENESAS_TPU) +=3D pwm-renesas-tpu.o > > > > obj-$(CONFIG_PWM_ROCKCHIP) +=3D pwm-rockchip.o > > > > +obj-$(CONFIG_PWM_ROCKCHIP_V4) +=3D pwm-rockchip-v4.o > > > > obj-$(CONFIG_PWM_RZ_MTU3) +=3D pwm-rz-mtu3.o > > > > obj-$(CONFIG_PWM_SAMSUNG) +=3D pwm-samsung.o > > > > obj-$(CONFIG_PWM_SIFIVE) +=3D pwm-sifive.o > > > > diff --git a/drivers/pwm/pwm-rockchip-v4.c b/drivers/pwm/pwm-rockch= ip-v4.c > > > > new file mode 100644 > > > > index 0000000000000000000000000000000000000000..980b27454ef9b930bef= 0496ca528533cf419fa0e > > > > --- /dev/null > > > > +++ b/drivers/pwm/pwm-rockchip-v4.c > > > > @@ -0,0 +1,336 @@ > > > > +// SPDX-License-Identifier: GPL-2.0-or-later > > > > +/* > > > > + * Copyright (c) 2025 Collabora Ltd. > > > > + * > > > > + * A Pulse-Width-Modulation (PWM) generator driver for the generat= ors found in > > > > + * Rockchip SoCs such as the RK3576, internally referred to as "PW= M v4". Uses > > > > + * the MFPWM infrastructure to guarantee exclusive use over the de= vice without > > > > + * other functions of the device from different drivers interferin= g with its > > > > + * operation while it's active. > > >=20 > > > Can you please add a "Limitations" paragraph here similar to the other > > > newer drivers that explains how the hardware behave on disable > > > (inactive? High-Z? freeze?), if there are glitches possible when > > > settings are changed or if the currently running period is completed = on > > > reconfiguration. > >=20 > > Will do. Might need a few long hours with the logic analyzer and poking= at > > the common clock framework to cover all bases. >=20 > Usually it's simpler. e.g. if you set period=3D1s,duty=3D0 and then > period=3D2s,duty=3D2 an LED is enough to determine if the current period = is > completed before a change. >=20 > You don't find High-Z with an LED but can distinguish between "inactive > when off" and "freeze when off". The datasheet might know about High-Z. I've used a logic analyzer to quickly determine this, it went fairly smoothly and didn't take long at all. The PWM output stops immediately and freezes in whatever state it was in at that point in time, i.e. stays either low or high. Changes to period/duty/offset params only seem to take effect at the start of the next period, so changing them should be glitch-free. I will add a full limitations paragraph, including a TODO for the future with an idea for how to change the driver so that it lets the current period complete when turning the PWM off. I'm not implementing it right away in this series because that'd involve adding some IRQ handlers to this driver as well and the series is big enough as it is already :) > Apropos datasheet: If that is publically available, a reference to it in > the driver's header would be awesome. I've noted that down as a thing to ask Rockchip. Currently, the technical reference manual of this SoC unfortunately is not publicly available, at least not in an official capacity. I'll mention it'd also be sufficient if we had just the PWM section of that TRM so that I can link to it. > > > > +static int rockchip_pwm_v4_round_wf_tohw(struct pwm_chip *chip, > > > > + struct pwm_device *pwm, > > > > + const struct pwm_waveform *wf, > > > > + void *_wfhw) > > > > +{ > > > > + struct rockchip_pwm_v4 *pc =3D to_rockchip_pwm_v4(chip); > > > > + struct rockchip_pwm_v4_wf *wfhw =3D _wfhw; > > > > + unsigned long rate; > > > > + int ret =3D 0; > > > > + > > > > + /* We do not want chosen_clk to change out from under us here */ > > > > + ret =3D mfpwm_acquire(pc->pwmf); > > > > + if (ret) > > > > + return ret; > > > > + > > > > + rate =3D mfpwm_clk_get_rate(pc->pwmf->parent); > > > > + > > > > + ret =3D rockchip_pwm_v4_round_params(rate, wf->duty_length_ns, > > > > + wf->period_length_ns, > > > > + wf->duty_offset_ns, &wfhw->duty, > > > > + &wfhw->period, &wfhw->offset); > > > > + > > > > + if (wf->period_length_ns > 0) > > > > + wfhw->enable =3D PWMV4_EN_BOTH_MASK; > > > > + else > > > > + wfhw->enable =3D 0; > > > > + > > > > + dev_dbg(&chip->dev, "tohw: duty =3D %u, period =3D %u, offset =3D= %u, rate %lu\n", > > > > + wfhw->duty, wfhw->period, wfhw->offset, rate); > > > > + > > > > + mfpwm_release(pc->pwmf); > > > > + return ret; > > >=20 > > > This is wrong. If a too high value for (say) period_length_ns is > > > requested, you're supposed to configure the maximal possible > > > period_length and not return a failure. > >=20 > > Ack. What if offset > period - duty is requested? Should I just saturat= e it > > to period - duty in that case? >=20 > If you configure period =3D 10, duty =3D offset =3D 6 the period restart = is > supposed to happen during the active phase, that is it looks as follows: >=20 > __ _____ _____ _____ ____ > \___/ \___/ \___/ \___/ =20 > ^ ^ ^ ^ ^ > 01234567890 >=20 > ('^' marks the period start.) Okay, this might make this a bit more complicated then. The hardware in the TRM at least states for the offset register The value ranges from 0 to (period-duty) which I think means that I have to actually make use of the hardware's polarity setting, set it to inverse polarity, and then set the offset to duty and the duty to period - duty if I understand this right. Offset right now is just used by the pwm core to do inversion, right? As in there's no handy sysfs knob I can shove values into to set it to an arbitrary number? I may also just shove a value above (period - duty) into the offset reg to see if the hardware already behaves in the expected way and doing the math manually would be overcomplicating things. > > > > + ret =3D mfpwm_acquire(pc->pwmf); > > > > + if (ret) > > > > + return ret; > > > > + > > > > + rate =3D mfpwm_clk_get_rate(pc->pwmf->parent); > > >=20 > > > Why isn't that a proper clock that you can call clk_get_rate() (and > > > clk_rate_exclusive_get()) for? > >=20 > > Because I didn't know clk-mux.c existed :( But even with it, I'm not su= re > > if letting mfpwm function drivers touch the clk directly is a good idea, > > as this either means storing it in their pwmf struct or making the memb= ers > > of the mfpwm struct part of the shared header. >=20 > The different drivers shouldn't need to touch the clk directly, the clk > API functions should be enough?! It's not just enough, it's too much. I don't want to give every pwmf instance a pointer to the clock mux and then let the function drivers call every common clock framework function on it that they wish to call. I'll think about it more. clk_rate_exclusive_get/_put should protect against the kinds of cross-function-driver interference hijinks I'm worried about, so maybe the indirection isn't needed. > > > > + wfhw->period =3D mfpwm_reg_read(pc->pwmf->base, PWMV4_REG_PERIOD); > > > > + wfhw->duty =3D mfpwm_reg_read(pc->pwmf->base, PWMV4_REG_DUTY); > > > > + wfhw->offset =3D mfpwm_reg_read(pc->pwmf->base, PWMV4_REG_OFFSET); > > > > + wfhw->enable =3D mfpwm_reg_read(pc->pwmf->base, PWMV4_REG_ENABLE)= & PWMV4_EN_BOTH_MASK; > > > > + > > > > + mfpwm_release(pc->pwmf); > > > > + > > > > + return 0; > > > > +} > > > > + > > > > +static int rockchip_pwm_v4_write_wf(struct pwm_chip *chip, struct = pwm_device *pwm, > > > > + const void *_wfhw) > > > > +{ > > > > + struct rockchip_pwm_v4 *pc =3D to_rockchip_pwm_v4(chip); > > > > + const struct rockchip_pwm_v4_wf *wfhw =3D _wfhw; > > > > + bool was_enabled =3D false; > > > > + int ret =3D 0; > > > > + > > > > + ret =3D mfpwm_acquire(pc->pwmf); > > > > + if (ret) > > > > + return ret; > > > > + > > > > + was_enabled =3D pwmv4_is_enabled(mfpwm_reg_read(pc->pwmf->base, > > > > + PWMV4_REG_ENABLE)); >=20 > Just noticed: pwmv4_is_enabled has the wrong prefix. Please use > "rockchip_pwm_v4" consistently. Will do. > [...] > > > > > +static int rockchip_pwm_v4_probe(struct platform_device *pdev) > > > > +{ > > > > + struct rockchip_mfpwm_func *pwmf =3D dev_get_platdata(&pdev->dev); > > > > + struct rockchip_pwm_v4 *pc; > > > > + struct pwm_chip *chip; > > > > + int ret; > > > > + > > > > + chip =3D devm_pwmchip_alloc(&pdev->dev, 1, sizeof(*pc)); > > > > + if (IS_ERR(chip)) > > > > + return PTR_ERR(chip); > > > > + > > > > + pc =3D to_rockchip_pwm_v4(chip); > > > > + pc->pwmf =3D pwmf; > > > > + > > > > + platform_set_drvdata(pdev, pc); > > > > + > > > > + chip->ops =3D &rockchip_pwm_v4_ops; > > > > + chip->atomic =3D true; > > > > + > > >=20 > > > If the PWM is already enabled you better call mfpwm_acquire() here? > >=20 > > As in, if the hardware set the PWM on before the driver probed? I hadn't > > considered this case, and will need to think about it. Could very well = be > > a possibility as u-boot does things before us. >=20 > The typical application is that the bootloader already shows a splash > screen and then you don't want Linux booting result in a flashing > display. Gotcha, that does sound fairly important and I've implemented it for v2 now. Managed to successfully test it with some manual register writes from u-boot. Haven't really decided yet whether I'll send v2 out soon or wait for -rc1 to release to base it against. I'm currently leaning towards sending it out before -rc1 just because I don't want to rob reviewers of up to two additional weeks of potential review time, especially since v2 is already substantially different based on the changes I've staged for it so far. >=20 > Best regards > Uwe Kind regards, Nicolas Frattaroli From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from bombadil.infradead.org (bombadil.infradead.org [198.137.202.133]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.lore.kernel.org (Postfix) with ESMTPS id 52038C54FB3 for ; Mon, 26 May 2025 09:33:24 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=lists.infradead.org; s=bombadil.20210309; h=Sender: Content-Transfer-Encoding:Content-Type:List-Subscribe:List-Help:List-Post: List-Archive:List-Unsubscribe:List-Id:MIME-Version:References:In-Reply-To: Message-ID:Date:Subject:Cc:To:From:Reply-To:Content-ID:Content-Description: Resent-Date:Resent-From:Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID: List-Owner; bh=GjOlv7ku2VTRehzQo/Hy+QwjA/ljYBPA9qG/dNvRUx8=; b=3W2bhvS7yp7IAk 0QwYh9KkDsi1BcvgETVkkAMsbTKdFLa4OVDix2MoRdQL1bgN4axUH41aRRxLABgFQi9g8UvarubjK 74IJhZBQDZNUpo4RfraGNsKtJN+CTvCKB1NY/4SPyQ2rUAH/xQohhCWim7/E1yvaoLrj6RHHDDYqH 4aFrSSNQH6nwgIkaARYIOQpRpMtqUnPyLM5s6kI5eUCN8ZeAL4MQIryTCOEWd8BBwggNBl3fSeHBR jw/XlbWQvpZFiNHtRoXyVK2ix0MUdNu+e253CBB07RJCF0teCh9dwbAEKHneb027BROq0T9VtzKI1 B1hBrUW5+v0G1HXWEFcw==; Received: from localhost ([::1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.98.2 #2 (Red Hat Linux)) id 1uJUCf-00000008WN8-41JP; Mon, 26 May 2025 09:33:05 +0000 Received: from sender4-pp-f112.zoho.com ([136.143.188.112]) by bombadil.infradead.org with esmtps (Exim 4.98.2 #2 (Red Hat Linux)) id 1uJUAW-00000008W1j-10Ed; Mon, 26 May 2025 09:30:53 +0000 ARC-Seal: i=1; a=rsa-sha256; t=1748251834; cv=none; d=zohomail.com; s=zohoarc; b=SBEsJcZHWSkaR/fROh7J9MBU8lIVoJhe/jejF9Fmga+ZTXxvyjrPzhu6rHxiv1vCK11NegL2g6dqlS6gnl4WnRCRGDDG+y9rxMj6TyngCdv8zJqGPYh0xaXWtg0TGoscHFXafDDcG4iS5QjSr7St017bDhuBrfMyFgbjd3IfOUI= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1748251834; h=Content-Type:Content-Transfer-Encoding:Cc:Cc:Date:Date:From:From:In-Reply-To:MIME-Version:Message-ID:References:Subject:Subject:To:To:Message-Id:Reply-To; bh=Z6te812vgyS+SyE7SWT04/qWDSaGg86QzX952wROxNE=; b=hY5XCU5tJIb2v7vLhdFphnAMf1VaCYsVNJ22OV70w65U5iSJff+f2vgmGp4sdtGpO6tIo47RbtO7leAgcPis4RnLZpo+sucy+kDAdER7BCk345pTH53/d/YBjjags9NA23VsX+viIfdH/AD8xcwTFOValbM/4o8vWeYbNXV5haM= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass header.i=collabora.com; spf=pass smtp.mailfrom=nicolas.frattaroli@collabora.com; dmarc=pass header.from= DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; t=1748251834; s=zohomail; d=collabora.com; i=nicolas.frattaroli@collabora.com; h=From:From:To:To:Cc:Cc:Subject:Subject:Date:Date:Message-ID:In-Reply-To:References:MIME-Version:Content-Transfer-Encoding:Content-Type:Message-Id:Reply-To; bh=Z6te812vgyS+SyE7SWT04/qWDSaGg86QzX952wROxNE=; b=Wg7XJSmrHb2OeyYw0MSH1bN4dcN1cXuBbrfJdY/qn3fyDkYZ7LdooXNVLExuQvu6 a/MqqbSNJlfNNT0AmmMhsh2wj3GB2drEP7po1/EWw9J7Fc+8QAXXQJs0J5AhAyfKNYq O7ANIVOUFI7Y4sstGl+ZdmkgTiEf+caRFoU/HHOs= Received: by mx.zohomail.com with SMTPS id 1748251831359884.8119171996467; Mon, 26 May 2025 02:30:31 -0700 (PDT) From: Nicolas Frattaroli To: Uwe =?UTF-8?B?S2xlaW5lLUvDtm5pZw==?= Cc: Linus Walleij , Rob Herring , Krzysztof Kozlowski , Conor Dooley , Heiko Stuebner , William Breathitt Gray , Sebastian Reichel , Kever Yang , linux-gpio@vger.kernel.org, devicetree@vger.kernel.org, linux-arm-kernel@lists.infradead.org, linux-rockchip@lists.infradead.org, linux-kernel@vger.kernel.org, linux-pwm@vger.kernel.org, linux-iio@vger.kernel.org, kernel@collabora.com, Jonas Karlman , Detlev Casanova Subject: Re: [PATCH 5/7] pwm: Add rockchip PWMv4 driver Date: Mon, 26 May 2025 11:30:25 +0200 Message-ID: <10663552.nUPlyArG6x@workhorse> In-Reply-To: References: <20250408-rk3576-pwm-v1-0-a49286c2ca8e@collabora.com> <4313739.kQq0lBPeGt@workhorse> MIME-Version: 1.0 X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20250526_023052_378030_FED9E37A X-CRM114-Status: GOOD ( 71.28 ) X-BeenThere: linux-rockchip@lists.infradead.org X-Mailman-Version: 2.1.34 Precedence: list List-Id: Upstream kernel work for Rockchip platforms List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Sender: "Linux-rockchip" Errors-To: linux-rockchip-bounces+linux-rockchip=archiver.kernel.org@lists.infradead.org SGkgVXdlLAoKT24gRnJpZGF5LCAyMyBNYXkgMjAyNSAxNzowMjozNCBDZW50cmFsIEV1cm9wZWFu IFN1bW1lciBUaW1lIFV3ZSBLbGVpbmUtS8O2bmlnIHdyb3RlOgo+IFtEcm9wcGVkIEpvbmFzIEth cmxtYW4gZnJvbSBDYyBhcyBoaXMgZW1haWwgYWRkcmVzcyBkb2Vzbid0IHdvcmsuXQoKU3RyYW5n ZSwgSSBkb24ndCB0aGluayBJIGdvdCBhbnkgYm91bmNlcywgYW5kIHlvdXIgcmVwbHkgc3RpbGwg aGFzIGhpbSBpbgp0aGUgQ2MgOykgSnVzdCBsZXR0aW5nIHlvdSBrbm93IHNvIHRoYXQgaXQgZG9l c24ndCBsb29rIGxpa2UgSSByZS1hZGRlZCBoaW0uCgo+IEhlbGxvIE5pY29sYXMsCj4gCj4gT24g VGh1LCBNYXkgMjIsIDIwMjUgYXQgMDM6MDI6MjlQTSArMDIwMCwgTmljb2xhcyBGcmF0dGFyb2xp IHdyb3RlOgo+ID4gT24gVHVlc2RheSwgMTMgTWF5IDIwMjUgMTk6MjY6MzEgQ2VudHJhbCBFdXJv cGVhbiBTdW1tZXIgVGltZSBVd2UgS2xlaW5lLUvDtm5pZyB3cm90ZToKPiA+ID4gT24gVHVlLCBB cHIgMDgsIDIwMjUgYXQgMDI6MzI6MTdQTSArMDIwMCwgTmljb2xhcyBGcmF0dGFyb2xpIHdyb3Rl Ogo+ID4gPiA+IFRoZSBSb2NrY2hpcCBSSzM1NzYgYnJpbmdzIHdpdGggaXQgYSBuZXcgUFdNIElQ LCBpbiBkb3duc3RyZWFtIGNvZGUKPiA+ID4gPiByZWZlcnJlZCB0byBhcyAidjQiLiBUaGlzIG5l dyBJUCBpcyBkaWZmZXJlbnQgZW5vdWdoIGZyb20gdGhlIHByZXZpb3VzCj4gPiA+ID4gUm9ja2No aXAgSVAgdGhhdCBJIGZlbHQgaXQgbmVjZXNzYXJ5IHRvIGFkZCBhIG5ldyBkcml2ZXIgZm9yIGl0 LCBpbnN0ZWFkCj4gPiA+ID4gb2Ygc2hvZWhvcm5pbmcgaXQgaW4gdGhlIG9sZCBvbmUuCj4gPiA+ ID4gCj4gPiA+ID4gQWRkIHRoaXMgbmV3IGRyaXZlciwgYmFzZWQgb24gdGhlIFBXTSBjb3JlJ3Mg d2F2ZWZvcm0gQVBJcy4gSXRzIHBsYXRmb3JtCj4gPiA+ID4gZGV2aWNlIGlzIHJlZ2lzdGVyZWQg YnkgdGhlIHBhcmVudCBtZnB3bSBkcml2ZXIsIGZyb20gd2hpY2ggaXQgYWxzbwo+ID4gPiA+IHJl Y2VpdmVzIGEgbGl0dGxlIHBsYXRmb3JtIGRhdGEgc3RydWN0LCBzbyB0aGF0IG1mcHdtIGNhbiBn dWFyYW50ZWUgdGhhdAo+ID4gPiA+IGFsbCB0aGUgcGxhdGZvcm0gZGV2aWNlIGRyaXZlcnMgc3By ZWFkIGFjcm9zcyBkaWZmZXJlbnQgc3Vic3lzdGVtcyBmb3IKPiA+ID4gPiB0aGlzIHNwZWNpZmlj IGhhcmR3YXJlIElQIGRvIG5vdCBpbnRlcmZlcmUgd2l0aCBlYWNoIG90aGVyLgo+ID4gPiA+IAo+ ID4gPiA+IFNpZ25lZC1vZmYtYnk6IE5pY29sYXMgRnJhdHRhcm9saSA8bmljb2xhcy5mcmF0dGFy b2xpQGNvbGxhYm9yYS5jb20+Cj4gPiA+ID4gLS0tCj4gPiA+ID4gIE1BSU5UQUlORVJTICAgICAg ICAgICAgICAgICAgIHwgICAxICsKPiA+ID4gPiAgZHJpdmVycy9wd20vS2NvbmZpZyAgICAgICAg ICAgfCAgMTMgKysKPiA+ID4gPiAgZHJpdmVycy9wd20vTWFrZWZpbGUgICAgICAgICAgfCAgIDEg Kwo+ID4gPiA+ICBkcml2ZXJzL3B3bS9wd20tcm9ja2NoaXAtdjQuYyB8IDMzNiArKysrKysrKysr KysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysKPiA+ID4gPiAgNCBmaWxlcyBjaGFuZ2Vk LCAzNTEgaW5zZXJ0aW9ucygrKQo+ID4gPiA+IAo+ID4gPiA+IGRpZmYgLS1naXQgYS9NQUlOVEFJ TkVSUyBiL01BSU5UQUlORVJTCj4gPiA+ID4gaW5kZXggZTZhOTM0N2JlMWU3ODg5MDg5ZTFkOWU2 NTVjYjIzYzJkODM5OWI0MC4uM2RkZDI0NWZkNGFkOGQ5ZWQyZTc2MjkxMGE3YTFmNjQzNmY5M2Uz NCAxMDA2NDQKPiA+ID4gPiAtLS0gYS9NQUlOVEFJTkVSUwo+ID4gPiA+ICsrKyBiL01BSU5UQUlO RVJTCj4gPiA+ID4gQEAgLTIwODkxLDYgKzIwODkxLDcgQEAgTDoJbGludXgtcm9ja2NoaXBAbGlz dHMuaW5mcmFkZWFkLm9yZwo+ID4gPiA+ICBMOglsaW51eC1wd21Admdlci5rZXJuZWwub3JnCj4g PiA+ID4gIFM6CU1haW50YWluZWQKPiA+ID4gPiAgRjoJRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVl L2JpbmRpbmdzL3B3bS9yb2NrY2hpcCxyazM1NzYtcHdtLnlhbWwKPiA+ID4gPiArRjoJZHJpdmVy cy9wd20vcHdtLXJvY2tjaGlwLXY0LmMKPiA+ID4gPiAgRjoJZHJpdmVycy9zb2Mvcm9ja2NoaXAv bWZwd20uYwo+ID4gPiA+ICBGOglpbmNsdWRlL3NvYy9yb2NrY2hpcC9tZnB3bS5oCj4gPiA+ID4g IAo+ID4gPiA+IGRpZmYgLS1naXQgYS9kcml2ZXJzL3B3bS9LY29uZmlnIGIvZHJpdmVycy9wd20v S2NvbmZpZwo+ID4gPiA+IGluZGV4IDQ3MzFkNWI5MGQ3ZWRjYzYxMTM4ZTRhNWJmN2U5ODkwNjk1 M2VjZTQuLjI0MjAzOWY2MmFiMDkxY2VhMzM3YmYyN2VmMzEwYmNmNjk2YjZlZDAgMTAwNjQ0Cj4g PiA+ID4gLS0tIGEvZHJpdmVycy9wd20vS2NvbmZpZwo+ID4gPiA+ICsrKyBiL2RyaXZlcnMvcHdt L0tjb25maWcKPiA+ID4gPiBAQCAtNTQwLDYgKzU0MCwxOSBAQCBjb25maWcgUFdNX1JPQ0tDSElQ Cj4gPiA+ID4gIAkgIEdlbmVyaWMgUFdNIGZyYW1ld29yayBkcml2ZXIgZm9yIHRoZSBQV00gY29u dHJvbGxlciBmb3VuZCBvbgo+ID4gPiA+ICAJICBSb2NrY2hpcCBTb0NzLgo+ID4gPiA+ICAKPiA+ ID4gPiArY29uZmlnIFBXTV9ST0NLQ0hJUF9WNAo+ID4gPiA+ICsJdHJpc3RhdGUgIlJvY2tjaGlw IFBXTSB2NCBzdXBwb3J0Igo+ID4gPiA+ICsJZGVwZW5kcyBvbiBBUkNIX1JPQ0tDSElQIHx8IENP TVBJTEVfVEVTVAo+ID4gPiA+ICsJZGVwZW5kcyBvbiBST0NLQ0hJUF9NRlBXTQo+ID4gPiA+ICsJ ZGVwZW5kcyBvbiBIQVNfSU9NRU0KPiA+ID4gPiArCWhlbHAKPiA+ID4gPiArCSAgR2VuZXJpYyBQ V00gZnJhbWV3b3JrIGRyaXZlciBmb3IgdGhlIFBXTSBjb250cm9sbGVyIGZvdW5kIG9uCj4gPiA+ ID4gKwkgIGxhdGVyIFJvY2tjaGlwIFNvQ3Mgc3VjaCBhcyB0aGUgUkszNTc2Lgo+ID4gPiA+ICsK PiA+ID4gPiArCSAgVXNlcyB0aGUgUm9ja2NoaXAgTXVsdGktZnVuY3Rpb24gUFdNIGNvbnRyb2xs ZXIgZHJpdmVyIGluZnJhc3RydWN0dXJlCj4gPiA+ID4gKwkgIHRvIGd1YXJhbnRlZSBmZWFybGVz c2x5IGNvbmN1cnJlbnQgb3BlcmF0aW9uIHdpdGggb3RoZXIgZnVuY3Rpb25zIG9mCj4gPiA+ID4g KwkgIHRoZSBzYW1lIGRldmljZSBpbXBsZW1lbnRlZCBieSBkcml2ZXJzIGluIG90aGVyIHN1YnN5 c3RlbXMuCj4gPiA+ID4gKwo+ID4gPiA+ICBjb25maWcgUFdNX1JaX01UVTMKPiA+ID4gPiAgCXRy aXN0YXRlICJSZW5lc2FzIFJaL0cyTCBNVFUzYSBQV00gVGltZXIgc3VwcG9ydCIKPiA+ID4gPiAg CWRlcGVuZHMgb24gUlpfTVRVMwo+ID4gPiA+IGRpZmYgLS1naXQgYS9kcml2ZXJzL3B3bS9NYWtl ZmlsZSBiL2RyaXZlcnMvcHdtL01ha2VmaWxlCj4gPiA+ID4gaW5kZXggNTM5ZTBkZWYzZjgyZmNi ODY2YWI4M2EwMzQ2YTE1ZjdlZmRkNzEyNy4uYjVhY2E3ZmY1OGFjODNmODQ0NTgxZGY1MjY2MjQ2 MTcwMjUyOTFkZSAxMDA2NDQKPiA+ID4gPiAtLS0gYS9kcml2ZXJzL3B3bS9NYWtlZmlsZQo+ID4g PiA+ICsrKyBiL2RyaXZlcnMvcHdtL01ha2VmaWxlCj4gPiA+ID4gQEAgLTQ5LDYgKzQ5LDcgQEAg b2JqLSQoQ09ORklHX1BXTV9SQVNQQkVSUllQSV9QT0UpCSs9IHB3bS1yYXNwYmVycnlwaS1wb2Uu bwo+ID4gPiA+ICBvYmotJChDT05GSUdfUFdNX1JDQVIpCQkrPSBwd20tcmNhci5vCj4gPiA+ID4g IG9iai0kKENPTkZJR19QV01fUkVORVNBU19UUFUpCSs9IHB3bS1yZW5lc2FzLXRwdS5vCj4gPiA+ ID4gIG9iai0kKENPTkZJR19QV01fUk9DS0NISVApCSs9IHB3bS1yb2NrY2hpcC5vCj4gPiA+ID4g K29iai0kKENPTkZJR19QV01fUk9DS0NISVBfVjQpCSs9IHB3bS1yb2NrY2hpcC12NC5vCj4gPiA+ ID4gIG9iai0kKENPTkZJR19QV01fUlpfTVRVMykJKz0gcHdtLXJ6LW10dTMubwo+ID4gPiA+ICBv YmotJChDT05GSUdfUFdNX1NBTVNVTkcpCSs9IHB3bS1zYW1zdW5nLm8KPiA+ID4gPiAgb2JqLSQo Q09ORklHX1BXTV9TSUZJVkUpCSs9IHB3bS1zaWZpdmUubwo+ID4gPiA+IGRpZmYgLS1naXQgYS9k cml2ZXJzL3B3bS9wd20tcm9ja2NoaXAtdjQuYyBiL2RyaXZlcnMvcHdtL3B3bS1yb2NrY2hpcC12 NC5jCj4gPiA+ID4gbmV3IGZpbGUgbW9kZSAxMDA2NDQKPiA+ID4gPiBpbmRleCAwMDAwMDAwMDAw MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwLi45ODBiMjc0NTRlZjliOTMwYmVmMDQ5NmNh NTI4NTMzY2Y0MTlmYTBlCj4gPiA+ID4gLS0tIC9kZXYvbnVsbAo+ID4gPiA+ICsrKyBiL2RyaXZl cnMvcHdtL3B3bS1yb2NrY2hpcC12NC5jCj4gPiA+ID4gQEAgLTAsMCArMSwzMzYgQEAKPiA+ID4g PiArLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEdQTC0yLjAtb3ItbGF0ZXIKPiA+ID4gPiAr LyoKPiA+ID4gPiArICogQ29weXJpZ2h0IChjKSAyMDI1IENvbGxhYm9yYSBMdGQuCj4gPiA+ID4g KyAqCj4gPiA+ID4gKyAqIEEgUHVsc2UtV2lkdGgtTW9kdWxhdGlvbiAoUFdNKSBnZW5lcmF0b3Ig ZHJpdmVyIGZvciB0aGUgZ2VuZXJhdG9ycyBmb3VuZCBpbgo+ID4gPiA+ICsgKiBSb2NrY2hpcCBT b0NzIHN1Y2ggYXMgdGhlIFJLMzU3NiwgaW50ZXJuYWxseSByZWZlcnJlZCB0byBhcyAiUFdNIHY0 Ii4gVXNlcwo+ID4gPiA+ICsgKiB0aGUgTUZQV00gaW5mcmFzdHJ1Y3R1cmUgdG8gZ3VhcmFudGVl IGV4Y2x1c2l2ZSB1c2Ugb3ZlciB0aGUgZGV2aWNlIHdpdGhvdXQKPiA+ID4gPiArICogb3RoZXIg ZnVuY3Rpb25zIG9mIHRoZSBkZXZpY2UgZnJvbSBkaWZmZXJlbnQgZHJpdmVycyBpbnRlcmZlcmlu ZyB3aXRoIGl0cwo+ID4gPiA+ICsgKiBvcGVyYXRpb24gd2hpbGUgaXQncyBhY3RpdmUuCj4gPiA+ IAo+ID4gPiBDYW4geW91IHBsZWFzZSBhZGQgYSAiTGltaXRhdGlvbnMiIHBhcmFncmFwaCBoZXJl IHNpbWlsYXIgdG8gdGhlIG90aGVyCj4gPiA+IG5ld2VyIGRyaXZlcnMgdGhhdCBleHBsYWlucyBo b3cgdGhlIGhhcmR3YXJlIGJlaGF2ZSBvbiBkaXNhYmxlCj4gPiA+IChpbmFjdGl2ZT8gSGlnaC1a PyBmcmVlemU/KSwgaWYgdGhlcmUgYXJlIGdsaXRjaGVzIHBvc3NpYmxlIHdoZW4KPiA+ID4gc2V0 dGluZ3MgYXJlIGNoYW5nZWQgb3IgaWYgdGhlIGN1cnJlbnRseSBydW5uaW5nIHBlcmlvZCBpcyBj b21wbGV0ZWQgb24KPiA+ID4gcmVjb25maWd1cmF0aW9uLgo+ID4gCj4gPiBXaWxsIGRvLiBNaWdo dCBuZWVkIGEgZmV3IGxvbmcgaG91cnMgd2l0aCB0aGUgbG9naWMgYW5hbHl6ZXIgYW5kIHBva2lu ZyBhdAo+ID4gdGhlIGNvbW1vbiBjbG9jayBmcmFtZXdvcmsgdG8gY292ZXIgYWxsIGJhc2VzLgo+ IAo+IFVzdWFsbHkgaXQncyBzaW1wbGVyLiBlLmcuIGlmIHlvdSBzZXQgcGVyaW9kPTFzLGR1dHk9 MCBhbmQgdGhlbgo+IHBlcmlvZD0ycyxkdXR5PTIgYW4gTEVEIGlzIGVub3VnaCB0byBkZXRlcm1p bmUgaWYgdGhlIGN1cnJlbnQgcGVyaW9kIGlzCj4gY29tcGxldGVkIGJlZm9yZSBhIGNoYW5nZS4K PiAKPiBZb3UgZG9uJ3QgZmluZCBIaWdoLVogd2l0aCBhbiBMRUQgYnV0IGNhbiBkaXN0aW5ndWlz aCBiZXR3ZWVuICJpbmFjdGl2ZQo+IHdoZW4gb2ZmIiBhbmQgImZyZWV6ZSB3aGVuIG9mZiIuIFRo ZSBkYXRhc2hlZXQgbWlnaHQga25vdyBhYm91dCBIaWdoLVouCgpJJ3ZlIHVzZWQgYSBsb2dpYyBh bmFseXplciB0byBxdWlja2x5IGRldGVybWluZSB0aGlzLCBpdCB3ZW50IGZhaXJseQpzbW9vdGhs eSBhbmQgZGlkbid0IHRha2UgbG9uZyBhdCBhbGwuIFRoZSBQV00gb3V0cHV0IHN0b3BzIGltbWVk aWF0ZWx5CmFuZCBmcmVlemVzIGluIHdoYXRldmVyIHN0YXRlIGl0IHdhcyBpbiBhdCB0aGF0IHBv aW50IGluIHRpbWUsIGkuZS4Kc3RheXMgZWl0aGVyIGxvdyBvciBoaWdoLiBDaGFuZ2VzIHRvIHBl cmlvZC9kdXR5L29mZnNldCBwYXJhbXMgb25seQpzZWVtIHRvIHRha2UgZWZmZWN0IGF0IHRoZSBz dGFydCBvZiB0aGUgbmV4dCBwZXJpb2QsIHNvIGNoYW5naW5nIHRoZW0Kc2hvdWxkIGJlIGdsaXRj aC1mcmVlLgoKSSB3aWxsIGFkZCBhIGZ1bGwgbGltaXRhdGlvbnMgcGFyYWdyYXBoLCBpbmNsdWRp bmcgYSBUT0RPIGZvciB0aGUgZnV0dXJlCndpdGggYW4gaWRlYSBmb3IgaG93IHRvIGNoYW5nZSB0 aGUgZHJpdmVyIHNvIHRoYXQgaXQgbGV0cyB0aGUgY3VycmVudApwZXJpb2QgY29tcGxldGUgd2hl biB0dXJuaW5nIHRoZSBQV00gb2ZmLiBJJ20gbm90IGltcGxlbWVudGluZyBpdCByaWdodAphd2F5 IGluIHRoaXMgc2VyaWVzIGJlY2F1c2UgdGhhdCdkIGludm9sdmUgYWRkaW5nIHNvbWUgSVJRIGhh bmRsZXJzIHRvCnRoaXMgZHJpdmVyIGFzIHdlbGwgYW5kIHRoZSBzZXJpZXMgaXMgYmlnIGVub3Vn aCBhcyBpdCBpcyBhbHJlYWR5IDopCgo+IEFwcm9wb3MgZGF0YXNoZWV0OiBJZiB0aGF0IGlzIHB1 YmxpY2FsbHkgYXZhaWxhYmxlLCBhIHJlZmVyZW5jZSB0byBpdCBpbgo+IHRoZSBkcml2ZXIncyBo ZWFkZXIgd291bGQgYmUgYXdlc29tZS4KCkkndmUgbm90ZWQgdGhhdCBkb3duIGFzIGEgdGhpbmcg dG8gYXNrIFJvY2tjaGlwLiBDdXJyZW50bHksIHRoZSB0ZWNobmljYWwKcmVmZXJlbmNlIG1hbnVh bCBvZiB0aGlzIFNvQyB1bmZvcnR1bmF0ZWx5IGlzIG5vdCBwdWJsaWNseSBhdmFpbGFibGUsIGF0 CmxlYXN0IG5vdCBpbiBhbiBvZmZpY2lhbCBjYXBhY2l0eS4gSSdsbCBtZW50aW9uIGl0J2QgYWxz byBiZSBzdWZmaWNpZW50CmlmIHdlIGhhZCBqdXN0IHRoZSBQV00gc2VjdGlvbiBvZiB0aGF0IFRS TSBzbyB0aGF0IEkgY2FuIGxpbmsgdG8gaXQuCgo+ID4gPiA+ICtzdGF0aWMgaW50IHJvY2tjaGlw X3B3bV92NF9yb3VuZF93Zl90b2h3KHN0cnVjdCBwd21fY2hpcCAqY2hpcCwKPiA+ID4gPiArCQkJ CQkgc3RydWN0IHB3bV9kZXZpY2UgKnB3bSwKPiA+ID4gPiArCQkJCQkgY29uc3Qgc3RydWN0IHB3 bV93YXZlZm9ybSAqd2YsCj4gPiA+ID4gKwkJCQkJIHZvaWQgKl93Zmh3KQo+ID4gPiA+ICt7Cj4g PiA+ID4gKwlzdHJ1Y3Qgcm9ja2NoaXBfcHdtX3Y0ICpwYyA9IHRvX3JvY2tjaGlwX3B3bV92NChj aGlwKTsKPiA+ID4gPiArCXN0cnVjdCByb2NrY2hpcF9wd21fdjRfd2YgKndmaHcgPSBfd2ZodzsK PiA+ID4gPiArCXVuc2lnbmVkIGxvbmcgcmF0ZTsKPiA+ID4gPiArCWludCByZXQgPSAwOwo+ID4g PiA+ICsKPiA+ID4gPiArCS8qIFdlIGRvIG5vdCB3YW50IGNob3Nlbl9jbGsgdG8gY2hhbmdlIG91 dCBmcm9tIHVuZGVyIHVzIGhlcmUgKi8KPiA+ID4gPiArCXJldCA9IG1mcHdtX2FjcXVpcmUocGMt PnB3bWYpOwo+ID4gPiA+ICsJaWYgKHJldCkKPiA+ID4gPiArCQlyZXR1cm4gcmV0Owo+ID4gPiA+ ICsKPiA+ID4gPiArCXJhdGUgPSBtZnB3bV9jbGtfZ2V0X3JhdGUocGMtPnB3bWYtPnBhcmVudCk7 Cj4gPiA+ID4gKwo+ID4gPiA+ICsJcmV0ID0gcm9ja2NoaXBfcHdtX3Y0X3JvdW5kX3BhcmFtcyhy YXRlLCB3Zi0+ZHV0eV9sZW5ndGhfbnMsCj4gPiA+ID4gKwkJCQkJICAgd2YtPnBlcmlvZF9sZW5n dGhfbnMsCj4gPiA+ID4gKwkJCQkJICAgd2YtPmR1dHlfb2Zmc2V0X25zLCAmd2Zody0+ZHV0eSwK PiA+ID4gPiArCQkJCQkgICAmd2Zody0+cGVyaW9kLCAmd2Zody0+b2Zmc2V0KTsKPiA+ID4gPiAr Cj4gPiA+ID4gKwlpZiAod2YtPnBlcmlvZF9sZW5ndGhfbnMgPiAwKQo+ID4gPiA+ICsJCXdmaHct PmVuYWJsZSA9IFBXTVY0X0VOX0JPVEhfTUFTSzsKPiA+ID4gPiArCWVsc2UKPiA+ID4gPiArCQl3 Zmh3LT5lbmFibGUgPSAwOwo+ID4gPiA+ICsKPiA+ID4gPiArCWRldl9kYmcoJmNoaXAtPmRldiwg InRvaHc6IGR1dHkgPSAldSwgcGVyaW9kID0gJXUsIG9mZnNldCA9ICV1LCByYXRlICVsdVxuIiwK PiA+ID4gPiArCQl3Zmh3LT5kdXR5LCB3Zmh3LT5wZXJpb2QsIHdmaHctPm9mZnNldCwgcmF0ZSk7 Cj4gPiA+ID4gKwo+ID4gPiA+ICsJbWZwd21fcmVsZWFzZShwYy0+cHdtZik7Cj4gPiA+ID4gKwly ZXR1cm4gcmV0Owo+ID4gPiAKPiA+ID4gVGhpcyBpcyB3cm9uZy4gSWYgYSB0b28gaGlnaCB2YWx1 ZSBmb3IgKHNheSkgcGVyaW9kX2xlbmd0aF9ucyBpcwo+ID4gPiByZXF1ZXN0ZWQsIHlvdSdyZSBz dXBwb3NlZCB0byBjb25maWd1cmUgdGhlIG1heGltYWwgcG9zc2libGUKPiA+ID4gcGVyaW9kX2xl bmd0aCBhbmQgbm90IHJldHVybiBhIGZhaWx1cmUuCj4gPiAKPiA+IEFjay4gV2hhdCBpZiBvZmZz ZXQgPiBwZXJpb2QgLSBkdXR5IGlzIHJlcXVlc3RlZD8gU2hvdWxkIEkganVzdCBzYXR1cmF0ZSBp dAo+ID4gdG8gcGVyaW9kIC0gZHV0eSBpbiB0aGF0IGNhc2U/Cj4gCj4gSWYgeW91IGNvbmZpZ3Vy ZSBwZXJpb2QgPSAxMCwgZHV0eSA9IG9mZnNldCA9IDYgdGhlIHBlcmlvZCByZXN0YXJ0IGlzCj4g c3VwcG9zZWQgdG8gaGFwcGVuIGR1cmluZyB0aGUgYWN0aXZlIHBoYXNlLCB0aGF0IGlzIGl0IGxv b2tzIGFzIGZvbGxvd3M6Cj4gCj4gICAgIF9fICAgICBfX19fXyAgICAgX19fX18gICAgIF9fX19f ICAgICBfX19fCj4gICAgICAgXF9fXy8gICAgIFxfX18vICAgICBcX19fLyAgICAgXF9fXy8gICAg Cj4gICAgIF4gICAgICAgICBeICAgICAgICAgXiAgICAgICAgIF4gICAgICAgICBeCj4gICAgIDAx MjM0NTY3ODkwCj4gCj4gKCdeJyBtYXJrcyB0aGUgcGVyaW9kIHN0YXJ0LikKCk9rYXksIHRoaXMg bWlnaHQgbWFrZSB0aGlzIGEgYml0IG1vcmUgY29tcGxpY2F0ZWQgdGhlbi4gVGhlIGhhcmR3YXJl IGluIHRoZQpUUk0gYXQgbGVhc3Qgc3RhdGVzIGZvciB0aGUgb2Zmc2V0IHJlZ2lzdGVyCgogIFRo ZSB2YWx1ZSByYW5nZXMgZnJvbSAwIHRvIChwZXJpb2QtZHV0eSkKCndoaWNoIEkgdGhpbmsgbWVh bnMgdGhhdCBJIGhhdmUgdG8gYWN0dWFsbHkgbWFrZSB1c2Ugb2YgdGhlIGhhcmR3YXJlJ3MKcG9s YXJpdHkgc2V0dGluZywgc2V0IGl0IHRvIGludmVyc2UgcG9sYXJpdHksIGFuZCB0aGVuIHNldCB0 aGUgb2Zmc2V0CnRvIGR1dHkgYW5kIHRoZSBkdXR5IHRvIHBlcmlvZCAtIGR1dHkgaWYgSSB1bmRl cnN0YW5kIHRoaXMgcmlnaHQuCgpPZmZzZXQgcmlnaHQgbm93IGlzIGp1c3QgdXNlZCBieSB0aGUg cHdtIGNvcmUgdG8gZG8gaW52ZXJzaW9uLCByaWdodD8gQXMKaW4gdGhlcmUncyBubyBoYW5keSBz eXNmcyBrbm9iIEkgY2FuIHNob3ZlIHZhbHVlcyBpbnRvIHRvIHNldCBpdCB0byBhbgphcmJpdHJh cnkgbnVtYmVyPwoKSSBtYXkgYWxzbyBqdXN0IHNob3ZlIGEgdmFsdWUgYWJvdmUgKHBlcmlvZCAt IGR1dHkpIGludG8gdGhlIG9mZnNldCByZWcKdG8gc2VlIGlmIHRoZSBoYXJkd2FyZSBhbHJlYWR5 IGJlaGF2ZXMgaW4gdGhlIGV4cGVjdGVkIHdheSBhbmQgZG9pbmcgdGhlCm1hdGggbWFudWFsbHkg d291bGQgYmUgb3ZlcmNvbXBsaWNhdGluZyB0aGluZ3MuCgo+ID4gPiA+ICsJcmV0ID0gbWZwd21f YWNxdWlyZShwYy0+cHdtZik7Cj4gPiA+ID4gKwlpZiAocmV0KQo+ID4gPiA+ICsJCXJldHVybiBy ZXQ7Cj4gPiA+ID4gKwo+ID4gPiA+ICsJcmF0ZSA9IG1mcHdtX2Nsa19nZXRfcmF0ZShwYy0+cHdt Zi0+cGFyZW50KTsKPiA+ID4gCj4gPiA+IFdoeSBpc24ndCB0aGF0IGEgcHJvcGVyIGNsb2NrIHRo YXQgeW91IGNhbiBjYWxsIGNsa19nZXRfcmF0ZSgpIChhbmQKPiA+ID4gY2xrX3JhdGVfZXhjbHVz aXZlX2dldCgpKSBmb3I/Cj4gPiAKPiA+IEJlY2F1c2UgSSBkaWRuJ3Qga25vdyBjbGstbXV4LmMg ZXhpc3RlZCA6KCBCdXQgZXZlbiB3aXRoIGl0LCBJJ20gbm90IHN1cmUKPiA+IGlmIGxldHRpbmcg bWZwd20gZnVuY3Rpb24gZHJpdmVycyB0b3VjaCB0aGUgY2xrIGRpcmVjdGx5IGlzIGEgZ29vZCBp ZGVhLAo+ID4gYXMgdGhpcyBlaXRoZXIgbWVhbnMgc3RvcmluZyBpdCBpbiB0aGVpciBwd21mIHN0 cnVjdCBvciBtYWtpbmcgdGhlIG1lbWJlcnMKPiA+IG9mIHRoZSBtZnB3bSBzdHJ1Y3QgcGFydCBv ZiB0aGUgc2hhcmVkIGhlYWRlci4KPiAKPiBUaGUgZGlmZmVyZW50IGRyaXZlcnMgc2hvdWxkbid0 IG5lZWQgdG8gdG91Y2ggdGhlIGNsayBkaXJlY3RseSwgdGhlIGNsawo+IEFQSSBmdW5jdGlvbnMg c2hvdWxkIGJlIGVub3VnaD8hCgpJdCdzIG5vdCBqdXN0IGVub3VnaCwgaXQncyB0b28gbXVjaC4g SSBkb24ndCB3YW50IHRvIGdpdmUgZXZlcnkgcHdtZgppbnN0YW5jZSBhIHBvaW50ZXIgdG8gdGhl IGNsb2NrIG11eCBhbmQgdGhlbiBsZXQgdGhlIGZ1bmN0aW9uIGRyaXZlcnMgY2FsbApldmVyeSBj b21tb24gY2xvY2sgZnJhbWV3b3JrIGZ1bmN0aW9uIG9uIGl0IHRoYXQgdGhleSB3aXNoIHRvIGNh bGwuCgpJJ2xsIHRoaW5rIGFib3V0IGl0IG1vcmUuIGNsa19yYXRlX2V4Y2x1c2l2ZV9nZXQvX3B1 dCBzaG91bGQgcHJvdGVjdAphZ2FpbnN0IHRoZSBraW5kcyBvZiBjcm9zcy1mdW5jdGlvbi1kcml2 ZXIgaW50ZXJmZXJlbmNlIGhpamlua3MgSSdtCndvcnJpZWQgYWJvdXQsIHNvIG1heWJlIHRoZSBp bmRpcmVjdGlvbiBpc24ndCBuZWVkZWQuCgo+ID4gPiA+ICsJd2Zody0+cGVyaW9kID0gbWZwd21f cmVnX3JlYWQocGMtPnB3bWYtPmJhc2UsIFBXTVY0X1JFR19QRVJJT0QpOwo+ID4gPiA+ICsJd2Zo dy0+ZHV0eSA9IG1mcHdtX3JlZ19yZWFkKHBjLT5wd21mLT5iYXNlLCBQV01WNF9SRUdfRFVUWSk7 Cj4gPiA+ID4gKwl3Zmh3LT5vZmZzZXQgPSBtZnB3bV9yZWdfcmVhZChwYy0+cHdtZi0+YmFzZSwg UFdNVjRfUkVHX09GRlNFVCk7Cj4gPiA+ID4gKwl3Zmh3LT5lbmFibGUgPSBtZnB3bV9yZWdfcmVh ZChwYy0+cHdtZi0+YmFzZSwgUFdNVjRfUkVHX0VOQUJMRSkgJiBQV01WNF9FTl9CT1RIX01BU0s7 Cj4gPiA+ID4gKwo+ID4gPiA+ICsJbWZwd21fcmVsZWFzZShwYy0+cHdtZik7Cj4gPiA+ID4gKwo+ ID4gPiA+ICsJcmV0dXJuIDA7Cj4gPiA+ID4gK30KPiA+ID4gPiArCj4gPiA+ID4gK3N0YXRpYyBp bnQgcm9ja2NoaXBfcHdtX3Y0X3dyaXRlX3dmKHN0cnVjdCBwd21fY2hpcCAqY2hpcCwgc3RydWN0 IHB3bV9kZXZpY2UgKnB3bSwKPiA+ID4gPiArCQkJCSAgICBjb25zdCB2b2lkICpfd2ZodykKPiA+ ID4gPiArewo+ID4gPiA+ICsJc3RydWN0IHJvY2tjaGlwX3B3bV92NCAqcGMgPSB0b19yb2NrY2hp cF9wd21fdjQoY2hpcCk7Cj4gPiA+ID4gKwljb25zdCBzdHJ1Y3Qgcm9ja2NoaXBfcHdtX3Y0X3dm ICp3Zmh3ID0gX3dmaHc7Cj4gPiA+ID4gKwlib29sIHdhc19lbmFibGVkID0gZmFsc2U7Cj4gPiA+ ID4gKwlpbnQgcmV0ID0gMDsKPiA+ID4gPiArCj4gPiA+ID4gKwlyZXQgPSBtZnB3bV9hY3F1aXJl KHBjLT5wd21mKTsKPiA+ID4gPiArCWlmIChyZXQpCj4gPiA+ID4gKwkJcmV0dXJuIHJldDsKPiA+ ID4gPiArCj4gPiA+ID4gKwl3YXNfZW5hYmxlZCA9IHB3bXY0X2lzX2VuYWJsZWQobWZwd21fcmVn X3JlYWQocGMtPnB3bWYtPmJhc2UsCj4gPiA+ID4gKwkJCQkJCSAgICAgIFBXTVY0X1JFR19FTkFC TEUpKTsKPiAKPiBKdXN0IG5vdGljZWQ6IHB3bXY0X2lzX2VuYWJsZWQgaGFzIHRoZSB3cm9uZyBw cmVmaXguIFBsZWFzZSB1c2UKPiAicm9ja2NoaXBfcHdtX3Y0IiBjb25zaXN0ZW50bHkuCgpXaWxs IGRvLgoKPiBbLi4uXQo+Cj4gPiA+ID4gK3N0YXRpYyBpbnQgcm9ja2NoaXBfcHdtX3Y0X3Byb2Jl KHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCj4gPiA+ID4gK3sKPiA+ID4gPiArCXN0cnVj dCByb2NrY2hpcF9tZnB3bV9mdW5jICpwd21mID0gZGV2X2dldF9wbGF0ZGF0YSgmcGRldi0+ZGV2 KTsKPiA+ID4gPiArCXN0cnVjdCByb2NrY2hpcF9wd21fdjQgKnBjOwo+ID4gPiA+ICsJc3RydWN0 IHB3bV9jaGlwICpjaGlwOwo+ID4gPiA+ICsJaW50IHJldDsKPiA+ID4gPiArCj4gPiA+ID4gKwlj aGlwID0gZGV2bV9wd21jaGlwX2FsbG9jKCZwZGV2LT5kZXYsIDEsIHNpemVvZigqcGMpKTsKPiA+ ID4gPiArCWlmIChJU19FUlIoY2hpcCkpCj4gPiA+ID4gKwkJcmV0dXJuIFBUUl9FUlIoY2hpcCk7 Cj4gPiA+ID4gKwo+ID4gPiA+ICsJcGMgPSB0b19yb2NrY2hpcF9wd21fdjQoY2hpcCk7Cj4gPiA+ ID4gKwlwYy0+cHdtZiA9IHB3bWY7Cj4gPiA+ID4gKwo+ID4gPiA+ICsJcGxhdGZvcm1fc2V0X2Ry dmRhdGEocGRldiwgcGMpOwo+ID4gPiA+ICsKPiA+ID4gPiArCWNoaXAtPm9wcyA9ICZyb2NrY2hp cF9wd21fdjRfb3BzOwo+ID4gPiA+ICsJY2hpcC0+YXRvbWljID0gdHJ1ZTsKPiA+ID4gPiArCj4g PiA+IAo+ID4gPiBJZiB0aGUgUFdNIGlzIGFscmVhZHkgZW5hYmxlZCB5b3UgYmV0dGVyIGNhbGwg bWZwd21fYWNxdWlyZSgpIGhlcmU/Cj4gPiAKPiA+IEFzIGluLCBpZiB0aGUgaGFyZHdhcmUgc2V0 IHRoZSBQV00gb24gYmVmb3JlIHRoZSBkcml2ZXIgcHJvYmVkPyBJIGhhZG4ndAo+ID4gY29uc2lk ZXJlZCB0aGlzIGNhc2UsIGFuZCB3aWxsIG5lZWQgdG8gdGhpbmsgYWJvdXQgaXQuIENvdWxkIHZl cnkgd2VsbCBiZQo+ID4gYSBwb3NzaWJpbGl0eSBhcyB1LWJvb3QgZG9lcyB0aGluZ3MgYmVmb3Jl IHVzLgo+IAo+IFRoZSB0eXBpY2FsIGFwcGxpY2F0aW9uIGlzIHRoYXQgdGhlIGJvb3Rsb2FkZXIg YWxyZWFkeSBzaG93cyBhIHNwbGFzaAo+IHNjcmVlbiBhbmQgdGhlbiB5b3UgZG9uJ3Qgd2FudCBM aW51eCBib290aW5nIHJlc3VsdCBpbiBhIGZsYXNoaW5nCj4gZGlzcGxheS4KCkdvdGNoYSwgdGhh dCBkb2VzIHNvdW5kIGZhaXJseSBpbXBvcnRhbnQgYW5kIEkndmUgaW1wbGVtZW50ZWQgaXQgZm9y IHYyCm5vdy4gTWFuYWdlZCB0byBzdWNjZXNzZnVsbHkgdGVzdCBpdCB3aXRoIHNvbWUgbWFudWFs IHJlZ2lzdGVyIHdyaXRlcwpmcm9tIHUtYm9vdC4KCkhhdmVuJ3QgcmVhbGx5IGRlY2lkZWQgeWV0 IHdoZXRoZXIgSSdsbCBzZW5kIHYyIG91dCBzb29uIG9yIHdhaXQgZm9yIC1yYzEKdG8gcmVsZWFz ZSB0byBiYXNlIGl0IGFnYWluc3QuIEknbSBjdXJyZW50bHkgbGVhbmluZyB0b3dhcmRzIHNlbmRp bmcgaXQKb3V0IGJlZm9yZSAtcmMxIGp1c3QgYmVjYXVzZSBJIGRvbid0IHdhbnQgdG8gcm9iIHJl dmlld2VycyBvZiB1cCB0byB0d28KYWRkaXRpb25hbCB3ZWVrcyBvZiBwb3RlbnRpYWwgcmV2aWV3 IHRpbWUsIGVzcGVjaWFsbHkgc2luY2UgdjIgaXMgYWxyZWFkeQpzdWJzdGFudGlhbGx5IGRpZmZl cmVudCBiYXNlZCBvbiB0aGUgY2hhbmdlcyBJJ3ZlIHN0YWdlZCBmb3IgaXQgc28gZmFyLgoKPiAK PiBCZXN0IHJlZ2FyZHMKPiBVd2UKCktpbmQgcmVnYXJkcywKTmljb2xhcyBGcmF0dGFyb2xpCgoK CgpfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXwpMaW51eC1y b2NrY2hpcCBtYWlsaW5nIGxpc3QKTGludXgtcm9ja2NoaXBAbGlzdHMuaW5mcmFkZWFkLm9yZwpo dHRwOi8vbGlzdHMuaW5mcmFkZWFkLm9yZy9tYWlsbWFuL2xpc3RpbmZvL2xpbnV4LXJvY2tjaGlw Cg==