Browse Source

V4L/DVB (7266): cx88-dvb: convert attach_xc3028 into a function

Signed-off-by: Mauro Carvalho Chehab <mchehab@infradead.org>
Mauro Carvalho Chehab 17 years ago
parent
commit
23fb348d00
1 changed files with 31 additions and 27 deletions
  1. 31 27
      drivers/media/video/cx88/cx88-dvb.c

+ 31 - 27
drivers/media/video/cx88/cx88-dvb.c

@@ -452,11 +452,33 @@ static struct zl10353_config cx88_geniatech_x8000_mt = {
        .no_tuner = 1,
 };
 
+static int attach_xc3028(u8 addr, struct cx8802_dev *dev)
+{
+	struct dvb_frontend *fe;
+	struct xc2028_config cfg = {
+		.i2c_adap  = &dev->core->i2c_adap,
+		.i2c_addr  = addr,
+		.video_dev = dev->core,
+	};
+
+	fe = dvb_attach(xc2028_attach, dev->dvb.frontend, &cfg);
+	if (!fe) {
+		printk(KERN_ERR "%s/2: xc3028 attach failed\n",
+		       dev->core->name);
+		dvb_frontend_detach(dev->dvb.frontend);
+		dvb_unregister_frontend(dev->dvb.frontend);
+		dev->dvb.frontend = NULL;
+		return -EINVAL;
+	}
+
+	printk(KERN_INFO "%s/2: xc3028 attached\n",
+	       dev->core->name);
+
+	return 0;
+}
 
 static int dvb_register(struct cx8802_dev *dev)
 {
-	int attach_xc3028 = 0;
-
 	/* init struct videobuf_dvb */
 	dev->dvb.name = dev->core->name;
 	dev->ts_gen_cntrl = 0x0c;
@@ -595,8 +617,8 @@ static int dvb_register(struct cx8802_dev *dev)
 		 */
 		if (dev->dvb.frontend)
 			dev->dvb.frontend->ops.i2c_gate_ctrl = NULL;
-
-		attach_xc3028 = 1;
+		if (attach_xc3028(0x61, dev) < 0)
+			return -EINVAL;
 		break;
 	case CX88_BOARD_PCHDTV_HD3000:
 		dev->dvb.frontend = dvb_attach(or51132_attach, &pchdtv_hd3000,
@@ -770,7 +792,8 @@ static int dvb_register(struct cx8802_dev *dev)
 		dev->dvb.frontend = dvb_attach(zl10353_attach,
 					       &cx88_geniatech_x8000_mt,
 					       &dev->core->i2c_adap);
-		attach_xc3028 = 1;
+		if (attach_xc3028(0x61, dev) < 0)
+			return -EINVAL;
 		break;
 	 case CX88_BOARD_GENIATECH_X8000_MT:
 	       dev->ts_gen_cntrl = 0x00;
@@ -778,7 +801,8 @@ static int dvb_register(struct cx8802_dev *dev)
 		dev->dvb.frontend = dvb_attach(zl10353_attach,
 					       &cx88_geniatech_x8000_mt,
 					       &dev->core->i2c_adap);
-		attach_xc3028 = 1;
+		if (attach_xc3028(0x61, dev) < 0)
+			return -EINVAL;
 		break;
 	default:
 		printk(KERN_ERR "%s/2: The frontend of your DVB/ATSC card isn't supported yet\n",
@@ -789,27 +813,7 @@ static int dvb_register(struct cx8802_dev *dev)
 		printk(KERN_ERR
 		       "%s/2: frontend initialization failed\n",
 		       dev->core->name);
-		return -1;
-	}
-
-	if (attach_xc3028) {
-		struct dvb_frontend *fe;
-		struct xc2028_config cfg = {
-			.i2c_adap  = &dev->core->i2c_adap,
-			.i2c_addr  = 0x61,
-			.video_dev = dev->core,
-		};
-		fe = dvb_attach(xc2028_attach, dev->dvb.frontend, &cfg);
-		if (!fe) {
-			printk(KERN_ERR "%s/2: xc3028 attach failed\n",
-			       dev->core->name);
-			dvb_frontend_detach(dev->dvb.frontend);
-			dvb_unregister_frontend(dev->dvb.frontend);
-			dev->dvb.frontend = NULL;
-			return -1;
-		}
-		printk(KERN_INFO "%s/2: xc3028 attached\n",
-		       dev->core->name);
+		return -EINVAL;
 	}
 
 	/* Ensure all frontends negotiate bus access */