[i2c] [patch 2.6.21-rc3-git +i2c 1/4] remove i2c_client.driver

Jean Delvare khali at linux-fr.org
Wed Mar 14 19:12:24 CET 2007


Hi David,

On Mon, 12 Mar 2007 10:39:25 -0800, David Brownell wrote:
> Remove some more (error prone) duplication in the i2c stack:
> 
> 	i2c_client.driver == to_i2c_driver(i2c_client.dev.driver)
> 
> The i2c_client.driver field should be removed, since the driver model
> field is more fundamental.  This means that all legacy I2C drivers need
> to change the line which previously initialized that field ... making
> this a large patch.
> (...)
> NOTE: Not everything here has been test-built.  Also, some parts of this
> could be merged before the actual removal of i2c_client.driver, helping
> create smaller patches:  the parts that don't initialize either field,
> but need the driver for equality testing or its name for diagnostics.

Here are the additional changes I had to make to get my kernel to
compile again on i386:

Signed-off-by: Jean Delvare <khali at linux-fr.org>
---
 drivers/media/video/bt8xx/bttv-driver.c    |    6 +-
 drivers/media/video/bt8xx/bttv-i2c.c       |    8 +-
 drivers/media/video/cafe_ccic.c            |    7 +-
 drivers/media/video/cx25840/cx25840-core.c |    2 
 drivers/media/video/cx88/cx88-i2c.c        |   12 ++--
 drivers/media/video/mxb.c                  |   93 +++++++++++++++++-----------
 drivers/media/video/saa7134/saa6752hs.c    |    4 +
 drivers/media/video/saa7134/saa7134-i2c.c  |   14 ++--
 drivers/media/video/tda7432.c              |    4 +
 drivers/media/video/zoran_card.c           |    6 +-
 drivers/media/video/zoran_device.c         |   13 +++-
 drivers/media/video/zoran_driver.c         |   14 ++--
 drivers/rtc/rtc-ds1307.c                   |    2 
 13 files changed, 112 insertions(+), 73 deletions(-)

(The rtc-ds1307 driver should no longer need to be touched if ported to
the new model according to another post of yours.)

