diff options
author | Michael Krufky <mkrufky@linuxtv.org> | 2008-06-26 03:58:30 -0400 |
---|---|---|
committer | Mauro Carvalho Chehab <mchehab@infradead.org> | 2008-07-20 06:23:20 -0400 |
commit | 02aea4fb640cdc4018e0a6d34e235eb63e4482d7 (patch) | |
tree | e357cba33f9c33374b2fd8ceed7bde1e13f6f680 | |
parent | 2708e888c57904f78649dcd91dcda9768d580ecf (diff) |
V4L/DVB (8301): sms1xxx: add capability to define device-specific firmware filenames
Add the capability to define device-specific firmware filenames for the SMS1150,
with a mechanism to fall back to the generic firmware if the device-specific
firmware is not present.
Signed-off-by: Michael Krufky <mkrufky@linuxtv.org>
Signed-off-by: Mauro Carvalho Chehab <mchehab@infradead.org>
-rw-r--r-- | drivers/media/dvb/siano/sms-cards.h | 2 | ||||
-rw-r--r-- | drivers/media/dvb/siano/smscoreapi.c | 31 | ||||
-rw-r--r-- | drivers/media/dvb/siano/smsusb.c | 1 |
3 files changed, 28 insertions, 6 deletions
diff --git a/drivers/media/dvb/siano/sms-cards.h b/drivers/media/dvb/siano/sms-cards.h index 7ba3df63dffe..9e93f0b5b231 100644 --- a/drivers/media/dvb/siano/sms-cards.h +++ b/drivers/media/dvb/siano/sms-cards.h | |||
@@ -31,8 +31,8 @@ | |||
31 | #define SMS1XXX_BOARD_SIANO_VEGA 5 | 31 | #define SMS1XXX_BOARD_SIANO_VEGA 5 |
32 | 32 | ||
33 | struct sms_board { | 33 | struct sms_board { |
34 | char *name; | ||
35 | enum sms_device_type_st type; | 34 | enum sms_device_type_st type; |
35 | char *name, *fw[DEVICE_MODE_MAX]; | ||
36 | }; | 36 | }; |
37 | 37 | ||
38 | struct sms_board *sms_get_board(int id); | 38 | struct sms_board *sms_get_board(int id); |
diff --git a/drivers/media/dvb/siano/smscoreapi.c b/drivers/media/dvb/siano/smscoreapi.c index bbb3ad9c804a..eaa7cf22715b 100644 --- a/drivers/media/dvb/siano/smscoreapi.c +++ b/drivers/media/dvb/siano/smscoreapi.c | |||
@@ -32,6 +32,7 @@ | |||
32 | #include <linux/firmware.h> | 32 | #include <linux/firmware.h> |
33 | 33 | ||
34 | #include "smscoreapi.h" | 34 | #include "smscoreapi.h" |
35 | #include "sms-cards.h" | ||
35 | 36 | ||
36 | int sms_debug; | 37 | int sms_debug; |
37 | module_param_named(debug, sms_debug, int, 0644); | 38 | module_param_named(debug, sms_debug, int, 0644); |
@@ -600,7 +601,7 @@ static int smscore_load_firmware_from_file(struct smscore_device_t *coredev, | |||
600 | sms_info("failed to open \"%s\"", filename); | 601 | sms_info("failed to open \"%s\"", filename); |
601 | return rc; | 602 | return rc; |
602 | } | 603 | } |
603 | sms_info("read FW %s, size=%d\"", filename, fw->size); | 604 | sms_info("read FW %s, size=%d", filename, fw->size); |
604 | fw_buffer = kmalloc(ALIGN(fw->size, SMS_ALLOC_ALIGNMENT), | 605 | fw_buffer = kmalloc(ALIGN(fw->size, SMS_ALLOC_ALIGNMENT), |
605 | GFP_KERNEL | GFP_DMA); | 606 | GFP_KERNEL | GFP_DMA); |
606 | if (fw_buffer) { | 607 | if (fw_buffer) { |
@@ -736,6 +737,12 @@ static char *smscore_fw_lkup[][SMS_NUM_OF_DEVICE_TYPES] = { | |||
736 | {"none", "none", "none", "cmmb_vega_12mhz.inp"} | 737 | {"none", "none", "none", "cmmb_vega_12mhz.inp"} |
737 | }; | 738 | }; |
738 | 739 | ||
740 | static inline char *sms_get_fw_name(struct smscore_device_t *coredev, | ||
741 | int mode, enum sms_device_type_st type) | ||
742 | { | ||
743 | char **fw = sms_get_board(smscore_get_board_id(coredev))->fw; | ||
744 | return (fw && fw[mode]) ? fw[mode] : smscore_fw_lkup[mode][type]; | ||
745 | } | ||
739 | 746 | ||
740 | /** | 747 | /** |
741 | * calls device handler to change mode of operation | 748 | * calls device handler to change mode of operation |
@@ -776,12 +783,26 @@ int smscore_set_device_mode(struct smscore_device_t *coredev, int mode) | |||
776 | } | 783 | } |
777 | 784 | ||
778 | if (!(coredev->modes_supported & (1 << mode))) { | 785 | if (!(coredev->modes_supported & (1 << mode))) { |
786 | char *fw_filename; | ||
787 | |||
779 | type = smscore_registry_gettype(coredev->devpath); | 788 | type = smscore_registry_gettype(coredev->devpath); |
780 | rc = smscore_load_firmware_from_file( | 789 | fw_filename = sms_get_fw_name(coredev, mode, type); |
781 | coredev, smscore_fw_lkup[mode][type], NULL); | 790 | |
791 | rc = smscore_load_firmware_from_file(coredev, | ||
792 | fw_filename, NULL); | ||
782 | if (rc < 0) { | 793 | if (rc < 0) { |
783 | sms_err("load firmware failed %d", rc); | 794 | sms_err("error %d loading firmware: %s, " |
784 | return rc; | 795 | "trying again with default firmware", |
796 | rc, fw_filename); | ||
797 | |||
798 | /* try again with the default firmware */ | ||
799 | rc = smscore_load_firmware_from_file(coredev, | ||
800 | smscore_fw_lkup[mode][type], NULL); | ||
801 | |||
802 | if (rc < 0) { | ||
803 | sms_err("load firmware failed %d", rc); | ||
804 | return rc; | ||
805 | } | ||
785 | } | 806 | } |
786 | } else | 807 | } else |
787 | sms_info("mode %d supported by running " | 808 | sms_info("mode %d supported by running " |
diff --git a/drivers/media/dvb/siano/smsusb.c b/drivers/media/dvb/siano/smsusb.c index e7e0fe735427..f85210f2bd0d 100644 --- a/drivers/media/dvb/siano/smsusb.c +++ b/drivers/media/dvb/siano/smsusb.c | |||
@@ -216,6 +216,7 @@ static int smsusb1_load_firmware(struct usb_device *udev, int id) | |||
216 | sms_err("failed to allocate firmware buffer"); | 216 | sms_err("failed to allocate firmware buffer"); |
217 | rc = -ENOMEM; | 217 | rc = -ENOMEM; |
218 | } | 218 | } |
219 | sms_info("read FW %s, size=%d", smsusb1_fw_lkup[id], fw->size); | ||
219 | 220 | ||
220 | release_firmware(fw); | 221 | release_firmware(fw); |
221 | 222 | ||