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:
2023-06-10 13:21:42 +01:00
parent 4a2c5de5b6
commit c5edce612d
8 changed files with 122 additions and 8 deletions

View File

@@ -228,6 +228,19 @@ kern_status_t device_register(struct device *dev, struct driver *owner, struct d
{
unsigned long flags;
device_lock_irqsave(dev, &flags);
if (dev->dev_owner) {
struct driver *prev_owner = dev->dev_owner;
/* migrate device to new driver */
driver_lock(prev_owner);
driver_remove_device(prev_owner, dev);
driver_free_minor(prev_owner, dev->dev_minor);
dev->dev_minor = DEV_MINOR_INVALID;
dev->dev_owner = NULL;
driver_unlock(prev_owner);
}
driver_lock(owner);
if (owner->drv_major == DEV_MAJOR_INVALID) {