--- linux-2.6.21-rc3.orig/drivers/media/video/tda7432.c	2007-02-21 08:36:09.000000000 +0100
+++ linux-2.6.21-rc3/drivers/media/video/tda7432.c	2007-03-13 14:15:17.000000000 +0100
@@ -497,7 +497,9 @@ static struct i2c_driver driver = {
 static struct i2c_client client_template =
 {
 	.name       = "tda7432",
-	.driver     = &driver,
+	.dev = {
+		.driver	= &driver.driver,
+	},
 };
 
 static int __init tda7432_init(void)
--- linux-2.6.21-rc3.orig/drivers/media/video/mxb.c	2007-02-04 19:44:54.000000000 +0100
+++ linux-2.6.21-rc3/drivers/media/video/mxb.c	2007-03-13 14:51:57.000000000 +0100
@@ -331,62 +331,71 @@ static int mxb_init_done(struct saa7146_
 
 	int i = 0, err = 0;
 	struct	tea6415c_multiplex vm;
+	struct i2c_driver *saa7111a_driver, *tuner_driver,
+			  *tea6420_1_driver, *tea6420_2_driver,
+			  *tea6415c_driver, *tda9840_driver;
+
+	saa7111a_driver = to_i2c_driver(mxb->saa7111a->dev.driver);
+	tuner_driver = to_i2c_driver(mxb->tuner->dev.driver);
+	tea6420_1_driver = to_i2c_driver(mxb->tea6420_1->dev.driver);
+	tea6420_2_driver = to_i2c_driver(mxb->tea6420_2->dev.driver);
+	tea6415c_driver = to_i2c_driver(mxb->tea6415c->dev.driver);
+	tda9840_driver = to_i2c_driver(mxb->tda9840->dev.driver);
 
 	/* select video mode in saa7111a */
 	i = VIDEO_MODE_PAL;
 	/* fixme: currently pointless: gets overwritten by configuration below */
-	mxb->saa7111a->driver->command(mxb->saa7111a,DECODER_SET_NORM, &i);
+	saa7111a_driver->command(mxb->saa7111a,DECODER_SET_NORM, &i);
 
 	/* write configuration to saa7111a */
 	init.data = mxb_saa7111_init;
 	init.len = sizeof(mxb_saa7111_init);
-	mxb->saa7111a->driver->command(mxb->saa7111a,DECODER_INIT, &init);
+	saa7111a_driver->command(mxb->saa7111a,DECODER_INIT, &init);
 
 	/* select tuner-output on saa7111a */
 	i = 0;
-	mxb->saa7111a->driver->command(mxb->saa7111a,DECODER_SET_INPUT, &i);
+	saa7111a_driver->command(mxb->saa7111a,DECODER_SET_INPUT, &i);
 
 	/* enable vbi bypass */
 	i = 1;
-	mxb->saa7111a->driver->command(mxb->saa7111a,DECODER_SET_VBI_BYPASS, &i);
+	saa7111a_driver->command(mxb->saa7111a,DECODER_SET_VBI_BYPASS, &i);
 
 	/* select a tuner type */
 	tun_setup.mode_mask = T_ANALOG_TV;
 	tun_setup.addr = ADDR_UNSET;
 	tun_setup.type = TUNER_PHILIPS_PAL;
-	mxb->tuner->driver->command(mxb->tuner,TUNER_SET_TYPE_ADDR, &tun_setup);
+	tuner_driver->command(mxb->tuner,TUNER_SET_TYPE_ADDR, &tun_setup);
 	/* tune in some frequency on tuner */
 	mxb->cur_freq.tuner = 0;
 	mxb->cur_freq.type = V4L2_TUNER_ANALOG_TV;
 	mxb->cur_freq.frequency = freq;
-	mxb->tuner->driver->command(mxb->tuner, VIDIOC_S_FREQUENCY,
-					&mxb->cur_freq);
+	tuner_driver->command(mxb->tuner, VIDIOC_S_FREQUENCY, &mxb->cur_freq);
 
 	/* set a default video standard */
-	mxb->tuner->driver->command(mxb->tuner, VIDIOC_S_STD, &std);
+	tuner_driver->command(mxb->tuner, VIDIOC_S_STD, &std);
 
 	/* mute audio on tea6420s */
-	mxb->tea6420_1->driver->command(mxb->tea6420_1,TEA6420_SWITCH, &TEA6420_line[6][0]);
-	mxb->tea6420_2->driver->command(mxb->tea6420_2,TEA6420_SWITCH, &TEA6420_line[6][1]);
-	mxb->tea6420_1->driver->command(mxb->tea6420_1,TEA6420_SWITCH, &TEA6420_cd[6][0]);
-	mxb->tea6420_2->driver->command(mxb->tea6420_2,TEA6420_SWITCH, &TEA6420_cd[6][1]);
+	tea6420_1_driver->command(mxb->tea6420_1,TEA6420_SWITCH, &TEA6420_line[6][0]);
+	tea6420_2_driver->command(mxb->tea6420_2,TEA6420_SWITCH, &TEA6420_line[6][1]);
+	tea6420_1_driver->command(mxb->tea6420_1,TEA6420_SWITCH, &TEA6420_cd[6][0]);
+	tea6420_2_driver->command(mxb->tea6420_2,TEA6420_SWITCH, &TEA6420_cd[6][1]);
 
 	/* switch to tuner-channel on tea6415c*/
 	vm.out = 17;
 	vm.in  = 3;
-	mxb->tea6415c->driver->command(mxb->tea6415c,TEA6415C_SWITCH, &vm);
+	tea6415c_driver->command(mxb->tea6415c,TEA6415C_SWITCH, &vm);
 
 	/* select tuner-output on multicable on tea6415c*/
 	vm.in  = 3;
 	vm.out = 13;
-	mxb->tea6415c->driver->command(mxb->tea6415c,TEA6415C_SWITCH, &vm);
+	tea6415c_driver->command(mxb->tea6415c,TEA6415C_SWITCH, &vm);
 
 	/* the rest for mxb */
 	mxb->cur_input = 0;
 	mxb->cur_mute = 1;
 
 	mxb->cur_mode = V4L2_TUNER_MODE_STEREO;
-	mxb->tda9840->driver->command(mxb->tda9840, TDA9840_SWITCH, &mxb->cur_mode);
+	tda9840_driver->command(mxb->tda9840, TDA9840_SWITCH, &mxb->cur_mode);
 
 	/* check if the saa7740 (aka 'sound arena module') is present
 	   on the mxb. if so, we must initialize it. due to lack of
@@ -518,6 +527,16 @@ static int mxb_ioctl(struct saa7146_fh *
 	struct saa7146_dev *dev = fh->dev;
 	struct mxb* mxb = (struct mxb*)dev->ext_priv;
 	struct saa7146_vv *vv = dev->vv_data;
+	struct i2c_driver *saa7111a_driver, *tuner_driver,
+			  *tea6420_1_driver, *tea6420_2_driver,
+			  *tea6415c_driver, *tda9840_driver;
+
+	saa7111a_driver = to_i2c_driver(mxb->saa7111a->dev.driver);
+	tuner_driver = to_i2c_driver(mxb->tuner->dev.driver);
+	tea6420_1_driver = to_i2c_driver(mxb->tea6420_1->dev.driver);
+	tea6420_2_driver = to_i2c_driver(mxb->tea6420_2->dev.driver);
+	tea6415c_driver = to_i2c_driver(mxb->tea6415c->dev.driver);
+	tda9840_driver = to_i2c_driver(mxb->tda9840->dev.driver);
 
 	switch(cmd) {
 	case VIDIOC_ENUMINPUT:
@@ -596,11 +615,11 @@ static int mxb_ioctl(struct saa7146_fh *
 				mxb->cur_mute = vc->value;
 				if( 0 == vc->value ) {
 					/* switch the audio-source */
-					mxb->tea6420_1->driver->command(mxb->tea6420_1,TEA6420_SWITCH, &TEA6420_line[video_audio_connect[mxb->cur_input]][0]);
-					mxb->tea6420_2->driver->command(mxb->tea6420_2,TEA6420_SWITCH, &TEA6420_line[video_audio_connect[mxb->cur_input]][1]);
+					tea6420_1_driver->command(mxb->tea6420_1,TEA6420_SWITCH, &TEA6420_line[video_audio_connect[mxb->cur_input]][0]);
+					tea6420_2_driver->command(mxb->tea6420_2,TEA6420_SWITCH, &TEA6420_line[video_audio_connect[mxb->cur_input]][1]);
 				} else {
-					mxb->tea6420_1->driver->command(mxb->tea6420_1,TEA6420_SWITCH, &TEA6420_line[6][0]);
-					mxb->tea6420_2->driver->command(mxb->tea6420_2,TEA6420_SWITCH, &TEA6420_line[6][1]);
+					tea6420_1_driver->command(mxb->tea6420_1,TEA6420_SWITCH, &TEA6420_line[6][0]);
+					tea6420_2_driver->command(mxb->tea6420_2,TEA6420_SWITCH, &TEA6420_line[6][1]);
 				}
 				DEB_EE(("VIDIOC_S_CTRL, V4L2_CID_AUDIO_MUTE: %d.\n",vc->value));
 				break;
@@ -655,7 +674,7 @@ static int mxb_ioctl(struct saa7146_fh *
 				vm.in  = 3;
 				vm.out = 17;
 
-			if ( 0 != mxb->tea6415c->driver->command(mxb->tea6415c,TEA6415C_SWITCH, &vm)) {
+			if ( 0 != tea6415c_driver->command(mxb->tea6415c,TEA6415C_SWITCH, &vm)) {
 					printk("VIDIOC_S_INPUT: could not address tea6415c #1\n");
 					return -EFAULT;
 				}
@@ -692,7 +711,7 @@ static int mxb_ioctl(struct saa7146_fh *
 			case TUNER:
 			case AUX1:
 			{
-				if ( 0 != mxb->tea6415c->driver->command(mxb->tea6415c,TEA6415C_SWITCH, &vm)) {
+				if ( 0 != tea6415c_driver->command(mxb->tea6415c,TEA6415C_SWITCH, &vm)) {
 					printk("VIDIOC_S_INPUT: could not address tea6415c #3\n");
 					return -EFAULT;
 				}
@@ -705,14 +724,14 @@ static int mxb_ioctl(struct saa7146_fh *
 		}
 
 		/* switch video in saa7111a */
-		if ( 0 != mxb->saa7111a->driver->command(mxb->saa7111a,DECODER_SET_INPUT, &i)) {
+		if ( 0 != saa7111a_driver->command(mxb->saa7111a,DECODER_SET_INPUT, &i)) {
 			printk("VIDIOC_S_INPUT: could not address saa7111a #1.\n");
 		}
 
 		/* switch the audio-source only if necessary */
 		if( 0 == mxb->cur_mute ) {
-			mxb->tea6420_1->driver->command(mxb->tea6420_1,TEA6420_SWITCH, &TEA6420_line[video_audio_connect[input]][0]);
-			mxb->tea6420_2->driver->command(mxb->tea6420_2,TEA6420_SWITCH, &TEA6420_line[video_audio_connect[input]][1]);
+			tea6420_1_driver->command(mxb->tea6420_1,TEA6420_SWITCH, &TEA6420_line[video_audio_connect[input]][0]);
+			tea6420_2_driver->command(mxb->tea6420_2,TEA6420_SWITCH, &TEA6420_line[video_audio_connect[input]][1]);
 		}
 
 		return 0;
@@ -740,7 +759,7 @@ static int mxb_ioctl(struct saa7146_fh *
 		t->signal = 0xffff;
 		t->afc = 0;
 
-		mxb->tda9840->driver->command(mxb->tda9840,TDA9840_DETECT, &byte);
+		tda9840_driver->command(mxb->tda9840,TDA9840_DETECT, &byte);
 		t->audmode = mxb->cur_mode;
 
 		if( byte < 0 ) {
@@ -816,7 +835,7 @@ static int mxb_ioctl(struct saa7146_fh *
 			}
 		}
 
-		if( 0 != (result = mxb->tda9840->driver->command(mxb->tda9840, TDA9840_SWITCH, &byte))) {
+		if( 0 != (result = tda9840_driver->command(mxb->tda9840, TDA9840_SWITCH, &byte))) {
 			printk("VIDIOC_S_TUNER error. result:%d, byte:%d\n",result,byte);
 		}
 
@@ -855,7 +874,7 @@ static int mxb_ioctl(struct saa7146_fh *
 		DEB_EE(("VIDIOC_S_FREQUENCY: freq:0x%08x.\n", mxb->cur_freq.frequency));
 
 		/* tune in desired frequency */
-		mxb->tuner->driver->command(mxb->tuner, VIDIOC_S_FREQUENCY, &mxb->cur_freq);
+		tuner_driver->command(mxb->tuner, VIDIOC_S_FREQUENCY, &mxb->cur_freq);
 
 		/* hack: changing the frequency should invalidate the vbi-counter (=> alevt) */
 		spin_lock(&dev->slock);
@@ -875,8 +894,8 @@ static int mxb_ioctl(struct saa7146_fh *
 
 		DEB_EE(("MXB_S_AUDIO_CD: i:%d.\n",i));
 
-		mxb->tea6420_1->driver->command(mxb->tea6420_1,TEA6420_SWITCH, &TEA6420_cd[i][0]);
-		mxb->tea6420_2->driver->command(mxb->tea6420_2,TEA6420_SWITCH, &TEA6420_cd[i][1]);
+		tea6420_1_driver->command(mxb->tea6420_1,TEA6420_SWITCH, &TEA6420_cd[i][0]);
+		tea6420_2_driver->command(mxb->tea6420_2,TEA6420_SWITCH, &TEA6420_cd[i][1]);
 
 		return 0;
 	}
@@ -890,8 +909,8 @@ static int mxb_ioctl(struct saa7146_fh *
 		}
 
 		DEB_EE(("MXB_S_AUDIO_LINE: i:%d.\n",i));
-		mxb->tea6420_1->driver->command(mxb->tea6420_1,TEA6420_SWITCH, &TEA6420_line[i][0]);
-		mxb->tea6420_2->driver->command(mxb->tea6420_2,TEA6420_SWITCH, &TEA6420_line[i][1]);
+		tea6420_1_driver->command(mxb->tea6420_1,TEA6420_SWITCH, &TEA6420_line[i][0]);
+		tea6420_2_driver->command(mxb->tea6420_2,TEA6420_SWITCH, &TEA6420_line[i][1]);
 
 		return 0;
 	}
@@ -929,6 +948,10 @@ static int std_callback(struct saa7146_d
 	struct mxb* mxb = (struct mxb*)dev->ext_priv;
 	int zero = 0;
 	int one = 1;
+	struct i2c_driver *saa7111a_driver, *tuner_driver;
+
+	saa7111a_driver = to_i2c_driver(mxb->saa7111a->dev.driver);
+	tuner_driver = to_i2c_driver(mxb->tuner->dev.driver);
 
 	if(V4L2_STD_PAL_I == std->id ) {
 		v4l2_std_id std = V4L2_STD_PAL_I;
@@ -936,16 +959,16 @@ static int std_callback(struct saa7146_d
 		/* set the 7146 gpio register -- I don't know what this does exactly */
 		saa7146_write(dev, GPIO_CTRL, 0x00404050);
 		/* unset the 7111 gpio register -- I don't know what this does exactly */
-		mxb->saa7111a->driver->command(mxb->saa7111a,DECODER_SET_GPIO, &zero);
-		mxb->tuner->driver->command(mxb->tuner, VIDIOC_S_STD, &std);
+		saa7111a_driver->command(mxb->saa7111a,DECODER_SET_GPIO, &zero);
+		tuner_driver->command(mxb->tuner, VIDIOC_S_STD, &std);
 	} else {
 		v4l2_std_id std = V4L2_STD_PAL_BG;
 		DEB_D(("VIDIOC_S_STD: setting mxb for PAL/NTSC/SECAM.\n"));
 		/* set the 7146 gpio register -- I don't know what this does exactly */
 		saa7146_write(dev, GPIO_CTRL, 0x00404050);
 		/* set the 7111 gpio register -- I don't know what this does exactly */
-		mxb->saa7111a->driver->command(mxb->saa7111a,DECODER_SET_GPIO, &one);
-		mxb->tuner->driver->command(mxb->tuner, VIDIOC_S_STD, &std);
+		saa7111a_driver->command(mxb->saa7111a,DECODER_SET_GPIO, &one);
+		tuner_driver->command(mxb->tuner, VIDIOC_S_STD, &std);
 	}
 	return 0;
 }
--- linux-2.6.21-rc3.orig/drivers/media/video/zoran_card.c	2007-02-21 08:36:09.000000000 +0100
+++ linux-2.6.21-rc3/drivers/media/video/zoran_card.c	2007-03-13 14:28:44.000000000 +0100
@@ -759,7 +759,7 @@ zoran_i2c_client_register (struct i2c_cl
 
 	dprintk(2,
 		KERN_DEBUG "%s: i2c_client_register() - driver id = %d\n",
-		ZR_DEVNAME(zr), client->driver->id);
+		ZR_DEVNAME(zr), to_i2c_driver(client->dev.driver)->id);
 
 	mutex_lock(&zr->resource_lock);
 
@@ -772,9 +772,9 @@ zoran_i2c_client_register (struct i2c_cl
 		goto clientreg_unlock_and_return;
 	}
 
-	if (client->driver->id == zr->card.i2c_decoder)
+	if (to_i2c_driver(client->dev.driver)->id == zr->card.i2c_decoder)
 		zr->decoder = client;
-	else if (client->driver->id == zr->card.i2c_encoder)
+	else if (to_i2c_driver(client->dev.driver)->id == zr->card.i2c_encoder)
 		zr->encoder = client;
 	else {
 		res = -ENODEV;
--- linux-2.6.21-rc3.orig/drivers/media/video/zoran_device.c	2007-02-04 19:44:54.000000000 +0100
+++ linux-2.6.21-rc3/drivers/media/video/zoran_device.c	2007-03-13 14:19:41.000000000 +0100
@@ -1753,9 +1753,12 @@ decoder_command (struct zoran *zr,
 		 int           cmd,
 		 void         *data)
 {
+	struct i2c_driver *driver;
+
 	if (zr->decoder == NULL)
 		return -EIO;
 
+	driver = to_i2c_driver(zr->decoder->dev.driver);
 	if (zr->card.type == LML33 &&
 	    (cmd == DECODER_SET_NORM || DECODER_SET_INPUT)) {
 		int res;
@@ -1763,13 +1766,12 @@ decoder_command (struct zoran *zr,
 		// Bt819 needs to reset its FIFO buffer using #FRST pin and
 		// LML33 card uses GPIO(7) for that.
 		GPIO(zr, 7, 0);
-		res = zr->decoder->driver->command(zr->decoder, cmd, data);
+		res = driver->command(zr->decoder, cmd, data);
 		// Pull #FRST high.
 		GPIO(zr, 7, 1);
 		return res;
 	} else
-		return zr->decoder->driver->command(zr->decoder, cmd,
-						    data);
+		return driver->command(zr->decoder, cmd, data);
 }
 
 int
@@ -1777,8 +1779,11 @@ encoder_command (struct zoran *zr,
 		 int           cmd,
 		 void         *data)
 {
+	struct i2c_driver *driver;
+
 	if (zr->encoder == NULL)
 		return -1;
 
-	return zr->encoder->driver->command(zr->encoder, cmd, data);
+	driver = to_i2c_driver(zr->encoder->dev.driver);
+	return driver->command(zr->encoder, cmd, data);
 }
--- linux-2.6.21-rc3.orig/drivers/media/video/zoran_driver.c	2007-02-21 08:36:09.000000000 +0100
+++ linux-2.6.21-rc3/drivers/media/video/zoran_driver.c	2007-03-13 14:23:39.000000000 +0100
@@ -1311,7 +1311,7 @@ zoran_open (struct inode *inode,
 		res = -ENODEV;
 		goto open_unlock_and_return;
 	}
-	if (!try_module_get(zr->decoder->driver->driver.owner)) {
+	if (!try_module_get(zr->decoder->dev.driver->owner)) {
 		dprintk(1,
 			KERN_ERR
 			"%s: failed to grab ownership of i2c decoder\n",
@@ -1321,13 +1321,13 @@ zoran_open (struct inode *inode,
 		goto open_unlock_and_return;
 	}
 	if (zr->encoder &&
-	    !try_module_get(zr->encoder->driver->driver.owner)) {
+	    !try_module_get(zr->encoder->dev.driver->owner)) {
 		dprintk(1,
 			KERN_ERR
 			"%s: failed to grab ownership of i2c encoder\n",
 			ZR_DEVNAME(zr));
 		res = -EIO;
-		module_put(zr->decoder->driver->driver.owner);
+		module_put(zr->decoder->dev.driver->owner);
 		module_put(THIS_MODULE);
 		goto open_unlock_and_return;
 	}
@@ -1392,9 +1392,9 @@ zoran_open (struct inode *inode,
 open_unlock_and_return:
 	/* if we grabbed locks, release them accordingly */
 	if (have_module_locks) {
-		module_put(zr->decoder->driver->driver.owner);
+		module_put(zr->decoder->dev.driver->owner);
 		if (zr->encoder) {
-			module_put(zr->encoder->driver->driver.owner);
+			module_put(zr->encoder->dev.driver->owner);
 		}
 		module_put(THIS_MODULE);
 	}
@@ -1460,9 +1460,9 @@ zoran_close (struct inode *inode,
 	kfree(fh);
 
 	/* release locks on the i2c modules */
-	module_put(zr->decoder->driver->driver.owner);
+	module_put(zr->decoder->dev.driver->owner);
 	if (zr->encoder) {
-		 module_put(zr->encoder->driver->driver.owner);
+		 module_put(zr->encoder->dev.driver->owner);
 	}
 	module_put(THIS_MODULE);
 
--- linux-2.6.21-rc3.orig/drivers/media/video/bt8xx/bttv-driver.c	2007-02-28 09:48:20.000000000 +0100
+++ linux-2.6.21-rc3/drivers/media/video/bt8xx/bttv-driver.c	2007-03-13 14:59:40.000000000 +0100
@@ -1204,7 +1204,8 @@ audio_mux(struct bttv *btv, int input, i
 			break;
 		}
 		route.output = MSP_OUTPUT_DEFAULT;
-		c->driver->command(c, VIDIOC_INT_S_AUDIO_ROUTING, &route);
+		to_i2c_driver(c->dev.driver)->command(c,
+					VIDIOC_INT_S_AUDIO_ROUTING, &route);
 	}
 	c = btv->i2c_tvaudio_client;
 	if (c) {
@@ -1212,7 +1213,8 @@ audio_mux(struct bttv *btv, int input, i
 
 		route.input = input;
 		route.output = 0;
-		c->driver->command(c, VIDIOC_INT_S_AUDIO_ROUTING, &route);
+		to_i2c_driver(c->dev.driver)->command(c,
+					VIDIOC_INT_S_AUDIO_ROUTING, &route);
 	}
 	return 0;
 }
--- linux-2.6.21-rc3.orig/drivers/media/video/bt8xx/bttv-i2c.c	2007-02-09 09:15:20.000000000 +0100
+++ linux-2.6.21-rc3/drivers/media/video/bt8xx/bttv-i2c.c	2007-03-13 15:05:48.000000000 +0100
@@ -307,14 +307,14 @@ static int attach_inform(struct i2c_clie
 
 	if (bttv_debug)
 		printk(KERN_DEBUG "bttv%d: %s i2c attach [addr=0x%x,client=%s]\n",
-			btv->c.nr, client->driver->driver.name, client->addr,
+			btv->c.nr, client->dev.driver->name, client->addr,
 			client->name);
-	if (!client->driver->command)
+	if (!to_i2c_driver(client->dev.driver)->command)
 		return 0;
 
-	if (client->driver->id == I2C_DRIVERID_MSP3400)
+	if (to_i2c_driver(client->dev.driver)->id == I2C_DRIVERID_MSP3400)
 		btv->i2c_msp34xx_client = client;
-	if (client->driver->id == I2C_DRIVERID_TVAUDIO)
+	if (to_i2c_driver(client->dev.driver)->id == I2C_DRIVERID_TVAUDIO)
 		btv->i2c_tvaudio_client = client;
 	if (btv->tuner_type != UNSET) {
 		struct tuner_setup tun_setup;
--- linux-2.6.21-rc3.orig/drivers/media/video/cafe_ccic.c	2007-03-08 07:31:02.000000000 +0100
+++ linux-2.6.21-rc3/drivers/media/video/cafe_ccic.c	2007-03-13 14:57:58.000000000 +0100
@@ -515,7 +515,7 @@ static int cafe_smbus_attach(struct i2c_
 	/*
 	 * Don't talk to chips we don't recognize.
 	 */
-	if (client->driver->id == I2C_DRIVERID_OV7670) {
+	if (to_i2c_driver(client->dev.driver)->id == I2C_DRIVERID_OV7670) {
 		cam->sensor = client;
 		return cafe_cam_init(cam);
 	}
@@ -798,9 +798,10 @@ static int __cafe_cam_cmd(struct cafe_ca
 	struct i2c_client *sc = cam->sensor;
 	int ret;
 
-	if (sc == NULL || sc->driver == NULL || sc->driver->command == NULL)
+	if (sc == NULL || sc->dev.driver == NULL ||
+	    to_i2c_driver(sc->dev.driver)->command == NULL)
 		return -EINVAL;
-	ret = sc->driver->command(sc, cmd, arg);
+	ret = to_i2c_driver(sc->dev.driver)->command(sc, cmd, arg);
 	if (ret == -EPERM) /* Unsupported command */
 		return 0;
 	return ret;
--- linux-2.6.21-rc3.orig/drivers/media/video/cx25840/cx25840-core.c	2007-03-08 07:31:02.000000000 +0100
+++ linux-2.6.21-rc3/drivers/media/video/cx25840/cx25840-core.c	2007-03-13 15:12:35.000000000 +0100
@@ -863,7 +863,7 @@ static int cx25840_detect_client(struct 
 	client = &state->c;
 	client->addr = address;
 	client->adapter = adapter;
-	client->driver = &i2c_driver_cx25840;
+	client->dev.driver = &i2c_driver_cx25840.driver;
 	snprintf(client->name, sizeof(client->name) - 1, "cx25840");
 
 	v4l_dbg(1, cx25840_debug, client, "detecting cx25840 client on address 0x%x\n", address << 1);
--- linux-2.6.21-rc3.orig/drivers/media/video/cx88/cx88-i2c.c	2007-02-28 09:48:20.000000000 +0100
+++ linux-2.6.21-rc3/drivers/media/video/cx88/cx88-i2c.c	2007-03-13 15:16:42.000000000 +0100
@@ -101,10 +101,12 @@ static int attach_inform(struct i2c_clie
 {
 	struct tuner_setup tun_setup;
 	struct cx88_core *core = i2c_get_adapdata(client->adapter);
+	struct i2c_driver *driver;
 
 	dprintk(1, "%s i2c attach [addr=0x%x,client=%s]\n",
-		client->driver->driver.name, client->addr, client->name);
-	if (!client->driver->command)
+		client->dev.driver->name, client->addr, client->name);
+	driver = to_i2c_driver(client->dev.driver);
+	if (!driver->command)
 		return 0;
 
 	if (core->radio_type != UNSET) {
@@ -113,7 +115,7 @@ static int attach_inform(struct i2c_clie
 			tun_setup.type = core->radio_type;
 			tun_setup.addr = core->radio_addr;
 
-			client->driver->command (client, TUNER_SET_TYPE_ADDR, &tun_setup);
+			driver->command (client, TUNER_SET_TYPE_ADDR, &tun_setup);
 		}
 	}
 	if (core->tuner_type != UNSET) {
@@ -123,12 +125,12 @@ static int attach_inform(struct i2c_clie
 			tun_setup.type = core->tuner_type;
 			tun_setup.addr = core->tuner_addr;
 
-			client->driver->command (client,TUNER_SET_TYPE_ADDR, &tun_setup);
+			driver->command (client, TUNER_SET_TYPE_ADDR, &tun_setup);
 		}
 	}
 
 	if (core->tda9887_conf)
-		client->driver->command(client, TDA9887_SET_CONFIG, &core->tda9887_conf);
+		driver->command(client, TDA9887_SET_CONFIG, &core->tda9887_conf);
 	return 0;
 }
 
--- linux-2.6.21-rc3.orig/drivers/media/video/saa7134/saa6752hs.c	2007-02-21 08:36:09.000000000 +0100
+++ linux-2.6.21-rc3/drivers/media/video/saa7134/saa6752hs.c	2007-03-13 15:35:44.000000000 +0100
@@ -818,7 +818,9 @@ static struct i2c_driver driver = {
 static struct i2c_client client_template =
 {
 	.name       = "saa6752hs",
-	.driver     = &driver,
+	.dev = {
+		.driver = &driver.driver,
+	},
 };
 
 static int __init saa6752hs_init_module(void)
--- linux-2.6.21-rc3.orig/drivers/media/video/saa7134/saa7134-i2c.c	2007-02-28 09:48:20.000000000 +0100
+++ linux-2.6.21-rc3/drivers/media/video/saa7134/saa7134-i2c.c	2007-03-13 15:34:27.000000000 +0100
@@ -332,9 +332,10 @@ static int attach_inform(struct i2c_clie
 	int tuner = dev->tuner_type;
 	int conf  = dev->tda9887_conf;
 	struct tuner_setup tun_setup;
+	struct i2c_driver *driver;
 
 	d1printk( "%s i2c attach [addr=0x%x,client=%s]\n",
-		client->driver->driver.name, client->addr, client->name);
+		client->dev.driver->name, client->addr, client->name);
 
 	/* Am I an i2c remote control? */
 
@@ -345,13 +346,14 @@ static int attach_inform(struct i2c_clie
 		{
 			struct IR_i2c *ir = i2c_get_clientdata(client);
 			d1printk("%s i2c IR detected (%s).\n",
-				 client->driver->driver.name, ir->phys);
+				 client->dev.driver->name, ir->phys);
 			saa7134_set_i2c_ir(dev,ir);
 			break;
 		}
 	}
 
-	if (!client->driver->command)
+	driver = to_i2c_driver(client->dev.driver);
+	if (driver->command)
 		return 0;
 
 	if (saa7134_boards[dev->board].radio_type != UNSET) {
@@ -362,7 +364,7 @@ static int attach_inform(struct i2c_clie
 		if ((tun_setup.addr == ADDR_UNSET) || (tun_setup.addr == client->addr)) {
 			tun_setup.mode_mask = T_RADIO;
 
-			client->driver->command(client, TUNER_SET_TYPE_ADDR, &tun_setup);
+			driver->command(client, TUNER_SET_TYPE_ADDR, &tun_setup);
 		}
 	}
 
@@ -375,11 +377,11 @@ static int attach_inform(struct i2c_clie
 
 			tun_setup.mode_mask = T_ANALOG_TV;
 
-			client->driver->command(client,TUNER_SET_TYPE_ADDR, &tun_setup);
+			driver->command(client,TUNER_SET_TYPE_ADDR, &tun_setup);
 		}
 	}
 
-	client->driver->command(client, TDA9887_SET_CONFIG, &conf);
+	driver->command(client, TDA9887_SET_CONFIG, &conf);
 
 	return 0;
 }
--- linux-2.6.21-rc3.orig/drivers/rtc/rtc-ds1307.c	2007-02-04 19:44:54.000000000 +0100
+++ linux-2.6.21-rc3/drivers/rtc/rtc-ds1307.c	2007-03-13 15:37:19.000000000 +0100
@@ -201,7 +201,7 @@ ds1307_detect(struct i2c_adapter *adapte
 	client = &ds1307->client;
 	client->addr = address;
 	client->adapter = adapter;
-	client->driver = &ds1307_driver;
+	client->dev.driver = &ds1307_driver.driver;
 	client->flags = 0;
 
 	i2c_set_clientdata(client, ds1307);


-- 
Jean Delvare



More information about the i2c mailing list