diff mbox

[V2,07/13] cx231xx: add wrapper to get the i2c_adapter pointer

Message ID 1412140821-16285-8-git-send-email-zzam@gentoo.org (mailing list archive)
State New, archived
Headers show

Commit Message

Matthias Schwarzott Oct. 1, 2014, 5:20 a.m. UTC
This is a preparation for mapping I2C_1_MUX_1 and I2C_1_MUX_3 later to the seperate
muxed i2c adapters.

Map mux adapters to I2C_1 for now.

Add local variables for i2c_adapters in dvb_init to get line lengths
shorter.

Signed-off-by: Matthias Schwarzott <zzam@gentoo.org>
---
 drivers/media/usb/cx231xx/cx231xx-cards.c |  8 +++---
 drivers/media/usb/cx231xx/cx231xx-dvb.c   | 42 +++++++++++++++++--------------
 drivers/media/usb/cx231xx/cx231xx-i2c.c   | 20 ++++++++++++++-
 drivers/media/usb/cx231xx/cx231xx-input.c |  3 ++-
 drivers/media/usb/cx231xx/cx231xx.h       |  1 +
 5 files changed, 50 insertions(+), 24 deletions(-)

Comments

Antti Palosaari Oct. 1, 2014, 7:28 p.m. UTC | #1
Reviewed-by: Antti Palosaari <crope@iki.fi>

Antti

