@@ -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+
4246struct PL061Resources {
4347 base : IoMem < GPIO_SIZE > ,
4448 parent_irq : u32 ,
4549}
4650
4751type PL061Registrations = gpio:: RegistrationWithIrqChip < PL061Device > ;
4852
49- type DeviceData = device:: Data < PL061Registrations , PL061Resources , SpinLock < PL061Data > > ;
53+ type DeviceData = device:: Data < PL061Registrations , PL061Resources , PL061Data > ;
5054
5155struct 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