#include #include #include #include "firmware.h" #define WE_CAN_NEED_FIRMWARE_BEFORE_USERSPACE_IS_AVAILABLE #ifdef WE_CAN_NEED_FIRMWARE_BEFORE_USERSPACE_IS_AVAILABLE char __init inkernel_firmware[] = "let's say that this is firmware\n"; #endif static void sample_firmware_load(char *firmware, int size) { printk("firmware_sample_driver: firmware: %s\n", firmware); } static void sample_probe_default(void) { /* uses the default method to get the firmware */ const struct firmware *fw_entry; printk("firmware_sample_driver: a ghost device got inserted :)\n"); if(request_firmware(&fw_entry, "sample_driver_fw", "ghost0")!=0) { printk(KERN_ERR "firmware_sample_driver: Firmware not available\n"); return; } sample_firmware_load(fw_entry->data, fw_entry->size); release_firmware(fw_entry); /* finish setting up the device */ } static void sample_probe_specific(void) { /* Uses some specific hotplug support to get the firmware from * userspace directly into the hardware, or via some sysfs file */ printk("firmware_sample_driver: a ghost device got inserted :)\n"); if(request_firmware(NULL, "sample_driver_fw", "ghost0")!=0) { printk(KERN_ERR "firmware_sample_driver: Firmware load failed\n"); return; } /* request_firmware blocks until userspace finished, so at * this point the firmware should be already in the device */ /* finish setting up the device */ } static int sample_init(void) { #ifdef WE_CAN_NEED_FIRMWARE_BEFORE_USERSPACE_IS_AVAILABLE register_firmware("sample_driver_fw", inkernel_firmware, sizeof(inkernel_firmware)); #endif /* since there is no real hardware insertion I just call the * sample probe functions here */ sample_probe_specific(); sample_probe_default(); return 0; } static void __exit sample_exit(void) { } module_init (sample_init); module_exit (sample_exit); MODULE_LICENSE("GPL");