]> git.proxmox.com Git - mirror_ubuntu-eoan-kernel.git/commitdiff
[media] mt2063: don't crash if device is not initialized
authorMauro Carvalho Chehab <mchehab@redhat.com>
Sat, 23 Jul 2011 00:22:29 +0000 (21:22 -0300)
committerMauro Carvalho Chehab <mchehab@redhat.com>
Thu, 5 Jan 2012 00:48:59 +0000 (22:48 -0200)
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>
drivers/media/common/tuners/mt2063.c

index 92653a9ff3b0c1bab70f34f6e68ecd5d933210c5..db347d9e7d4577373d34303f9e7c5de95a0e9921 100644 (file)
@@ -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;
 }