Skip to content

Commit 84d3e28

Browse files
committed
gpio: pl061: add general data not protected by spinlock
This is in preparation for also storing the device on device data so that we can use `dev_info`, `dev_derr`, etc. when logging from the driver. No functional changes are intended. Signed-off-by: Wedson Almeida Filho <wedsonaf@google.com>
1 parent 42c9ff6 commit 84d3e28

File tree

1 file changed

+20
-14
lines changed

1 file changed

+20
-14
lines changed

drivers/gpio/gpio_pl061_rust.rs

Lines changed: 20 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -35,18 +35,22 @@ struct ContextSaveRegs {
3535
}
3636

3737
#[derive(Default)]
38-
struct PL061Data {
38+
struct PL061DataInner {
3939
csave_regs: ContextSaveRegs,
4040
}
4141

42+
struct PL061Data {
43+
inner: SpinLock<PL061DataInner>,
44+
}
45+
4246
struct PL061Resources {
4347
base: IoMem<GPIO_SIZE>,
4448
parent_irq: u32,
4549
}
4650

4751
type PL061Registrations = gpio::RegistrationWithIrqChip<PL061Device>;
4852

49-
type DeviceData = device::Data<PL061Registrations, PL061Resources, SpinLock<PL061Data>>;
53+
type DeviceData = device::Data<PL061Registrations, PL061Resources, PL061Data>;
5054

5155
struct PL061Device;
5256

@@ -71,7 +75,7 @@ impl gpio::Chip for PL061Device {
7175
}
7276

7377
fn direction_input(data: RefBorrow<'_, DeviceData>, offset: u32) -> Result {
74-
let _guard = data.lock_irqdisable();
78+
let _guard = data.inner.lock_irqdisable();
7579
let pl061 = data.resources().ok_or(Error::ENXIO)?;
7680
let mut gpiodir = pl061.base.readb(GPIODIR);
7781
gpiodir &= !bit(offset);
@@ -81,7 +85,7 @@ impl gpio::Chip for PL061Device {
8185

8286
fn direction_output(data: RefBorrow<'_, DeviceData>, offset: u32, value: bool) -> Result {
8387
let woffset = bit(offset + 2).into();
84-
let _guard = data.lock_irqdisable();
88+
let _guard = data.inner.lock_irqdisable();
8589
let pl061 = data.resources().ok_or(Error::ENXIO)?;
8690
pl061.base.try_writeb((value as u8) << offset, woffset)?;
8791
let mut gpiodir = pl061.base.readb(GPIODIR);
@@ -151,7 +155,7 @@ impl irq::Chip for PL061Device {
151155
return Err(Error::EINVAL);
152156
}
153157

154-
let _guard = data.lock_irqdisable();
158+
let _guard = data.inner.lock_irqdisable();
155159
let pl061 = data.resources().ok_or(Error::ENXIO)?;
156160

157161
let mut gpioiev = pl061.base.readb(GPIOIEV);
@@ -221,7 +225,7 @@ impl irq::Chip for PL061Device {
221225

222226
fn mask(data: RefBorrow<'_, DeviceData>, irq_data: &IrqData) {
223227
let mask = bit(irq_data.hwirq() % irq::HwNumber::from(PL061_GPIO_NR));
224-
let _guard = data.lock();
228+
let _guard = data.inner.lock();
225229
if let Some(pl061) = data.resources() {
226230
let gpioie = pl061.base.readb(GPIOIE) & !mask;
227231
pl061.base.writeb(gpioie, GPIOIE);
@@ -230,7 +234,7 @@ impl irq::Chip for PL061Device {
230234

231235
fn unmask(data: RefBorrow<'_, DeviceData>, irq_data: &IrqData) {
232236
let mask = bit(irq_data.hwirq() % irq::HwNumber::from(PL061_GPIO_NR));
233-
let _guard = data.lock();
237+
let _guard = data.inner.lock();
234238
if let Some(pl061) = data.resources() {
235239
let gpioie = pl061.base.readb(GPIOIE) | mask;
236240
pl061.base.writeb(gpioie, GPIOIE);
@@ -242,7 +246,7 @@ impl irq::Chip for PL061Device {
242246
// signal goes away.
243247
fn ack(data: RefBorrow<'_, DeviceData>, irq_data: &IrqData) {
244248
let mask = bit(irq_data.hwirq() % irq::HwNumber::from(PL061_GPIO_NR));
245-
let _guard = data.lock();
249+
let _guard = data.inner.lock();
246250
if let Some(pl061) = data.resources() {
247251
pl061.base.writeb(mask.into(), GPIOIC);
248252
}
@@ -273,14 +277,16 @@ impl amba::Driver for PL061Device {
273277
base: unsafe { IoMem::try_new(res)? },
274278
parent_irq: irq,
275279
},
276-
// SAFETY: We call `spinlock_init` below.
277-
unsafe { SpinLock::new(PL061Data::default()) },
280+
PL061Data {
281+
// SAFETY: We call `spinlock_init` below.
282+
inner: unsafe { SpinLock::new(PL061DataInner::default()) },
283+
},
278284
"PL061::Registrations"
279285
)?;
280286

281287
// SAFETY: General part of the data is pinned when `data` is.
282-
let gen = unsafe { data.as_mut().map_unchecked_mut(|d| &mut **d) };
283-
kernel::spinlock_init!(gen, "PL061::General");
288+
let gen_inner = unsafe { data.as_mut().map_unchecked_mut(|d| &mut (**d).inner) };
289+
kernel::spinlock_init!(gen_inner, "PL061Data::inner");
284290

285291
let data = Ref::<DeviceData>::from(data);
286292

@@ -301,7 +307,7 @@ impl power::Operations for PL061Device {
301307
type Data = Ref<DeviceData>;
302308

303309
fn suspend(data: RefBorrow<'_, DeviceData>) -> Result {
304-
let mut inner = data.lock();
310+
let mut inner = data.inner.lock();
305311
let pl061 = data.resources().ok_or(Error::ENXIO)?;
306312
inner.csave_regs.gpio_data = 0;
307313
inner.csave_regs.gpio_dir = pl061.base.readb(GPIODIR);
@@ -322,7 +328,7 @@ impl power::Operations for PL061Device {
322328
}
323329

324330
fn resume(data: RefBorrow<'_, DeviceData>) -> Result {
325-
let inner = data.lock();
331+
let inner = data.inner.lock();
326332
let pl061 = data.resources().ok_or(Error::ENXIO)?;
327333

328334
for offset in 0..PL061_GPIO_NR {

0 commit comments

Comments
 (0)