@@ -986,19 +986,43 @@ static int __dma_async_device_channel_register(struct dma_device *device,
986986 return rc ;
987987}
988988
989+ int dma_async_device_channel_register (struct dma_device * device ,
990+ struct dma_chan * chan )
991+ {
992+ int rc ;
993+
994+ rc = __dma_async_device_channel_register (device , chan , -1 );
995+ if (rc < 0 )
996+ return rc ;
997+
998+ dma_channel_rebalance ();
999+ return 0 ;
1000+ }
1001+ EXPORT_SYMBOL_GPL (dma_async_device_channel_register );
1002+
9891003static void __dma_async_device_channel_unregister (struct dma_device * device ,
9901004 struct dma_chan * chan )
9911005{
9921006 WARN_ONCE (!device -> device_release && chan -> client_count ,
9931007 "%s called while %d clients hold a reference\n" ,
9941008 __func__ , chan -> client_count );
9951009 mutex_lock (& dma_list_mutex );
1010+ list_del (& chan -> device_node );
1011+ device -> chancnt -- ;
9961012 chan -> dev -> chan = NULL ;
9971013 mutex_unlock (& dma_list_mutex );
9981014 device_unregister (& chan -> dev -> device );
9991015 free_percpu (chan -> local );
10001016}
10011017
1018+ void dma_async_device_channel_unregister (struct dma_device * device ,
1019+ struct dma_chan * chan )
1020+ {
1021+ __dma_async_device_channel_unregister (device , chan );
1022+ dma_channel_rebalance ();
1023+ }
1024+ EXPORT_SYMBOL_GPL (dma_async_device_channel_unregister );
1025+
10021026/**
10031027 * dma_async_device_register - registers DMA devices found
10041028 * @device: &dma_device
@@ -1121,12 +1145,6 @@ int dma_async_device_register(struct dma_device *device)
11211145 goto err_out ;
11221146 }
11231147
1124- if (!device -> chancnt ) {
1125- dev_err (device -> dev , "%s: device has no channels!\n" , __func__ );
1126- rc = - ENODEV ;
1127- goto err_out ;
1128- }
1129-
11301148 mutex_lock (& dma_list_mutex );
11311149 /* take references on public channels */
11321150 if (dmaengine_ref_count && !dma_has_cap (DMA_PRIVATE , device -> cap_mask ))
@@ -1181,9 +1199,9 @@ EXPORT_SYMBOL(dma_async_device_register);
11811199 */
11821200void dma_async_device_unregister (struct dma_device * device )
11831201{
1184- struct dma_chan * chan ;
1202+ struct dma_chan * chan , * n ;
11851203
1186- list_for_each_entry (chan , & device -> channels , device_node )
1204+ list_for_each_entry_safe (chan , n , & device -> channels , device_node )
11871205 __dma_async_device_channel_unregister (device , chan );
11881206
11891207 mutex_lock (& dma_list_mutex );
0 commit comments