aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/media/dvb/frontends/drxd_hard.c
diff options
context:
space:
mode:
authorDevin Heitmueller <dheitmueller@kernellabs.com>2011-03-13 02:11:07 -0300
committerMauro Carvalho Chehab <mchehab@redhat.com>2011-05-20 07:26:21 -0300
commit8f19f27e3e0e055aed877a07198cfbaf9d784105 (patch)
tree461ba731d6abc2c32f4033f3541b99369cdd9cb5 /drivers/media/dvb/frontends/drxd_hard.c
parentad9b4bb265cecbfc9b0c495741e331ce199964e0 (diff)
downloadkernel_samsung_smdk4412-8f19f27e3e0e055aed877a07198cfbaf9d784105.zip
kernel_samsung_smdk4412-8f19f27e3e0e055aed877a07198cfbaf9d784105.tar.gz
kernel_samsung_smdk4412-8f19f27e3e0e055aed877a07198cfbaf9d784105.tar.bz2
[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.c31
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 b8baafe..bdc004b 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;