diff options
author | Mauro Carvalho Chehab <mchehab@redhat.com> | 2011-07-23 02:22:29 +0200 |
---|---|---|
committer | Mauro Carvalho Chehab <mchehab@redhat.com> | 2012-01-05 01:48:59 +0100 |
commit | 1b0bfee39d531ffaf91b3294a2204b2ed8151fb8 (patch) | |
tree | 72b0ebe8f312aae0530a96ef739fe7a35d398a3a /drivers/media | |
parent | [media] mt2063: Remove two unused temporary vars (diff) | |
download | linux-1b0bfee39d531ffaf91b3294a2204b2ed8151fb8.tar.xz linux-1b0bfee39d531ffaf91b3294a2204b2ed8151fb8.zip |
[media] mt2063: don't crash if device is not initialized
Instead of crash, return -ENODEV, if the device is not poperly
initialized.
Also, give a second chance for it to initialize, at set_params
calls.
Signed-off-by: Mauro Carvalho Chehab <mchehab@redhat.com>
Diffstat (limited to 'drivers/media')
-rw-r--r-- | drivers/media/common/tuners/mt2063.c | 25 |
1 files changed, 25 insertions, 0 deletions
diff --git a/drivers/media/common/tuners/mt2063.c b/drivers/media/common/tuners/mt2063.c index 92653a9ff3b0..db347d9e7d45 100644 --- a/drivers/media/common/tuners/mt2063.c +++ b/drivers/media/common/tuners/mt2063.c @@ -220,6 +220,8 @@ enum MT2063_Register_Offsets { struct mt2063_state { struct i2c_adapter *i2c; + bool init; + const struct mt2063_config *config; struct dvb_tuner_ops ops; struct dvb_frontend *frontend; @@ -1974,6 +1976,8 @@ static int mt2063_init(struct dvb_frontend *fe) if (status < 0) return status; + state->init = true; + return 0; } @@ -1984,6 +1988,9 @@ static int mt2063_get_status(struct dvb_frontend *fe, u32 *tuner_status) dprintk(2, "\n"); + if (!state->init) + return -ENODEV; + *tuner_status = 0; status = mt2063_lockStatus(state); if (status < 0) @@ -2019,6 +2026,12 @@ static int mt2063_set_analog_params(struct dvb_frontend *fe, dprintk(2, "\n"); + if (!state->init) { + status = mt2063_init(fe); + if (status < 0) + return status; + } + switch (params->mode) { case V4L2_TUNER_RADIO: pict_car = 38900000; @@ -2082,6 +2095,12 @@ static int mt2063_set_params(struct dvb_frontend *fe) s32 if_mid; s32 rcvr_mode; + if (!state->init) { + status = mt2063_init(fe); + if (status < 0) + return status; + } + dprintk(2, "\n"); if (c->bandwidth_hz == 0) @@ -2132,6 +2151,9 @@ static int mt2063_get_frequency(struct dvb_frontend *fe, u32 *freq) dprintk(2, "\n"); + if (!state->init) + return -ENODEV; + *freq = state->frequency; return 0; } @@ -2142,6 +2164,9 @@ static int mt2063_get_bandwidth(struct dvb_frontend *fe, u32 *bw) dprintk(2, "\n"); + if (!state->init) + return -ENODEV; + *bw = state->AS_Data.f_out_bw - 750000; return 0; } |