forked from Imagelibrary/rtems
IO_MANAGER: early dynamic driver registration
Adds the possibility to register drivers before the IO Manager has completed the initialization. Sometimes the BSP may want to register a driver dynamically early in the boot process.
This commit is contained in:
@@ -21,10 +21,14 @@
|
||||
|
||||
#include <rtems/io.h>
|
||||
|
||||
int _IO_Manager_drivers_inititalized = 0;
|
||||
|
||||
void _IO_Initialize_all_drivers( void )
|
||||
{
|
||||
rtems_device_major_number major;
|
||||
|
||||
_IO_Manager_drivers_inititalized = 1;
|
||||
|
||||
for ( major=0 ; major < _IO_Number_of_drivers ; major ++ )
|
||||
(void) rtems_io_initialize( major, 0, NULL );
|
||||
}
|
||||
|
||||
@@ -25,6 +25,8 @@
|
||||
#include <rtems/rtems/intr.h>
|
||||
#include <rtems/score/threaddispatch.h>
|
||||
|
||||
extern int _IO_Manager_drivers_inititalized;
|
||||
|
||||
static inline bool rtems_io_is_empty_table(
|
||||
const rtems_driver_address_table *table
|
||||
)
|
||||
@@ -108,5 +110,15 @@ rtems_status_code rtems_io_register_driver(
|
||||
|
||||
_Thread_Enable_dispatch();
|
||||
|
||||
return rtems_io_initialize( major, 0, NULL );
|
||||
if ( _IO_Manager_drivers_inititalized ) {
|
||||
/* Other drivers have already been initialized, we initialize
|
||||
* the driver directly.
|
||||
*/
|
||||
return rtems_io_initialize( major, 0, NULL );
|
||||
} else {
|
||||
/* The driver will be initialized together with all other drivers
|
||||
* in a later stage by _IO_Initialize_all_drivers().
|
||||
*/
|
||||
return RTEMS_SUCCESSFUL;
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user