From 1b0bfee39d531ffaf91b3294a2204b2ed8151fb8 Mon Sep 17 00:00:00 2001 From: Mauro Carvalho Chehab Date: Fri, 22 Jul 2011 21:22:29 -0300 Subject: [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 --- drivers/media/common/tuners/mt2063.c | 25 +++++++++++++++++++++++++ 1 file changed, 25 insertions(+) (limited to 'drivers/media/common') 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; } -- cgit v1.2.3