On Thu, Oct 26, 2023 at 09:34:51PM -0300, Martin Rodriguez Reboredo wrote: > This is a demonstration of the capabilities of doing bindings with > subsystems that may or may not be statically linked. > > Signed-off-by: Martin Rodriguez Reboredo <yakoyoku@xxxxxxxxx> > --- > drivers/usb/core/Kconfig | 7 +++++++ > drivers/usb/core/Makefile | 3 +++ > drivers/usb/core/usb.rs | 13 +++++++++++++ > samples/rust/Kconfig | 10 ++++++++++ > samples/rust/Makefile | 3 +++ > samples/rust/rust_usb_simple.rs | 22 ++++++++++++++++++++++ > 6 files changed, 58 insertions(+) > create mode 100644 drivers/usb/core/usb.rs > create mode 100644 samples/rust/rust_usb_simple.rs > > diff --git a/drivers/usb/core/Kconfig b/drivers/usb/core/Kconfig > index 351ede4b5de2..4b5604282129 100644 > --- a/drivers/usb/core/Kconfig > +++ b/drivers/usb/core/Kconfig > @@ -116,3 +116,10 @@ config USB_AUTOSUSPEND_DELAY > The default value Linux has always had is 2 seconds. Change > this value if you want a different delay and cannot modify > the command line or module parameter. > + > +config USB_RUST > + bool "Rust USB bindings" > + depends on USB && RUST > + default n Nit, "n" is the default, this line is not needed. Also, if you want to get really picky, _which_ USB is this for, the "host" apis (you plug a USB device into a Linux maching), or the "gadget" apis (i.e. Linux is running in the device that you plug into a USB host)? Linux supports both :) > + help > + Enables Rust bindings for USB. > diff --git a/drivers/usb/core/Makefile b/drivers/usb/core/Makefile > index 7d338e9c0657..00e116913591 100644 > --- a/drivers/usb/core/Makefile > +++ b/drivers/usb/core/Makefile > @@ -11,6 +11,7 @@ usbcore-y += phy.o port.o > usbcore-$(CONFIG_OF) += of.o > usbcore-$(CONFIG_USB_PCI) += hcd-pci.o > usbcore-$(CONFIG_ACPI) += usb-acpi.o > +usbcore-$(CONFIG_USB_RUST) += libusb.rlib > > ifdef CONFIG_USB_ONBOARD_HUB > usbcore-y += ../misc/onboard_usb_hub_pdevs.o > @@ -18,4 +19,6 @@ endif > > obj-$(CONFIG_USB) += usbcore.o > > +rust-libs := ./usb > + > obj-$(CONFIG_USB_LEDS_TRIGGER_USBPORT) += ledtrig-usbport.o > diff --git a/drivers/usb/core/usb.rs b/drivers/usb/core/usb.rs > new file mode 100644 > index 000000000000..3f7ad02153f5 > --- /dev/null > +++ b/drivers/usb/core/usb.rs > @@ -0,0 +1,13 @@ > +// SPDX-License-Identifier: GPL-2.0 > + > +//! USB devices and drivers. > +//! > +//! C header: [`include/linux/usb.h`](../../../../include/linux/usb.h) > + > +use kernel::bindings; > + > +/// Check if USB is disabled. > +pub fn disabled() -> bool { > + // SAFETY: FFI call. > + unsafe { bindings::usb_disabled() != 0 } > +} > diff --git a/samples/rust/Kconfig b/samples/rust/Kconfig > index b0f74a81c8f9..12116f6fb526 100644 > --- a/samples/rust/Kconfig > +++ b/samples/rust/Kconfig > @@ -30,6 +30,16 @@ config SAMPLE_RUST_PRINT > > If unsure, say N. > > +config SAMPLE_RUST_USB_SIMPLE > + tristate "USB simple device driver" > + help > + This option builds the Rust USB simple driver sample. > + > + To compile this as a module, choose M here: > + the module will be called rust_usb_simple. > + > + If unsure, say N. > + > config SAMPLE_RUST_HOSTPROGS > bool "Host programs" > help > diff --git a/samples/rust/Makefile b/samples/rust/Makefile > index 03086dabbea4..f1ab58a9ecdd 100644 > --- a/samples/rust/Makefile > +++ b/samples/rust/Makefile > @@ -2,5 +2,8 @@ > > obj-$(CONFIG_SAMPLE_RUST_MINIMAL) += rust_minimal.o > obj-$(CONFIG_SAMPLE_RUST_PRINT) += rust_print.o > +obj-$(CONFIG_SAMPLE_RUST_USB_SIMPLE) += rust_usb_simple.o > + > +rust-libs := ../../drivers/usb/core/usb > > subdir-$(CONFIG_SAMPLE_RUST_HOSTPROGS) += hostprogs > diff --git a/samples/rust/rust_usb_simple.rs b/samples/rust/rust_usb_simple.rs > new file mode 100644 > index 000000000000..3523f81d5eb8 > --- /dev/null > +++ b/samples/rust/rust_usb_simple.rs > @@ -0,0 +1,22 @@ > +// SPDX-License-Identifier: GPL-2.0 > + > +//! Rust USB sample. > + > +use kernel::prelude::*; > + > +module! { > + type: UsbSimple, > + name: "rust_usb_simple", > + author: "Martin Rodriguez Reboredo", > + description: "Rust USB sample", > + license: "GPL v2", > +} > + > +struct UsbSimple; "USBSimple" please. > + > +impl kernel::Module for UsbSimple { > + fn init(_module: &'static ThisModule) -> Result<Self> { > + pr_info!("usb enabled: {}", !usb::disabled()); > + Ok(UsbSimple) > + } > +} I know this is just a fake patch to test the bindings logic, so sorry for the noise, just wanted to get terminology right :) thanks, greg k-h