Alice, > On 21 Jul 2025, at 11:38, Alice Ryhl <aliceryhl@xxxxxxxxxx> wrote: > > When working with a bus device, many operations are only possible while > the device is still bound. The &Device<Bound> type represents a proof in > the type system that you are in a scope where the device is guaranteed > to still be bound. Since we deregister irq callbacks when unbinding a > device, if an irq callback is running, that implies that the device has > not yet been unbound. > > To allow drivers to take advantage of that, add an additional argument > to irq callbacks. > > Signed-off-by: Alice Ryhl <aliceryhl@xxxxxxxxxx> > --- > This patch is a follow-up to Daniel's irq series [1] that adds a > &Device<Bound> argument to all irq callbacks. This allows you to use > operations that are only safe on a bound device inside an irq callback. > > The patch is otherwise based on top of driver-core-next. > > [1]: https://lore.kernel.org/r/20250715-topics-tyr-request_irq2-v7-0-d469c0f37c07@xxxxxxxxxxxxx I am having a hard time applying this locally. > /// > /// This function should be only used as the callback in `request_irq`. > unsafe extern "C" fn handle_irq_callback<T: Handler>(_irq: i32, ptr: *mut c_void) -> c_uint { > - // SAFETY: `ptr` is a pointer to T set in `Registration::new` > - let handler = unsafe { &*(ptr as *const T) }; > - T::handle(handler) as c_uint > + // SAFETY: `ptr` is a pointer to `Registration<T>` set in `Registration::new` > + let registration = unsafe { &*(ptr as *const Registration<T>) }; > + // SAFETY: The irq callback is removed before the device is unbound, so the fact that the irq > + // callback is running implies that the device has not yet been unbound. > + let device = unsafe { registration.inner.device().as_bound() }; Where was this function introduced? i.e. I am missing the change that brought in RegistrationInner::device(), or maybe some Deref impl that would make this possible? Also, I wonder if we can't make the scope of this unsafe block smaller? — Daniel