[media] drx-j: dynamically load the firmware
authorMauro Carvalho Chehab <m.chehab@samsung.com>
Sat, 18 Jan 2014 14:13:02 +0000 (11:13 -0300)
committerMauro Carvalho Chehab <m.chehab@samsung.com>
Tue, 4 Mar 2014 17:32:17 +0000 (14:32 -0300)
Instead of hardcoding the firmware files together with the driver,
use request_firmware() way, loading it from userspace.

The firmware files are placed at:
http://linuxtv.org/downloads/firmware/#8

And they'll be latter submitted to linux-firmware git tree.

Acked-by: Devin Heitmueller <dheitmueller@kernellabs.com>
Signed-off-by: Mauro Carvalho Chehab <m.chehab@samsung.com>
drivers/media/dvb-frontends/drx39xyj/drx39xxj.c
drivers/media/dvb-frontends/drx39xyj/drx39xxj.h
drivers/media/dvb-frontends/drx39xyj/drx_driver.c
drivers/media/dvb-frontends/drx39xyj/drx_driver.h
drivers/media/dvb-frontends/drx39xyj/drxj.c
drivers/media/dvb-frontends/drx39xyj/drxj_mc.h [deleted file]
drivers/media/dvb-frontends/drx39xyj/drxj_mc_vsb.h [deleted file]
drivers/media/dvb-frontends/drx39xyj/drxj_mc_vsbqam.h [deleted file]

index a19547b..f0f14ed 100644 (file)
 #include "dvb_frontend.h"
 #include "drx39xxj.h"
 #include "drx_driver.h"
-#include "drxj_mc.h"
 #include "drxj.h"
 
+#define DRX39XX_MAIN_FIRMWARE "dvb-fe-drxj-mc-1.0.8.fw"
+
 static int drx39xxj_set_powerstate(struct dvb_frontend *fe, int enable)
 {
        struct drx39xxj_state *state = fe->demodulator_priv;
@@ -323,6 +324,8 @@ static void drx39xxj_release(struct dvb_frontend *fe)
        kfree(demod->my_ext_attr);
        kfree(demod->my_common_attr);
        kfree(demod->my_i2c_dev_addr);
+       if (demod->firmware)
+               release_firmware(demod->firmware);
        kfree(demod);
        kfree(state);
 }
@@ -377,15 +380,13 @@ struct dvb_frontend *drx39xxj_attach(struct i2c_adapter *i2c)
        demod->my_i2c_dev_addr = demod_addr;
        demod->my_common_attr = demod_comm_attr;
        demod->my_i2c_dev_addr->user_data = state;
-       demod->my_common_attr->microcode = DRXJ_MC_MAIN;
-#if 0
-       demod->my_common_attr->verify_microcode = false;
-#endif
+       demod->my_common_attr->microcode_file = DRX39XX_MAIN_FIRMWARE;
        demod->my_common_attr->verify_microcode = true;
        demod->my_common_attr->intermediate_freq = 5000;
        demod->my_ext_attr = demod_ext_attr;
        ((struct drxj_data *)demod_ext_attr)->uio_sma_tx_mode = DRX_UIO_MODE_READWRITE;
        demod->my_tuner = NULL;
+       demod->i2c = i2c;
 
        result = drx_open(demod);
        if (result != 0) {
@@ -455,3 +456,4 @@ static struct dvb_frontend_ops drx39xxj_ops = {
 MODULE_DESCRIPTION("Micronas DRX39xxj Frontend");
 MODULE_AUTHOR("Devin Heitmueller");
 MODULE_LICENSE("GPL");
+MODULE_FIRMWARE(DRX39XX_MAIN_FIRMWARE);
diff --cc drivers/media/dvb-frontends/drx39xyj/drxj_mc.h
Simple merge
diff --cc drivers/media/dvb-frontends/drx39xyj/drxj_mc_vsb.h
Simple merge
diff --cc drivers/media/dvb-frontends/drx39xyj/drxj_mc_vsbqam.h
Simple merge