twx-linux/rust/kernel
Michal Wilczynski d8046cd508 rust: pwm: Add complete abstraction layer
Introduce a comprehensive abstraction layer for the PWM subsystem to
enable writing drivers in Rust.

Because `Device`, `Chip`, and `PwmOps` all refer to each other, they
form a single, indivisible unit with circular dependencies. They are
introduced together in this single commit to create a complete,
compilable abstraction layer.

The main components are:
 - Data Wrappers: Safe, idiomatic wrappers for core C types like
   `pwm_device`, and `pwm_chip`.

 - PwmOps Trait: An interface that drivers can implement to provide
   their hardware-specific logic, mirroring the C `pwm_ops` interface.

 - FFI VTable and Adapter: A bridge to connect the high-level PwmOps trait
   to the C kernel's pwm_ops vtable.

 - Allocation and Lifetime Management: A high-level `Chip::new()`
   API to safely allocate a chip and a `Registration` guard that integrates
   with `devres` to manage the chip's registration with the PWM core.
   An `AlwaysRefCounted` implementation and a custom release handler
   prevent memory leaks by managing the chip's lifetime and freeing
   driver data correctly.

Reviewed-by: Danilo Krummrich <dakr@kernel.org>
Reviewed-by: Elle Rhumsaa <elle@weathered-steel.dev>
Signed-off-by: Michal Wilczynski <m.wilczynski@samsung.com>
Link: https://patch.msgid.link/20251016-rust-next-pwm-working-fan-for-sending-v16-3-a5df2405d2bd@samsung.com
Signed-off-by: Uwe Kleine-König <ukleinek@kernel.org>
2025-11-07 10:03:55 +01:00
..
alloc Summary of significant series in this pull request: 2025-10-02 18:18:33 -07:00
block for-6.18/block-20250929 2025-10-02 10:16:56 -07:00
debugfs rust: debugfs: Add support for scoped directories 2025-09-10 18:58:29 +02:00
device rust: device: use kernel::{fmt,prelude::fmt!} 2025-09-16 09:26:59 +02:00
drm drm next for 6.18-rc1 2025-10-02 12:47:25 -07:00
fs Char/Misc/IIO/Binder changes for 6.18-rc1 2025-10-04 16:26:32 -07:00
io rust: Add read_poll_timeout function 2025-08-21 21:09:48 +02:00
irq rust: irq: add &Device<Bound> argument to irq callbacks 2025-08-12 20:33:33 +02:00
list rust: list: remove nonexistent generic parameter in link 2025-07-20 19:29:19 +02:00
mm rust: mm: update ARef and AlwaysRefCounted imports from sync::aref 2025-09-13 16:55:15 -07:00
net Networking changes for 6.18. 2025-10-02 15:17:01 -07:00
pci rust: pci: display symbolic PCI vendor names 2025-09-25 15:52:00 +02:00
sync Rust changes for v6.18 2025-09-30 19:12:49 -07:00
time rust: hrtimer: Add HrTimer::expires() 2025-09-04 16:54:39 +02:00
.gitignore rust: Add warn_on macro 2025-07-23 02:05:58 +02:00
acpi.rs rust: acpi: use core::ffi::CStr method names 2025-09-16 09:26:59 +02:00
alloc.rs Summary of significant series in this pull request: 2025-10-02 18:18:33 -07:00
auxiliary.rs Driver core changes for 6.18-rc1 2025-10-01 08:39:23 -07:00
bitmap.rs rust: add find_bit_benchmark_rust module. 2025-09-22 15:52:44 -04:00
bits.rs rust: bits: add support for bits/genmask macros 2025-07-19 23:18:18 +02:00
block.rs rust: block: add block related constants 2025-09-02 05:23:56 -06:00
bug.rs rust: Add warn_on macro 2025-07-23 02:05:58 +02:00
build_assert.rs rust: add build_error! to the prelude 2025-01-10 00:19:09 +01:00
clk.rs Rust changes for v6.17 2025-08-03 13:49:10 -07:00
configfs.rs for-6.18/block-20250929 2025-10-02 10:16:56 -07:00
cpu.rs rust: kernel: cpu: mark CpuId::current() inline 2025-09-14 23:58:45 +02:00
cpufreq.rs Merge branch 'pm-cpufreq' 2025-10-07 12:31:46 +02:00
cpumask.rs rust: cpumask: Mark CpumaskVar as transparent 2025-08-14 09:55:47 +05:30
cred.rs Char/Misc/IIO/Binder changes for 6.18-rc1 2025-10-04 16:26:32 -07:00
debugfs.rs rust: debugfs: Add support for scoped directories 2025-09-10 18:58:29 +02:00
device_id.rs modpost: Add modname to mod_device_table alias 2025-09-24 09:10:45 -07:00
device.rs Driver core changes for 6.18-rc1 2025-10-01 08:39:23 -07:00
devres.rs drm next for 6.18-rc1 2025-10-02 12:47:25 -07:00
dma.rs dma-mapping updates for Linux 6.18: 2025-10-03 17:41:12 -07:00
driver.rs driver: rust: expand documentation for driver infrastructure 2025-08-12 15:23:49 +02:00
error.rs rust: error: improve to_result documentation 2025-09-10 00:10:10 +02:00
faux.rs rust: faux: fix C header link 2025-08-13 17:40:28 +02:00
firmware.rs rust: firmware: use core::ffi::CStr method names 2025-09-16 09:26:59 +02:00
fmt.rs rust: kernel: add fmt module 2025-07-21 01:16:35 +02:00
fs.rs rust: fs: add Kiocb struct 2025-09-06 13:27:20 +02:00
generated_arch_reachable_asm.rs.S rust: Add warn_on macro 2025-07-23 02:05:58 +02:00
generated_arch_static_branch_asm.rs.S rust: jump_label: skip formatting generated file 2024-11-20 13:32:42 -05:00
generated_arch_warn_asm.rs.S rust: Add warn_on macro 2025-07-23 02:05:58 +02:00
id_pool.rs rust: add dynamic ID pool abstraction for bitmap 2025-09-22 15:52:44 -04:00
init.rs Rust changes for v6.17 2025-08-03 13:49:10 -07:00
io.rs rust: Add read_poll_timeout function 2025-08-21 21:09:48 +02:00
ioctl.rs
iov.rs rust: iov: add iov_iter abstractions for ITER_DEST 2025-09-06 13:27:20 +02:00
irq.rs rust: irq: add support for threaded IRQs and handlers 2025-08-12 20:22:09 +02:00
jump_label.rs rust: jump_label: skip formatting generated file 2024-11-20 13:32:42 -05:00
kunit.rs linux_kselftest-kunit-6.18-rc1 2025-10-01 19:15:11 -07:00
lib.rs rust: pwm: Add Kconfig and basic data structures 2025-11-07 10:03:54 +01:00
list.rs rust: list: Add an example for ListLinksSelfPtr usage 2025-09-15 01:10:23 +02:00
maple_tree.rs rust: maple_tree: add MapleTreeAlloc 2025-09-21 14:22:19 -07:00
miscdevice.rs Char/Misc/IIO/Binder changes for 6.18-rc1 2025-10-04 16:26:32 -07:00
mm.rs rust: mm: update ARef and AlwaysRefCounted imports from sync::aref 2025-09-13 16:55:15 -07:00
net.rs
of.rs rust: of: use core::ffi::CStr method names 2025-09-16 09:26:59 +02:00
opp.rs Merge branches 'pm-em', 'pm-opp' and 'pm-devfreq' 2025-09-29 12:30:44 +02:00
page.rs Char/Misc/IIO/Binder changes for 6.18-rc1 2025-10-04 16:26:32 -07:00
pci.rs rust: pci: fix incorrect platform reference in PCI driver probe doc comment 2025-09-17 12:51:13 +02:00
pid_namespace.rs rust: pid_namespace: update AlwaysRefCounted imports from sync::aref 2025-08-19 13:08:41 +02:00
platform.rs rust: driver-core: Update ARef and AlwaysRefCounted imports from sync::aref 2025-08-15 22:34:41 +02:00
prelude.rs rust: prelude: re-export core::mem::{align,size}_of{,_val} 2025-09-08 00:11:19 +02:00
print.rs rust: use kernel::{fmt,prelude::fmt!} 2025-07-21 01:16:35 +02:00
processor.rs rust: Add cpu_relax() helper 2025-08-21 16:58:07 +02:00
ptr.rs rust: add Alignment type 2025-09-22 23:55:41 +02:00
pwm.rs rust: pwm: Add complete abstraction layer 2025-11-07 10:03:55 +01:00
rbtree.rs rust: rbtree: simplify finding current in remove_current 2025-07-14 23:53:35 +02:00
regulator.rs rust: regulator: add devm_enable and devm_enable_optional 2025-09-10 21:02:16 +01:00
revocable.rs Rust changes for v6.17 2025-08-03 13:49:10 -07:00
scatterlist.rs rust: scatterlist: Add abstraction for sg_table 2025-09-04 23:33:50 +02:00
security.rs rust_binder: add Rust Binder driver 2025-09-19 09:40:46 +02:00
seq_file.rs rust: seq_file: use kernel::{fmt,prelude::fmt!} 2025-09-16 09:26:59 +02:00
sizes.rs rust: sizes: add constants up to SZ_2G 2025-06-23 18:12:30 +02:00
static_assert.rs rust: use absolute paths in macros referencing core and kernel 2025-05-23 00:12:14 +02:00
std_vendor.rs rust: convert raw URLs to Markdown autolinks in comments 2025-05-12 00:20:25 +02:00
str.rs rust: block: use NullTerminatedFormatter 2025-09-02 05:23:56 -06:00
sync.rs rust: implement kernel::sync::Refcount 2025-09-15 09:38:35 +02:00
task.rs rust: task: update ARef and AlwaysRefCounted imports from sync::aref 2025-09-08 00:11:19 +02:00
time.rs rust: time: Implement basic arithmetic operations for Delta 2025-09-04 16:56:48 +02:00
tracepoint.rs
transmute.rs rust: transmute: add from_bytes_copy method to FromBytes trait 2025-08-28 22:31:17 +09:00
types.rs Rust changes for v6.17 2025-08-03 13:49:10 -07:00
uaccess.rs rust: uaccess: use newtype for user pointers 2025-07-14 23:52:45 +02:00
usb.rs rust: usb: keep usb::Device private for now 2025-09-26 08:09:08 +02:00
workqueue.rs rust: pin-init: add pin projections to #[pin_data] 2025-09-11 23:26:20 +02:00
xarray.rs rust: types: add FOREIGN_ALIGN to ForeignOwnable 2025-07-14 23:55:24 +02:00