Merge master.kernel.org:/pub/scm/linux/kernel/git/acme/net-2.6
[pandora-kernel.git] / drivers / base / firmware_class.c
1 /*
2  * firmware_class.c - Multi purpose firmware loading support
3  *
4  * Copyright (c) 2003 Manuel Estrada Sainz <ranty@debian.org>
5  *
6  * Please see Documentation/firmware_class/ for more information.
7  *
8  */
9
10 #include <linux/device.h>
11 #include <linux/module.h>
12 #include <linux/init.h>
13 #include <linux/timer.h>
14 #include <linux/vmalloc.h>
15 #include <linux/interrupt.h>
16 #include <linux/bitops.h>
17 #include <asm/semaphore.h>
18
19 #include <linux/firmware.h>
20 #include "base.h"
21
22 MODULE_AUTHOR("Manuel Estrada Sainz <ranty@debian.org>");
23 MODULE_DESCRIPTION("Multi purpose firmware loading support");
24 MODULE_LICENSE("GPL");
25
26 enum {
27         FW_STATUS_LOADING,
28         FW_STATUS_DONE,
29         FW_STATUS_ABORT,
30         FW_STATUS_READY,
31         FW_STATUS_READY_NOHOTPLUG,
32 };
33
34 static int loading_timeout = 10;        /* In seconds */
35
36 /* fw_lock could be moved to 'struct firmware_priv' but since it is just
37  * guarding for corner cases a global lock should be OK */
38 static DECLARE_MUTEX(fw_lock);
39
40 struct firmware_priv {
41         char fw_id[FIRMWARE_NAME_MAX];
42         struct completion completion;
43         struct bin_attribute attr_data;
44         struct firmware *fw;
45         unsigned long status;
46         int alloc_size;
47         struct timer_list timeout;
48 };
49
50 static inline void
51 fw_load_abort(struct firmware_priv *fw_priv)
52 {
53         set_bit(FW_STATUS_ABORT, &fw_priv->status);
54         wmb();
55         complete(&fw_priv->completion);
56 }
57
58 static ssize_t
59 firmware_timeout_show(struct class *class, char *buf)
60 {
61         return sprintf(buf, "%d\n", loading_timeout);
62 }
63
64 /**
65  * firmware_timeout_store:
66  * Description:
67  *      Sets the number of seconds to wait for the firmware.  Once
68  *      this expires an error will be return to the driver and no
69  *      firmware will be provided.
70  *
71  *      Note: zero means 'wait for ever'
72  *
73  **/
74 static ssize_t
75 firmware_timeout_store(struct class *class, const char *buf, size_t count)
76 {
77         loading_timeout = simple_strtol(buf, NULL, 10);
78         if (loading_timeout < 0)
79                 loading_timeout = 0;
80         return count;
81 }
82
83 static CLASS_ATTR(timeout, 0644, firmware_timeout_show, firmware_timeout_store);
84
85 static void  fw_class_dev_release(struct class_device *class_dev);
86 int firmware_class_hotplug(struct class_device *dev, char **envp,
87                            int num_envp, char *buffer, int buffer_size);
88
89 static struct class firmware_class = {
90         .name           = "firmware",
91         .hotplug        = firmware_class_hotplug,
92         .release        = fw_class_dev_release,
93 };
94
95 int
96 firmware_class_hotplug(struct class_device *class_dev, char **envp,
97                        int num_envp, char *buffer, int buffer_size)
98 {
99         struct firmware_priv *fw_priv = class_get_devdata(class_dev);
100         int i = 0, len = 0;
101
102         if (!test_bit(FW_STATUS_READY, &fw_priv->status))
103                 return -ENODEV;
104
105         if (add_hotplug_env_var(envp, num_envp, &i, buffer, buffer_size, &len,
106                         "FIRMWARE=%s", fw_priv->fw_id))
107                 return -ENOMEM;
108         if (add_hotplug_env_var(envp, num_envp, &i, buffer, buffer_size, &len,
109                         "TIMEOUT=%i", loading_timeout))
110                 return -ENOMEM;
111
112         envp[i] = NULL;
113
114         return 0;
115 }
116
117 static ssize_t
118 firmware_loading_show(struct class_device *class_dev, char *buf)
119 {
120         struct firmware_priv *fw_priv = class_get_devdata(class_dev);
121         int loading = test_bit(FW_STATUS_LOADING, &fw_priv->status);
122         return sprintf(buf, "%d\n", loading);
123 }
124
125 /**
126  * firmware_loading_store: - loading control file
127  * Description:
128  *      The relevant values are:
129  *
130  *       1: Start a load, discarding any previous partial load.
131  *       0: Conclude the load and handle the data to the driver code.
132  *      -1: Conclude the load with an error and discard any written data.
133  **/
134 static ssize_t
135 firmware_loading_store(struct class_device *class_dev,
136                        const char *buf, size_t count)
137 {
138         struct firmware_priv *fw_priv = class_get_devdata(class_dev);
139         int loading = simple_strtol(buf, NULL, 10);
140
141         switch (loading) {
142         case 1:
143                 down(&fw_lock);
144                 if (!fw_priv->fw) {
145                         up(&fw_lock);
146                         break;
147                 }
148                 vfree(fw_priv->fw->data);
149                 fw_priv->fw->data = NULL;
150                 fw_priv->fw->size = 0;
151                 fw_priv->alloc_size = 0;
152                 set_bit(FW_STATUS_LOADING, &fw_priv->status);
153                 up(&fw_lock);
154                 break;
155         case 0:
156                 if (test_bit(FW_STATUS_LOADING, &fw_priv->status)) {
157                         complete(&fw_priv->completion);
158                         clear_bit(FW_STATUS_LOADING, &fw_priv->status);
159                         break;
160                 }
161                 /* fallthrough */
162         default:
163                 printk(KERN_ERR "%s: unexpected value (%d)\n", __FUNCTION__,
164                        loading);
165                 /* fallthrough */
166         case -1:
167                 fw_load_abort(fw_priv);
168                 break;
169         }
170
171         return count;
172 }
173
174 static CLASS_DEVICE_ATTR(loading, 0644,
175                         firmware_loading_show, firmware_loading_store);
176
177 static ssize_t
178 firmware_data_read(struct kobject *kobj,
179                    char *buffer, loff_t offset, size_t count)
180 {
181         struct class_device *class_dev = to_class_dev(kobj);
182         struct firmware_priv *fw_priv = class_get_devdata(class_dev);
183         struct firmware *fw;
184         ssize_t ret_count = count;
185
186         down(&fw_lock);
187         fw = fw_priv->fw;
188         if (!fw || test_bit(FW_STATUS_DONE, &fw_priv->status)) {
189                 ret_count = -ENODEV;
190                 goto out;
191         }
192         if (offset > fw->size) {
193                 ret_count = 0;
194                 goto out;
195         }
196         if (offset + ret_count > fw->size)
197                 ret_count = fw->size - offset;
198
199         memcpy(buffer, fw->data + offset, ret_count);
200 out:
201         up(&fw_lock);
202         return ret_count;
203 }
204 static int
205 fw_realloc_buffer(struct firmware_priv *fw_priv, int min_size)
206 {
207         u8 *new_data;
208
209         if (min_size <= fw_priv->alloc_size)
210                 return 0;
211
212         new_data = vmalloc(fw_priv->alloc_size + PAGE_SIZE);
213         if (!new_data) {
214                 printk(KERN_ERR "%s: unable to alloc buffer\n", __FUNCTION__);
215                 /* Make sure that we don't keep incomplete data */
216                 fw_load_abort(fw_priv);
217                 return -ENOMEM;
218         }
219         fw_priv->alloc_size += PAGE_SIZE;
220         if (fw_priv->fw->data) {
221                 memcpy(new_data, fw_priv->fw->data, fw_priv->fw->size);
222                 vfree(fw_priv->fw->data);
223         }
224         fw_priv->fw->data = new_data;
225         BUG_ON(min_size > fw_priv->alloc_size);
226         return 0;
227 }
228
229 /**
230  * firmware_data_write:
231  *
232  * Description:
233  *
234  *      Data written to the 'data' attribute will be later handled to
235  *      the driver as a firmware image.
236  **/
237 static ssize_t
238 firmware_data_write(struct kobject *kobj,
239                     char *buffer, loff_t offset, size_t count)
240 {
241         struct class_device *class_dev = to_class_dev(kobj);
242         struct firmware_priv *fw_priv = class_get_devdata(class_dev);
243         struct firmware *fw;
244         ssize_t retval;
245
246         if (!capable(CAP_SYS_RAWIO))
247                 return -EPERM;
248
249         down(&fw_lock);
250         fw = fw_priv->fw;
251         if (!fw || test_bit(FW_STATUS_DONE, &fw_priv->status)) {
252                 retval = -ENODEV;
253                 goto out;
254         }
255         retval = fw_realloc_buffer(fw_priv, offset + count);
256         if (retval)
257                 goto out;
258
259         memcpy(fw->data + offset, buffer, count);
260
261         fw->size = max_t(size_t, offset + count, fw->size);
262         retval = count;
263 out:
264         up(&fw_lock);
265         return retval;
266 }
267 static struct bin_attribute firmware_attr_data_tmpl = {
268         .attr = {.name = "data", .mode = 0644, .owner = THIS_MODULE},
269         .size = 0,
270         .read = firmware_data_read,
271         .write = firmware_data_write,
272 };
273
274 static void
275 fw_class_dev_release(struct class_device *class_dev)
276 {
277         struct firmware_priv *fw_priv = class_get_devdata(class_dev);
278
279         kfree(fw_priv);
280         kfree(class_dev);
281
282         module_put(THIS_MODULE);
283 }
284
285 static void
286 firmware_class_timeout(u_long data)
287 {
288         struct firmware_priv *fw_priv = (struct firmware_priv *) data;
289         fw_load_abort(fw_priv);
290 }
291
292 static inline void
293 fw_setup_class_device_id(struct class_device *class_dev, struct device *dev)
294 {
295         /* XXX warning we should watch out for name collisions */
296         strlcpy(class_dev->class_id, dev->bus_id, BUS_ID_SIZE);
297 }
298
299 static int
300 fw_register_class_device(struct class_device **class_dev_p,
301                          const char *fw_name, struct device *device)
302 {
303         int retval;
304         struct firmware_priv *fw_priv = kzalloc(sizeof(*fw_priv),
305                                                 GFP_KERNEL);
306         struct class_device *class_dev = kzalloc(sizeof(*class_dev),
307                                                  GFP_KERNEL);
308
309         *class_dev_p = NULL;
310
311         if (!fw_priv || !class_dev) {
312                 printk(KERN_ERR "%s: kmalloc failed\n", __FUNCTION__);
313                 retval = -ENOMEM;
314                 goto error_kfree;
315         }
316
317         init_completion(&fw_priv->completion);
318         fw_priv->attr_data = firmware_attr_data_tmpl;
319         strlcpy(fw_priv->fw_id, fw_name, FIRMWARE_NAME_MAX);
320
321         fw_priv->timeout.function = firmware_class_timeout;
322         fw_priv->timeout.data = (u_long) fw_priv;
323         init_timer(&fw_priv->timeout);
324
325         fw_setup_class_device_id(class_dev, device);
326         class_dev->dev = device;
327         class_dev->class = &firmware_class;
328         class_set_devdata(class_dev, fw_priv);
329         retval = class_device_register(class_dev);
330         if (retval) {
331                 printk(KERN_ERR "%s: class_device_register failed\n",
332                        __FUNCTION__);
333                 goto error_kfree;
334         }
335         *class_dev_p = class_dev;
336         return 0;
337
338 error_kfree:
339         kfree(fw_priv);
340         kfree(class_dev);
341         return retval;
342 }
343
344 static int
345 fw_setup_class_device(struct firmware *fw, struct class_device **class_dev_p,
346                       const char *fw_name, struct device *device, int hotplug)
347 {
348         struct class_device *class_dev;
349         struct firmware_priv *fw_priv;
350         int retval;
351
352         *class_dev_p = NULL;
353         retval = fw_register_class_device(&class_dev, fw_name, device);
354         if (retval)
355                 goto out;
356
357         /* Need to pin this module until class device is destroyed */
358         __module_get(THIS_MODULE);
359
360         fw_priv = class_get_devdata(class_dev);
361
362         fw_priv->fw = fw;
363         retval = sysfs_create_bin_file(&class_dev->kobj, &fw_priv->attr_data);
364         if (retval) {
365                 printk(KERN_ERR "%s: sysfs_create_bin_file failed\n",
366                        __FUNCTION__);
367                 goto error_unreg;
368         }
369
370         retval = class_device_create_file(class_dev,
371                                           &class_device_attr_loading);
372         if (retval) {
373                 printk(KERN_ERR "%s: class_device_create_file failed\n",
374                        __FUNCTION__);
375                 goto error_unreg;
376         }
377
378         if (hotplug)
379                 set_bit(FW_STATUS_READY, &fw_priv->status);
380         else
381                 set_bit(FW_STATUS_READY_NOHOTPLUG, &fw_priv->status);
382         *class_dev_p = class_dev;
383         goto out;
384
385 error_unreg:
386         class_device_unregister(class_dev);
387 out:
388         return retval;
389 }
390
391 static int
392 _request_firmware(const struct firmware **firmware_p, const char *name,
393                  struct device *device, int hotplug)
394 {
395         struct class_device *class_dev;
396         struct firmware_priv *fw_priv;
397         struct firmware *firmware;
398         int retval;
399
400         if (!firmware_p)
401                 return -EINVAL;
402
403         *firmware_p = firmware = kzalloc(sizeof(*firmware), GFP_KERNEL);
404         if (!firmware) {
405                 printk(KERN_ERR "%s: kmalloc(struct firmware) failed\n",
406                        __FUNCTION__);
407                 retval = -ENOMEM;
408                 goto out;
409         }
410
411         retval = fw_setup_class_device(firmware, &class_dev, name, device,
412                 hotplug);
413         if (retval)
414                 goto error_kfree_fw;
415
416         fw_priv = class_get_devdata(class_dev);
417
418         if (hotplug) {
419                 if (loading_timeout > 0) {
420                         fw_priv->timeout.expires = jiffies + loading_timeout * HZ;
421                         add_timer(&fw_priv->timeout);
422                 }
423
424                 kobject_hotplug(&class_dev->kobj, KOBJ_ADD);
425                 wait_for_completion(&fw_priv->completion);
426                 set_bit(FW_STATUS_DONE, &fw_priv->status);
427                 del_timer_sync(&fw_priv->timeout);
428         } else
429                 wait_for_completion(&fw_priv->completion);
430
431         down(&fw_lock);
432         if (!fw_priv->fw->size || test_bit(FW_STATUS_ABORT, &fw_priv->status)) {
433                 retval = -ENOENT;
434                 release_firmware(fw_priv->fw);
435                 *firmware_p = NULL;
436         }
437         fw_priv->fw = NULL;
438         up(&fw_lock);
439         class_device_unregister(class_dev);
440         goto out;
441
442 error_kfree_fw:
443         kfree(firmware);
444         *firmware_p = NULL;
445 out:
446         return retval;
447 }
448
449 /**
450  * request_firmware: - request firmware to hotplug and wait for it
451  * Description:
452  *      @firmware will be used to return a firmware image by the name
453  *      of @name for device @device.
454  *
455  *      Should be called from user context where sleeping is allowed.
456  *
457  *      @name will be use as $FIRMWARE in the hotplug environment and
458  *      should be distinctive enough not to be confused with any other
459  *      firmware image for this or any other device.
460  **/
461 int
462 request_firmware(const struct firmware **firmware_p, const char *name,
463                  struct device *device)
464 {
465         int hotplug = 1;
466         return _request_firmware(firmware_p, name, device, hotplug);
467 }
468
469 /**
470  * release_firmware: - release the resource associated with a firmware image
471  **/
472 void
473 release_firmware(const struct firmware *fw)
474 {
475         if (fw) {
476                 vfree(fw->data);
477                 kfree(fw);
478         }
479 }
480
481 /**
482  * register_firmware: - provide a firmware image for later usage
483  *
484  * Description:
485  *      Make sure that @data will be available by requesting firmware @name.
486  *
487  *      Note: This will not be possible until some kind of persistence
488  *      is available.
489  **/
490 void
491 register_firmware(const char *name, const u8 *data, size_t size)
492 {
493         /* This is meaningless without firmware caching, so until we
494          * decide if firmware caching is reasonable just leave it as a
495          * noop */
496 }
497
498 /* Async support */
499 struct firmware_work {
500         struct work_struct work;
501         struct module *module;
502         const char *name;
503         struct device *device;
504         void *context;
505         void (*cont)(const struct firmware *fw, void *context);
506         int hotplug;
507 };
508
509 static int
510 request_firmware_work_func(void *arg)
511 {
512         struct firmware_work *fw_work = arg;
513         const struct firmware *fw;
514         if (!arg) {
515                 WARN_ON(1);
516                 return 0;
517         }
518         daemonize("%s/%s", "firmware", fw_work->name);
519         _request_firmware(&fw, fw_work->name, fw_work->device,
520                 fw_work->hotplug);
521         fw_work->cont(fw, fw_work->context);
522         release_firmware(fw);
523         module_put(fw_work->module);
524         kfree(fw_work);
525         return 0;
526 }
527
528 /**
529  * request_firmware_nowait:
530  *
531  * Description:
532  *      Asynchronous variant of request_firmware() for contexts where
533  *      it is not possible to sleep.
534  *
535  *      @hotplug invokes hotplug event to copy the firmware image if this flag
536  *      is non-zero else the firmware copy must be done manually.
537  *
538  *      @cont will be called asynchronously when the firmware request is over.
539  *
540  *      @context will be passed over to @cont.
541  *
542  *      @fw may be %NULL if firmware request fails.
543  *
544  **/
545 int
546 request_firmware_nowait(
547         struct module *module, int hotplug,
548         const char *name, struct device *device, void *context,
549         void (*cont)(const struct firmware *fw, void *context))
550 {
551         struct firmware_work *fw_work = kmalloc(sizeof (struct firmware_work),
552                                                 GFP_ATOMIC);
553         int ret;
554
555         if (!fw_work)
556                 return -ENOMEM;
557         if (!try_module_get(module)) {
558                 kfree(fw_work);
559                 return -EFAULT;
560         }
561
562         *fw_work = (struct firmware_work) {
563                 .module = module,
564                 .name = name,
565                 .device = device,
566                 .context = context,
567                 .cont = cont,
568                 .hotplug = hotplug,
569         };
570
571         ret = kernel_thread(request_firmware_work_func, fw_work,
572                             CLONE_FS | CLONE_FILES);
573
574         if (ret < 0) {
575                 fw_work->cont(NULL, fw_work->context);
576                 return ret;
577         }
578         return 0;
579 }
580
581 static int __init
582 firmware_class_init(void)
583 {
584         int error;
585         error = class_register(&firmware_class);
586         if (error) {
587                 printk(KERN_ERR "%s: class_register failed\n", __FUNCTION__);
588                 return error;
589         }
590         error = class_create_file(&firmware_class, &class_attr_timeout);
591         if (error) {
592                 printk(KERN_ERR "%s: class_create_file failed\n",
593                        __FUNCTION__);
594                 class_unregister(&firmware_class);
595         }
596         return error;
597
598 }
599 static void __exit
600 firmware_class_exit(void)
601 {
602         class_unregister(&firmware_class);
603 }
604
605 module_init(firmware_class_init);
606 module_exit(firmware_class_exit);
607
608 EXPORT_SYMBOL(release_firmware);
609 EXPORT_SYMBOL(request_firmware);
610 EXPORT_SYMBOL(request_firmware_nowait);
611 EXPORT_SYMBOL(register_firmware);