@@ -35,18 +35,22 @@ struct ContextSaveRegs {
35
35
}
36
36
37
37
#[ derive( Default ) ]
38
- struct PL061Data {
38
+ struct PL061DataInner {
39
39
csave_regs : ContextSaveRegs ,
40
40
}
41
41
42
+ struct PL061Data {
43
+ inner : SpinLock < PL061DataInner > ,
44
+ }
45
+
42
46
struct PL061Resources {
43
47
base : IoMem < GPIO_SIZE > ,
44
48
parent_irq : u32 ,
45
49
}
46
50
47
51
type PL061Registrations = gpio:: RegistrationWithIrqChip < PL061Device > ;
48
52
49
- type DeviceData = device:: Data < PL061Registrations , PL061Resources , SpinLock < PL061Data > > ;
53
+ type DeviceData = device:: Data < PL061Registrations , PL061Resources , PL061Data > ;
50
54
51
55
struct PL061Device ;
52
56
@@ -71,7 +75,7 @@ impl gpio::Chip for PL061Device {
71
75
}
72
76
73
77
fn direction_input ( data : RefBorrow < ' _ , DeviceData > , offset : u32 ) -> Result {
74
- let _guard = data. lock_irqdisable ( ) ;
78
+ let _guard = data. inner . lock_irqdisable ( ) ;
75
79
let pl061 = data. resources ( ) . ok_or ( Error :: ENXIO ) ?;
76
80
let mut gpiodir = pl061. base . readb ( GPIODIR ) ;
77
81
gpiodir &= !bit ( offset) ;
@@ -81,7 +85,7 @@ impl gpio::Chip for PL061Device {
81
85
82
86
fn direction_output ( data : RefBorrow < ' _ , DeviceData > , offset : u32 , value : bool ) -> Result {
83
87
let woffset = bit ( offset + 2 ) . into ( ) ;
84
- let _guard = data. lock_irqdisable ( ) ;
88
+ let _guard = data. inner . lock_irqdisable ( ) ;
85
89
let pl061 = data. resources ( ) . ok_or ( Error :: ENXIO ) ?;
86
90
pl061. base . try_writeb ( ( value as u8 ) << offset, woffset) ?;
87
91
let mut gpiodir = pl061. base . readb ( GPIODIR ) ;
@@ -151,7 +155,7 @@ impl irq::Chip for PL061Device {
151
155
return Err ( Error :: EINVAL ) ;
152
156
}
153
157
154
- let _guard = data. lock_irqdisable ( ) ;
158
+ let _guard = data. inner . lock_irqdisable ( ) ;
155
159
let pl061 = data. resources ( ) . ok_or ( Error :: ENXIO ) ?;
156
160
157
161
let mut gpioiev = pl061. base . readb ( GPIOIEV ) ;
@@ -221,7 +225,7 @@ impl irq::Chip for PL061Device {
221
225
222
226
fn mask ( data : RefBorrow < ' _ , DeviceData > , irq_data : & IrqData ) {
223
227
let mask = bit ( irq_data. hwirq ( ) % irq:: HwNumber :: from ( PL061_GPIO_NR ) ) ;
224
- let _guard = data. lock ( ) ;
228
+ let _guard = data. inner . lock ( ) ;
225
229
if let Some ( pl061) = data. resources ( ) {
226
230
let gpioie = pl061. base . readb ( GPIOIE ) & !mask;
227
231
pl061. base . writeb ( gpioie, GPIOIE ) ;
@@ -230,7 +234,7 @@ impl irq::Chip for PL061Device {
230
234
231
235
fn unmask ( data : RefBorrow < ' _ , DeviceData > , irq_data : & IrqData ) {
232
236
let mask = bit ( irq_data. hwirq ( ) % irq:: HwNumber :: from ( PL061_GPIO_NR ) ) ;
233
- let _guard = data. lock ( ) ;
237
+ let _guard = data. inner . lock ( ) ;
234
238
if let Some ( pl061) = data. resources ( ) {
235
239
let gpioie = pl061. base . readb ( GPIOIE ) | mask;
236
240
pl061. base . writeb ( gpioie, GPIOIE ) ;
@@ -242,7 +246,7 @@ impl irq::Chip for PL061Device {
242
246
// signal goes away.
243
247
fn ack ( data : RefBorrow < ' _ , DeviceData > , irq_data : & IrqData ) {
244
248
let mask = bit ( irq_data. hwirq ( ) % irq:: HwNumber :: from ( PL061_GPIO_NR ) ) ;
245
- let _guard = data. lock ( ) ;
249
+ let _guard = data. inner . lock ( ) ;
246
250
if let Some ( pl061) = data. resources ( ) {
247
251
pl061. base . writeb ( mask. into ( ) , GPIOIC ) ;
248
252
}
@@ -273,14 +277,16 @@ impl amba::Driver for PL061Device {
273
277
base: unsafe { IoMem :: try_new( res) ? } ,
274
278
parent_irq: irq,
275
279
} ,
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
+ } ,
278
284
"PL061::Registrations"
279
285
) ?;
280
286
281
287
// 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 " ) ;
284
290
285
291
let data = Ref :: < DeviceData > :: from ( data) ;
286
292
@@ -301,7 +307,7 @@ impl power::Operations for PL061Device {
301
307
type Data = Ref < DeviceData > ;
302
308
303
309
fn suspend ( data : RefBorrow < ' _ , DeviceData > ) -> Result {
304
- let mut inner = data. lock ( ) ;
310
+ let mut inner = data. inner . lock ( ) ;
305
311
let pl061 = data. resources ( ) . ok_or ( Error :: ENXIO ) ?;
306
312
inner. csave_regs . gpio_data = 0 ;
307
313
inner. csave_regs . gpio_dir = pl061. base . readb ( GPIODIR ) ;
@@ -322,7 +328,7 @@ impl power::Operations for PL061Device {
322
328
}
323
329
324
330
fn resume ( data : RefBorrow < ' _ , DeviceData > ) -> Result {
325
- let inner = data. lock ( ) ;
331
+ let inner = data. inner . lock ( ) ;
326
332
let pl061 = data. resources ( ) . ok_or ( Error :: ENXIO ) ?;
327
333
328
334
for offset in 0 ..PL061_GPIO_NR {
0 commit comments