static int lme_firmware_switch(struct usb_device *udev, int cold) { const struct firmware *fw = NULL; const char fw_c_s7395[] = "dvb-usb-lme2510c-s7395.fw"; const char fw_c_lg[] = "dvb-usb-lme2510c-lg.fw"; const char fw_c_s0194[] = "dvb-usb-lme2510c-s0194.fw"; const char fw_c_rs2000[] = "dvb-usb-lme2510c-rs2000.fw"; const char fw_lg[] = "dvb-usb-lme2510-lg.fw"; const char fw_s0194[] = "dvb-usb-lme2510-s0194.fw"; const char *fw_lme; int ret = 0, cold_fw; cold = (cold > 0) ? (cold & 1) : 0; cold_fw = !cold; switch (le16_to_cpu(udev->descriptor.idProduct)) { case 0x1122: switch (dvb_usb_lme2510_firmware) { default: dvb_usb_lme2510_firmware = TUNER_S0194; case TUNER_S0194: fw_lme = fw_s0194; ret = request_firmware(&fw, fw_lme, &udev->dev); if (ret == 0) { cold = 0; break; } dvb_usb_lme2510_firmware = TUNER_LG; case TUNER_LG: fw_lme = fw_lg; ret = request_firmware(&fw, fw_lme, &udev->dev); if (ret == 0) break; info("FRM No Firmware Found - please install"); dvb_usb_lme2510_firmware = TUNER_DEFAULT; cold = 0; cold_fw = 0; break; } break; case 0x1120: switch (dvb_usb_lme2510_firmware) { default: dvb_usb_lme2510_firmware = TUNER_S7395; case TUNER_S7395: fw_lme = fw_c_s7395; ret = request_firmware(&fw, fw_lme, &udev->dev); if (ret == 0) { cold = 0; break; } dvb_usb_lme2510_firmware = TUNER_LG; case TUNER_LG: fw_lme = fw_c_lg; ret = request_firmware(&fw, fw_lme, &udev->dev); if (ret == 0) break; dvb_usb_lme2510_firmware = TUNER_S0194; case TUNER_S0194: fw_lme = fw_c_s0194; ret = request_firmware(&fw, fw_lme, &udev->dev); if (ret == 0) break; info("FRM No Firmware Found - please install"); dvb_usb_lme2510_firmware = TUNER_DEFAULT; cold = 0; cold_fw = 0; break; } break; case 0x22f0: fw_lme = fw_c_rs2000; ret = request_firmware(&fw, fw_lme, &udev->dev); dvb_usb_lme2510_firmware = TUNER_RS2000; break; default: fw_lme = fw_c_s7395; } if (cold_fw) { info("FRM Loading %s file", fw_lme); ret = lme2510_download_firmware(udev, fw); } release_firmware(fw); if (cold) { info("FRM Changing to %s firmware", fw_lme); lme_coldreset(udev); return -ENODEV; } return ret; }
static const char *lme_firmware_switch(struct dvb_usb_device *d, int cold) { struct lme2510_state *st = d->priv; struct usb_device *udev = d->udev; const struct firmware *fw = NULL; const char *fw_lme; int ret = 0; cold = (cold > 0) ? (cold & 1) : 0; switch (le16_to_cpu(udev->descriptor.idProduct)) { case 0x1122: switch (st->dvb_usb_lme2510_firmware) { default: case TUNER_S0194: fw_lme = fw_s0194; ret = request_firmware(&fw, fw_lme, &udev->dev); if (ret == 0) { st->dvb_usb_lme2510_firmware = TUNER_S0194; cold = 0; break; } /* fall through */ case TUNER_LG: fw_lme = fw_lg; ret = request_firmware(&fw, fw_lme, &udev->dev); if (ret == 0) { st->dvb_usb_lme2510_firmware = TUNER_LG; break; } st->dvb_usb_lme2510_firmware = TUNER_DEFAULT; break; } break; case 0x1120: switch (st->dvb_usb_lme2510_firmware) { default: case TUNER_S7395: fw_lme = fw_c_s7395; ret = request_firmware(&fw, fw_lme, &udev->dev); if (ret == 0) { st->dvb_usb_lme2510_firmware = TUNER_S7395; cold = 0; break; } /* fall through */ case TUNER_LG: fw_lme = fw_c_lg; ret = request_firmware(&fw, fw_lme, &udev->dev); if (ret == 0) { st->dvb_usb_lme2510_firmware = TUNER_LG; break; } /* fall through */ case TUNER_S0194: fw_lme = fw_c_s0194; ret = request_firmware(&fw, fw_lme, &udev->dev); if (ret == 0) { st->dvb_usb_lme2510_firmware = TUNER_S0194; break; } st->dvb_usb_lme2510_firmware = TUNER_DEFAULT; cold = 0; break; } break; case 0x22f0: fw_lme = fw_c_rs2000; st->dvb_usb_lme2510_firmware = TUNER_RS2000; break; default: fw_lme = fw_c_s7395; } release_firmware(fw); if (cold) { dvb_usb_lme2510_firmware = st->dvb_usb_lme2510_firmware; info("FRM Changing to %s firmware", fw_lme); lme_coldreset(d); return NULL; } return fw_lme; }