Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux
at v2.6.13-rc7 126 lines 3.2 kB view raw
1/* 2 * firmware_sample_driver.c - 3 * 4 * Copyright (c) 2003 Manuel Estrada Sainz <ranty@debian.org> 5 * 6 * Sample code on how to use request_firmware() from drivers. 7 * 8 * Note that register_firmware() is currently useless. 9 * 10 */ 11 12#include <linux/module.h> 13#include <linux/kernel.h> 14#include <linux/init.h> 15#include <linux/device.h> 16 17#include "linux/firmware.h" 18 19#define WE_CAN_NEED_FIRMWARE_BEFORE_USERSPACE_IS_AVAILABLE 20#ifdef WE_CAN_NEED_FIRMWARE_BEFORE_USERSPACE_IS_AVAILABLE 21char __init inkernel_firmware[] = "let's say that this is firmware\n"; 22#endif 23 24static struct device ghost_device = { 25 .name = "Ghost Device", 26 .bus_id = "ghost0", 27}; 28 29 30static void sample_firmware_load(char *firmware, int size) 31{ 32 u8 buf[size+1]; 33 memcpy(buf, firmware, size); 34 buf[size] = '\0'; 35 printk("firmware_sample_driver: firmware: %s\n", buf); 36} 37 38static void sample_probe_default(void) 39{ 40 /* uses the default method to get the firmware */ 41 const struct firmware *fw_entry; 42 printk("firmware_sample_driver: a ghost device got inserted :)\n"); 43 44 if(request_firmware(&fw_entry, "sample_driver_fw", &ghost_device)!=0) 45 { 46 printk(KERN_ERR 47 "firmware_sample_driver: Firmware not available\n"); 48 return; 49 } 50 51 sample_firmware_load(fw_entry->data, fw_entry->size); 52 53 release_firmware(fw_entry); 54 55 /* finish setting up the device */ 56} 57static void sample_probe_specific(void) 58{ 59 /* Uses some specific hotplug support to get the firmware from 60 * userspace directly into the hardware, or via some sysfs file */ 61 62 /* NOTE: This currently doesn't work */ 63 64 printk("firmware_sample_driver: a ghost device got inserted :)\n"); 65 66 if(request_firmware(NULL, "sample_driver_fw", &ghost_device)!=0) 67 { 68 printk(KERN_ERR 69 "firmware_sample_driver: Firmware load failed\n"); 70 return; 71 } 72 73 /* request_firmware blocks until userspace finished, so at 74 * this point the firmware should be already in the device */ 75 76 /* finish setting up the device */ 77} 78static void sample_probe_async_cont(const struct firmware *fw, void *context) 79{ 80 if(!fw){ 81 printk(KERN_ERR 82 "firmware_sample_driver: firmware load failed\n"); 83 return; 84 } 85 86 printk("firmware_sample_driver: device pointer \"%s\"\n", 87 (char *)context); 88 sample_firmware_load(fw->data, fw->size); 89} 90static void sample_probe_async(void) 91{ 92 /* Let's say that I can't sleep */ 93 int error; 94 error = request_firmware_nowait (THIS_MODULE, 95 "sample_driver_fw", &ghost_device, 96 "my device pointer", 97 sample_probe_async_cont); 98 if(error){ 99 printk(KERN_ERR 100 "firmware_sample_driver:" 101 " request_firmware_nowait failed\n"); 102 } 103} 104 105static int sample_init(void) 106{ 107#ifdef WE_CAN_NEED_FIRMWARE_BEFORE_USERSPACE_IS_AVAILABLE 108 register_firmware("sample_driver_fw", inkernel_firmware, 109 sizeof(inkernel_firmware)); 110#endif 111 device_initialize(&ghost_device); 112 /* since there is no real hardware insertion I just call the 113 * sample probe functions here */ 114 sample_probe_specific(); 115 sample_probe_default(); 116 sample_probe_async(); 117 return 0; 118} 119static void __exit sample_exit(void) 120{ 121} 122 123module_init (sample_init); 124module_exit (sample_exit); 125 126MODULE_LICENSE("GPL");