Commit 23fb348d authored by Mauro Carvalho Chehab's avatar Mauro Carvalho Chehab
Browse files

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

parent 64016330
Loading
Loading
Loading
Loading
+31 −27
Original line number Diff line number Diff line
@@ -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 */