dev: implement generic devices
generic devices don't have a type (char, block, etc) and are created by bus drivers to represent the device until a suitable driver is found. generic devices are registered by the bus driver. once a more suitable driver is found, that driver will re-register the device under itself.
This commit is contained in:
43
dev/driver.c
43
dev/driver.c
@@ -44,13 +44,10 @@ struct driver *driver_create(struct kext *self, const char *name)
|
||||
return NULL;
|
||||
}
|
||||
|
||||
memset(driver, 0x0, sizeof *driver);
|
||||
|
||||
driver->drv_owner = self;
|
||||
strncpy(driver->drv_name, name, sizeof driver->drv_name - 1);
|
||||
driver->drv_name[sizeof driver->drv_name - 1] = 0;
|
||||
|
||||
bitmap_set(driver->drv_minors, DEV_MINOR_INVALID);
|
||||
if (driver_init(driver, self, name) != KERN_OK) {
|
||||
vm_cache_free(&driver_cache, driver);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
return driver;
|
||||
}
|
||||
@@ -61,6 +58,30 @@ kern_status_t driver_destroy(struct driver *driver)
|
||||
return KERN_BUSY;
|
||||
}
|
||||
|
||||
kern_status_t status = driver_deinit(driver);
|
||||
if (status != KERN_OK) {
|
||||
return status;
|
||||
}
|
||||
|
||||
vm_cache_free(&driver_cache, driver);
|
||||
return KERN_OK;
|
||||
}
|
||||
|
||||
kern_status_t driver_init(struct driver *driver, struct kext *self, const char *name)
|
||||
{
|
||||
memset(driver, 0x0, sizeof *driver);
|
||||
|
||||
driver->drv_owner = self;
|
||||
strncpy(driver->drv_name, name, sizeof driver->drv_name - 1);
|
||||
driver->drv_name[sizeof driver->drv_name - 1] = 0;
|
||||
|
||||
bitmap_set(driver->drv_minors, DEV_MINOR_INVALID);
|
||||
return KERN_OK;
|
||||
}
|
||||
|
||||
kern_status_t driver_deinit(struct driver *driver)
|
||||
{
|
||||
/* TODO */
|
||||
return KERN_UNIMPLEMENTED;
|
||||
}
|
||||
|
||||
@@ -91,7 +112,7 @@ kern_status_t driver_register(struct driver *driver)
|
||||
put_driver(&drivers, driver);
|
||||
|
||||
spin_unlock_irqrestore(&drivers_lock, flags);
|
||||
return KERN_UNIMPLEMENTED;
|
||||
return KERN_OK;
|
||||
}
|
||||
|
||||
kern_status_t driver_unregister(struct driver *driver)
|
||||
@@ -147,3 +168,9 @@ kern_status_t driver_add_device(struct driver *driver, struct device *dev)
|
||||
|
||||
return KERN_OK;
|
||||
}
|
||||
|
||||
kern_status_t driver_remove_device(struct driver *driver, struct device *dev)
|
||||
{
|
||||
btree_delete(&driver->drv_children, &dev->dev_driverent);
|
||||
return KERN_OK;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user