@@ -20,10 +20,10 @@ use super::{
20
20
} ;
21
21
22
22
#[ allow( private_bounds) ]
23
- impl < ' a , CH : DmaChannel + ChannelWaker > IntoFuture for DmaTransfer < ' a , CH > {
23
+ impl < ' a , CH : DmaChannel > IntoFuture for DmaTransfer < ' a , CH > {
24
24
type Output = Result < ( ) , Error > ;
25
25
type IntoFuture = DmaTransferFuture < ' a , CH > ;
26
-
26
+
27
27
fn into_future ( self ) -> DmaTransferFuture < ' a , CH > {
28
28
DmaTransferFuture { transfer : self }
29
29
}
@@ -73,7 +73,7 @@ impl<'a, CH: DmaChannel> Unpin for DmaTransferFuture<'a, CH> {}
73
73
74
74
impl < ' a , CH > Future for DmaTransferFuture < ' a , CH >
75
75
where
76
- CH : DmaChannel + ChannelWaker ,
76
+ CH : DmaChannel ,
77
77
{
78
78
type Output = Result < ( ) , Error > ;
79
79
@@ -92,7 +92,6 @@ impl<DMA, CH, const N: usize> DmaChannelImpl<DmaChannelRef<DMA, CH, N>>
92
92
where
93
93
DMA : Instance ,
94
94
CH : ChannelRegs ,
95
- Self : ChannelWaker ,
96
95
DmaChannelRef < DMA , CH , N > : ChannelRegs ,
97
96
{
98
97
#[ inline( always) ]
@@ -114,21 +113,36 @@ macro_rules! gpdma_irq {
114
113
} ;
115
114
}
116
115
117
- trait ChannelWaker {
116
+ pub ( super ) trait InstanceWaker {
117
+ fn waker ( idx : usize ) -> & ' static AtomicWaker ;
118
+ }
119
+
120
+ pub ( super ) trait ChannelWaker {
121
+ /// Returns a reference to the AtomicWaker for the channel.
118
122
fn waker ( & self ) -> & ' static AtomicWaker ;
119
123
}
120
124
125
+ impl < DMA , CH , const N : usize > ChannelWaker for DmaChannelRef < DMA , CH , N >
126
+ where
127
+ DMA : Instance ,
128
+ CH : ChannelRegs ,
129
+ {
130
+ #[ inline( always) ]
131
+ fn waker ( & self ) -> & ' static AtomicWaker {
132
+ DMA :: waker ( N )
133
+ }
134
+ }
135
+
121
136
mod gpdma1 {
122
137
use super :: * ;
123
138
124
139
static WAKERS_GPDMA1 : [ AtomicWaker ; 8 ] = [ const { AtomicWaker :: new ( ) } ; 8 ] ;
125
140
126
141
#[ allow( private_bounds) ]
127
- impl < CH : ChannelRegs , const N : usize > ChannelWaker
128
- for DmaChannelImpl < DmaChannelRef < GPDMA1 , CH , N > >
129
- {
130
- fn waker ( & self ) -> & ' static AtomicWaker {
131
- & WAKERS_GPDMA1 [ N ]
142
+ impl InstanceWaker for GPDMA1 {
143
+ #[ inline( always) ]
144
+ fn waker ( idx : usize ) -> & ' static AtomicWaker {
145
+ & WAKERS_GPDMA1 [ idx]
132
146
}
133
147
}
134
148
@@ -148,11 +162,10 @@ mod gpdma2 {
148
162
static WAKERS_GPDMA2 : [ AtomicWaker ; 8 ] = [ const { AtomicWaker :: new ( ) } ; 8 ] ;
149
163
150
164
#[ allow( private_bounds) ]
151
- impl < CH : ChannelRegs , const N : usize > ChannelWaker
152
- for DmaChannelImpl < DmaChannelRef < GPDMA2 , CH , N > >
153
- {
154
- fn waker ( & self ) -> & ' static AtomicWaker {
155
- & WAKERS_GPDMA2 [ N ]
165
+ impl InstanceWaker for GPDMA2 {
166
+ #[ inline( always) ]
167
+ fn waker ( idx : usize ) -> & ' static AtomicWaker {
168
+ & WAKERS_GPDMA2 [ idx]
156
169
}
157
170
}
158
171
0 commit comments