V4L/DVB (7837): tda18271: fix error handling in init and sleep paths
authorMichael Krufky <mkrufky@linuxtv.org>
Sat, 3 May 2008 21:20:21 +0000 (18:20 -0300)
committerMauro Carvalho Chehab <mchehab@infradead.org>
Wed, 14 May 2008 05:54:04 +0000 (02:54 -0300)
Signed-off-by: Michael Krufky <mkrufky@linuxtv.org>
Signed-off-by: Mauro Carvalho Chehab <mchehab@infradead.org>
drivers/media/common/tuners/tda18271-common.c
drivers/media/common/tuners/tda18271-fe.c

index e27a762..9001d42 100644 (file)
@@ -227,9 +227,8 @@ int tda18271_charge_pump_source(struct dvb_frontend *fe,
 
        regs[r_cp] &= ~0x20;
        regs[r_cp] |= ((force & 1) << 5);
-       tda18271_write_regs(fe, r_cp, 1);
 
-       return 0;
+       return tda18271_write_regs(fe, r_cp, 1);
 }
 
 int tda18271_init_regs(struct dvb_frontend *fe)
@@ -494,9 +493,7 @@ int tda18271_set_standby_mode(struct dvb_frontend *fe,
                        sm_lt ? (1 << 6) : 0 |
                        sm_xt ? (1 << 5) : 0;
 
-       tda18271_write_regs(fe, R_EP3, 1);
-
-       return 0;
+       return tda18271_write_regs(fe, R_EP3, 1);
 }
 
 /*---------------------------------------------------------------------*/
index b262100..46c0800 100644 (file)
@@ -719,45 +719,56 @@ static int tda18271_ir_cal_init(struct dvb_frontend *fe)
 {
        struct tda18271_priv *priv = fe->tuner_priv;
        unsigned char *regs = priv->tda18271_regs;
+       int ret;
 
-       tda18271_read_regs(fe);
+       ret = tda18271_read_regs(fe);
+       if (ret < 0)
+               goto fail;
 
        /* test IR_CAL_OK to see if we need init */
        if ((regs[R_EP1] & 0x08) == 0)
-               tda18271_init_regs(fe);
-
-       return 0;
+               ret = tda18271_init_regs(fe);
+fail:
+       return ret;
 }
 
 static int tda18271_init(struct dvb_frontend *fe)
 {
        struct tda18271_priv *priv = fe->tuner_priv;
+       int ret;
 
        mutex_lock(&priv->lock);
 
        /* power up */
-       tda18271_set_standby_mode(fe, 0, 0, 0);
+       ret = tda18271_set_standby_mode(fe, 0, 0, 0);
+       if (ret < 0)
+               goto fail;
 
        /* initialization */
-       tda18271_ir_cal_init(fe);
+       ret = tda18271_ir_cal_init(fe);
+       if (ret < 0)
+               goto fail;
 
        if (priv->id == TDA18271HDC2)
                tda18271c2_rf_cal_init(fe);
-
+fail:
        mutex_unlock(&priv->lock);
 
-       return 0;
+       return ret;
 }
 
 static int tda18271_tune(struct dvb_frontend *fe,
                         struct tda18271_std_map_item *map, u32 freq, u32 bw)
 {
        struct tda18271_priv *priv = fe->tuner_priv;
+       int ret;
 
        tda_dbg("freq = %d, ifc = %d, bw = %d, agc_mode = %d, std = %d\n",
                freq, map->if_freq, bw, map->agc_mode, map->std);
 
-       tda18271_init(fe);
+       ret = tda18271_init(fe);
+       if (ret < 0)
+               goto fail;
 
        mutex_lock(&priv->lock);
 
@@ -772,8 +783,8 @@ static int tda18271_tune(struct dvb_frontend *fe,
        tda18271_channel_configuration(fe, map, freq, bw);
 
        mutex_unlock(&priv->lock);
-
-       return 0;
+fail:
+       return ret;
 }
 
 /* ------------------------------------------------------------------ */
@@ -905,16 +916,17 @@ fail:
 static int tda18271_sleep(struct dvb_frontend *fe)
 {
        struct tda18271_priv *priv = fe->tuner_priv;
+       int ret;
 
        mutex_lock(&priv->lock);
 
        /* standby mode w/ slave tuner output
         * & loop thru & xtal oscillator on */
-       tda18271_set_standby_mode(fe, 1, 0, 0);
+       ret = tda18271_set_standby_mode(fe, 1, 0, 0);
 
        mutex_unlock(&priv->lock);
 
-       return 0;
+       return ret;
 }
 
 static int tda18271_release(struct dvb_frontend *fe)