On 10/01/2014 08:20 AM, Matthias Schwarzott wrote:
> This is a preparation for mapping I2C_1_MUX_1 and I2C_1_MUX_3 later to the seperate
> muxed i2c adapters.
>
> Map mux adapters to I2C_1 for now.
>
> Add local variables for i2c_adapters in dvb_init to get line lengths
> shorter.
>
> Signed-off-by: Matthias Schwarzott <zzam@gentoo.org>
> ---
>   drivers/media/usb/cx231xx/cx231xx-cards.c |  8 +++---
>   drivers/media/usb/cx231xx/cx231xx-dvb.c   | 42 +++++++++++++++++--------------
>   drivers/media/usb/cx231xx/cx231xx-i2c.c   | 20 ++++++++++++++-
>   drivers/media/usb/cx231xx/cx231xx-input.c |  3 ++-
>   drivers/media/usb/cx231xx/cx231xx.h       |  1 +
>   5 files changed, 50 insertions(+), 24 deletions(-)
>
> diff --git a/drivers/media/usb/cx231xx/cx231xx-cards.c b/drivers/media/usb/cx231xx/cx231xx-cards.c
> index 2f027c7..f5fb93a 100644
> --- a/drivers/media/usb/cx231xx/cx231xx-cards.c
> +++ b/drivers/media/usb/cx231xx/cx231xx-cards.c
> @@ -1033,7 +1033,7 @@ void cx231xx_card_setup(struct cx231xx *dev)
>   	/* request some modules */
>   	if (dev->board.decoder == CX231XX_AVDECODER) {
>   		dev->sd_cx25840 = v4l2_i2c_new_subdev(&dev->v4l2_dev,
> -					&dev->i2c_bus[I2C_0].i2c_adap,
> +					cx231xx_get_i2c_adap(dev, I2C_0),
>   					"cx25840", 0x88 >> 1, NULL);
>   		if (dev->sd_cx25840 == NULL)
>   			cx231xx_info("cx25840 subdev registration failure\n");
> @@ -1043,8 +1043,10 @@ void cx231xx_card_setup(struct cx231xx *dev)
>
>   	/* Initialize the tuner */
>   	if (dev->board.tuner_type != TUNER_ABSENT) {
> +		struct i2c_adapter *tuner_i2c = cx231xx_get_i2c_adap(dev,
> +						dev->board.tuner_i2c_master);
>   		dev->sd_tuner = v4l2_i2c_new_subdev(&dev->v4l2_dev,
> -						    &dev->i2c_bus[dev->board.tuner_i2c_master].i2c_adap,
> +						    tuner_i2c,
>   						    "tuner",
>   						    dev->tuner_addr, NULL);
>   		if (dev->sd_tuner == NULL)
> @@ -1062,7 +1064,7 @@ void cx231xx_card_setup(struct cx231xx *dev)
>   			struct i2c_client client;
>
>   			memset(&client, 0, sizeof(client));
> -			client.adapter = &dev->i2c_bus[I2C_1].i2c_adap;
> +			client.adapter = cx231xx_get_i2c_adap(dev, I2C_1);
>   			client.addr = 0xa0 >> 1;
>
>   			read_eeprom(dev, &client, eeprom, sizeof(eeprom));
> diff --git a/drivers/media/usb/cx231xx/cx231xx-dvb.c b/drivers/media/usb/cx231xx/cx231xx-dvb.c
> index 6c7b5e2..869c433 100644
> --- a/drivers/media/usb/cx231xx/cx231xx-dvb.c
> +++ b/drivers/media/usb/cx231xx/cx231xx-dvb.c
> @@ -378,7 +378,7 @@ static int attach_xc5000(u8 addr, struct cx231xx *dev)
>   	struct xc5000_config cfg;
>
>   	memset(&cfg, 0, sizeof(cfg));
> -	cfg.i2c_adap = &dev->i2c_bus[dev->board.tuner_i2c_master].i2c_adap;
> +	cfg.i2c_adap = cx231xx_get_i2c_adap(dev, dev->board.tuner_i2c_master);
>   	cfg.i2c_addr = addr;
>
>   	if (!dev->dvb->frontend) {
> @@ -583,6 +583,8 @@ static int dvb_init(struct cx231xx *dev)
>   {
>   	int result = 0;
>   	struct cx231xx_dvb *dvb;
> +	struct i2c_adapter *tuner_i2c;
> +	struct i2c_adapter *demod_i2c;
>
>   	if (!dev->board.has_dvb) {
>   		/* This device does not support the extension */
> @@ -599,6 +601,8 @@ static int dvb_init(struct cx231xx *dev)
>   	dev->cx231xx_set_analog_freq = cx231xx_set_analog_freq;
>   	dev->cx231xx_reset_analog_tuner = cx231xx_reset_analog_tuner;
>
> +	tuner_i2c = cx231xx_get_i2c_adap(dev, dev->board.tuner_i2c_master);
> +	demod_i2c = cx231xx_get_i2c_adap(dev, dev->board.demod_i2c_master);
>   	mutex_lock(&dev->lock);
>   	cx231xx_set_mode(dev, CX231XX_DIGITAL_MODE);
>   	cx231xx_demod_reset(dev);
> @@ -609,7 +613,7 @@ static int dvb_init(struct cx231xx *dev)
>
>   		dev->dvb->frontend = dvb_attach(s5h1432_attach,
>   					&dvico_s5h1432_config,
> -					&dev->i2c_bus[dev->board.demod_i2c_master].i2c_adap);
> +					demod_i2c);
>
>   		if (dev->dvb->frontend == NULL) {
>   			printk(DRIVER_NAME
> @@ -622,7 +626,7 @@ static int dvb_init(struct cx231xx *dev)
>   		dvb->frontend->callback = cx231xx_tuner_callback;
>
>   		if (!dvb_attach(xc5000_attach, dev->dvb->frontend,
> -			       &dev->i2c_bus[dev->board.tuner_i2c_master].i2c_adap,
> +			       tuner_i2c,
>   			       &cnxt_rde250_tunerconfig)) {
>   			result = -EINVAL;
>   			goto out_free;
> @@ -634,7 +638,7 @@ static int dvb_init(struct cx231xx *dev)
>
>   		dev->dvb->frontend = dvb_attach(s5h1411_attach,
>   					       &xc5000_s5h1411_config,
> -					       &dev->i2c_bus[dev->board.demod_i2c_master].i2c_adap);
> +					       demod_i2c);
>
>   		if (dev->dvb->frontend == NULL) {
>   			printk(DRIVER_NAME
> @@ -647,7 +651,7 @@ static int dvb_init(struct cx231xx *dev)
>   		dvb->frontend->callback = cx231xx_tuner_callback;
>
>   		if (!dvb_attach(xc5000_attach, dev->dvb->frontend,
> -			       &dev->i2c_bus[dev->board.tuner_i2c_master].i2c_adap,
> +			       tuner_i2c,
>   			       &cnxt_rdu250_tunerconfig)) {
>   			result = -EINVAL;
>   			goto out_free;
> @@ -657,7 +661,7 @@ static int dvb_init(struct cx231xx *dev)
>
>   		dev->dvb->frontend = dvb_attach(s5h1432_attach,
>   					&dvico_s5h1432_config,
> -					&dev->i2c_bus[dev->board.demod_i2c_master].i2c_adap);
> +					demod_i2c);
>
>   		if (dev->dvb->frontend == NULL) {
>   			printk(DRIVER_NAME
> @@ -670,7 +674,7 @@ static int dvb_init(struct cx231xx *dev)
>   		dvb->frontend->callback = cx231xx_tuner_callback;
>
>   		if (!dvb_attach(tda18271_attach, dev->dvb->frontend,
> -			       0x60, &dev->i2c_bus[dev->board.tuner_i2c_master].i2c_adap,
> +			       0x60, tuner_i2c,
>   			       &cnxt_rde253s_tunerconfig)) {
>   			result = -EINVAL;
>   			goto out_free;
> @@ -681,7 +685,7 @@ static int dvb_init(struct cx231xx *dev)
>
>   		dev->dvb->frontend = dvb_attach(s5h1411_attach,
>   					       &tda18271_s5h1411_config,
> -					       &dev->i2c_bus[dev->board.demod_i2c_master].i2c_adap);
> +					       demod_i2c);
>
>   		if (dev->dvb->frontend == NULL) {
>   			printk(DRIVER_NAME
> @@ -694,7 +698,7 @@ static int dvb_init(struct cx231xx *dev)
>   		dvb->frontend->callback = cx231xx_tuner_callback;
>
>   		if (!dvb_attach(tda18271_attach, dev->dvb->frontend,
> -			       0x60, &dev->i2c_bus[dev->board.tuner_i2c_master].i2c_adap,
> +			       0x60, tuner_i2c,
>   			       &cnxt_rde253s_tunerconfig)) {
>   			result = -EINVAL;
>   			goto out_free;
> @@ -703,11 +707,11 @@ static int dvb_init(struct cx231xx *dev)
>   	case CX231XX_BOARD_HAUPPAUGE_EXETER:
>
>   		printk(KERN_INFO "%s: looking for tuner / demod on i2c bus: %d\n",
> -		       __func__, i2c_adapter_id(&dev->i2c_bus[dev->board.tuner_i2c_master].i2c_adap));
> +		       __func__, i2c_adapter_id(tuner_i2c));
>
>   		dev->dvb->frontend = dvb_attach(lgdt3305_attach,
>   						&hcw_lgdt3305_config,
> -						&dev->i2c_bus[dev->board.tuner_i2c_master].i2c_adap);
> +						tuner_i2c);
>
>   		if (dev->dvb->frontend == NULL) {
>   			printk(DRIVER_NAME
> @@ -720,7 +724,7 @@ static int dvb_init(struct cx231xx *dev)
>   		dvb->frontend->callback = cx231xx_tuner_callback;
>
>   		dvb_attach(tda18271_attach, dev->dvb->frontend,
> -			   0x60, &dev->i2c_bus[dev->board.tuner_i2c_master].i2c_adap,
> +			   0x60, tuner_i2c,
>   			   &hcw_tda18271_config);
>   		break;
>
> @@ -728,7 +732,7 @@ static int dvb_init(struct cx231xx *dev)
>
>   		dev->dvb->frontend = dvb_attach(si2165_attach,
>   			&hauppauge_930C_HD_1113xx_si2165_config,
> -			&dev->i2c_bus[dev->board.tuner_i2c_master].i2c_adap
> +			tuner_i2c
>   			);
>
>   		if (dev->dvb->frontend == NULL) {
> @@ -745,7 +749,7 @@ static int dvb_init(struct cx231xx *dev)
>
>   		dvb_attach(tda18271_attach, dev->dvb->frontend,
>   			0x60,
> -			&dev->i2c_bus[dev->board.tuner_i2c_master].i2c_adap,
> +			tuner_i2c,
>   			&hcw_tda18271_config);
>
>   		dev->cx231xx_reset_analog_tuner = NULL;
> @@ -761,7 +765,7 @@ static int dvb_init(struct cx231xx *dev)
>
>   		dev->dvb->frontend = dvb_attach(si2165_attach,
>   			&pctv_quatro_stick_1114xx_si2165_config,
> -			&dev->i2c_bus[dev->board.tuner_i2c_master].i2c_adap
> +			tuner_i2c
>   			);
>
>   		if (dev->dvb->frontend == NULL) {
> @@ -786,7 +790,7 @@ static int dvb_init(struct cx231xx *dev)
>   		request_module("si2157");
>
>   		client = i2c_new_device(
> -			&dev->i2c_bus[dev->board.tuner_i2c_master].i2c_adap,
> +			tuner_i2c,
>   			&info);
>   		if (client == NULL || client->dev.driver == NULL) {
>   			dvb_frontend_detach(dev->dvb->frontend);
> @@ -811,11 +815,11 @@ static int dvb_init(struct cx231xx *dev)
>   	case CX231XX_BOARD_KWORLD_UB430_USB_HYBRID:
>
>   		printk(KERN_INFO "%s: looking for demod on i2c bus: %d\n",
> -		       __func__, i2c_adapter_id(&dev->i2c_bus[dev->board.tuner_i2c_master].i2c_adap));
> +		       __func__, i2c_adapter_id(tuner_i2c));
>
>   		dev->dvb->frontend = dvb_attach(mb86a20s_attach,
>   						&pv_mb86a20s_config,
> -						&dev->i2c_bus[dev->board.demod_i2c_master].i2c_adap);
> +						demod_i2c);
>
>   		if (dev->dvb->frontend == NULL) {
>   			printk(DRIVER_NAME
> @@ -828,7 +832,7 @@ static int dvb_init(struct cx231xx *dev)
>   		dvb->frontend->callback = cx231xx_tuner_callback;
>
>   		dvb_attach(tda18271_attach, dev->dvb->frontend,
> -			   0x60, &dev->i2c_bus[dev->board.tuner_i2c_master].i2c_adap,
> +			   0x60, tuner_i2c,
>   			   &pv_tda18271_config);
>   		break;
>
> diff --git a/drivers/media/usb/cx231xx/cx231xx-i2c.c b/drivers/media/usb/cx231xx/cx231xx-i2c.c
> index 178fa48..6a871e0 100644
> --- a/drivers/media/usb/cx231xx/cx231xx-i2c.c
> +++ b/drivers/media/usb/cx231xx/cx231xx-i2c.c
> @@ -483,7 +483,7 @@ void cx231xx_do_i2c_scan(struct cx231xx *dev, int i2c_port)
>   	struct i2c_client client;
>
>   	memset(&client, 0, sizeof(client));
> -	client.adapter = &dev->i2c_bus[i2c_port].i2c_adap;
> +	client.adapter = cx231xx_get_i2c_adap(dev, i2c_port);
>
>   	cx231xx_info(": Checking for I2C devices on port=%d ..\n", i2c_port);
>   	for (i = 0; i < 128; i++) {
> @@ -542,3 +542,21 @@ int cx231xx_i2c_unregister(struct cx231xx_i2c *bus)
>   	i2c_del_adapter(&bus->i2c_adap);
>   	return 0;
>   }
> +
> +struct i2c_adapter *cx231xx_get_i2c_adap(struct cx231xx *dev, int i2c_port)
> +{
> +	switch (i2c_port) {
> +	case I2C_0:
> +		return &dev->i2c_bus[0].i2c_adap;
> +	case I2C_1:
> +		return &dev->i2c_bus[1].i2c_adap;
> +	case I2C_2:
> +		return &dev->i2c_bus[2].i2c_adap;
> +	case I2C_1_MUX_1:
> +	case I2C_1_MUX_3:
> +		return &dev->i2c_bus[1].i2c_adap;
> +	default:
> +		return NULL;
> +	}
> +}
> +EXPORT_SYMBOL_GPL(cx231xx_get_i2c_adap);
> diff --git a/drivers/media/usb/cx231xx/cx231xx-input.c b/drivers/media/usb/cx231xx/cx231xx-input.c
> index 05f0434..5ae2ce3 100644
> --- a/drivers/media/usb/cx231xx/cx231xx-input.c
> +++ b/drivers/media/usb/cx231xx/cx231xx-input.c
> @@ -100,7 +100,8 @@ int cx231xx_ir_init(struct cx231xx *dev)
>   	ir_i2c_bus = cx231xx_boards[dev->model].ir_i2c_master;
>   	dev_dbg(&dev->udev->dev, "Trying to bind ir at bus %d, addr 0x%02x\n",
>   		ir_i2c_bus, info.addr);
> -	dev->ir_i2c_client = i2c_new_device(&dev->i2c_bus[ir_i2c_bus].i2c_adap, &info);
> +	dev->ir_i2c_client = i2c_new_device(
> +		cx231xx_get_i2c_adap(dev, ir_i2c_bus), &info);
>
>   	return 0;
>   }
> diff --git a/drivers/media/usb/cx231xx/cx231xx.h b/drivers/media/usb/cx231xx/cx231xx.h
> index 377216b..f03338b 100644
> --- a/drivers/media/usb/cx231xx/cx231xx.h
> +++ b/drivers/media/usb/cx231xx/cx231xx.h
> @@ -754,6 +754,7 @@ int cx231xx_reset_analog_tuner(struct cx231xx *dev);
>   void cx231xx_do_i2c_scan(struct cx231xx *dev, int i2c_port);
>   int cx231xx_i2c_register(struct cx231xx_i2c *bus);
>   int cx231xx_i2c_unregister(struct cx231xx_i2c *bus);
> +struct i2c_adapter *cx231xx_get_i2c_adap(struct cx231xx *dev, int i2c_port);
>
>   /* Internal block control functions */
>   int cx231xx_read_i2c_master(struct cx231xx *dev, u8 dev_addr, u16 saddr,
>
diff mbox

Patch

diff --git a/drivers/media/usb/cx231xx/cx231xx-cards.c b/drivers/media/usb/cx231xx/cx231xx-cards.c
index 2f027c7..f5fb93a 100644
--- a/drivers/media/usb/cx231xx/cx231xx-cards.c
+++ b/drivers/media/usb/cx231xx/cx231xx-cards.c
@@ -1033,7 +1033,7 @@  void cx231xx_card_setup(struct cx231xx *dev)
 	/* request some modules */
 	if (dev->board.decoder == CX231XX_AVDECODER) {
 		dev->sd_cx25840 = v4l2_i2c_new_subdev(&dev->v4l2_dev,
-					&dev->i2c_bus[I2C_0].i2c_adap,
+					cx231xx_get_i2c_adap(dev, I2C_0),
 					"cx25840", 0x88 >> 1, NULL);
 		if (dev->sd_cx25840 == NULL)
 			cx231xx_info("cx25840 subdev registration failure\n");
@@ -1043,8 +1043,10 @@  void cx231xx_card_setup(struct cx231xx *dev)
 
 	/* Initialize the tuner */
 	if (dev->board.tuner_type != TUNER_ABSENT) {
+		struct i2c_adapter *tuner_i2c = cx231xx_get_i2c_adap(dev,
+						dev->board.tuner_i2c_master);
 		dev->sd_tuner = v4l2_i2c_new_subdev(&dev->v4l2_dev,
-						    &dev->i2c_bus[dev->board.tuner_i2c_master].i2c_adap,
+						    tuner_i2c,
 						    "tuner",
 						    dev->tuner_addr, NULL);
 		if (dev->sd_tuner == NULL)
@@ -1062,7 +1064,7 @@  void cx231xx_card_setup(struct cx231xx *dev)
 			struct i2c_client client;
 
 			memset(&client, 0, sizeof(client));
-			client.adapter = &dev->i2c_bus[I2C_1].i2c_adap;
+			client.adapter = cx231xx_get_i2c_adap(dev, I2C_1);
 			client.addr = 0xa0 >> 1;
 
 			read_eeprom(dev, &client, eeprom, sizeof(eeprom));
diff --git a/drivers/media/usb/cx231xx/cx231xx-dvb.c b/drivers/media/usb/cx231xx/cx231xx-dvb.c
index 6c7b5e2..869c433 100644
--- a/drivers/media/usb/cx231xx/cx231xx-dvb.c
+++ b/drivers/media/usb/cx231xx/cx231xx-dvb.c
@@ -378,7 +378,7 @@  static int attach_xc5000(u8 addr, struct cx231xx *dev)
 	struct xc5000_config cfg;
 
 	memset(&cfg, 0, sizeof(cfg));
-	cfg.i2c_adap = &dev->i2c_bus[dev->board.tuner_i2c_master].i2c_adap;
+	cfg.i2c_adap = cx231xx_get_i2c_adap(dev, dev->board.tuner_i2c_master);
 	cfg.i2c_addr = addr;
 
 	if (!dev->dvb->frontend) {
@@ -583,6 +583,8 @@  static int dvb_init(struct cx231xx *dev)
 {
 	int result = 0;
 	struct cx231xx_dvb *dvb;
+	struct i2c_adapter *tuner_i2c;
+	struct i2c_adapter *demod_i2c;
 
 	if (!dev->board.has_dvb) {
 		/* This device does not support the extension */
@@ -599,6 +601,8 @@  static int dvb_init(struct cx231xx *dev)
 	dev->cx231xx_set_analog_freq = cx231xx_set_analog_freq;
 	dev->cx231xx_reset_analog_tuner = cx231xx_reset_analog_tuner;
 
+	tuner_i2c = cx231xx_get_i2c_adap(dev, dev->board.tuner_i2c_master);
+	demod_i2c = cx231xx_get_i2c_adap(dev, dev->board.demod_i2c_master);
 	mutex_lock(&dev->lock);
 	cx231xx_set_mode(dev, CX231XX_DIGITAL_MODE);
 	cx231xx_demod_reset(dev);
@@ -609,7 +613,7 @@  static int dvb_init(struct cx231xx *dev)
 
 		dev->dvb->frontend = dvb_attach(s5h1432_attach,
 					&dvico_s5h1432_config,
-					&dev->i2c_bus[dev->board.demod_i2c_master].i2c_adap);
+					demod_i2c);
 
 		if (dev->dvb->frontend == NULL) {
 			printk(DRIVER_NAME
@@ -622,7 +626,7 @@  static int dvb_init(struct cx231xx *dev)
 		dvb->frontend->callback = cx231xx_tuner_callback;
 
 		if (!dvb_attach(xc5000_attach, dev->dvb->frontend,
-			       &dev->i2c_bus[dev->board.tuner_i2c_master].i2c_adap,
+			       tuner_i2c,
 			       &cnxt_rde250_tunerconfig)) {
 			result = -EINVAL;
 			goto out_free;
@@ -634,7 +638,7 @@  static int dvb_init(struct cx231xx *dev)
 
 		dev->dvb->frontend = dvb_attach(s5h1411_attach,
 					       &xc5000_s5h1411_config,
-					       &dev->i2c_bus[dev->board.demod_i2c_master].i2c_adap);
+					       demod_i2c);
 
 		if (dev->dvb->frontend == NULL) {
 			printk(DRIVER_NAME
@@ -647,7 +651,7 @@  static int dvb_init(struct cx231xx *dev)
 		dvb->frontend->callback = cx231xx_tuner_callback;
 
 		if (!dvb_attach(xc5000_attach, dev->dvb->frontend,
-			       &dev->i2c_bus[dev->board.tuner_i2c_master].i2c_adap,
+			       tuner_i2c,
 			       &cnxt_rdu250_tunerconfig)) {
 			result = -EINVAL;
 			goto out_free;
@@ -657,7 +661,7 @@  static int dvb_init(struct cx231xx *dev)
 
 		dev->dvb->frontend = dvb_attach(s5h1432_attach,
 					&dvico_s5h1432_config,
-					&dev->i2c_bus[dev->board.demod_i2c_master].i2c_adap);
+					demod_i2c);
 
 		if (dev->dvb->frontend == NULL) {
 			printk(DRIVER_NAME
@@ -670,7 +674,7 @@  static int dvb_init(struct cx231xx *dev)
 		dvb->frontend->callback = cx231xx_tuner_callback;
 
 		if (!dvb_attach(tda18271_attach, dev->dvb->frontend,
-			       0x60, &dev->i2c_bus[dev->board.tuner_i2c_master].i2c_adap,
+			       0x60, tuner_i2c,
 			       &cnxt_rde253s_tunerconfig)) {
 			result = -EINVAL;
 			goto out_free;
@@ -681,7 +685,7 @@  static int dvb_init(struct cx231xx *dev)
 
 		dev->dvb->frontend = dvb_attach(s5h1411_attach,
 					       &tda18271_s5h1411_config,
-					       &dev->i2c_bus[dev->board.demod_i2c_master].i2c_adap);
+					       demod_i2c);
 
 		if (dev->dvb->frontend == NULL) {
 			printk(DRIVER_NAME
@@ -694,7 +698,7 @@  static int dvb_init(struct cx231xx *dev)
 		dvb->frontend->callback = cx231xx_tuner_callback;
 
 		if (!dvb_attach(tda18271_attach, dev->dvb->frontend,
-			       0x60, &dev->i2c_bus[dev->board.tuner_i2c_master].i2c_adap,
+			       0x60, tuner_i2c,
 			       &cnxt_rde253s_tunerconfig)) {
 			result = -EINVAL;
 			goto out_free;
@@ -703,11 +707,11 @@  static int dvb_init(struct cx231xx *dev)
 	case CX231XX_BOARD_HAUPPAUGE_EXETER:
 
 		printk(KERN_INFO "%s: looking for tuner / demod on i2c bus: %d\n",
-		       __func__, i2c_adapter_id(&dev->i2c_bus[dev->board.tuner_i2c_master].i2c_adap));
+		       __func__, i2c_adapter_id(tuner_i2c));
 
 		dev->dvb->frontend = dvb_attach(lgdt3305_attach,
 						&hcw_lgdt3305_config,
-						&dev->i2c_bus[dev->board.tuner_i2c_master].i2c_adap);
+						tuner_i2c);
 
 		if (dev->dvb->frontend == NULL) {
 			printk(DRIVER_NAME
@@ -720,7 +724,7 @@  static int dvb_init(struct cx231xx *dev)
 		dvb->frontend->callback = cx231xx_tuner_callback;
 
 		dvb_attach(tda18271_attach, dev->dvb->frontend,
-			   0x60, &dev->i2c_bus[dev->board.tuner_i2c_master].i2c_adap,
+			   0x60, tuner_i2c,
 			   &hcw_tda18271_config);
 		break;
 
@@ -728,7 +732,7 @@  static int dvb_init(struct cx231xx *dev)
 
 		dev->dvb->frontend = dvb_attach(si2165_attach,
 			&hauppauge_930C_HD_1113xx_si2165_config,
-			&dev->i2c_bus[dev->board.tuner_i2c_master].i2c_adap
+			tuner_i2c
 			);
 
 		if (dev->dvb->frontend == NULL) {
@@ -745,7 +749,7 @@  static int dvb_init(struct cx231xx *dev)
 
 		dvb_attach(tda18271_attach, dev->dvb->frontend,
 			0x60,
-			&dev->i2c_bus[dev->board.tuner_i2c_master].i2c_adap,
+			tuner_i2c,
 			&hcw_tda18271_config);
 
 		dev->cx231xx_reset_analog_tuner = NULL;
@@ -761,7 +765,7 @@  static int dvb_init(struct cx231xx *dev)
 
 		dev->dvb->frontend = dvb_attach(si2165_attach,
 			&pctv_quatro_stick_1114xx_si2165_config,
-			&dev->i2c_bus[dev->board.tuner_i2c_master].i2c_adap
+			tuner_i2c
 			);
 
 		if (dev->dvb->frontend == NULL) {
@@ -786,7 +790,7 @@  static int dvb_init(struct cx231xx *dev)
 		request_module("si2157");
 
 		client = i2c_new_device(
-			&dev->i2c_bus[dev->board.tuner_i2c_master].i2c_adap,
+			tuner_i2c,
 			&info);
 		if (client == NULL || client->dev.driver == NULL) {
 			dvb_frontend_detach(dev->dvb->frontend);
@@ -811,11 +815,11 @@  static int dvb_init(struct cx231xx *dev)
 	case CX231XX_BOARD_KWORLD_UB430_USB_HYBRID:
 
 		printk(KERN_INFO "%s: looking for demod on i2c bus: %d\n",
-		       __func__, i2c_adapter_id(&dev->i2c_bus[dev->board.tuner_i2c_master].i2c_adap));
+		       __func__, i2c_adapter_id(tuner_i2c));
 
 		dev->dvb->frontend = dvb_attach(mb86a20s_attach,
 						&pv_mb86a20s_config,
-						&dev->i2c_bus[dev->board.demod_i2c_master].i2c_adap);
+						demod_i2c);
 
 		if (dev->dvb->frontend == NULL) {
 			printk(DRIVER_NAME
@@ -828,7 +832,7 @@  static int dvb_init(struct cx231xx *dev)
 		dvb->frontend->callback = cx231xx_tuner_callback;
 
 		dvb_attach(tda18271_attach, dev->dvb->frontend,
-			   0x60, &dev->i2c_bus[dev->board.tuner_i2c_master].i2c_adap,
+			   0x60, tuner_i2c,
 			   &pv_tda18271_config);
 		break;
 
diff --git a/drivers/media/usb/cx231xx/cx231xx-i2c.c b/drivers/media/usb/cx231xx/cx231xx-i2c.c
index 178fa48..6a871e0 100644
--- a/drivers/media/usb/cx231xx/cx231xx-i2c.c
+++ b/drivers/media/usb/cx231xx/cx231xx-i2c.c
@@ -483,7 +483,7 @@  void cx231xx_do_i2c_scan(struct cx231xx *dev, int i2c_port)
 	struct i2c_client client;
 
 	memset(&client, 0, sizeof(client));
-	client.adapter = &dev->i2c_bus[i2c_port].i2c_adap;
+	client.adapter = cx231xx_get_i2c_adap(dev, i2c_port);
 
 	cx231xx_info(": Checking for I2C devices on port=%d ..\n", i2c_port);
 	for (i = 0; i < 128; i++) {
@@ -542,3 +542,21 @@  int cx231xx_i2c_unregister(struct cx231xx_i2c *bus)
 	i2c_del_adapter(&bus->i2c_adap);
 	return 0;
 }
+
+struct i2c_adapter *cx231xx_get_i2c_adap(struct cx231xx *dev, int i2c_port)
+{
+	switch (i2c_port) {
+	case I2C_0:
+		return &dev->i2c_bus[0].i2c_adap;
+	case I2C_1:
+		return &dev->i2c_bus[1].i2c_adap;
+	case I2C_2:
+		return &dev->i2c_bus[2].i2c_adap;
+	case I2C_1_MUX_1:
+	case I2C_1_MUX_3:
+		return &dev->i2c_bus[1].i2c_adap;
+	default:
+		return NULL;
+	}
+}
+EXPORT_SYMBOL_GPL(cx231xx_get_i2c_adap);
diff --git a/drivers/media/usb/cx231xx/cx231xx-input.c b/drivers/media/usb/cx231xx/cx231xx-input.c
index 05f0434..5ae2ce3 100644
--- a/drivers/media/usb/cx231xx/cx231xx-input.c
+++ b/drivers/media/usb/cx231xx/cx231xx-input.c
@@ -100,7 +100,8 @@  int cx231xx_ir_init(struct cx231xx *dev)
 	ir_i2c_bus = cx231xx_boards[dev->model].ir_i2c_master;
 	dev_dbg(&dev->udev->dev, "Trying to bind ir at bus %d, addr 0x%02x\n",
 		ir_i2c_bus, info.addr);
-	dev->ir_i2c_client = i2c_new_device(&dev->i2c_bus[ir_i2c_bus].i2c_adap, &info);
+	dev->ir_i2c_client = i2c_new_device(
+		cx231xx_get_i2c_adap(dev, ir_i2c_bus), &info);
 
 	return 0;
 }
diff --git a/drivers/media/usb/cx231xx/cx231xx.h b/drivers/media/usb/cx231xx/cx231xx.h
index 377216b..f03338b 100644
--- a/drivers/media/usb/cx231xx/cx231xx.h
+++ b/drivers/media/usb/cx231xx/cx231xx.h
@@ -754,6 +754,7 @@  int cx231xx_reset_analog_tuner(struct cx231xx *dev);
 void cx231xx_do_i2c_scan(struct cx231xx *dev, int i2c_port);
 int cx231xx_i2c_register(struct cx231xx_i2c *bus);
 int cx231xx_i2c_unregister(struct cx231xx_i2c *bus);
+struct i2c_adapter *cx231xx_get_i2c_adap(struct cx231xx *dev, int i2c_port);
 
 /* Internal block control functions */
 int cx231xx_read_i2c_master(struct cx231xx *dev, u8 dev_addr, u16 saddr,