diff options
author | Dmitry Torokhov <dmitry.torokhov@gmail.com> | 2010-03-14 03:49:18 -0400 |
---|---|---|
committer | Greg Kroah-Hartman <gregkh@suse.de> | 2010-05-21 12:37:30 -0400 |
commit | bcb9bd18e397eabe14b45f4dc4283359ab148d79 (patch) | |
tree | 0fbb55b4e90a02824f8dc7aaffc3c26a2f0ebfa3 /drivers/base | |
parent | 673fae90d5ee4ae2b6403f9d45af7ff640f06a60 (diff) |
firmware loader: split out builtin firmware handling
Split builtin firmware handling into separate functions to clean up the
main body of code.
Signed-off-by: Dmitry Torokhov <dtor@mail.ru>
Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
Diffstat (limited to 'drivers/base')
-rw-r--r-- | drivers/base/firmware_class.c | 76 |
1 files changed, 50 insertions, 26 deletions
diff --git a/drivers/base/firmware_class.c b/drivers/base/firmware_class.c index d351e773f439..c378a355bed4 100644 --- a/drivers/base/firmware_class.c +++ b/drivers/base/firmware_class.c | |||
@@ -27,6 +27,52 @@ MODULE_AUTHOR("Manuel Estrada Sainz"); | |||
27 | MODULE_DESCRIPTION("Multi purpose firmware loading support"); | 27 | MODULE_DESCRIPTION("Multi purpose firmware loading support"); |
28 | MODULE_LICENSE("GPL"); | 28 | MODULE_LICENSE("GPL"); |
29 | 29 | ||
30 | /* Builtin firmware support */ | ||
31 | |||
32 | #ifdef CONFIG_FW_LOADER | ||
33 | |||
34 | extern struct builtin_fw __start_builtin_fw[]; | ||
35 | extern struct builtin_fw __end_builtin_fw[]; | ||
36 | |||
37 | static bool fw_get_builtin_firmware(struct firmware *fw, const char *name) | ||
38 | { | ||
39 | struct builtin_fw *b_fw; | ||
40 | |||
41 | for (b_fw = __start_builtin_fw; b_fw != __end_builtin_fw; b_fw++) { | ||
42 | if (strcmp(name, b_fw->name) == 0) { | ||
43 | fw->size = b_fw->size; | ||
44 | fw->data = b_fw->data; | ||
45 | return true; | ||
46 | } | ||
47 | } | ||
48 | |||
49 | return false; | ||
50 | } | ||
51 | |||
52 | static bool fw_is_builtin_firmware(const struct firmware *fw) | ||
53 | { | ||
54 | struct builtin_fw *b_fw; | ||
55 | |||
56 | for (b_fw = __start_builtin_fw; b_fw != __end_builtin_fw; b_fw++) | ||
57 | if (fw->data == b_fw->data) | ||
58 | return true; | ||
59 | |||
60 | return false; | ||
61 | } | ||
62 | |||
63 | #else /* Module case - no builtin firmware support */ | ||
64 | |||
65 | static inline bool fw_get_builtin_firmware(struct firmware *fw, const char *name) | ||
66 | { | ||
67 | return false; | ||
68 | } | ||
69 | |||
70 | static inline bool fw_is_builtin_firmware(const struct firmware *fw) | ||
71 | { | ||
72 | return false; | ||
73 | } | ||
74 | #endif | ||
75 | |||
30 | enum { | 76 | enum { |
31 | FW_STATUS_LOADING, | 77 | FW_STATUS_LOADING, |
32 | FW_STATUS_DONE, | 78 | FW_STATUS_DONE, |
@@ -53,14 +99,6 @@ struct firmware_priv { | |||
53 | bool nowait; | 99 | bool nowait; |
54 | }; | 100 | }; |
55 | 101 | ||
56 | #ifdef CONFIG_FW_LOADER | ||
57 | extern struct builtin_fw __start_builtin_fw[]; | ||
58 | extern struct builtin_fw __end_builtin_fw[]; | ||
59 | #else /* Module case. Avoid ifdefs later; it'll all optimise out */ | ||
60 | static struct builtin_fw *__start_builtin_fw; | ||
61 | static struct builtin_fw *__end_builtin_fw; | ||
62 | #endif | ||
63 | |||
64 | static void | 102 | static void |
65 | fw_load_abort(struct firmware_priv *fw_priv) | 103 | fw_load_abort(struct firmware_priv *fw_priv) |
66 | { | 104 | { |
@@ -497,7 +535,6 @@ _request_firmware(const struct firmware **firmware_p, const char *name, | |||
497 | struct device *f_dev; | 535 | struct device *f_dev; |
498 | struct firmware_priv *fw_priv; | 536 | struct firmware_priv *fw_priv; |
499 | struct firmware *firmware; | 537 | struct firmware *firmware; |
500 | struct builtin_fw *builtin; | ||
501 | int retval; | 538 | int retval; |
502 | 539 | ||
503 | if (!firmware_p) | 540 | if (!firmware_p) |
@@ -511,13 +548,8 @@ _request_firmware(const struct firmware **firmware_p, const char *name, | |||
511 | goto out; | 548 | goto out; |
512 | } | 549 | } |
513 | 550 | ||
514 | for (builtin = __start_builtin_fw; builtin != __end_builtin_fw; | 551 | if (fw_get_builtin_firmware(firmware, name)) { |
515 | builtin++) { | ||
516 | if (strcmp(name, builtin->name)) | ||
517 | continue; | ||
518 | dev_dbg(device, "firmware: using built-in firmware %s\n", name); | 552 | dev_dbg(device, "firmware: using built-in firmware %s\n", name); |
519 | firmware->size = builtin->size; | ||
520 | firmware->data = builtin->data; | ||
521 | return 0; | 553 | return 0; |
522 | } | 554 | } |
523 | 555 | ||
@@ -589,19 +621,11 @@ request_firmware(const struct firmware **firmware_p, const char *name, | |||
589 | * release_firmware: - release the resource associated with a firmware image | 621 | * release_firmware: - release the resource associated with a firmware image |
590 | * @fw: firmware resource to release | 622 | * @fw: firmware resource to release |
591 | **/ | 623 | **/ |
592 | void | 624 | void release_firmware(const struct firmware *fw) |
593 | release_firmware(const struct firmware *fw) | ||
594 | { | 625 | { |
595 | struct builtin_fw *builtin; | ||
596 | |||
597 | if (fw) { | 626 | if (fw) { |
598 | for (builtin = __start_builtin_fw; builtin != __end_builtin_fw; | 627 | if (!fw_is_builtin_firmware(fw)) |
599 | builtin++) { | 628 | firmware_free_data(fw); |
600 | if (fw->data == builtin->data) | ||
601 | goto free_fw; | ||
602 | } | ||
603 | firmware_free_data(fw); | ||
604 | free_fw: | ||
605 | kfree(fw); | 629 | kfree(fw); |
606 | } | 630 | } |
607 | } | 631 | } |