> On 12 Jul 2025, at 18:24, Danilo Krummrich <dakr@xxxxxxxxxx> wrote: > > On Thu Jul 3, 2025 at 9:30 PM CEST, Daniel Almeida wrote: >> +/// Callbacks for an IRQ handler. >> +pub trait Handler: Sync { >> + /// The hard IRQ handler. >> + /// >> + /// This is executed in interrupt context, hence all corresponding >> + /// limitations do apply. >> + /// >> + /// All work that does not necessarily need to be executed from >> + /// interrupt context, should be deferred to a threaded handler. >> + /// See also [`ThreadedRegistration`]. >> + fn handle(&self) -> IrqReturn; >> +} > > One thing I forgot, the IRQ handlers should have a &Device<Bound> argument, > i.e.: > > fn handle(&self, dev: &Device<Bound>) -> IrqReturn > > IRQ registrations naturally give us this guarantee, so we should take advantage > of that. > > - Danilo Hi Danilo, I do not immediately see a way to get a Device<Bound> from here: unsafe extern "C" fn handle_irq_callback<T: Handler>(_irq: i32, ptr: *mut c_void) -> c_uint { Refall that we've established `ptr` to be the address of the handler. This came after some back and forth and after the extensive discussion that Benno and Boqun had w.r.t to pinning in request_irq().