// SPDX-License-Identifier: Apache-2.0 #pragma once #ifdef __cplusplus extern "C" { #endif #include "error.h" #include struct Device; struct DeviceType; struct Module; struct DriverPrivate; struct Driver { /** The driver name */ const char* name; /** Array of const char*, terminated by NULL */ const char**compatible; /** Function to initialize the driver for a device */ error_t (*start_device)(struct Device* dev); /** Function to deinitialize the driver for a device */ error_t (*stop_device)(struct Device* dev); /** Contains the driver's functions */ const void* api; /** Which type of devices this driver creates (can be NULL) */ const struct DeviceType* device_type; /** The module that owns this driver. When it is NULL, the system owns the driver and it cannot be removed from registration. */ const struct Module* owner; /** Internal data */ struct DriverPrivate* driver_private; }; error_t driver_construct(struct Driver* driver); error_t driver_destruct(struct Driver* driver); error_t driver_add(struct Driver* driver); error_t driver_remove(struct Driver* driver); error_t driver_construct_add(struct Driver* driver); error_t driver_remove_destruct(struct Driver* driver); error_t driver_bind(struct Driver* driver, struct Device* device); error_t driver_unbind(struct Driver* driver, struct Device* device); bool driver_is_compatible(struct Driver* driver, const char* compatible); struct Driver* driver_find_compatible(const char* compatible); static inline const struct DeviceType* driver_get_device_type(struct Driver* driver) { return driver->device_type; } #ifdef __cplusplus } #endif