summaryrefslogtreecommitdiffstats
path: root/drivers/media/common
diff options
context:
space:
mode:
authorMauro Carvalho Chehab <mchehab@redhat.com>2011-07-23 02:22:29 +0200
committerMauro Carvalho Chehab <mchehab@redhat.com>2012-01-05 01:48:59 +0100
commit1b0bfee39d531ffaf91b3294a2204b2ed8151fb8 (patch)
tree72b0ebe8f312aae0530a96ef739fe7a35d398a3a /drivers/media/common
parent[media] mt2063: Remove two unused temporary vars (diff)
downloadlinux-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/common')
-rw-r--r--drivers/media/common/tuners/mt2063.c25
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;
}