[BK PATCH] i2c driver fixes for 2.6.0-test2

Mark M. Hoffman mhoffman at lightlink.com
Tue Aug 5 05:49:21 CEST 2003


* Greg KH <greg at kroah.com> [2003-08-04 09:06:30 -0700]:
> On Sun, Aug 03, 2003 at 01:27:28AM -0400, Mark M. Hoffman wrote:
> > 
> > Done, plus most of the nforce2 patch.  This bit though... any particular
> > reason you didn't just whack all of it?
> > 
> > @@ -345,18 +334,12 @@
> >  			smbus->base, smbus->base+smbus->size-1, name);
> >  		return -1;
> >  	}
> > -
> > -	/* TODO: find a better way to find out whether this file is compiled
> > -	 * with i2c 2.7.0 of earlier
> > -	 */
> > -/*#ifdef I2C_HW_SMBUS_AMD8111
> > +/*
> >  	smbus->adapter.owner = THIS_MODULE;
> > -#endif
> > -
> >  	smbus->adapter.id = I2C_ALGO_SMBUS | I2C_HW_SMBUS_NFORCE2;
> >  	smbus->adapter.algo = &smbus_algorithm;
> > -	smbus->adapter.algo_data = smbus;*/
> > -
> > +	smbus->adapter.algo_data = smbus;
> > +*/
> 
> I didn't have the time to verify if this really should be set or not, so
> I left the main portion alone.  Does this mean I can delete all of the
> commented out area for 2.6?

With a closer look, I think this driver was broken before and after
your patch.  The algo_data field has to be set (to smbus), because it's
used in nforce2_access().  Notice the macros...

#define NVIDIA_SMB_PRTCL        (smbus->base + 0x00)    /* protocol, PEC */
#define NVIDIA_SMB_STS          (smbus->base + 0x01)    /* status */
#define NVIDIA_SMB_ADDR         (smbus->base + 0x02)    /* address */

I'm not a fan of that (I would give the macros a parameter) but whatever.

A new patch is attached; please consider...

[comment]
This patch restores a line that was wrongly removed.  There are also some
trivial cleanups.  It applies & compiles vs. 2.6.0-test2-bk4.  It's untested
(no hardware here).
[/comment]

Regards,

-- 
Mark M. Hoffman
mhoffman at lightlink.com

-------------- next part --------------
--- linux-2.6.0-test2/drivers/i2c/busses/i2c-nforce2.c.old	2003-08-04 23:01:39.000000000 -0400
+++ linux-2.6.0-test2/drivers/i2c/busses/i2c-nforce2.c	2003-08-04 23:07:33.000000000 -0400
@@ -51,10 +51,6 @@
 #ifndef PCI_DEVICE_ID_NVIDIA_NFORCE2_SMBUS
 #define PCI_DEVICE_ID_NVIDIA_NFORCE2_SMBUS   0x0064
 #endif
-/* TODO: sync with lm-sensors */
-#ifndef I2C_HW_SMBUS_NFORCE2
-#define I2C_HW_SMBUS_NFORCE2	0x0c
-#endif
 
 
 struct nforce2_smbus {
@@ -130,20 +126,10 @@
 	},
 };
 
-
-#if 0
-/* Internally used pause function */
-static void nforce2_do_pause(unsigned int amount)
-{
-	current->state = TASK_INTERRUPTIBLE;
-	schedule_timeout(amount);
-}
-#endif
-
 /* Return -1 on error. See smbus.h for more information */
-static s32 nforce2_access(struct i2c_adapter * adap, u16 addr, unsigned short flags,
-		char read_write, u8 command, int size,
-		union i2c_smbus_data * data)
+static s32 nforce2_access(struct i2c_adapter * adap, u16 addr,
+		unsigned short flags, char read_write,
+		u8 command, int size, union i2c_smbus_data * data)
 {
 	struct nforce2_smbus *smbus = adap->algo_data;
 	unsigned char protocol, pec, temp;
@@ -251,7 +237,7 @@
 
 #if 0
 	do {
-		nforce2_do_pause(1);
+		i2c_do_pause(1);
 		temp = inb_p(NVIDIA_SMB_STS);
 	} while (((temp & NVIDIA_SMB_STS_DONE) == 0) && (timeout++ < MAX_TIMEOUT));
 #endif
@@ -334,13 +320,8 @@
 			smbus->base, smbus->base+smbus->size-1, name);
 		return -1;
 	}
-/*
-	smbus->adapter.owner = THIS_MODULE;
-	smbus->adapter.id = I2C_ALGO_SMBUS | I2C_HW_SMBUS_NFORCE2;
-	smbus->adapter.algo = &smbus_algorithm;
-	smbus->adapter.algo_data = smbus;
-*/
 	smbus->adapter = nforce2_adapter;
+	smbus->adapter.algo_data = smbus;
 	smbus->adapter.dev.parent = &dev->dev;
 	snprintf(smbus->adapter.dev.name, DEVICE_NAME_SIZE,
 		"SMBus nForce2 adapter at %04x", smbus->base);


More information about the lm-sensors mailing list