| From 8e30783b0b3270736b2cff6415c68b894bc411df Mon Sep 17 00:00:00 2001 |
| From: Mauro Carvalho Chehab <mchehab@redhat.com> |
| Date: Tue, 2 Oct 2012 16:01:15 -0300 |
| Subject: drxk: allow loading firmware synchrousnously |
| |
| From: Mauro Carvalho Chehab <mchehab@redhat.com> |
| |
| commit 8e30783b0b3270736b2cff6415c68b894bc411df upstream. |
| |
| Due to udev-182, the firmware load was changed to be async, as |
| otherwise udev would give up of loading a firmware. |
| |
| Add an option to return to the previous behaviour, async firmware |
| loads cause failures with the tda18271 driver. |
| |
| Antti tested it with the following hardware: |
| Hauppauge WinTV HVR 930C |
| MaxMedia UB425-TC |
| PCTV QuatroStick nano (520e) |
| |
| Tested-by: Antti Palosaari <crope@iki.fi> |
| Signed-off-by: Mauro Carvalho Chehab <mchehab@redhat.com> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| |
| --- |
| drivers/media/dvb/frontends/drxk.h | 2 ++ |
| drivers/media/dvb/frontends/drxk_hard.c | 20 +++++++++++++++----- |
| 2 files changed, 17 insertions(+), 5 deletions(-) |
| |
| --- a/drivers/media/dvb/frontends/drxk.h |
| +++ b/drivers/media/dvb/frontends/drxk.h |
| @@ -28,6 +28,7 @@ |
| * A value of 0 (default) or lower indicates that |
| * the correct number of parameters will be |
| * automatically detected. |
| + * @load_firmware_sync: Force the firmware load to be synchronous. |
| * |
| * On the *_gpio vars, bit 0 is UIO-1, bit 1 is UIO-2 and bit 2 is |
| * UIO-3. |
| @@ -39,6 +40,7 @@ struct drxk_config { |
| bool parallel_ts; |
| bool dynamic_clk; |
| bool enable_merr_cfg; |
| + bool load_firmware_sync; |
| |
| bool antenna_dvbt; |
| u16 antenna_gpio; |
| --- a/drivers/media/dvb/frontends/drxk_hard.c |
| +++ b/drivers/media/dvb/frontends/drxk_hard.c |
| @@ -6609,15 +6609,25 @@ struct dvb_frontend *drxk_attach(const s |
| |
| /* Load firmware and initialize DRX-K */ |
| if (state->microcode_name) { |
| - status = request_firmware_nowait(THIS_MODULE, 1, |
| + if (config->load_firmware_sync) { |
| + const struct firmware *fw = NULL; |
| + |
| + status = request_firmware(&fw, state->microcode_name, |
| + state->i2c->dev.parent); |
| + if (status < 0) |
| + fw = NULL; |
| + load_firmware_cb(fw, state); |
| + } else { |
| + status = request_firmware_nowait(THIS_MODULE, 1, |
| state->microcode_name, |
| state->i2c->dev.parent, |
| GFP_KERNEL, |
| state, load_firmware_cb); |
| - if (status < 0) { |
| - printk(KERN_ERR |
| - "drxk: failed to request a firmware\n"); |
| - return NULL; |
| + if (status < 0) { |
| + printk(KERN_ERR |
| + "drxk: failed to request a firmware\n"); |
| + return NULL; |
| + } |
| } |
| } else if (init_drxk(state) < 0) |
| goto error; |