Commit 2af04244 authored by Brad Love's avatar Brad Love Committed by Mauro Carvalho Chehab
Browse files

media: cx231xx: Add second i2c demod client



Include ability to add a i2c device style frontend to cx231xx USB
bridge. All current boards set to use frontend[0]. Changes are
backwards compatible with current behaviour.

Signed-off-by: default avatarBrad Love <brad@nextdimension.cc>
Signed-off-by: default avatarMauro Carvalho Chehab <mchehab@s-opensource.com>
parent bdaacc32
Loading
Loading
Loading
Loading
+25 −20
Original line number Diff line number Diff line
@@ -68,7 +68,7 @@ struct cx231xx_dvb {
	struct dmx_frontend fe_hw;
	struct dmx_frontend fe_mem;
	struct dvb_net net;
	struct i2c_client *i2c_client_demod;
	struct i2c_client *i2c_client_demod[2];
	struct i2c_client *i2c_client_tuner;
};

@@ -616,7 +616,12 @@ static void unregister_dvb(struct cx231xx_dvb *dvb)
		i2c_unregister_device(client);
	}
	/* remove I2C demod */
	client = dvb->i2c_client_demod;
	client = dvb->i2c_client_demod[1];
	if (client) {
		module_put(client->dev.driver->owner);
		i2c_unregister_device(client);
	}
	client = dvb->i2c_client_demod[0];
	if (client) {
		module_put(client->dev.driver->owner);
		i2c_unregister_device(client);
@@ -805,7 +810,7 @@ static int dvb_init(struct cx231xx *dev)
			goto out_free;
		}

		dvb->i2c_client_demod = client;
		dvb->i2c_client_demod[0] = client;

		dev->dvb->frontend[0]->ops.i2c_gate_ctrl = NULL;

@@ -852,7 +857,7 @@ static int dvb_init(struct cx231xx *dev)
			goto out_free;
		}

		dvb->i2c_client_demod = client;
		dvb->i2c_client_demod[0] = client;

		memset(&info, 0, sizeof(struct i2c_board_info));

@@ -1012,7 +1017,7 @@ static int dvb_init(struct cx231xx *dev)
			goto out_free;
		}

		dvb->i2c_client_demod = client;
		dvb->i2c_client_demod[0] = client;

		/* attach tuner chip */
		si2157_config.fe = dev->dvb->frontend[0];
@@ -1031,16 +1036,16 @@ static int dvb_init(struct cx231xx *dev)
		client = i2c_new_device(tuner_i2c, &info);

		if (client == NULL || client->dev.driver == NULL) {
			module_put(dvb->i2c_client_demod->dev.driver->owner);
			i2c_unregister_device(dvb->i2c_client_demod);
			module_put(dvb->i2c_client_demod[0]->dev.driver->owner);
			i2c_unregister_device(dvb->i2c_client_demod[0]);
			result = -ENODEV;
			goto out_free;
		}

		if (!try_module_get(client->dev.driver->owner)) {
			i2c_unregister_device(client);
			module_put(dvb->i2c_client_demod->dev.driver->owner);
			i2c_unregister_device(dvb->i2c_client_demod);
			module_put(dvb->i2c_client_demod[0]->dev.driver->owner);
			i2c_unregister_device(dvb->i2c_client_demod[0]);
			result = -ENODEV;
			goto out_free;
		}
@@ -1078,7 +1083,7 @@ static int dvb_init(struct cx231xx *dev)
			goto out_free;
		}

		dvb->i2c_client_demod = client;
		dvb->i2c_client_demod[0] = client;

		/* define general-purpose callback pointer */
		dvb->frontend[0]->callback = cx231xx_tuner_callback;
@@ -1122,7 +1127,7 @@ static int dvb_init(struct cx231xx *dev)
			goto out_free;
		}

		dvb->i2c_client_demod = client;
		dvb->i2c_client_demod[0] = client;
		dev->dvb->frontend[0]->ops.i2c_gate_ctrl = NULL;

		/* define general-purpose callback pointer */
@@ -1144,8 +1149,8 @@ static int dvb_init(struct cx231xx *dev)

		client = i2c_new_device(adapter, &info);
		if (client == NULL || client->dev.driver == NULL) {
			module_put(dvb->i2c_client_demod->dev.driver->owner);
			i2c_unregister_device(dvb->i2c_client_demod);
			module_put(dvb->i2c_client_demod[0]->dev.driver->owner);
			i2c_unregister_device(dvb->i2c_client_demod[0]);
			result = -ENODEV;
			goto out_free;
		}
@@ -1154,8 +1159,8 @@ static int dvb_init(struct cx231xx *dev)
			dev_err(dev->dev,
				"Failed to obtain %s tuner.\n",	info.type);
			i2c_unregister_device(client);
			module_put(dvb->i2c_client_demod->dev.driver->owner);
			i2c_unregister_device(dvb->i2c_client_demod);
			module_put(dvb->i2c_client_demod[0]->dev.driver->owner);
			i2c_unregister_device(dvb->i2c_client_demod[0]);
			result = -ENODEV;
			goto out_free;
		}
@@ -1196,7 +1201,7 @@ static int dvb_init(struct cx231xx *dev)
			goto out_free;
		}

		dvb->i2c_client_demod = client;
		dvb->i2c_client_demod[0] = client;
		dev->dvb->frontend[0]->ops.i2c_gate_ctrl = NULL;

		/* define general-purpose callback pointer */
@@ -1218,8 +1223,8 @@ static int dvb_init(struct cx231xx *dev)

		client = i2c_new_device(tuner_i2c, &info);
		if (client == NULL || client->dev.driver == NULL) {
			module_put(dvb->i2c_client_demod->dev.driver->owner);
			i2c_unregister_device(dvb->i2c_client_demod);
			module_put(dvb->i2c_client_demod[0]->dev.driver->owner);
			i2c_unregister_device(dvb->i2c_client_demod[0]);
			result = -ENODEV;
			goto out_free;
		}
@@ -1228,8 +1233,8 @@ static int dvb_init(struct cx231xx *dev)
			dev_err(dev->dev,
				"Failed to obtain %s tuner.\n",	info.type);
			i2c_unregister_device(client);
			module_put(dvb->i2c_client_demod->dev.driver->owner);
			i2c_unregister_device(dvb->i2c_client_demod);
			module_put(dvb->i2c_client_demod[0]->dev.driver->owner);
			i2c_unregister_device(dvb->i2c_client_demod[0]);
			result = -ENODEV;
			goto out_free;
		}
+1 −0
Original line number Diff line number Diff line
@@ -345,6 +345,7 @@ struct cx231xx_board {

	/* demod related */
	int demod_addr;
	int demod_addr2;
	u8 demod_xfer_mode;	/* 0 - Serial; 1 - parallel */

	/* GPIO Pins */