Re: [RFC PATCH 0/3] rust: power_supply class abstraction and SMB347 charger driver
Sebastian Reichel <[email protected]> Sat, 25 Jul 2026 03:41:35 +0200
| Newsgroups | org.kernel.vger.linux-i2c,org.kernel.vger.linux-kernel,org.kernel.vger.linux-pm,org.kernel.vger.rust-for-linux |
|---|---|
| Message-ID | <amQPYhBkj9rIdSZ_@venus> |
Hi, On Wed, Jul 08, 2026 at 09:47:35PM +0000, Bruce Robertson wrote: > This series adds a Rust abstraction for the power supply class -- which > does not currently exist in mainline or rust-next -- together with the > SMBus helpers needed to drive an I2C charger from Rust, Having Rust bindings for new drivers sounds good to me. > and a Rust port of the Summit SMB347 battery charger as the first > consumer. Any reason for Summit SMB347 specifically? I would prefer not to have two drivers for the same hardware. Looks like this is used by just three relatively old devices: rg -l '"summit,smb347"' arch arch/arm/boot/dts/ti/omap/omap4-samsung-espresso10.dts arch/arm/boot/dts/nvidia/tegra30-asus-nexus7-grouper-common.dtsi arch/arm/boot/dts/samsung/exynos4412-p4note.dtsi All are ARM32 based, so Rust is at least available by all users. So I suppose replacing this C driver would be an option, OTOH I don't want to motivate people to rewrite things either :) > Motivation > ---------- > Rust drivers for power supply hardware are currently blocked: there is > no safe Rust interface to the power supply class, and the I2cClient > abstraction exposes no register I/O. This series provides a minimal, > self-contained path from binding an I2C charger to reporting charging > state through sysfs, entirely in safe Rust, with the unsafe FFI confined > to the two abstraction layers. > > The series is structured abstraction-first: > > 1/3 Safe SMBus read/write/update_bits over i2c::I2cClient. > 2/3 A power_supply Driver trait, a generic get_property trampoline, > and an RAII Registration that owns the descriptor lifetime. > 3/3 A Rust SMB347 charger driver consuming both: it binds over I2C > and reports STATUS, ONLINE and CHARGE_TYPE. A new driver supporting CHARGE_TYPE should also support CHARGE_TYPES. > Testing > ------- > Built and exercised against an emulated SMB347 using i2c-stub: seeding > the chip's status registers and reading back the corresponding sysfs > attributes (status, online, charge_type) confirms the full C->Rust->C > path. No physical hardware or interrupt path has been tested. If the idea is to just have a user for the Rust binding and something to test/play around: Maybe convert test_power instead? It would also decouple the power-supply Rust bindings from I2C/SMBus. The disadvantage is, that this driver is a special-case, since it has no parent device :) Greetings, -- Sebastian > Open questions / known limitations (hence RFC) > ---------------------------------------------- > - get_property recovers the driver's private data via the parent > device's drvdata. The current code relies on the observed ordering > (callbacks only fire after probe() has set drvdata); the contract > should be made explicit. > - smbus_update_bits() is not atomic against concurrent callers; a lock > will be required before a charger IRQ handler is added (not yet > implemented). > - Only get_property and a handful of properties are wired up; > set_property, property_is_writeable and the IRQ-driven > power_supply_changed() notification are future work. > > Feedback on the abstraction's shape -- especially the descriptor > lifetime and the drvdata recovery -- would be very welcome. > > checkpatch emits one MAINTAINERS warning on patch 3/3 (new driver file); > it is a false positive -- the driver is covered by the existing POWER > SUPPLY CLASS "F: drivers/power/supply/" glob and needs no new entry. > Patch 2/3 adds the one file outside any existing glob > (rust/kernel/power_supply.rs) and updates MAINTAINERS accordingly. > > Based on rust-next (v7.2-rc1). > > Bruce Robertson (3): > rust: i2c: add SMBus byte transfer helpers > rust: power_supply: add power supply class abstraction > power: supply: add Rust SMB347 charger driver > > MAINTAINERS | 1 + > drivers/power/supply/Kconfig | 14 ++ > drivers/power/supply/Makefile | 1 + > drivers/power/supply/smb347-charger_rust.rs | 180 ++++++++++++++++++++ > rust/bindings/bindings_helper.h | 1 + > rust/kernel/i2c.rs | 42 +++++ > rust/kernel/lib.rs | 1 + > rust/kernel/power_supply.rs | 133 +++++++++++++++ > 8 files changed, 373 insertions(+) > create mode 100644 drivers/power/supply/smb347-charger_rust.rs > create mode 100644 rust/kernel/power_supply.rs > > -- > 2.43.0 >
signature.asc
(application/pgp-signature, 833 B)
-----BEGIN PGP SIGNATURE----- iQIzBAABCgAdFiEE72YNB0Y/i3JqeVQT2O7X88g7+poFAmpkFEsACgkQ2O7X88g7 +pqG5A/+OXDSMBBeBQeHtPnntBd8Wx6nflqqmyNWgjtgNzc1Hmk+yQzj2BFnvkwq UwzB7KOiUxVJbNzOuV19yRqVeSFmxYHGXEUzNsQNFHBpvSPopOj/IN/sd3uw6eEw w8a356v9gJdEP/cMd2pKOKQmRzDDDwNbMSOYaAxhMLaBa8kSepf37L2nWx8RnxoK 7Usvij75cQN4RIsGzg5QsjwujoSNuBdk0naHkGUsdVjq0eTPLiYMeIck6nQ69VtU NUsUy96WDAgiZJU+iir1rh/IVRJQS+nNO/Kd41ANyMhP47e3idOVJ24PJivjFnWw wq8wKSGxOT9rhkrLDddgJwFKKeZYp5AH2NmvquSCS3xF3k1uSow2uPmBYpP9nx4K Aay0TjibqIJWt58swQegj2OpogWn72VTs7l3HQUp6ARy06FOv/LXxFMPKWDnH22u vL4MrUC+Brbt5751q6hOfna9399fv+C8KO6WblFlBXs5hfumLNjbWilNCy/BH+6v 7QOcT1WvOuwbNAsMnECGSsf/Tlv4EVh/6XBYl9eN8PrlIM/r6lnXGVZUgwtwbz0w 3MsLJwdBiqHKPYZsHr1NN5Uy5+GUhkHORT3Rc+3YbxyR0PRrnanu3dTvSY6pHsLQ mhW9p1sgguehZBDH6411FwsEkO+dMSCV8v1Q0AyPI2Q4RDCnaqQ= =V0FH -----END PGP SIGNATURE-----