summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--drivers/media/common/siano/smscoreapi.c91
1 files changed, 54 insertions, 37 deletions
diff --git a/drivers/media/common/siano/smscoreapi.c b/drivers/media/common/siano/smscoreapi.c
index 8c576a6e382..9b2f2b42bfb 100644
--- a/drivers/media/common/siano/smscoreapi.c
+++ b/drivers/media/common/siano/smscoreapi.c
@@ -1063,9 +1063,11 @@ static int smscore_load_firmware_from_file(struct smscore_device_t *coredev,
const struct firmware *fw;
char *fw_filename = smscore_get_fw_filename(coredev, mode, lookup);
- sms_debug("Firmware name: %s\n", fw_filename);
- if (!strcmp(fw_filename, "none"))
+ if (!fw_filename) {
+ sms_info("mode %d not supported on this device", mode);
return -ENOENT;
+ }
+ sms_debug("Firmware name: %s", fw_filename);
if (loadfirmware_handler == NULL && !(coredev->device_flags
& SMS_DEVICE_FAMILY2))
@@ -1198,32 +1200,53 @@ static int smscore_detect_mode(struct smscore_device_t *coredev)
return rc;
}
-static char *smscore_fw_lkup[][SMS_NUM_OF_DEVICE_TYPES] = {
- /*Stellar, NOVA A0, Nova B0, VEGA, VENICE, MING, PELE, RIO, DENVER_1530, DENVER_2160 */
- /*DVBT*/
- { "none", "dvb_nova_12mhz.inp", "dvb_nova_12mhz_b0.inp", "none", "none", "none", "none", "dvb_rio.inp", "none", "none" },
- /*DVBH*/
- { "none", "dvb_nova_12mhz.inp", "dvb_nova_12mhz_b0.inp", "none", "none", "none", "none", "dvbh_rio.inp", "none", "none" },
- /*TDMB*/
- { "none", "tdmb_nova_12mhz.inp", "tdmb_nova_12mhz_b0.inp", "none", "none", "none", "none", "none", "none", "tdmb_denver.inp" },
- /*DABIP*/
- { "none", "none", "none", "none", "none", "none", "none", "none", "none", "none" },
- /*DVBT_BDA*/
- { "none", "dvb_nova_12mhz.inp", "dvb_nova_12mhz_b0.inp", "none", "none", "none", "none", "dvb_rio.inp", "none", "none" },
- /*ISDBT*/
- { "none", "isdbt_nova_12mhz.inp", "isdbt_nova_12mhz_b0.inp", "none", "none", "none", "isdbt_pele.inp", "isdbt_rio.inp", "none", "none" },
- /*ISDBT_BDA*/
- { "none", "isdbt_nova_12mhz.inp", "isdbt_nova_12mhz_b0.inp", "none", "none", "none", "isdbt_pele.inp", "isdbt_rio.inp", "none", "none" },
- /*CMMB*/
- { "none", "none", "none", "cmmb_vega_12mhz.inp", "cmmb_venice_12mhz.inp", "cmmb_ming_app.inp", "none", "none", "none", "none" },
- /*RAW - not supported*/
- { "none", "none", "none", "none", "none", "none", "none", "none", "none", "none" },
- /*FM*/
- { "none", "none", "fm_radio.inp", "none", "none", "none", "none", "fm_radio_rio.inp", "none", "none" },
- /*FM_BDA*/
- { "none", "none", "fm_radio.inp", "none", "none", "none", "none", "fm_radio_rio.inp", "none", "none" },
- /*ATSC*/
- { "none", "none", "none", "none", "none", "none", "none", "none", "atsc_denver.inp", "none" }
+static char *smscore_fw_lkup[][DEVICE_MODE_MAX] = {
+ [SMS_NOVA_A0] = {
+ [DEVICE_MODE_DVBT] = "dvb_nova_12mhz.inp",
+ [DEVICE_MODE_DVBH] = "dvb_nova_12mhz.inp",
+ [DEVICE_MODE_DAB_TDMB] = "tdmb_nova_12mhz.inp",
+ [DEVICE_MODE_DVBT_BDA] = "dvb_nova_12mhz.inp",
+ [DEVICE_MODE_ISDBT] = "isdbt_nova_12mhz.inp",
+ [DEVICE_MODE_ISDBT_BDA] = "isdbt_nova_12mhz.inp",
+ },
+ [SMS_NOVA_B0] = {
+ [DEVICE_MODE_DVBT] = "dvb_nova_12mhz_b0.inp",
+ [DEVICE_MODE_DVBH] = "dvb_nova_12mhz_b0.inp",
+ [DEVICE_MODE_DAB_TDMB] = "tdmb_nova_12mhz_b0.inp",
+ [DEVICE_MODE_DVBT_BDA] = "dvb_nova_12mhz_b0.inp",
+ [DEVICE_MODE_ISDBT] = "isdbt_nova_12mhz_b0.inp",
+ [DEVICE_MODE_ISDBT_BDA] = "isdbt_nova_12mhz_b0.inp",
+ [DEVICE_MODE_FM_RADIO] = "fm_radio.inp",
+ [DEVICE_MODE_FM_RADIO_BDA] = "fm_radio.inp",
+ },
+ [SMS_VEGA] = {
+ [DEVICE_MODE_CMMB] = "cmmb_vega_12mhz.inp",
+ },
+ [SMS_VENICE] = {
+ [DEVICE_MODE_CMMB] = "cmmb_venice_12mhz.inp",
+ },
+ [SMS_MING] = {
+ [DEVICE_MODE_CMMB] = "cmmb_ming_app.inp",
+ },
+ [SMS_PELE] = {
+ [DEVICE_MODE_ISDBT] = "isdbt_pele.inp",
+ [DEVICE_MODE_ISDBT_BDA] = "isdbt_pele.inp",
+ },
+ [SMS_RIO] = {
+ [DEVICE_MODE_DVBT] = "dvb_rio.inp",
+ [DEVICE_MODE_DVBH] = "dvbh_rio.inp",
+ [DEVICE_MODE_DVBT_BDA] = "dvb_rio.inp",
+ [DEVICE_MODE_ISDBT] = "isdbt_rio.inp",
+ [DEVICE_MODE_ISDBT_BDA] = "isdbt_rio.inp",
+ [DEVICE_MODE_FM_RADIO] = "fm_radio_rio.inp",
+ [DEVICE_MODE_FM_RADIO_BDA] = "fm_radio_rio.inp",
+ },
+ [SMS_DENVER_1530] = {
+ [DEVICE_MODE_ATSC] = "atsc_denver.inp",
+ },
+ [SMS_DENVER_2160] = {
+ [DEVICE_MODE_DAB_TDMB] = "tdmb_denver.inp",
+ },
};
/**
@@ -1249,22 +1272,16 @@ static char *smscore_get_fw_filename(struct smscore_device_t *coredev,
if ((board_id == SMS_BOARD_UNKNOWN) || (lookup == 1)) {
sms_debug("trying to get fw name from lookup table mode %d type %d",
mode, type);
- return smscore_fw_lkup[mode][type];
+ return smscore_fw_lkup[type][mode];
}
sms_debug("trying to get fw name from sms_boards board_id %d mode %d",
board_id, mode);
fw = sms_get_board(board_id)->fw;
- if (fw == NULL) {
- sms_debug("cannot find fw name in sms_boards, getting from lookup table mode %d type %d",
- mode, type);
- return smscore_fw_lkup[mode][type];
- }
-
- if (fw[mode] == NULL) {
+ if (!fw || !fw[mode]) {
sms_debug("cannot find fw name in sms_boards, getting from lookup table mode %d type %d",
mode, type);
- return smscore_fw_lkup[mode][type];
+ return smscore_fw_lkup[type][mode];
}
return fw[mode];