Struct Registration

Source
pub struct Registration<T: Handler + 'static> { /* private fields */ }
Expand description

A registration of an IRQ handler for a given IRQ line.

§Examples

The following is an example of using Registration. It uses a Completion to coordinate between the IRQ handler and process context. Completion uses interior mutability, so the handler can signal with Completion::complete_all() and the process context can wait with Completion::wait_for_completion() even though there is no way to get a mutable reference to the any of the fields in Data.

use kernel::c_str;
use kernel::device::{Bound, Device};
use kernel::irq::{self, Flags, IrqRequest, IrqReturn, Registration};
use kernel::prelude::*;
use kernel::sync::{Arc, Completion};

// Data shared between process and IRQ context.
#[pin_data]
struct Data {
    #[pin]
    completion: Completion,
}

impl irq::Handler for Data {
    // Executed in IRQ context.
    fn handle(&self, _dev: &Device<Bound>) -> IrqReturn {
        self.completion.complete_all();
        IrqReturn::Handled
    }
}

// Registers an IRQ handler for the given IrqRequest.
//
// This runs in process context and assumes `request` was previously acquired from a device.
fn register_irq(
    handler: impl PinInit<Data, Error>,
    request: IrqRequest<'_>,
) -> Result<Arc<Registration<Data>>> {
    let registration = Registration::new(request, Flags::SHARED, c_str!("my_device"), handler);

    let registration = Arc::pin_init(registration, GFP_KERNEL)?;

    registration.handler().completion.wait_for_completion();

    Ok(registration)
}

§Invariants

  • We own an irq handler whose cookie is a pointer to Self.

Implementations§

Source§

impl<T: Handler + 'static> Registration<T>

Source

pub fn new<'a>( request: IrqRequest<'a>, flags: Flags, name: &'static CStr, handler: impl PinInit<T, Error> + 'a, ) -> impl PinInit<Self, Error> + 'a

Registers the IRQ handler with the system for the given IRQ number.

Source

pub fn handler(&self) -> &T

Returns a reference to the handler that was registered with the system.

Source

pub fn try_synchronize(&self) -> Result

Wait for pending IRQ handlers on other CPUs.

This will attempt to access the inner Devres container.

Source

pub fn synchronize(&self, dev: &Device<Bound>) -> Result

Wait for pending IRQ handlers on other CPUs.

Trait Implementations§

Source§

impl<T: Handler + 'static> HasPinData for Registration<T>

Source§

type PinData = __ThePinData<T>

Source§

unsafe fn __pin_data() -> Self::PinData

Auto Trait Implementations§

§

impl<T> !Freeze for Registration<T>

§

impl<T> !RefUnwindSafe for Registration<T>

§

impl<T> Send for Registration<T>
where T: Send,

§

impl<T> Sync for Registration<T>

§

impl<T> !UnwindSafe for Registration<T>

Blanket Implementations§

Source§

impl<T> Any for T
where T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

Source§

impl<T> Init<T> for T

Source§

unsafe fn __init(self, slot: *mut T) -> Result<(), Infallible>

Initializes slot. Read more
Source§

fn chain<F>(self, f: F) -> ChainInit<Self, F, T, E>
where F: FnOnce(&mut T) -> Result<(), E>,

First initializes the value using self then calls the function f with the initialized value. Read more
Source§

impl<T, U> Into<U> for T
where U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

That is, this conversion is whatever the implementation of From<T> for U chooses to do.

Source§

impl<T> PinInit<T> for T

Source§

unsafe fn __pinned_init(self, slot: *mut T) -> Result<(), Infallible>

Initializes slot. Read more
Source§

fn pin_chain<F>(self, f: F) -> ChainPinInit<Self, F, T, E>
where F: FnOnce(Pin<&mut T>) -> Result<(), E>,

First initializes the value using self then calls the function f with the initialized value. Read more
Source§

impl<T, U> TryFrom<U> for T
where U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.