From: Danilo Krummrich <dakr@kernel.org>
To: Michal Wilczynski <m.wilczynski@samsung.com>
Cc: "Uwe Kleine-König" <ukleinek@kernel.org>,
"Miguel Ojeda" <ojeda@kernel.org>,
"Alex Gaynor" <alex.gaynor@gmail.com>,
"Boqun Feng" <boqun.feng@gmail.com>,
"Gary Guo" <gary@garyguo.net>,
"Björn Roy Baron" <bjorn3_gh@protonmail.com>,
"Andreas Hindborg" <a.hindborg@kernel.org>,
"Alice Ryhl" <aliceryhl@google.com>,
"Trevor Gross" <tmgross@umich.edu>,
"Drew Fustini" <drew@pdp7.com>, "Guo Ren" <guoren@kernel.org>,
"Fu Wei" <wefu@redhat.com>, "Rob Herring" <robh@kernel.org>,
"Krzysztof Kozlowski" <krzk+dt@kernel.org>,
"Conor Dooley" <conor+dt@kernel.org>,
"Paul Walmsley" <paul.walmsley@sifive.com>,
"Palmer Dabbelt" <palmer@dabbelt.com>,
"Albert Ou" <aou@eecs.berkeley.edu>,
"Alexandre Ghiti" <alex@ghiti.fr>,
"Marek Szyprowski" <m.szyprowski@samsung.com>,
"Benno Lossin" <lossin@kernel.org>,
"Michael Turquette" <mturquette@baylibre.com>,
"Stephen Boyd" <sboyd@kernel.org>,
linux-kernel@vger.kernel.org, linux-pwm@vger.kernel.org,
rust-for-linux@vger.kernel.org, linux-riscv@lists.infradead.org,
devicetree@vger.kernel.org, linux-clk@vger.kernel.org
Subject: Re: [PATCH v3 3/9] rust: pwm: Add driver operations trait and registration support
Date: Tue, 17 Jun 2025 16:41:00 +0200 [thread overview]
Message-ID: <aFF-fNOOEzoiomFu@pollux> (raw)
In-Reply-To: <20250617-rust-next-pwm-working-fan-for-sending-v3-3-1cca847c6f9f@samsung.com>
On Tue, Jun 17, 2025 at 04:07:26PM +0200, Michal Wilczynski wrote:
> +/// Manages the registration of a PWM chip, ensuring `pwmchip_remove` is called on drop.
> +pub struct Registration {
> + chip: ManuallyDrop<ARef<Chip>>,
Why is this ManuallyDrop when you call ManuallyDrop::drop(&mut self.chip) as
the last thing in Registration::drop()?
I think you don't need ManuallyDrop here.
> +}
> +
> +impl Registration {
> + /// Registers a PWM chip (obtained via `Chip::new`) with the PWM subsystem.
> + ///
> + /// Takes an [`ARef<Chip>`]. On `Drop` of the returned `Registration` object,
> + /// `pwmchip_remove` is called for the chip.
> + pub fn new(chip: ARef<Chip>, ops_vtable: &'static PwmOpsVTable) -> Result<Self> {
For the reason mentioned in [1] this should either return Result<Devres<Self>>
or just Result, if you use Devres::new_foreign_owned() (see also [2]).
In case of the latter, the Registration instance is automatically dropped once
the parent device is unbound.
If you go with the first, you can drop the Devres<Registration> (and hence the
inner Registration) at any arbitrary point of time, but Devres will still
gurarantee that the inner Registration is dropped once the parent device is
unbound, i.e. it can't out-live driver unbind.
This guarantees that the &Device<Bound> instance you provide in the callbacks
below is guaranteed to be valid.
[1] https://lore.kernel.org/lkml/aFF7qqlexxh540FW@pollux/
[2] https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/tree/rust/kernel/drm/driver.rs#n134
> + // Get the raw C pointer from ARef<Chip>.
> + let c_chip_ptr = chip.as_raw().cast::<bindings::pwm_chip>();
> +
> + // SAFETY: `c_chip_ptr` is valid (guaranteed by ARef existing).
> + // `ops_vtable.as_raw()` provides a valid `*const bindings::pwm_ops`.
> + // `bindings::__pwmchip_add` preconditions (valid pointers, ops set on chip) are met.
> + unsafe {
> + (*c_chip_ptr).ops = ops_vtable.as_raw();
> + to_result(bindings::__pwmchip_add(c_chip_ptr, core::ptr::null_mut()))?;
> + }
Please split this up into separate unsafe blocks.
> + Ok(Registration {
> + chip: ManuallyDrop::new(chip),
> + })
> + }
> +}
> +
> +impl Drop for Registration {
> + fn drop(&mut self) {
> + let chip = &**self.chip;
> + let chip_raw: *mut bindings::pwm_chip = chip.as_raw();
> +
> + // SAFETY: `chip_raw` points to a chip that was successfully registered via `Self::new`.
> + // `bindings::pwmchip_remove` is the correct C function to unregister it.
> + unsafe {
> + bindings::pwmchip_remove(chip_raw);
> + ManuallyDrop::drop(&mut self.chip); // Drops the ARef<Chip>
> + }
Same here, but I don't think ManuallyDrop is needed anyways.
> + }
> +}
next prev parent reply other threads:[~2025-06-17 14:41 UTC|newest]
Thread overview: 13+ messages / expand[flat|nested] mbox.gz Atom feed top
[not found] <CGME20250617140834eucas1p2b35624cd4903bed6d52b7cc432e6da64@eucas1p2.samsung.com>
2025-06-17 14:07 ` [PATCH v3 0/9] Rust Abstractions for PWM subsystem with TH1520 PWM driver Michal Wilczynski
[not found] ` <CGME20250617140835eucas1p2f54c36c63fa7470724a6d027a81d73ff@eucas1p2.samsung.com>
2025-06-17 14:07 ` [PATCH v3 1/9] rust: pwm: Add Kconfig and basic data structures Michal Wilczynski
[not found] ` <CGME20250617140836eucas1p1531fccff82c0fcec217ca3526ae09124@eucas1p1.samsung.com>
2025-06-17 14:07 ` [PATCH v3 2/9] rust: pwm: Add core 'Device' and 'Chip' object wrappers Michal Wilczynski
[not found] ` <CGME20250617140838eucas1p2a31af5a73297580c2421263c1c6ba700@eucas1p2.samsung.com>
2025-06-17 14:07 ` [PATCH v3 3/9] rust: pwm: Add driver operations trait and registration support Michal Wilczynski
2025-06-17 14:41 ` Danilo Krummrich [this message]
[not found] ` <CGME20250617140839eucas1p2d13775f8e6d34a516e93d3b426d5fb16@eucas1p2.samsung.com>
2025-06-17 14:07 ` [PATCH v3 4/9] pwm: Add Rust driver for T-HEAD TH1520 SoC Michal Wilczynski
2025-06-17 14:28 ` Danilo Krummrich
2025-06-17 19:43 ` Michal Wilczynski
[not found] ` <CGME20250617140840eucas1p1a55fd5f902aac84c16299a0a19852e0d@eucas1p1.samsung.com>
2025-06-17 14:07 ` [PATCH v3 5/9] clk: thead: Mark essential bus clocks as CLK_IGNORE_UNUSED Michal Wilczynski
[not found] ` <CGME20250617140842eucas1p22777d6dfc4881099161ecf9404d909b2@eucas1p2.samsung.com>
2025-06-17 14:07 ` [PATCH v3 6/9] dt-bindings: pwm: thead: Add T-HEAD TH1520 PWM controller Michal Wilczynski
[not found] ` <CGME20250617140843eucas1p21824efa35dec7b9169ed3114f9e92df9@eucas1p2.samsung.com>
2025-06-17 14:07 ` [PATCH v3 7/9] riscv: dts: thead: Add PWM controller node Michal Wilczynski
[not found] ` <CGME20250617140844eucas1p2ec26280d366f9cdb4c7846cb2690196a@eucas1p2.samsung.com>
2025-06-17 14:07 ` [PATCH v3 8/9] riscv: dts: thead: Add PVT node Michal Wilczynski
[not found] ` <CGME20250617140846eucas1p1af47d138896b71aabb8ad36245b0466a@eucas1p1.samsung.com>
2025-06-17 14:07 ` [PATCH v3 9/9] riscv: dts: thead: Add PWM fan and thermal control Michal Wilczynski
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=aFF-fNOOEzoiomFu@pollux \
--to=dakr@kernel.org \
--cc=a.hindborg@kernel.org \
--cc=alex.gaynor@gmail.com \
--cc=alex@ghiti.fr \
--cc=aliceryhl@google.com \
--cc=aou@eecs.berkeley.edu \
--cc=bjorn3_gh@protonmail.com \
--cc=boqun.feng@gmail.com \
--cc=conor+dt@kernel.org \
--cc=devicetree@vger.kernel.org \
--cc=drew@pdp7.com \
--cc=gary@garyguo.net \
--cc=guoren@kernel.org \
--cc=krzk+dt@kernel.org \
--cc=linux-clk@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-pwm@vger.kernel.org \
--cc=linux-riscv@lists.infradead.org \
--cc=lossin@kernel.org \
--cc=m.szyprowski@samsung.com \
--cc=m.wilczynski@samsung.com \
--cc=mturquette@baylibre.com \
--cc=ojeda@kernel.org \
--cc=palmer@dabbelt.com \
--cc=paul.walmsley@sifive.com \
--cc=robh@kernel.org \
--cc=rust-for-linux@vger.kernel.org \
--cc=sboyd@kernel.org \
--cc=tmgross@umich.edu \
--cc=ukleinek@kernel.org \
--cc=wefu@redhat.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;
as well as URLs for NNTP newsgroup(s).