@@ -328,7 +328,7 @@ where
328
328
#[ allow( unused_mut) ]
329
329
pub fn transfer < W , B > ( mut self , mut buffer : B ) -> Result < Transfer < T , B > , ( Error , Spis < T > , B ) >
330
330
where
331
- B : WriteBuffer < Word = W > ,
331
+ B : WriteBuffer < Word = W > + ' static ,
332
332
{
333
333
let ( ptr, len) = unsafe { buffer. write_buffer ( ) } ;
334
334
let maxcnt = len * core:: mem:: size_of :: < W > ( ) ;
@@ -371,8 +371,8 @@ where
371
371
mut rx_buffer : RxB ,
372
372
) -> Result < TransferSplit < T , TxB , RxB > , ( Error , Spis < T > , TxB , RxB ) >
373
373
where
374
- TxB : ReadBuffer < Word = TxW > ,
375
- RxB : WriteBuffer < Word = RxW > ,
374
+ TxB : ReadBuffer < Word = TxW > + ' static ,
375
+ RxB : WriteBuffer < Word = RxW > + ' static ,
376
376
{
377
377
let ( rx_ptr, rx_len) = unsafe { rx_buffer. write_buffer ( ) } ;
378
378
let ( tx_ptr, tx_len) = unsafe { tx_buffer. read_buffer ( ) } ;
@@ -420,6 +420,7 @@ where
420
420
421
421
/// A DMA transfer
422
422
pub struct Transfer < T : Instance , B > {
423
+ // FIXME: Always `Some`, only using `Option` here to allow moving fields out of `inner`.
423
424
inner : Option < Inner < T , B > > ,
424
425
}
425
426
@@ -463,6 +464,7 @@ impl<T: Instance, B> Drop for Transfer<T, B> {
463
464
}
464
465
/// A full duplex DMA transfer
465
466
pub struct TransferSplit < T : Instance , TxB , RxB > {
467
+ // FIXME: Always `Some`, only using `Option` here to allow moving fields out of `inner`.
466
468
inner : Option < InnerSplit < T , TxB , RxB > > ,
467
469
}
468
470
@@ -490,15 +492,15 @@ impl<T: Instance, TxB, RxB> TransferSplit<T, TxB, RxB> {
490
492
pub fn is_done ( & mut self ) -> bool {
491
493
let inner = self
492
494
. inner
493
- . take ( )
495
+ . as_mut ( )
494
496
. unwrap_or_else ( || unsafe { core:: hint:: unreachable_unchecked ( ) } ) ;
495
497
inner. spis . is_done ( )
496
498
}
497
499
}
498
500
499
501
impl < T : Instance , TxB , RxB > Drop for TransferSplit < T , TxB , RxB > {
500
502
fn drop ( & mut self ) {
501
- if let Some ( inner) = self . inner . as_mut ( ) {
503
+ if let Some ( inner) = self . inner . take ( ) {
502
504
compiler_fence ( Ordering :: SeqCst ) ;
503
505
while !inner. spis . is_done ( ) { }
504
506
inner. spis . disable ( ) ;
0 commit comments