Skip to content

Commit e44ef5b

Browse files
authored
Merge pull request #609 from wedsonaf/device-removal
rust: simplify `DeviceRemoval` requirement.
2 parents 4bb4f38 + 1fbd7db commit e44ef5b

File tree

2 files changed

+29
-38
lines changed

2 files changed

+29
-38
lines changed

rust/kernel/amba.rs

Lines changed: 11 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,6 @@ use crate::{
88
bindings, c_types, device, driver, error::from_kernel_result, io_mem::Resource, power,
99
str::CStr, to_result, types::PointerWrapper, Error, Result, ThisModule,
1010
};
11-
use core::{marker::PhantomData, ops::Deref};
1211

1312
/// A registration of an amba driver.
1413
pub type Registration<T> = driver::Registration<Adapter<T>>;
@@ -27,12 +26,9 @@ pub struct DeviceId<T = ()> {
2726
}
2827

2928
/// An amba driver.
30-
pub trait Driver
31-
where
32-
<Self::Data as Deref>::Target: driver::DeviceRemoval,
33-
{
29+
pub trait Driver {
3430
/// Data stored on device by driver.
35-
type Data: PointerWrapper + Send + Sync + Deref;
31+
type Data: PointerWrapper + Send + Sync + driver::DeviceRemoval = ();
3632

3733
/// The type that implements the power-management operations.
3834
///
@@ -56,14 +52,9 @@ where
5652
}
5753

5854
/// An adapter for the registration of Amba drivers.
59-
pub struct Adapter<T: Driver>(PhantomData<T>)
60-
where
61-
<T::Data as Deref>::Target: driver::DeviceRemoval;
55+
pub struct Adapter<T: Driver>(T);
6256

63-
impl<T: Driver> driver::DriverOps for Adapter<T>
64-
where
65-
<T::Data as Deref>::Target: driver::DeviceRemoval,
66-
{
57+
impl<T: Driver> driver::DriverOps for Adapter<T> {
6758
type RegType = bindings::amba_driver;
6859
type RawIdType = bindings::amba_id;
6960
type IdType = DeviceId<T::IdInfo>;
@@ -112,10 +103,7 @@ where
112103
unsafe extern "C" fn probe_callback<T: Driver>(
113104
adev: *mut bindings::amba_device,
114105
aid: *const bindings::amba_id,
115-
) -> c_types::c_int
116-
where
117-
<T::Data as Deref>::Target: driver::DeviceRemoval,
118-
{
106+
) -> c_types::c_int {
119107
from_kernel_result! {
120108
// SAFETY: `adev` is valid by the contract with the C code. `dev` is alive only for the
121109
// duration of this call, so it is guaranteed to remain alive for the lifetime of `dev`.
@@ -133,18 +121,15 @@ where
133121
}
134122
}
135123

136-
unsafe extern "C" fn remove_callback<T: Driver>(adev: *mut bindings::amba_device)
137-
where
138-
<T::Data as Deref>::Target: driver::DeviceRemoval,
139-
{
124+
unsafe extern "C" fn remove_callback<T: Driver>(adev: *mut bindings::amba_device) {
140125
// SAFETY: `adev` is valid by the contract with the C code.
141126
let ptr = unsafe { bindings::amba_get_drvdata(adev) };
142127
// SAFETY: The value returned by `amba_get_drvdata` was stored by a previous call to
143128
// `amba_set_drvdata` in `probe_callback` above; the value comes from a call to
144129
// `T::Data::into_pointer`.
145130
let data = unsafe { T::Data::from_pointer(ptr) };
146131
T::remove(&data);
147-
<<T::Data as Deref>::Target as driver::DeviceRemoval>::device_remove(data.deref());
132+
<T::Data as driver::DeviceRemoval>::device_remove(&data);
148133
}
149134

150135
/// An Amba device.
@@ -210,16 +195,11 @@ unsafe impl device::RawDevice for Device {
210195
/// # use kernel::prelude::*;
211196
/// # use kernel::{amba, declare_amba_id_table, module_amba_driver};
212197
/// #
213-
/// # struct State;
214-
/// # impl kernel::driver::DeviceRemoval for State {
215-
/// # fn device_remove(&self) {}
216-
/// # }
217198
/// struct MyDriver;
218199
/// impl amba::Driver for MyDriver {
219200
/// // [...]
220-
/// # type Data = kernel::sync::Ref<State>;
221-
/// # fn probe(dev: &mut amba::Device, id: &amba::DeviceId<Self::IdInfo>) -> Result<Self::Data> {
222-
/// # todo!()
201+
/// # fn probe(_dev: &mut amba::Device, _id: &amba::DeviceId<Self::IdInfo>) -> Result {
202+
/// # Ok(())
223203
/// # }
224204
/// # declare_amba_id_table! [
225205
/// # { id: 0x00041061, mask: 0x000fffff, data: () },
@@ -248,15 +228,10 @@ macro_rules! module_amba_driver {
248228
/// # use kernel::prelude::*;
249229
/// # use kernel::{amba, declare_amba_id_table};
250230
/// #
251-
/// # struct State;
252-
/// # impl kernel::driver::DeviceRemoval for State {
253-
/// # fn device_remove(&self) {}
254-
/// # }
255231
/// # struct Sample;
256232
/// # impl kernel::amba::Driver for Sample {
257-
/// # type Data = kernel::sync::Ref<State>;
258-
/// # fn probe(dev: &mut amba::Device, id: &amba::DeviceId<Self::IdInfo>) -> Result<Self::Data> {
259-
/// # todo!()
233+
/// # fn probe(_dev: &mut amba::Device, _id: &amba::DeviceId<Self::IdInfo>) -> Result {
234+
/// # Ok(())
260235
/// # }
261236
/// declare_amba_id_table! [
262237
/// { id: 0x00041061, mask: 0x000fffff, data: () },

rust/kernel/driver.rs

Lines changed: 18 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,9 +5,9 @@
55
//! Each bus/subsystem is expected to implement [`DriverOps`], which allows drivers to register
66
//! using the [`Registration`] class.
77
8-
use crate::{str::CStr, Error, KernelModule, Result, ScopeGuard, ThisModule};
8+
use crate::{str::CStr, sync::Ref, Error, KernelModule, Result, ScopeGuard, ThisModule};
99
use alloc::{boxed::Box, vec::Vec};
10-
use core::{cell::UnsafeCell, mem::MaybeUninit, pin::Pin};
10+
use core::{cell::UnsafeCell, mem::MaybeUninit, ops::Deref, pin::Pin};
1111

1212
/// A subsystem (e.g., PCI, Platform, Amba, etc.) that allows drivers to be written for it.
1313
pub trait DriverOps {
@@ -171,6 +171,22 @@ pub trait DeviceRemoval {
171171
fn device_remove(&self);
172172
}
173173

174+
impl DeviceRemoval for () {
175+
fn device_remove(&self) {}
176+
}
177+
178+
impl<T: DeviceRemoval> DeviceRemoval for Ref<T> {
179+
fn device_remove(&self) {
180+
self.deref().device_remove();
181+
}
182+
}
183+
184+
impl<T: DeviceRemoval> DeviceRemoval for Box<T> {
185+
fn device_remove(&self) {
186+
self.deref().device_remove();
187+
}
188+
}
189+
174190
/// A kernel module that only registers the given driver on init.
175191
///
176192
/// This is a helper struct to make it easier to define single-functionality modules, in this case,

0 commit comments

Comments
 (0)