diff options
author | Devin Heitmueller <dheitmueller@kernellabs.com> | 2011-03-13 08:11:07 +0300 |
---|---|---|
committer | Mauro Carvalho Chehab <mchehab@redhat.com> | 2011-05-20 14:26:21 +0400 |
commit | 8f19f27e3e0e055aed877a07198cfbaf9d784105 (patch) | |
tree | 461ba731d6abc2c32f4033f3541b99369cdd9cb5 /drivers/media/dvb/frontends/drxd_hard.c | |
parent | ad9b4bb265cecbfc9b0c495741e331ce199964e0 (diff) | |
download | linux-8f19f27e3e0e055aed877a07198cfbaf9d784105.tar.xz |
[media] drxd: move firmware to binary blob
Abstract out the firmware for the drx-d so that it can be loaded by the
request_firmware() interface.
The firmware licensing permits free redistribution, and can be found here:
http://kernellabs.com/firmware/drxd
Signed-off-by: Mauro Carvalho Chehab <mchehab@redhat.com>
Diffstat (limited to 'drivers/media/dvb/frontends/drxd_hard.c')
-rw-r--r-- | drivers/media/dvb/frontends/drxd_hard.c | 31 |
1 files changed, 27 insertions, 4 deletions
diff --git a/drivers/media/dvb/frontends/drxd_hard.c b/drivers/media/dvb/frontends/drxd_hard.c index b8baafe3b54b..bdc004b65ea9 100644 --- a/drivers/media/dvb/frontends/drxd_hard.c +++ b/drivers/media/dvb/frontends/drxd_hard.c @@ -35,6 +35,9 @@ #include "drxd.h" #include "drxd_firm.h" +#define DRX_FW_FILENAME_A2 "drxd-a2-1.1.fw" +#define DRX_FW_FILENAME_B1 "drxd-b1-1.1.fw" + #define CHK_ERROR(s) if( (status = s)<0 ) break #define CHUNK_SIZE 48 @@ -854,6 +857,26 @@ static int ReadIFAgc(struct drxd_state *state, u32 *pValue) return status; } +static int load_firmware(struct drxd_state *state, const char *fw_name) +{ + const struct firmware *fw; + + if (request_firmware(&fw, fw_name, state->dev) < 0) { + printk(KERN_ERR "drxd: firmware load failure [%s]\n", fw_name); + return -EIO; + } + + state->microcode = kzalloc(fw->size, GFP_KERNEL); + if (state->microcode == NULL) { + printk(KERN_ERR "drxd: firmware load failure: nomemory\n"); + return -ENOMEM; + } + + memcpy(state->microcode, fw->data, fw->size); + state->microcode_length = fw->size; + return 0; +} + static int DownloadMicrocode(struct drxd_state *state, const u8 *pMCImage, u32 Length) { @@ -1450,8 +1473,8 @@ static int SetDeviceTypeId(struct drxd_state *state) state->m_InitCE = DRXD_InitCEA2; state->m_InitEQ = DRXD_InitEQA2; state->m_InitEC = DRXD_InitECA2; - state->microcode = DRXD_A2_microcode; - state->microcode_length = DRXD_A2_microcode_length; + if (load_firmware(state, DRX_FW_FILENAME_A2)) + return -EIO; } else { state->m_ResetCEFR = NULL; state->m_InitFE_1 = DRXD_InitFEB1_1; @@ -1460,8 +1483,8 @@ static int SetDeviceTypeId(struct drxd_state *state) state->m_InitCE = DRXD_InitCEB1; state->m_InitEQ = DRXD_InitEQB1; state->m_InitEC = DRXD_InitECB1; - state->microcode = DRXD_B1_microcode; - state->microcode_length = DRXD_B1_microcode_length; + if (load_firmware(state, DRX_FW_FILENAME_B1)) + return -EIO; } if (state->diversity) { state->m_InitDiversityFront = DRXD_InitDiversityFront; |