Re: [PATCH RFC 0/6] Rust Abstractions for PWM subsystem with TH1520 PWM driver

Michal Wilczynski
2025-05-26T08:23:06Z

On 5/25/25 00:21, Drew Fustini wrote:
> On Sat, May 24, 2025 at 11:14:54PM +0200, Michal Wilczynski wrote:
>> This patch series introduces Rust support for the T-HEAD TH1520 PWM
>> controller and demonstrates its use for fan control on the Sipeed Lichee
>> Pi 4A board.
>>
>> The primary goal of this patch series is to introduce a basic set of
>> Rust abstractions for the Linux PWM subsystem. As a first user and
>> practical demonstration of these abstractions, the series also provides
>> a functional PWM driver for the T-HEAD TH1520 SoC. This allows control
>> of its PWM channels and ultimately enables temperature controlled fan
>> support for the Lichee Pi 4A board. This work aims to explore the use of
>> Rust for PWM drivers and lay a foundation for potential future
>> Rust based PWM drivers.
>>
>> The series is structured as follows:
>>
>> Patch 1/6: Introduce basic PWM abstractions
>> This patch lays the groundwork by adding a Kconfig option for Rust PWM
>> abstractions, necessary C helper functions, and a new Rust module
>> (rust/kernel/pwm.rs). This module provides initial safe wrappers for
>> core PWM data structures (Chip, Device, State, Args, Polarity) and
>> functions (devm_chip_alloc, devm_chip_add), along with a basic PwmOps
>> trait focusing on the .apply callback needed by PWM chip providers.
>>
>> Patch 2/6: Add PWM driver for TH1520 SoC
>> This introduces the Rust based PWM driver for the T-HEAD TH1520 SoC.
>> It implements the PwmOps trait using the abstractions from the first
>> patch and handles the specifics of the TH1520 hardware for configuring
>> period, duty cycle, and polarity. Resource management leverages devm
>> for the PWM chip and Rust DevRes for I/O memory, and RAII for clock
>> handling.
>>
>> Patch 3/6: dt-bindings: Add PWM T-HEAD controller dt-binding
>> This patch adds the Device Tree binding documentation for the T-HEAD
>> TH1520 PWM controller.
>>
>> Patch 4/6: riscv: dts: thead:: Add PWM controller node
>> This patch adds the actual Device Tree node for the TH1520 PWM controller.
>>
>> Patch 5/6: riscv: dts: thead: Add PVT node
>> Add pvt node for thermal sensor.
>>
>> Patch 6/6: riscv: dts: thead: Add PWM fan and thermal control
>> This final patch adds the Device Tree configuration for a PWM controlled
>> fan to the Sipeed Lichee Pi 4A board DTS file.
>>
>> Testing:
>> Tested on the TH1520 SoC. The fan works correctly.
>>
>> Points for Discussion:
>> The rust/kernel/pwm.rs abstraction layer is currently minimal,
>> focusing on the immediate needs of this driver. Feedback on its design,
>> scope, and potential for generalization would be highly appreciated.
>> General feedback on the Rust implementation, FFI wrapping patterns, and
>> adherence to kernel development practices is very welcome.
>>
>> The patches are based on rust-next, with some dependencies which are not
>> merged yet - platform Io support [1] and clk abstractions [2].
>>
>> Reference repository with all the patches together can be found on
>> github [3].
>>
>> [1] - https://lore.kernel.org/rust-for-linux/20250509-topics-tyr-platform_iomem-v8-0-e9f1725a40da@collabora.com/
>> [2] - https://lore.kernel.org/rust-for-linux/0ec0250c1170a8a6efb2db7a6cb49ae974d7ce05.1747634382.git.viresh.kumar@linaro.org/
>> [3] - https://protect2.fireeye.com/v1/url?k=53ce9a1b-32458f21-53cf1154-74fe4860008a-0c44c7bcb0c6b2a5&q=1&e=b41cbed0-2556-4543-be6a-a1333ab74001&u=https%3A%2F%2Fgithub.com%2Fmwilczy%2Flinux%2Fcommits%2Frust-next-pwm-working-fan-for-sending%2F
>
> Thanks for the patch series. It will be great to have PWM working
> upstream.
>
> I've not built Linux with Rust before, so I'm going through the quick
> start [1]. I've also never built Linux with LLVM before but clang seems
> like the best compiler to use for Rust. Are you using LLVM?

Hi Drew,
You're correct, Clang is the way to go for Rust in the kernel. I also
followed the official quick start guide. To answer your question
directly: yes, I'm using LLVM. This is the exact command I use for
cross-compilation:

make ARCH=riscv LLVM=1

CROSS_COMPILATION variable seems to be unnecessary for the LLVM
toolchain.

After the build, I load the kernel binary onto my Lichee Pi 4A board
(running Debian Trixie) via TFTP, which is the same process I used with
the GNU toolchain.

>
> Drew
>
> [1] https://docs.kernel.org/rust/quick-start.html
>

Best regards,
--
Michal Wilczynski <m.wilczynski@samsung.com>