OSDN Git Service

V4L/DVB (7128): tuner: properly handle failed calls to simple_tuner_attach
authorMichael Krufky <mkrufky@linuxtv.org>
Tue, 22 Apr 2008 17:41:51 +0000 (14:41 -0300)
committerMauro Carvalho Chehab <mchehab@infradead.org>
Thu, 24 Apr 2008 16:42:25 +0000 (13:42 -0300)
If simple_tuner_attach fails, set t->type to TUNER_ABSENT,
set t->mode_mask to T_UNINITIALIZED, and exit the set_type function.

Signed-off-by: Michael Krufky <mkrufky@linuxtv.org>
Signed-off-by: Mauro Carvalho Chehab <mchehab@infradead.org>
drivers/media/video/tuner-core.c

index d6b64e9..335a971 100644 (file)
@@ -317,11 +317,6 @@ static void tuner_i2c_address_check(struct tuner *t)
        tuner_warn("====================== WARNING! ======================\n");
 }
 
-static inline void attach_simple_tuner(struct tuner *t)
-{
-       simple_tuner_attach(&t->fe, t->i2c->adapter, t->i2c->addr, t->type);
-}
-
 static void attach_tda829x(struct tuner *t)
 {
        struct tda829x_config cfg = {
@@ -399,7 +394,12 @@ static void set_type(struct i2c_client *c, unsigned int type,
                buffer[2] = 0x86;
                buffer[3] = 0x54;
                i2c_master_send(c, buffer, 4);
-               attach_simple_tuner(t);
+               if (simple_tuner_attach(&t->fe, t->i2c->adapter, t->i2c->addr,
+                                       t->type) == NULL) {
+                       t->type = TUNER_ABSENT;
+                       t->mode_mask = T_UNINITIALIZED;
+                       return;
+               }
                break;
        case TUNER_PHILIPS_TD1316:
                buffer[0] = 0x0b;
@@ -407,7 +407,12 @@ static void set_type(struct i2c_client *c, unsigned int type,
                buffer[2] = 0x86;
                buffer[3] = 0xa4;
                i2c_master_send(c,buffer,4);
-               attach_simple_tuner(t);
+               if (simple_tuner_attach(&t->fe, t->i2c->adapter,
+                                       t->i2c->addr, t->type) == NULL) {
+                       t->type = TUNER_ABSENT;
+                       t->mode_mask = T_UNINITIALIZED;
+                       return;
+               }
                break;
        case TUNER_XC2028:
        {
@@ -445,7 +450,12 @@ static void set_type(struct i2c_client *c, unsigned int type,
                }
                break;
        default:
-               attach_simple_tuner(t);
+               if (simple_tuner_attach(&t->fe, t->i2c->adapter,
+                                       t->i2c->addr, t->type) == NULL) {
+                       t->type = TUNER_ABSENT;
+                       t->mode_mask = T_UNINITIALIZED;
+                       return;
+               }
                break;
        }