All of lore.kernel.org
 help / color / mirror / Atom feed
* [BK PATCH] More i2c driver fixes for 2.6.0-test2
@ 2005-05-19  6:24 ` Greg KH
  0 siblings, 0 replies; 33+ messages in thread
From: Greg KH @ 2003-08-08 23:55 UTC (permalink / raw)
  To: torvalds; +Cc: linux-kernel, sensors

Hi,

Here are some more i2c driver fixes for 2.6.0-test2.  They include a fix
for the driver model code (no release function, so easy oopses could
happen by users), and removing usage of the struct device.name field as
that is about to go away.

Please pull from:  bk://kernel.bkbits.net/gregkh/linux/i2c-2.5

thanks,

greg k-h

 drivers/i2c/busses/i2c-ali1535.c          |    6 +----
 drivers/i2c/busses/i2c-ali15x3.c          |    6 +----
 drivers/i2c/busses/i2c-amd756.c           |    6 +----
 drivers/i2c/busses/i2c-amd8111.c          |    2 -
 drivers/i2c/busses/i2c-i801.c             |    6 +----
 drivers/i2c/busses/i2c-isa.c              |    4 ---
 drivers/i2c/busses/i2c-nforce2.c          |    6 +----
 drivers/i2c/busses/i2c-piix4.c            |    8 ++----
 drivers/i2c/busses/i2c-sis96x.c           |    6 +----
 drivers/i2c/busses/i2c-viapro.c           |    6 +----
 drivers/i2c/chips/adm1021.c               |    2 -
 drivers/i2c/chips/it87.c                  |    2 -
 drivers/i2c/chips/lm75.c                  |    2 -
 drivers/i2c/chips/lm78.c                  |    2 -
 drivers/i2c/chips/lm85.c                  |   12 +++++-----
 drivers/i2c/chips/via686a.c               |    2 -
 drivers/i2c/chips/w83781d.c               |    4 +--
 drivers/i2c/i2c-algo-bit.c                |    2 -
 drivers/i2c/i2c-core.c                    |   35 +++++++++++++++++++++++++++---
 drivers/i2c/i2c-dev.c                     |    6 +----
 drivers/i2c/i2c-elektor.c                 |    4 ---
 drivers/i2c/i2c-elv.c                     |    4 ---
 drivers/i2c/i2c-philips-par.c             |    4 ---
 drivers/i2c/i2c-prosavage.c               |    5 ----
 drivers/i2c/i2c-velleman.c                |    4 ---
 drivers/i2c/scx200_acb.c                  |    4 +--
 drivers/media/common/saa7146_i2c.c        |    3 --
 drivers/media/video/adv7175.c             |   22 +++++++-----------
 drivers/media/video/bt819.c               |   24 +++++++++-----------
 drivers/media/video/bt856.c               |   20 +++++++----------
 drivers/media/video/bttv-cards.c          |    2 -
 drivers/media/video/msp3400.c             |    2 -
 drivers/media/video/saa5249.c             |    6 +----
 drivers/media/video/saa7110.c             |   10 +++-----
 drivers/media/video/saa7111.c             |   15 +++++-------
 drivers/media/video/saa7134/saa7134-i2c.c |    2 -
 drivers/media/video/saa7185.c             |   13 ++++-------
 drivers/media/video/tda9840.c             |    6 ++---
 drivers/media/video/tda9887.c             |    4 ---
 drivers/media/video/tea6415c.c            |    6 ++---
 drivers/media/video/tea6420.c             |    6 ++---
 drivers/media/video/tuner-3036.c          |    4 ---
 drivers/media/video/tuner.c               |    8 ++----
 drivers/pci/quirks.c                      |    9 +++++--
 include/linux/i2c.h                       |   12 +++++++---
 45 files changed, 152 insertions(+), 172 deletions(-)
-----

<seanlkml:rogers.com>:
  o I2C: Additional P4B subsystem id for hidden asus smbus

<wodecki:gmx.de>:
  o I2C: i2c sysfs rant

Greg Kroah-Hartman:
  o I2C: fix up driver model programming error
  o I2C: move the name field back into the i2c_client and i2c_adapter structures


^ permalink raw reply	[flat|nested] 33+ messages in thread

* [PATCH] More i2c driver changes 2.6.0-test2
  2005-05-19  6:24 ` Greg KH
@ 2005-05-19  6:24   ` Greg KH
  -1 siblings, 0 replies; 33+ messages in thread
From: Greg KH @ 2003-08-08 23:55 UTC (permalink / raw)
  To: linux-kernel, sensors

ChangeSet 1.1124, 2003/08/08 16:15:11-07:00, greg@kroah.com

I2C: move the name field back into the i2c_client and i2c_adapter structures.

This is because the name field of struct device is going away, and the name
fields on these i2c structures are useful for people.


 drivers/i2c/busses/i2c-ali1535.c          |    6 ++----
 drivers/i2c/busses/i2c-ali15x3.c          |    6 ++----
 drivers/i2c/busses/i2c-amd756.c           |    6 ++----
 drivers/i2c/busses/i2c-amd8111.c          |    2 +-
 drivers/i2c/busses/i2c-i801.c             |    6 ++----
 drivers/i2c/busses/i2c-isa.c              |    4 +---
 drivers/i2c/busses/i2c-nforce2.c          |    6 ++----
 drivers/i2c/busses/i2c-piix4.c            |    8 +++-----
 drivers/i2c/busses/i2c-sis96x.c           |    6 ++----
 drivers/i2c/busses/i2c-viapro.c           |    6 ++----
 drivers/i2c/chips/adm1021.c               |    2 +-
 drivers/i2c/chips/it87.c                  |    2 +-
 drivers/i2c/chips/lm75.c                  |    2 +-
 drivers/i2c/chips/lm78.c                  |    2 +-
 drivers/i2c/chips/lm85.c                  |   12 ++++++------
 drivers/i2c/chips/via686a.c               |    2 +-
 drivers/i2c/chips/w83781d.c               |    4 ++--
 drivers/i2c/i2c-algo-bit.c                |    2 +-
 drivers/i2c/i2c-core.c                    |    4 ++--
 drivers/i2c/i2c-dev.c                     |    4 +---
 drivers/i2c/i2c-elektor.c                 |    4 +---
 drivers/i2c/i2c-elv.c                     |    4 +---
 drivers/i2c/i2c-philips-par.c             |    4 +---
 drivers/i2c/i2c-prosavage.c               |    5 -----
 drivers/i2c/i2c-velleman.c                |    4 +---
 drivers/i2c/scx200_acb.c                  |    4 ++--
 drivers/media/common/saa7146_i2c.c        |    3 +--
 drivers/media/video/adv7175.c             |   22 +++++++++-------------
 drivers/media/video/bt819.c               |   24 +++++++++++-------------
 drivers/media/video/bt856.c               |   20 +++++++++-----------
 drivers/media/video/bttv-cards.c          |    2 +-
 drivers/media/video/msp3400.c             |    2 +-
 drivers/media/video/saa5249.c             |    6 ++----
 drivers/media/video/saa7110.c             |   10 ++++------
 drivers/media/video/saa7111.c             |   15 ++++++---------
 drivers/media/video/saa7134/saa7134-i2c.c |    2 +-
 drivers/media/video/saa7185.c             |   13 +++++--------
 drivers/media/video/tda9840.c             |    6 +++---
 drivers/media/video/tda9887.c             |    4 +---
 drivers/media/video/tea6415c.c            |    6 +++---
 drivers/media/video/tea6420.c             |    6 +++---
 drivers/media/video/tuner-3036.c          |    4 +---
 drivers/media/video/tuner.c               |    8 +++-----
 include/linux/i2c.h                       |    6 ++++--
 44 files changed, 110 insertions(+), 166 deletions(-)


diff -Nru a/drivers/i2c/busses/i2c-ali1535.c b/drivers/i2c/busses/i2c-ali1535.c
--- a/drivers/i2c/busses/i2c-ali1535.c	Fri Aug  8 16:47:40 2003
+++ b/drivers/i2c/busses/i2c-ali1535.c	Fri Aug  8 16:47:40 2003
@@ -483,9 +483,7 @@
 	.owner		= THIS_MODULE,
 	.id		= I2C_ALGO_SMBUS | I2C_HW_SMBUS_ALI1535,
 	.algo		= &smbus_algorithm,
-	.dev		= {
-		.name	= "unset",
-	}
+	.name		= "unset",
 };
 
 static struct pci_device_id ali1535_ids[] = {
@@ -509,7 +507,7 @@
 	/* set up the driverfs linkage to our parent device */
 	ali1535_adapter.dev.parent = &dev->dev;
 
-	snprintf(ali1535_adapter.dev.name, DEVICE_NAME_SIZE, 
+	snprintf(ali1535_adapter.name, DEVICE_NAME_SIZE, 
 		"SMBus ALI1535 adapter at %04x", ali1535_smba);
 	return i2c_add_adapter(&ali1535_adapter);
 }
diff -Nru a/drivers/i2c/busses/i2c-ali15x3.c b/drivers/i2c/busses/i2c-ali15x3.c
--- a/drivers/i2c/busses/i2c-ali15x3.c	Fri Aug  8 16:47:40 2003
+++ b/drivers/i2c/busses/i2c-ali15x3.c	Fri Aug  8 16:47:40 2003
@@ -474,9 +474,7 @@
 	.id		= I2C_ALGO_SMBUS | I2C_HW_SMBUS_ALI15X3,
 	.class          = I2C_ADAP_CLASS_SMBUS,
 	.algo		= &smbus_algorithm,
-	.dev		= {
-		.name	= "unset",
-	},
+	.name		= "unset",
 };
 
 static struct pci_device_id ali15x3_ids[] = {
@@ -500,7 +498,7 @@
 	/* set up the driverfs linkage to our parent device */
 	ali15x3_adapter.dev.parent = &dev->dev;
 
-	snprintf(ali15x3_adapter.dev.name, DEVICE_NAME_SIZE,
+	snprintf(ali15x3_adapter.name, DEVICE_NAME_SIZE,
 		"SMBus ALI15X3 adapter at %04x", ali15x3_smba);
 	return i2c_add_adapter(&ali15x3_adapter);
 }
diff -Nru a/drivers/i2c/busses/i2c-amd756.c b/drivers/i2c/busses/i2c-amd756.c
--- a/drivers/i2c/busses/i2c-amd756.c	Fri Aug  8 16:47:40 2003
+++ b/drivers/i2c/busses/i2c-amd756.c	Fri Aug  8 16:47:40 2003
@@ -307,9 +307,7 @@
 	.id		= I2C_ALGO_SMBUS | I2C_HW_SMBUS_AMD756,
 	.class          = I2C_ADAP_CLASS_SMBUS,
 	.algo		= &smbus_algorithm,
-	.dev		= {
-		.name	= "unset",
-	},
+	.name		= "unset",
 };
 
 enum chiptype { AMD756, AMD766, AMD768, NFORCE };
@@ -371,7 +369,7 @@
 	/* set up the driverfs linkage to our parent device */
 	amd756_adapter.dev.parent = &pdev->dev;
 
-	snprintf(amd756_adapter.dev.name, DEVICE_NAME_SIZE,
+	snprintf(amd756_adapter.name, DEVICE_NAME_SIZE,
 		"SMBus AMD75x adapter at %04x", amd756_ioport);
 
 	error = i2c_add_adapter(&amd756_adapter);
diff -Nru a/drivers/i2c/busses/i2c-amd8111.c b/drivers/i2c/busses/i2c-amd8111.c
--- a/drivers/i2c/busses/i2c-amd8111.c	Fri Aug  8 16:47:40 2003
+++ b/drivers/i2c/busses/i2c-amd8111.c	Fri Aug  8 16:47:40 2003
@@ -356,7 +356,7 @@
 		goto out_kfree;
 
 	smbus->adapter.owner = THIS_MODULE;
-	snprintf(smbus->adapter.dev.name, DEVICE_NAME_SIZE,
+	snprintf(smbus->adapter.name, DEVICE_NAME_SIZE,
 		"SMBus2 AMD8111 adapter at %04x", smbus->base);
 	smbus->adapter.id = I2C_ALGO_SMBUS | I2C_HW_SMBUS_AMD8111;
 	smbus->adapter.class = I2C_ADAP_CLASS_SMBUS;
diff -Nru a/drivers/i2c/busses/i2c-i801.c b/drivers/i2c/busses/i2c-i801.c
--- a/drivers/i2c/busses/i2c-i801.c	Fri Aug  8 16:47:40 2003
+++ b/drivers/i2c/busses/i2c-i801.c	Fri Aug  8 16:47:40 2003
@@ -543,9 +543,7 @@
 	.id		= I2C_ALGO_SMBUS | I2C_HW_SMBUS_I801,
 	.class		= I2C_ADAP_CLASS_SMBUS,
 	.algo		= &smbus_algorithm,
-	.dev		= {
-		.name	= "unset",
-	},
+	.name		= "unset",
 };
 
 static struct pci_device_id i801_ids[] = {
@@ -600,7 +598,7 @@
 	/* set up the driverfs linkage to our parent device */
 	i801_adapter.dev.parent = &dev->dev;
 
-	snprintf(i801_adapter.dev.name, DEVICE_NAME_SIZE,
+	snprintf(i801_adapter.name, DEVICE_NAME_SIZE,
 		"SMBus I801 adapter at %04x", i801_smba);
 	return i2c_add_adapter(&i801_adapter);
 }
diff -Nru a/drivers/i2c/busses/i2c-isa.c b/drivers/i2c/busses/i2c-isa.c
--- a/drivers/i2c/busses/i2c-isa.c	Fri Aug  8 16:47:40 2003
+++ b/drivers/i2c/busses/i2c-isa.c	Fri Aug  8 16:47:40 2003
@@ -42,9 +42,7 @@
 	.id		= I2C_ALGO_ISA | I2C_HW_ISA,
 	.class          = I2C_ADAP_CLASS_SMBUS,
 	.algo		= &isa_algorithm,
-	.dev		= {
-		.name	= "ISA main adapter",
-	},
+	.name		= "ISA main adapter",
 };
 
 static int __init i2c_isa_init(void)
diff -Nru a/drivers/i2c/busses/i2c-nforce2.c b/drivers/i2c/busses/i2c-nforce2.c
--- a/drivers/i2c/busses/i2c-nforce2.c	Fri Aug  8 16:47:40 2003
+++ b/drivers/i2c/busses/i2c-nforce2.c	Fri Aug  8 16:47:40 2003
@@ -125,9 +125,7 @@
 	.id             = I2C_ALGO_SMBUS | I2C_HW_SMBUS_NFORCE2,
 	.class          = I2C_ADAP_CLASS_SMBUS,
 	.algo           = &smbus_algorithm,
-	.dev            = {
-		.name   = "unset",
-	},
+	.name   	= "unset",
 };
 
 
@@ -342,7 +340,7 @@
 */
 	smbus->adapter = nforce2_adapter;
 	smbus->adapter.dev.parent = &dev->dev;
-	snprintf(smbus->adapter.dev.name, DEVICE_NAME_SIZE,
+	snprintf(smbus->adapter.name, DEVICE_NAME_SIZE,
 		"SMBus nForce2 adapter at %04x", smbus->base);
 
 	error = i2c_add_adapter(&smbus->adapter);
diff -Nru a/drivers/i2c/busses/i2c-piix4.c b/drivers/i2c/busses/i2c-piix4.c
--- a/drivers/i2c/busses/i2c-piix4.c	Fri Aug  8 16:47:40 2003
+++ b/drivers/i2c/busses/i2c-piix4.c	Fri Aug  8 16:47:40 2003
@@ -127,7 +127,7 @@
 	if (PCI_FUNC(PIIX4_dev->devfn) != id->driver_data)
 		return -ENODEV;
 
-	dev_info(&PIIX4_dev->dev, "Found %s device\n", PIIX4_dev->dev.name);
+	dev_info(&PIIX4_dev->dev, "Found %s device\n", pci_name(PIIX4_dev));
 
 	if(ibm_dmi_probe()) {
 		dev_err(&PIIX4_dev->dev, "IBM Laptop detected; this module "
@@ -389,9 +389,7 @@
 	.id		= I2C_ALGO_SMBUS | I2C_HW_SMBUS_PIIX4,
 	.class		= I2C_ADAP_CLASS_SMBUS,
 	.algo		= &smbus_algorithm,
-	.dev		= {
-		.name	= "unset",
-	},
+	.name		= "unset",
 };
 
 static struct pci_device_id piix4_ids[] = {
@@ -444,7 +442,7 @@
 	/* set up the driverfs linkage to our parent device */
 	piix4_adapter.dev.parent = &dev->dev;
 
-	snprintf(piix4_adapter.dev.name, DEVICE_NAME_SIZE,
+	snprintf(piix4_adapter.name, DEVICE_NAME_SIZE,
 		"SMBus PIIX4 adapter at %04x", piix4_smba);
 
 	retval = i2c_add_adapter(&piix4_adapter);
diff -Nru a/drivers/i2c/busses/i2c-sis96x.c b/drivers/i2c/busses/i2c-sis96x.c
--- a/drivers/i2c/busses/i2c-sis96x.c	Fri Aug  8 16:47:40 2003
+++ b/drivers/i2c/busses/i2c-sis96x.c	Fri Aug  8 16:47:40 2003
@@ -264,9 +264,7 @@
 	.id		= I2C_ALGO_SMBUS | I2C_HW_SMBUS_SIS96X,
 	.class		= I2C_ADAP_CLASS_SMBUS,
 	.algo		= &smbus_algorithm,
-	.dev		= {
-		.name	="unset",
-	},
+	.name		= "unset",
 };
 
 static struct pci_device_id sis96x_ids[] = {
@@ -320,7 +318,7 @@
 	/* set up the driverfs linkage to our parent device */
 	sis96x_adapter.dev.parent = &dev->dev;
 
-	snprintf(sis96x_adapter.dev.name, DEVICE_NAME_SIZE,
+	snprintf(sis96x_adapter.name, DEVICE_NAME_SIZE,
 		"SiS96x SMBus adapter at 0x%04x", sis96x_smbus_base);
 
 	if ((retval = i2c_add_adapter(&sis96x_adapter))) {
diff -Nru a/drivers/i2c/busses/i2c-viapro.c b/drivers/i2c/busses/i2c-viapro.c
--- a/drivers/i2c/busses/i2c-viapro.c	Fri Aug  8 16:47:40 2003
+++ b/drivers/i2c/busses/i2c-viapro.c	Fri Aug  8 16:47:40 2003
@@ -290,9 +290,7 @@
 	.id		= I2C_ALGO_SMBUS | I2C_HW_SMBUS_VIA2,
 	.class		= I2C_ADAP_CLASS_SMBUS,
 	.algo		= &smbus_algorithm,
-	.dev		= {
-		.name	= "unset",
-	},
+	.name		= "unset",
 };
 
 static int __devinit vt596_probe(struct pci_dev *pdev,
@@ -378,7 +376,7 @@
 	dev_dbg(&pdev->dev, "VT596_smba = 0x%X\n", vt596_smba);
 
 	vt596_adapter.dev.parent = &pdev->dev;
-	snprintf(vt596_adapter.dev.name, DEVICE_NAME_SIZE,
+	snprintf(vt596_adapter.name, DEVICE_NAME_SIZE,
 			"SMBus Via Pro adapter at %04x", vt596_smba);
 	
 	return i2c_add_adapter(&vt596_adapter);
diff -Nru a/drivers/i2c/chips/adm1021.c b/drivers/i2c/chips/adm1021.c
--- a/drivers/i2c/chips/adm1021.c	Fri Aug  8 16:47:39 2003
+++ b/drivers/i2c/chips/adm1021.c	Fri Aug  8 16:47:39 2003
@@ -320,7 +320,7 @@
 	}
 
 	/* Fill in the remaining client fields and put it into the global list */
-	strlcpy(new_client->dev.name, client_name, DEVICE_NAME_SIZE);
+	strlcpy(new_client->name, client_name, DEVICE_NAME_SIZE);
 	data->type = kind;
 
 	new_client->id = adm1021_id++;
diff -Nru a/drivers/i2c/chips/it87.c b/drivers/i2c/chips/it87.c
--- a/drivers/i2c/chips/it87.c	Fri Aug  8 16:47:40 2003
+++ b/drivers/i2c/chips/it87.c	Fri Aug  8 16:47:40 2003
@@ -692,7 +692,7 @@
 	}
 
 	/* Fill in the remaining client fields and put it into the global list */
-	strlcpy(new_client->dev.name, name, DEVICE_NAME_SIZE);
+	strlcpy(new_client->name, name, DEVICE_NAME_SIZE);
 
 	data->type = kind;
 
diff -Nru a/drivers/i2c/chips/lm75.c b/drivers/i2c/chips/lm75.c
--- a/drivers/i2c/chips/lm75.c	Fri Aug  8 16:47:39 2003
+++ b/drivers/i2c/chips/lm75.c	Fri Aug  8 16:47:39 2003
@@ -194,7 +194,7 @@
 	}
 
 	/* Fill in the remaining client fields and put it into the global list */
-	strlcpy(new_client->dev.name, name, DEVICE_NAME_SIZE);
+	strlcpy(new_client->name, name, DEVICE_NAME_SIZE);
 
 	new_client->id = lm75_id++;
 	data->valid = 0;
diff -Nru a/drivers/i2c/chips/lm78.c b/drivers/i2c/chips/lm78.c
--- a/drivers/i2c/chips/lm78.c	Fri Aug  8 16:47:40 2003
+++ b/drivers/i2c/chips/lm78.c	Fri Aug  8 16:47:40 2003
@@ -638,7 +638,7 @@
 	}
 
 	/* Fill in the remaining client fields and put into the global list */
-	strlcpy(new_client->dev.name, client_name, DEVICE_NAME_SIZE);
+	strlcpy(new_client->name, client_name, DEVICE_NAME_SIZE);
 	data->type = kind;
 
 	data->valid = 0;
diff -Nru a/drivers/i2c/chips/lm85.c b/drivers/i2c/chips/lm85.c
--- a/drivers/i2c/chips/lm85.c	Fri Aug  8 16:47:40 2003
+++ b/drivers/i2c/chips/lm85.c	Fri Aug  8 16:47:40 2003
@@ -853,19 +853,19 @@
 	/* Fill in the chip specific driver values */
 	if ( kind == any_chip ) {
 		type_name = "lm85";
-		strlcpy(new_client->dev.name, "Generic LM85", DEVICE_NAME_SIZE);
+		strlcpy(new_client->name, "Generic LM85", DEVICE_NAME_SIZE);
 	} else if ( kind == lm85b ) {
 		type_name = "lm85b";
-		strlcpy(new_client->dev.name, "National LM85-B", DEVICE_NAME_SIZE);
+		strlcpy(new_client->name, "National LM85-B", DEVICE_NAME_SIZE);
 	} else if ( kind == lm85c ) {
 		type_name = "lm85c";
-		strlcpy(new_client->dev.name, "National LM85-C", DEVICE_NAME_SIZE);
+		strlcpy(new_client->name, "National LM85-C", DEVICE_NAME_SIZE);
 	} else if ( kind == adm1027 ) {
 		type_name = "adm1027";
-		strlcpy(new_client->dev.name, "Analog Devices ADM1027", DEVICE_NAME_SIZE);
+		strlcpy(new_client->name, "Analog Devices ADM1027", DEVICE_NAME_SIZE);
 	} else if ( kind == adt7463 ) {
 		type_name = "adt7463";
-		strlcpy(new_client->dev.name, "Analog Devices ADT7463", DEVICE_NAME_SIZE);
+		strlcpy(new_client->name, "Analog Devices ADT7463", DEVICE_NAME_SIZE);
 	} else {
 		dev_dbg(&adapter->dev, "Internal error, invalid kind (%d)!", kind);
 		err = -EFAULT ;
@@ -880,7 +880,7 @@
 
 	if (lm85debug) {
 		printk("lm85: Assigning ID %d to %s at %d,0x%02x\n",
-		new_client->id, new_client->dev.name,
+		new_client->id, new_client->name,
 		i2c_adapter_id(new_client->adapter),
 		new_client->addr);
 	}
diff -Nru a/drivers/i2c/chips/via686a.c b/drivers/i2c/chips/via686a.c
--- a/drivers/i2c/chips/via686a.c	Fri Aug  8 16:47:39 2003
+++ b/drivers/i2c/chips/via686a.c	Fri Aug  8 16:47:39 2003
@@ -727,7 +727,7 @@
 	new_client->dev.parent = &adapter->dev;
 
 	/* Fill in the remaining client fields and put into the global list */
-	snprintf(new_client->dev.name, DEVICE_NAME_SIZE, client_name);
+	snprintf(new_client->name, DEVICE_NAME_SIZE, client_name);
 
 	data->valid = 0;
 	init_MUTEX(&data->update_lock);
diff -Nru a/drivers/i2c/chips/w83781d.c b/drivers/i2c/chips/w83781d.c
--- a/drivers/i2c/chips/w83781d.c	Fri Aug  8 16:47:39 2003
+++ b/drivers/i2c/chips/w83781d.c	Fri Aug  8 16:47:39 2003
@@ -1116,7 +1116,7 @@
 		data->lm75[i]->adapter = adapter;
 		data->lm75[i]->driver = &w83781d_driver;
 		data->lm75[i]->flags = 0;
-		strlcpy(data->lm75[i]->dev.name, client_name,
+		strlcpy(data->lm75[i]->name, client_name,
 			DEVICE_NAME_SIZE);
 		if ((err = i2c_attach_client(data->lm75[i]))) {
 			dev_err(&new_client->dev, "Subclient %d "
@@ -1326,7 +1326,7 @@
 	}
 
 	/* Fill in the remaining client fields and put into the global list */
-	strlcpy(new_client->dev.name, client_name, DEVICE_NAME_SIZE);
+	strlcpy(new_client->name, client_name, DEVICE_NAME_SIZE);
 	data->type = kind;
 
 	data->valid = 0;
diff -Nru a/drivers/i2c/i2c-algo-bit.c b/drivers/i2c/i2c-algo-bit.c
--- a/drivers/i2c/i2c-algo-bit.c	Fri Aug  8 16:47:40 2003
+++ b/drivers/i2c/i2c-algo-bit.c	Fri Aug  8 16:47:40 2003
@@ -527,7 +527,7 @@
 	struct i2c_algo_bit_data *bit_adap = adap->algo_data;
 
 	if (bit_test) {
-		int ret = test_bus(bit_adap, adap->dev.name);
+		int ret = test_bus(bit_adap, adap->name);
 		if (ret<0)
 			return -ENODEV;
 	}
diff -Nru a/drivers/i2c/i2c-core.c b/drivers/i2c/i2c-core.c
--- a/drivers/i2c/i2c-core.c	Fri Aug  8 16:47:40 2003
+++ b/drivers/i2c/i2c-core.c	Fri Aug  8 16:47:40 2003
@@ -250,7 +250,7 @@
 					continue;
 				DEB2(printk(KERN_DEBUG "i2c-core.o: "
 					    "detaching client %s:\n",
-					    client->dev.name));
+					    client->name));
 				if ((res = driver->detach_client(client))) {
 					dev_err(&adap->dev, "while "
 						"unregistering driver "
@@ -352,7 +352,7 @@
 		if (res) {
 			printk(KERN_ERR
 			       "i2c-core.o: client_unregister [%s] failed, "
-			       "client not detached", client->dev.name);
+			       "client not detached", client->name);
 			goto out;
 		}
 	}
diff -Nru a/drivers/i2c/i2c-dev.c b/drivers/i2c/i2c-dev.c
--- a/drivers/i2c/i2c-dev.c	Fri Aug  8 16:47:40 2003
+++ b/drivers/i2c/i2c-dev.c	Fri Aug  8 16:47:40 2003
@@ -484,9 +484,7 @@
 };
 
 static struct i2c_client i2cdev_client_template = {
-	.dev		= {
-		.name	= "I2C /dev entry",
-	},
+	.name		= "I2C /dev entry",
 	.id		= 1,
 	.addr		= -1,
 	.driver		= &i2cdev_driver,
diff -Nru a/drivers/i2c/i2c-elektor.c b/drivers/i2c/i2c-elektor.c
--- a/drivers/i2c/i2c-elektor.c	Fri Aug  8 16:47:39 2003
+++ b/drivers/i2c/i2c-elektor.c	Fri Aug  8 16:47:39 2003
@@ -178,9 +178,7 @@
 	.owner		= THIS_MODULE,
 	.id		= I2C_HW_P_ELEK,
 	.algo_data	= &pcf_isa_data,
-	.dev		= {
-		.name	= "PCF8584 ISA adapter",
-	},
+	.name		= "PCF8584 ISA adapter",
 };
 
 static int __init i2c_pcfisa_init(void) 
diff -Nru a/drivers/i2c/i2c-elv.c b/drivers/i2c/i2c-elv.c
--- a/drivers/i2c/i2c-elv.c	Fri Aug  8 16:47:40 2003
+++ b/drivers/i2c/i2c-elv.c	Fri Aug  8 16:47:40 2003
@@ -131,9 +131,7 @@
 	.owner		= THIS_MODULE,
 	.id		= I2C_HW_B_ELV,
 	.algo_data	= &bit_elv_data,
-	.dev		= {
-		.name	= "ELV Parallel port adaptor",
-	},
+	.name		= "ELV Parallel port adaptor",
 };
 
 static int __init i2c_bitelv_init(void)
diff -Nru a/drivers/i2c/i2c-philips-par.c b/drivers/i2c/i2c-philips-par.c
--- a/drivers/i2c/i2c-philips-par.c	Fri Aug  8 16:47:40 2003
+++ b/drivers/i2c/i2c-philips-par.c	Fri Aug  8 16:47:40 2003
@@ -152,9 +152,7 @@
 static struct i2c_adapter bit_lp_ops = {
 	.owner		= THIS_MODULE,
 	.id		= I2C_HW_B_LP,
-	.dev		= {
-		.name	= "Philips Parallel port adapter",
-	},
+	.name		= "Philips Parallel port adapter",
 };
 
 static void i2c_parport_attach (struct parport *port)
diff -Nru a/drivers/i2c/i2c-prosavage.c b/drivers/i2c/i2c-prosavage.c
--- a/drivers/i2c/i2c-prosavage.c	Fri Aug  8 16:47:40 2003
+++ b/drivers/i2c/i2c-prosavage.c	Fri Aug  8 16:47:40 2003
@@ -70,12 +70,7 @@
 #define	DRIVER_ID	"i2c-prosavage"
 #define	DRIVER_VERSION	"20030621"
 
-/* lm_sensors2 / kernel 2.5.xx compatibility */
-#if LINUX_VERSION_CODE < KERNEL_VERSION(2,5,0)
 #define ADAPTER_NAME(x) (x).name
-#else
-#define ADAPTER_NAME(x) (x).dev.name
-#endif /* LINUX_VERSION_CODE */
 
 #define MAX_BUSSES	2
 
diff -Nru a/drivers/i2c/i2c-velleman.c b/drivers/i2c/i2c-velleman.c
--- a/drivers/i2c/i2c-velleman.c	Fri Aug  8 16:47:40 2003
+++ b/drivers/i2c/i2c-velleman.c	Fri Aug  8 16:47:40 2003
@@ -116,9 +116,7 @@
 	.owner		= THIS_MODULE,
 	.id		= I2C_HW_B_VELLE,
 	.algo_data	= &bit_velle_data,
-	.dev		= {
-		.name	= "Velleman K8000",
-	},
+	.name		= "Velleman K8000",
 };
 
 static int __init i2c_bitvelle_init(void)
diff -Nru a/drivers/i2c/scx200_acb.c b/drivers/i2c/scx200_acb.c
--- a/drivers/i2c/scx200_acb.c	Fri Aug  8 16:47:40 2003
+++ b/drivers/i2c/scx200_acb.c	Fri Aug  8 16:47:40 2003
@@ -456,14 +456,14 @@
 	memset(iface, 0, sizeof(*iface));
 	adapter = &iface->adapter;
 	i2c_set_adapdata(adapter, iface);
-	snprintf(adapter->dev.name, DEVICE_NAME_SIZE, "SCx200 ACB%d", index);
+	snprintf(adapter->name, DEVICE_NAME_SIZE, "SCx200 ACB%d", index);
 	adapter->owner = THIS_MODULE;
 	adapter->id = I2C_ALGO_SMBUS;
 	adapter->algo = &scx200_acb_algorithm;
 
 	init_MUTEX(&iface->sem);
 
-	snprintf(description, sizeof(description), "NatSemi SCx200 ACCESS.bus [%s]", adapter->dev.name);
+	snprintf(description, sizeof(description), "NatSemi SCx200 ACCESS.bus [%s]", adapter->name);
 	if (request_region(base, 8, description) == 0) {
 		dev_err(&adapter->dev, "can't allocate io 0x%x-0x%x\n",
 			base, base + 8-1);
diff -Nru a/drivers/media/common/saa7146_i2c.c b/drivers/media/common/saa7146_i2c.c
--- a/drivers/media/common/saa7146_i2c.c	Fri Aug  8 16:47:40 2003
+++ b/drivers/media/common/saa7146_i2c.c	Fri Aug  8 16:47:40 2003
@@ -407,11 +407,10 @@
 
 	if( NULL != i2c_adapter ) {
 		memset(i2c_adapter,0,sizeof(struct i2c_adapter));
-#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,5,0))
 		strcpy(i2c_adapter->name, dev->name);	
+#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,5,0))
 		i2c_adapter->data = dev;
 #else
-		strcpy(i2c_adapter->dev.name, dev->name);	
 		i2c_set_adapdata(i2c_adapter,dev);
 #endif
 		i2c_adapter->algo	   = &saa7146_algo;
diff -Nru a/drivers/media/video/adv7175.c b/drivers/media/video/adv7175.c
--- a/drivers/media/video/adv7175.c	Fri Aug  8 16:47:40 2003
+++ b/drivers/media/video/adv7175.c	Fri Aug  8 16:47:40 2003
@@ -159,7 +159,7 @@
 	0x06, 0x1a,		/* subc. phase */
 };
 
-static int adv717x_attach(struct i2c_adapter *adap, int addr, unsigned short flags, int kind)
+static int adv717x_attach(struct i2c_adapter *adap, int addr, int kind)
 {
 	struct adv7175 *encoder;
 	struct	i2c_client	*client;
@@ -191,7 +191,7 @@
 		// We should never get here!!!
 		dname = unknown_name;
 	}
-	strlcpy(client->dev.name, dname, DEVICE_NAME_SIZE);
+	strlcpy(client->name, dname, DEVICE_NAME_SIZE);
 	init_MUTEX(&encoder->lock);
 	encoder->client = client;
 	i2c_set_clientdata(client, encoder);
@@ -203,7 +203,7 @@
 	for (i=1; i<x_common; i++) {
 		rv = i2c_smbus_write_byte(client,init_common[i]);
 		if (rv < 0) {
-			printk(KERN_ERR "%s_attach: init error %d\n", client->dev.name, rv);
+			printk(KERN_ERR "%s_attach: init error %d\n", client->name, rv);
 			break;
 		}
 	}
@@ -213,7 +213,7 @@
 		i2c_smbus_write_byte_data(client,0x07, TR0MODE);
 		i2c_smbus_read_byte_data(client,0x12);
 		printk(KERN_INFO "%s_attach: %s rev. %d at 0x%02x\n",
-		       client->dev.name, dname, rv & 1, client->addr);
+		       client->name, dname, rv & 1, client->addr);
 	}
 
 	i2c_attach_client(client);
@@ -297,9 +297,8 @@
 					i2c_smbus_write_byte_data(client,0x07, TR0MODE);
 					break;
 				default:
-					printk(KERN_ERR
-					       "%s: illegal norm: %d\n",
-					       client->dev.name, iarg);
+					printk(KERN_ERR "%s: illegal norm: %d\n",
+					       client->name, iarg);
 					return -EINVAL;
 
 				}
@@ -353,9 +352,8 @@
 					break;
 
 				default:
-					printk(KERN_ERR
-					       "%s: illegal input: %d\n",
-					       client->dev.name, iarg);
+					printk(KERN_ERR "%s: illegal input: %d\n",
+					       client->name, iarg);
 					return -EINVAL;
 
 				}
@@ -422,9 +420,7 @@
 
 static struct i2c_client client_template = {
 	.driver		= &i2c_driver_adv7175,
-	.dev		= {
-		.name	= "adv7175_client",
-	},
+	.name		= "adv7175_client",
 };
 
 static int adv717x_init(void)
diff -Nru a/drivers/media/video/bt819.c b/drivers/media/video/bt819.c
--- a/drivers/media/video/bt819.c	Fri Aug  8 16:47:40 2003
+++ b/drivers/media/video/bt819.c	Fri Aug  8 16:47:40 2003
@@ -150,7 +150,7 @@
 
 /* ----------------------------------------------------------------------- */
 
-static int bt819_attach(struct i2c_adapter *adap, int addr , unsigned long flags, int kind)
+static int bt819_attach(struct i2c_adapter *adap, int addr, int kind)
 {
 	int i;
 	struct bt819 *decoder;
@@ -172,7 +172,7 @@
 	}
 
 	memset(decoder, 0, sizeof(struct bt819));
-	strlcpy(client->dev.name, "bt819", DEVICE_NAME_SIZE);
+	strlcpy(client->name, "bt819", DEVICE_NAME_SIZE);
 	i2c_set_clientdata(client, decoder);
 	decoder->client = client;
 	decoder->addr = addr;
@@ -188,10 +188,10 @@
 	i = bt819_init(client);
 	if (i < 0) {
 		printk(KERN_ERR "%s: bt819_attach: init status %d\n",
-		       decoder->client->dev.name, i);
+		       decoder->client->name, i);
 	} else {
 		printk(KERN_INFO "%s: bt819_attach: chip version %x\n",
-		       decoder->client->dev.name, i2c_smbus_read_byte_data(client,
+		       decoder->client->name, i2c_smbus_read_byte_data(client,
 						      0x17) & 0x0f);
 	}
 	init_MUTEX(&decoder->lock);
@@ -270,7 +270,7 @@
 			*iarg = res;
 
 			DEBUG(printk(KERN_INFO "%s-bt819: get status %x\n",
-				     decoder->client->dev.name, *iarg));
+				     decoder->client->name, *iarg));
 		}
 		break;
 
@@ -280,7 +280,7 @@
 			struct timing *timing;
 
 			DEBUG(printk(KERN_INFO "%s-bt819: set norm %x\n",
-				     decoder->client->dev.name, *iarg));
+				     decoder->client->name, *iarg));
 
 			if (*iarg == VIDEO_MODE_NTSC) {
 				bt819_setbit(decoder, 0x01, 0, 1);
@@ -321,7 +321,7 @@
 			int *iarg = arg;
 
 			DEBUG(printk(KERN_INFO "%s-bt819: set input %x\n",
-				     decoder->client->dev.name, *iarg));
+				     decoder->client->name, *iarg));
 
 			if (*iarg < 0 || *iarg > 7) {
 				return -EINVAL;
@@ -346,7 +346,7 @@
 			int *iarg = arg;
 
 			DEBUG(printk(KERN_INFO "%s-bt819: set output %x\n",
-				     decoder->client->dev.name, *iarg));
+				     decoder->client->name, *iarg));
 
 			/* not much choice of outputs */
 			if (*iarg != 0) {
@@ -362,7 +362,7 @@
 
 			DEBUG(printk
 			      (KERN_INFO "%s-bt819: enable output %x\n",
-			       decoder->client->dev.name, *iarg));
+			       decoder->client->name, *iarg));
 
 			if (decoder->enable != enable) {
 				decoder->enable = enable;
@@ -383,7 +383,7 @@
 			DEBUG(printk
 			      (KERN_INFO
 			       "%s-bt819: set picture brightness %d contrast %d colour %d\n",
-			       decoder->client->dev.name, pic->brightness,
+			       decoder->client->name, pic->brightness,
 			       pic->contrast, pic->colour));
 
 
@@ -452,9 +452,7 @@
 static struct i2c_client client_template = {
 	.id = -1,
 	.driver = &i2c_driver_bt819,
-	.dev = {
-		.name = "bt819_client",
-	},
+	.name = "bt819_client",
 };
 
 static int bt819_setup(void)
diff -Nru a/drivers/media/video/bt856.c b/drivers/media/video/bt856.c
--- a/drivers/media/video/bt856.c	Fri Aug  8 16:47:39 2003
+++ b/drivers/media/video/bt856.c	Fri Aug  8 16:47:39 2003
@@ -97,7 +97,7 @@
 
 /* ----------------------------------------------------------------------- */
 
-static int bt856_attach(struct i2c_adapter *adap, int addr , unsigned long flags, int kind)
+static int bt856_attach(struct i2c_adapter *adap, int addr, int kind)
 {
 	struct bt856 *encoder;
 	struct i2c_client *client;
@@ -123,14 +123,14 @@
 
 
 	memset(encoder, 0, sizeof(struct bt856));
-	strlcpy(client->dev.name, "bt856", DEVICE_NAME_SIZE);
+	strlcpy(client->name, "bt856", DEVICE_NAME_SIZE);
 	encoder->client = client;
 	i2c_set_clientdata(client, encoder);
 	encoder->addr = client->addr;
 	encoder->norm = VIDEO_MODE_NTSC;
 	encoder->enable = 1;
 
-	DEBUG(printk(KERN_INFO "%s-bt856: attach\n", encoder->client->dev.name));
+	DEBUG(printk(KERN_INFO "%s-bt856: attach\n", encoder->client->name));
 
 	i2c_smbus_write_byte_data(client, 0xdc, 0x18);
 	encoder->reg[0xdc] = 0x18;
@@ -190,7 +190,7 @@
 
 			DEBUG(printk
 			      (KERN_INFO "%s-bt856: get capabilities\n",
-			       encoder->client->dev.name));
+			       encoder->client->name));
 
 			cap->flags
 			    = VIDEO_ENCODER_PAL
@@ -205,7 +205,7 @@
 			int *iarg = arg;
 
 			DEBUG(printk(KERN_INFO "%s-bt856: set norm %d\n",
-				     encoder->client->dev.name, *iarg));
+				     encoder->client->name, *iarg));
 
 			switch (*iarg) {
 
@@ -232,7 +232,7 @@
 			int *iarg = arg;
 
 			DEBUG(printk(KERN_INFO "%s-bt856: set input %d\n",
-				     encoder->client->dev.name, *iarg));
+				     encoder->client->name, *iarg));
 
 			/*     We only have video bus.
 			   *iarg = 0: input is from bt819
@@ -268,7 +268,7 @@
 			int *iarg = arg;
 
 			DEBUG(printk(KERN_INFO "%s-bt856: set output %d\n",
-				     encoder->client->dev.name, *iarg));
+				     encoder->client->name, *iarg));
 
 			/* not much choice of outputs */
 			if (*iarg != 0) {
@@ -285,7 +285,7 @@
 
 			DEBUG(printk
 			      (KERN_INFO "%s-bt856: enable output %d\n",
-			       encoder->client->dev.name, encoder->enable));
+			       encoder->client->name, encoder->enable));
 		}
 		break;
 
@@ -311,9 +311,7 @@
 static struct i2c_client client_template = {
 	.id = -1,
 	.driver = &i2c_driver_bt856,
-	.dev = {
-		.name = "bt856_client",
-	},
+	.name = "bt856_client",
 };
 
 static int bt856_init(void)
diff -Nru a/drivers/media/video/bttv-cards.c b/drivers/media/video/bttv-cards.c
--- a/drivers/media/video/bttv-cards.c	Fri Aug  8 16:47:40 2003
+++ b/drivers/media/video/bttv-cards.c	Fri Aug  8 16:47:40 2003
@@ -3469,7 +3469,7 @@
 
 	/* print which chipset we have */
 	while ((dev = pci_find_class(PCI_CLASS_BRIDGE_HOST << 8,dev)))
-		printk(KERN_INFO "bttv: Host bridge is %s\n",dev->dev.name);
+		printk(KERN_INFO "bttv: Host bridge is %s\n",pci_name(dev));
 
 	/* print warnings about any quirks found */
 	if (triton1)
diff -Nru a/drivers/media/video/msp3400.c b/drivers/media/video/msp3400.c
--- a/drivers/media/video/msp3400.c	Fri Aug  8 16:47:40 2003
+++ b/drivers/media/video/msp3400.c	Fri Aug  8 16:47:40 2003
@@ -1316,7 +1316,7 @@
 #endif
 	msp3400c_setvolume(c,msp->muted,msp->left,msp->right);
 
-	snprintf(c->dev.name, DEVICE_NAME_SIZE, "MSP34%02d%c-%c%d",
+	snprintf(c->name, DEVICE_NAME_SIZE, "MSP34%02d%c-%c%d",
 		 (msp->rev2>>8)&0xff, (msp->rev1&0xff)+'@',
 		 ((msp->rev1>>8)&0xff)+'@', msp->rev2&0x1f);
 
diff -Nru a/drivers/media/video/saa5249.c b/drivers/media/video/saa5249.c
--- a/drivers/media/video/saa5249.c	Fri Aug  8 16:47:40 2003
+++ b/drivers/media/video/saa5249.c	Fri Aug  8 16:47:40 2003
@@ -171,7 +171,7 @@
 		return -ENOMEM;
 	}
 	memset(t, 0, sizeof(*t));
-	strlcpy(client->dev.name, IF_NAME, DEVICE_NAME_SIZE);
+	strlcpy(client->name, IF_NAME, DEVICE_NAME_SIZE);
 	init_MUTEX(&t->lock);
 	
 	/*
@@ -263,9 +263,7 @@
 static struct i2c_client client_template = {
 	.id 		= -1,
 	.driver		= &i2c_driver_videotext,
-	.dev		= {
-		.name	= "(unset)",
-	},
+	.name		= "(unset)",
 };
 
 /*
diff -Nru a/drivers/media/video/saa7110.c b/drivers/media/video/saa7110.c
--- a/drivers/media/video/saa7110.c	Fri Aug  8 16:47:39 2003
+++ b/drivers/media/video/saa7110.c	Fri Aug  8 16:47:39 2003
@@ -147,7 +147,7 @@
 }
 
 static
-int saa7110_attach(struct i2c_adapter *adap, int  addr, unsigned short flags, int kind)
+int saa7110_attach(struct i2c_adapter *adap, int  addr, int kind)
 {
 static	const unsigned char initseq[] = {
 	     0, 0x4C, 0x3C, 0x0D, 0xEF, 0xBD, 0xF0, 0x00, 0x00,
@@ -176,7 +176,7 @@
 
 	/* clear our private data */
 	memset(decoder, 0, sizeof(*decoder));
-	strlcpy(client->dev.name, IF_NAME, DEVICE_NAME_SIZE);
+	strlcpy(client->name, IF_NAME, DEVICE_NAME_SIZE);
 	decoder->client = client;
 	i2c_set_clientdata(client, decoder);
 	decoder->addr = addr;
@@ -190,7 +190,7 @@
 
 	rv = i2c_master_send(client, initseq, sizeof(initseq));
 	if (rv < 0)
-		printk(KERN_ERR "%s_attach: init status %d\n", client->dev.name, rv);
+		printk(KERN_ERR "%s_attach: init status %d\n", client->name, rv);
 	else {
 		i2c_smbus_write_byte_data(client,0x21,0x16);
 		i2c_smbus_write_byte_data(client,0x0D,0x04);
@@ -393,9 +393,7 @@
 static struct i2c_client client_template = {
 	.id 		= -1,
 	.driver 	= &i2c_driver_saa7110,
-	.dev		= {
-		.name	= "saa7110_client",
-	},
+	.name		= "saa7110_client",
 };
 
 static int saa7110_init(void)
diff -Nru a/drivers/media/video/saa7111.c b/drivers/media/video/saa7111.c
--- a/drivers/media/video/saa7111.c	Fri Aug  8 16:47:40 2003
+++ b/drivers/media/video/saa7111.c	Fri Aug  8 16:47:40 2003
@@ -122,7 +122,7 @@
 	}
 
 	memset(decoder, 0, sizeof(*decoder));
-	strlcpy(client->dev.name, "saa7111", DEVICE_NAME_SIZE);
+	strlcpy(client->name, "saa7111", DEVICE_NAME_SIZE);
 	decoder->client = client;
 	i2c_set_clientdata(client, decoder);
 	decoder->addr = addr;
@@ -137,10 +137,10 @@
 	i = i2c_master_send(client, init, sizeof(init));
 	if (i < 0) {
 		printk(KERN_ERR "%s_attach: init status %d\n",
-		       client->dev.name, i);
+		       client->name, i);
 	} else {
 		printk(KERN_INFO "%s_attach: chip version %x @ 0x%08x\n",
-		       client->dev.name, i2c_smbus_read_byte_data(client, 0x00) >> 4,addr);
+		       client->name, i2c_smbus_read_byte_data(client, 0x00) >> 4,addr);
 	}
 
 	init_MUTEX(&decoder->lock);
@@ -159,7 +159,7 @@
 	}
 	
 	printk("saa7111: probing %s i2c adapter [id=0x%x]\n",
-                       adap->dev.name,adap->id);
+                       adap->name,adap->id);
 	return i2c_probe(adap, &addr_data, saa7111_attach);
 }
 
@@ -188,8 +188,7 @@
 			for (i = 0; i < 32; i += 16) {
 				int j;
 
-				printk("KERN_DEBUG %s: %03x", client->dev.name,
-				       i);
+				printk("KERN_DEBUG %s: %03x", client->name, i);
 				for (j = 0; j < 16; ++j) {
 					printk(" %02x",
 					       i2c_smbus_read_byte_data(client,
@@ -413,9 +412,7 @@
 static struct i2c_client client_template = {
 	.id 	= -1,
 	.driver	= &i2c_driver_saa7111,
-	.dev	= {
-		.name	= "saa7111_client",
-	},
+	.name	= "saa7111_client",
 };
 
 static int saa7111_init(void)
diff -Nru a/drivers/media/video/saa7134/saa7134-i2c.c b/drivers/media/video/saa7134/saa7134-i2c.c
--- a/drivers/media/video/saa7134/saa7134-i2c.c	Fri Aug  8 16:47:40 2003
+++ b/drivers/media/video/saa7134/saa7134-i2c.c	Fri Aug  8 16:47:40 2003
@@ -399,7 +399,7 @@
 int saa7134_i2c_register(struct saa7134_dev *dev)
 {
 	dev->i2c_adap = saa7134_adap_template;
-	strcpy(dev->i2c_adap.dev.name,dev->name);
+	strcpy(dev->i2c_adap.name,dev->name);
 	dev->i2c_adap.algo_data = dev;
 	i2c_add_adapter(&dev->i2c_adap);
 	
diff -Nru a/drivers/media/video/saa7185.c b/drivers/media/video/saa7185.c
--- a/drivers/media/video/saa7185.c	Fri Aug  8 16:47:39 2003
+++ b/drivers/media/video/saa7185.c	Fri Aug  8 16:47:39 2003
@@ -181,7 +181,7 @@
 	0x66, 0x21,		/* FSC3 */
 };
 
-static int saa7185_attach(struct i2c_adapter *adap, int addr, unsigned short flags, int kind)
+static int saa7185_attach(struct i2c_adapter *adap, int addr, int kind)
 {
 	int i;
 	struct saa7185 *encoder;
@@ -202,7 +202,7 @@
 
 
 	memset(encoder, 0, sizeof(*encoder));
-	strlcpy(client->dev.name, "saa7185", DEVICE_NAME_SIZE);
+	strlcpy(client->name, "saa7185", DEVICE_NAME_SIZE);
 	encoder->client = client;
 	i2c_set_clientdata(client, encoder);
 	encoder->addr = addr;
@@ -215,11 +215,10 @@
 					sizeof(init_ntsc));
 	}
 	if (i < 0) {
-		printk(KERN_ERR "%s_attach: init error %d\n", client->dev.name,
-		       i);
+		printk(KERN_ERR "%s_attach: init error %d\n", client->name, i);
 	} else {
 		printk(KERN_INFO "%s_attach: chip version %d\n",
-		       client->dev.name, i2c_smbus_read_byte(client) >> 5);
+		       client->name, i2c_smbus_read_byte(client) >> 5);
 	}
 	init_MUTEX(&encoder->lock);
 	i2c_attach_client(client);
@@ -367,9 +366,7 @@
 static struct i2c_client client_template = {
 	.id 	= -1,
 	.driver = &i2c_driver_saa7185,
-	.dev	= {
-		.name	= "saa7185_client",
-	},
+	.name	= "saa7185_client",
 };
 
 static int saa7185_init(void)
diff -Nru a/drivers/media/video/tda9840.c b/drivers/media/video/tda9840.c
--- a/drivers/media/video/tda9840.c	Fri Aug  8 16:47:40 2003
+++ b/drivers/media/video/tda9840.c	Fri Aug  8 16:47:40 2003
@@ -198,7 +198,7 @@
 	}
 	
 	/* fill client structure */
-	sprintf(client->dev.name,"tda9840 (0x%02x)", address);
+	sprintf(client->name,"tda9840 (0x%02x)", address);
 	client->id = tda9840_id++;
 	client->flags = 0;
 	client->addr = address;
@@ -227,7 +227,7 @@
  		printk("tda9840.o: could not initialize ic #3. continuing anyway. (result:%d)\n",result);
 	} 
 	
-	printk("tda9840.o: detected @ 0x%02x on adapter %s\n",2*address,&client->adapter->dev.name[0]);
+	printk("tda9840.o: detected @ 0x%02x on adapter %s\n",2*address,&client->adapter->name[0]);
 
 	return 0;
 }
@@ -236,7 +236,7 @@
 {
 	/* let's see whether this is a know adapter we can attach to */
 	if( adapter->id != I2C_ALGO_SAA7146 ) {
-		dprintk("tda9840.o: refusing to probe on unknown adapter [name='%s',id=0x%x]\n",adapter->dev.name,adapter->id);
+		dprintk("tda9840.o: refusing to probe on unknown adapter [name='%s',id=0x%x]\n",adapter->name,adapter->id);
 		return -ENODEV;
 	}
 
diff -Nru a/drivers/media/video/tda9887.c b/drivers/media/video/tda9887.c
--- a/drivers/media/video/tda9887.c	Fri Aug  8 16:47:39 2003
+++ b/drivers/media/video/tda9887.c	Fri Aug  8 16:47:39 2003
@@ -441,9 +441,7 @@
 {
 	.flags  = I2C_CLIENT_ALLOW_USE,
         .driver = &driver,
-        .dev	= {
-		.name	= "tda9887",
-	},
+	.name	= "tda9887",
 };
 
 static int tda9887_init_module(void)
diff -Nru a/drivers/media/video/tea6415c.c b/drivers/media/video/tea6415c.c
--- a/drivers/media/video/tea6415c.c	Fri Aug  8 16:47:40 2003
+++ b/drivers/media/video/tea6415c.c	Fri Aug  8 16:47:40 2003
@@ -72,7 +72,7 @@
 	}
 
 	/* fill client structure */
-	sprintf(client->dev.name,"tea6415c (0x%02x)", address);
+	sprintf(client->name,"tea6415c (0x%02x)", address);
 	client->id = tea6415c_id++;
 	client->flags = 0;
 	client->addr = address;
@@ -85,7 +85,7 @@
 		return err;
 	}
 
-	printk("tea6415c.o: detected @ 0x%02x on adapter %s\n",2*address,&client->adapter->dev.name[0]);
+	printk("tea6415c.o: detected @ 0x%02x on adapter %s\n",2*address,&client->adapter->name[0]);
 
 	return 0;
 }
@@ -94,7 +94,7 @@
 {
 	/* let's see whether this is a know adapter we can attach to */
 	if( adapter->id != I2C_ALGO_SAA7146 ) {
-		dprintk("tea6415c.o: refusing to probe on unknown adapter [name='%s',id=0x%x]\n",adapter->dev.name,adapter->id);
+		dprintk("tea6415c.o: refusing to probe on unknown adapter [name='%s',id=0x%x]\n",adapter->name,adapter->id);
 		return -ENODEV;
 	}
 
diff -Nru a/drivers/media/video/tea6420.c b/drivers/media/video/tea6420.c
--- a/drivers/media/video/tea6420.c	Fri Aug  8 16:47:40 2003
+++ b/drivers/media/video/tea6420.c	Fri Aug  8 16:47:40 2003
@@ -112,7 +112,7 @@
 	}
 	
 	/* fill client structure */
-	sprintf(client->dev.name,"tea6420 (0x%02x)", address);
+	sprintf(client->name,"tea6420 (0x%02x)", address);
 	client->id = tea6420_id++;
 	client->flags = 0;
 	client->addr = address;
@@ -135,7 +135,7 @@
 		printk("tea6420.o: could not initialize chipset. continuing anyway.\n");
 	}
 	
-	printk("tea6420.o: detected @ 0x%02x on adapter %s\n",2*address,&client->adapter->dev.name[0]);
+	printk("tea6420.o: detected @ 0x%02x on adapter %s\n",2*address,&client->adapter->name[0]);
 
 	return 0;
 }
@@ -144,7 +144,7 @@
 {
 	/* let's see whether this is a know adapter we can attach to */
 	if( adapter->id != I2C_ALGO_SAA7146 ) {
-		dprintk("tea6420.o: refusing to probe on unknown adapter [name='%s',id=0x%x]\n",adapter->dev.name,adapter->id);
+		dprintk("tea6420.o: refusing to probe on unknown adapter [name='%s',id=0x%x]\n",adapter->name,adapter->id);
 		return -ENODEV;
 	}
 
diff -Nru a/drivers/media/video/tuner-3036.c b/drivers/media/video/tuner-3036.c
--- a/drivers/media/video/tuner-3036.c	Fri Aug  8 16:47:40 2003
+++ b/drivers/media/video/tuner-3036.c	Fri Aug  8 16:47:40 2003
@@ -197,9 +197,7 @@
 {
         .id 		= -1,
         .driver		= &i2c_driver_tuner,
-        .dev		= {
-		.name	= "SAB3036",
-	},
+	.name		= "SAB3036",
 };
 
 int __init
diff -Nru a/drivers/media/video/tuner.c b/drivers/media/video/tuner.c
--- a/drivers/media/video/tuner.c	Fri Aug  8 16:47:40 2003
+++ b/drivers/media/video/tuner.c	Fri Aug  8 16:47:40 2003
@@ -824,7 +824,7 @@
 	if (type < TUNERS) {
 		t->type = type;
 		printk("tuner(bttv): type forced to %d (%s) [insmod]\n",t->type,tuners[t->type].name);
-		strlcpy(client->dev.name, tuners[t->type].name, DEVICE_NAME_SIZE);
+		strlcpy(client->name, tuners[t->type].name, DEVICE_NAME_SIZE);
 	}
         i2c_attach_client(client);
         if (t->type == TUNER_MT2032)
@@ -875,7 +875,7 @@
 		t->type = *iarg;
 		printk("tuner: type set to %d (%s)\n",
                         t->type,tuners[t->type].name);
-		strlcpy(client->dev.name, tuners[t->type].name, DEVICE_NAME_SIZE);
+		strlcpy(client->name, tuners[t->type].name, DEVICE_NAME_SIZE);
 		if (t->type == TUNER_MT2032)
                         mt2032_init(client);
 		break;
@@ -962,9 +962,7 @@
 {
 	.flags  = I2C_CLIENT_ALLOW_USE,
 	.driver = &driver,
-	.dev  = {
-		.name   = "(tuner unset)",
-	},
+	.name   = "(tuner unset)",
 };
 
 static int tuner_init_module(void)
diff -Nru a/include/linux/i2c.h b/include/linux/i2c.h
--- a/include/linux/i2c.h	Fri Aug  8 16:47:40 2003
+++ b/include/linux/i2c.h	Fri Aug  8 16:47:40 2003
@@ -166,6 +166,7 @@
 					/* to the client		*/
 	struct device dev;		/* the device structure		*/
 	struct list_head list;
+	char name[DEVICE_NAME_SIZE];
 };
 #define to_i2c_client(d) container_of(d, struct i2c_client, dev)
 
@@ -179,11 +180,11 @@
 	dev_set_drvdata (&dev->dev, data);
 }
 
-#define I2C_DEVNAME(str)   .dev = { .name = str }
+#define I2C_DEVNAME(str)	.name = str
 
 static inline char *i2c_clientname(struct i2c_client *c)
 {
-	return c->dev.name;
+	return &c->name[0];
 }
 
 /*
@@ -251,6 +252,7 @@
 	int nr;
 	struct list_head clients;
 	struct list_head list;
+	char name[DEVICE_NAME_SIZE];
 };
 #define to_i2c_adapter(d) container_of(d, struct i2c_adapter, dev)
 


^ permalink raw reply	[flat|nested] 33+ messages in thread

* Re: [PATCH] More i2c driver changes 2.6.0-test2
  2005-05-19  6:24   ` Greg KH
@ 2005-05-19  6:24     ` Greg KH
  -1 siblings, 0 replies; 33+ messages in thread
From: Greg KH @ 2003-08-08 23:55 UTC (permalink / raw)
  To: linux-kernel, sensors

ChangeSet 1.1125, 2003/08/08 16:24:32-07:00, greg@kroah.com

I2C: fix up driver model programming error.

There was no release function for the objects.
bad greg, no biscuit...


 drivers/i2c/i2c-core.c |   31 ++++++++++++++++++++++++++++++-
 include/linux/i2c.h    |    6 +++++-
 2 files changed, 35 insertions(+), 2 deletions(-)


diff -Nru a/drivers/i2c/i2c-core.c b/drivers/i2c/i2c-core.c
--- a/drivers/i2c/i2c-core.c	Fri Aug  8 16:47:25 2003
+++ b/drivers/i2c/i2c-core.c	Fri Aug  8 16:47:25 2003
@@ -55,6 +55,12 @@
 	return 0;
 }
 
+static void i2c_adapter_dev_release(struct device *dev)
+{
+	struct i2c_adapter *adap = dev_to_i2c_adapter(dev);
+	complete(&adap->dev_released);
+}
+
 static struct device_driver i2c_adapter_driver = {
 	.name =	"i2c_adapter",
 	.bus = &i2c_bus_type,
@@ -62,10 +68,23 @@
 	.remove = i2c_device_remove,
 };
 
+static void i2c_adapter_class_dev_release(struct class_device *dev)
+{
+	struct i2c_adapter *adap = class_dev_to_i2c_adapter(dev);
+	complete(&adap->class_dev_released);
+}
+
 static struct class i2c_adapter_class = {
-	.name =		"i2c-adapter"
+	.name =		"i2c-adapter",
+	.release =	&i2c_adapter_class_dev_release,
 };
 
+static void i2c_client_release(struct device *dev)
+{
+	struct i2c_client *client = to_i2c_client(dev);
+	complete(&client->released);
+}
+
 
 /* ---------------------------------------------------
  * registering functions 
@@ -99,6 +118,7 @@
 		adap->dev.parent = &legacy_bus;
 	sprintf(adap->dev.bus_id, "i2c-%d", adap->nr);
 	adap->dev.driver = &i2c_adapter_driver;
+	adap->dev.release = &i2c_adapter_dev_release;
 	device_register(&adap->dev);
 
 	/* Add this adapter to the i2c_adapter class */
@@ -161,10 +181,16 @@
 	}
 
 	/* clean up the sysfs representation */
+	init_completion(&adap->dev_released);
+	init_completion(&adap->class_dev_released);
 	class_device_unregister(&adap->class_dev);
 	device_unregister(&adap->dev);
 	list_del(&adap->list);
 
+	/* wait for sysfs to drop all references */
+	wait_for_completion(&adap->dev_released);
+	wait_for_completion(&adap->class_dev_released);
+
 	DEB(dev_dbg(&adap->dev, "adapter unregistered\n"));
 
  out_unlock:
@@ -329,6 +355,7 @@
 	client->dev.parent = &client->adapter->dev;
 	client->dev.driver = &client->driver->driver;
 	client->dev.bus = &i2c_bus_type;
+	client->dev.release = &i2c_client_release;
 	
 	snprintf(&client->dev.bus_id[0], sizeof(client->dev.bus_id),
 		"%d-%04x", i2c_adapter_id(adapter), client->addr);
@@ -359,8 +386,10 @@
 
 	down(&adapter->clist_lock);
 	list_del(&client->list);
+	init_completion(&client->released);
 	device_unregister(&client->dev);
 	up(&adapter->clist_lock);
+	wait_for_completion(&client->released);
 
  out:
 	return res;
diff -Nru a/include/linux/i2c.h b/include/linux/i2c.h
--- a/include/linux/i2c.h	Fri Aug  8 16:47:25 2003
+++ b/include/linux/i2c.h	Fri Aug  8 16:47:25 2003
@@ -167,6 +167,7 @@
 	struct device dev;		/* the device structure		*/
 	struct list_head list;
 	char name[DEVICE_NAME_SIZE];
+	struct completion released;
 };
 #define to_i2c_client(d) container_of(d, struct i2c_client, dev)
 
@@ -253,8 +254,11 @@
 	struct list_head clients;
 	struct list_head list;
 	char name[DEVICE_NAME_SIZE];
+	struct completion dev_released;
+	struct completion class_dev_released;
 };
-#define to_i2c_adapter(d) container_of(d, struct i2c_adapter, dev)
+#define dev_to_i2c_adapter(d) container_of(d, struct i2c_adapter, dev)
+#define class_dev_to_i2c_adapter(d) container_of(d, struct i2c_adapter, class_dev)
 
 static inline void *i2c_get_adapdata (struct i2c_adapter *dev)
 {


^ permalink raw reply	[flat|nested] 33+ messages in thread

* Re: [PATCH] More i2c driver changes 2.6.0-test2
  2005-05-19  6:24   ` Greg KH
@ 2005-05-19  6:24       ` Greg KH
  -1 siblings, 0 replies; 33+ messages in thread
From: Greg KH @ 2003-08-08 23:55 UTC (permalink / raw)
  To: linux-kernel, sensors

ChangeSet 1.1126, 2003/08/08 16:33:00-07:00, wodecki@gmx.de

[PATCH] I2C: i2c sysfs rant

On Wed, Aug 06, 2003 at 04:22:44PM -0700, Greg KH wrote:
> On Wed, Aug 06, 2003 at 09:11:45PM +0200, Wiktor Wodecki wrote:
> > Hello folks,
> >
> > I just saw that I2C provides "/sys/bus/i2c/drivers/dev\ driver" in
> > 2.6.0-test2. It would be nice if you'd consider renaming this to
> > dev_driver, to avoid un-neccessary quoting in scripts.
> >
> > Thank You :-)
>
> Patches are always gladly accepted :)

here you go


 drivers/i2c/i2c-dev.c |    2 +-
 1 files changed, 1 insertion(+), 1 deletion(-)


diff -Nru a/drivers/i2c/i2c-dev.c b/drivers/i2c/i2c-dev.c
--- a/drivers/i2c/i2c-dev.c	Fri Aug  8 16:47:15 2003
+++ b/drivers/i2c/i2c-dev.c	Fri Aug  8 16:47:15 2003
@@ -474,7 +474,7 @@
 
 static struct i2c_driver i2cdev_driver = {
 	.owner		= THIS_MODULE,
-	.name		= "dev driver",
+	.name		= "dev_driver",
 	.id		= I2C_DRIVERID_I2CDEV,
 	.flags		= I2C_DF_NOTIFY,
 	.attach_adapter	= i2cdev_attach_adapter,


^ permalink raw reply	[flat|nested] 33+ messages in thread

* Re: [PATCH] More i2c driver changes 2.6.0-test2
  2005-05-19  6:24   ` Greg KH
@ 2005-05-19  6:24         ` Greg KH
  -1 siblings, 0 replies; 33+ messages in thread
From: Greg KH @ 2003-08-08 23:55 UTC (permalink / raw)
  To: linux-kernel, sensors

ChangeSet 1.1127, 2003/08/08 16:36:42-07:00, seanlkml@rogers.com

[PATCH] I2C: Additional P4B subsystem id for hidden asus smbus

  This patch adds another P4B motherboard subsystem identifier to the recent
asus sensor patch for the 2.6 kernel.


 drivers/pci/quirks.c |    9 ++++++---
 1 files changed, 6 insertions(+), 3 deletions(-)


diff -Nru a/drivers/pci/quirks.c b/drivers/pci/quirks.c
--- a/drivers/pci/quirks.c	Fri Aug  8 16:47:06 2003
+++ b/drivers/pci/quirks.c	Fri Aug  8 16:47:06 2003
@@ -681,9 +681,12 @@
 	if (likely(dev->subsystem_vendor != PCI_VENDOR_ID_ASUSTEK))
 		return;
 
-	if ((dev->device == PCI_DEVICE_ID_INTEL_82845_HB) && 
-	    (dev->subsystem_device == 0x8088)) /* P4B533 */
-		asus_hides_smbus = 1;
+	if (dev->device == PCI_DEVICE_ID_INTEL_82845_HB)
+		switch(dev->subsystem_device) {
+		case 0x8070: /* P4B */
+	    	case 0x8088: /* P4B533 */
+			asus_hides_smbus = 1;
+		}
 	if ((dev->device == PCI_DEVICE_ID_INTEL_82845G_HB) &&
 	    (dev->subsystem_device == 0x80b2)) /* P4PE */
 		asus_hides_smbus = 1;


^ permalink raw reply	[flat|nested] 33+ messages in thread

* [BK PATCH] More i2c driver fixes for 2.6.0-test5
  2005-05-19  6:24 ` Greg KH
@ 2005-05-19  6:24 ` Greg KH
  -1 siblings, 0 replies; 33+ messages in thread
From: Greg KH @ 2003-09-25 21:48 UTC (permalink / raw)
  To: torvalds; +Cc: linux-kernel, sensors

Hi,

Here are some more i2c driver fixes and additions for 2.6.0-test5.  I've
fixed up the check_region/request_region logic for isa drivers and moved
the i2c algorithms into their own subdirectory, both as recommended by
Christoph, and added the eeprom i2c chip driver (ported from the 2.4
tree and converted to use the sysfs binary file interface).

There are a also a few other minor i2c cleanups and fixes in here.

Please pull from:  bk://kernel.bkbits.net/gregkh/linux/i2c-2.6

thanks,

greg k-h

 drivers/i2c/i2c-algo-bit.c        |  567 ------------------------
 drivers/i2c/i2c-algo-ite.c        |  872 --------------------------------------
 drivers/i2c/i2c-algo-pcf.c        |  479 --------------------
 drivers/i2c/i2c-ite.h             |  117 -----
 drivers/i2c/i2c-pcf8584.h         |   78 ---
 Documentation/i2c/sysfs-interface |    5 
 drivers/i2c/Kconfig               |   38 -
 drivers/i2c/Makefile              |    5 
 drivers/i2c/algos/Kconfig         |   45 +
 drivers/i2c/algos/Makefile        |    7 
 drivers/i2c/algos/i2c-algo-bit.c  |  567 ++++++++++++++++++++++++
 drivers/i2c/algos/i2c-algo-ite.c  |  872 ++++++++++++++++++++++++++++++++++++++
 drivers/i2c/algos/i2c-algo-ite.h  |  117 +++++
 drivers/i2c/algos/i2c-algo-pcf.c  |  479 ++++++++++++++++++++
 drivers/i2c/algos/i2c-algo-pcf.h  |   78 +++
 drivers/i2c/busses/i2c-elektor.c  |    2 
 drivers/i2c/chips/Kconfig         |   12 
 drivers/i2c/chips/Makefile        |    1 
 drivers/i2c/chips/eeprom.c        |  290 ++++++++++++
 drivers/i2c/i2c-sensor.c          |    5 
 20 files changed, 2469 insertions(+), 2167 deletions(-)
-----

Greg Kroah-Hartman:
  o I2C: remove unneeded #defines in the eeprom chip driver
  o I2C: add eeprom i2c chip driver
  o I2C: move the i2c algorithm drivers to drivers/i2c/algos
  o I2C: remove the isa address check alltogether


^ permalink raw reply	[flat|nested] 33+ messages in thread

* Re: [PATCH] More i2c driver fixes for 2.6.0-test5
  2005-05-19  6:24     ` Greg KH
@ 2005-05-19  6:24   ` Greg KH
  -1 siblings, 0 replies; 33+ messages in thread
From: Greg KH @ 2003-09-25 21:50 UTC (permalink / raw)
  To: linux-kernel, sensors

ChangeSet 1.1325.4.3, 2003/09/23 16:23:08-07:00, greg@kroah.com

[PATCH] I2C: add eeprom i2c chip driver.

This is based on the i2c cvs driver, but ported to 2.6 and rewritten
to use the sysfs binary file interface.


 Documentation/i2c/sysfs-interface |    5 
 drivers/i2c/chips/Kconfig         |   12 +
 drivers/i2c/chips/Makefile        |    1 
 drivers/i2c/chips/eeprom.c        |  283 ++++++++++++++++++++++++++++++++++++++
 4 files changed, 300 insertions(+), 1 deletion(-)


diff -Nru a/Documentation/i2c/sysfs-interface b/Documentation/i2c/sysfs-interface
--- a/Documentation/i2c/sysfs-interface	Thu Sep 25 14:49:42 2003
+++ b/Documentation/i2c/sysfs-interface	Thu Sep 25 14:49:42 2003
@@ -77,7 +77,10 @@
 curr_input[1-n]	Current input value
 		Fixed point XXXXX, divide by 1000 to get Amps.
 		Read only.
-		
+
+eeprom		Raw EEPROM data in binary form.
+		Read only.
+
 fan_min[1-3]	Fan minimum value
 		Integer value indicating RPM
 		Read/Write.
diff -Nru a/drivers/i2c/chips/Kconfig b/drivers/i2c/chips/Kconfig
--- a/drivers/i2c/chips/Kconfig	Thu Sep 25 14:49:42 2003
+++ b/drivers/i2c/chips/Kconfig	Thu Sep 25 14:49:42 2003
@@ -21,6 +21,18 @@
 	  This driver can also be built as a module.  If so, the module
 	  will be called adm1021.
 
+config SENSORS_EEPROM
+	tristate "EEPROM (DIMM) reader"
+	depends on I2C && EXPERIMENTAL
+	select I2C_SENSOR
+	help
+	  If you say yes here you get read-only access to the EEPROM data
+	  available on modern memory DIMMs, and which could theoretically
+	  also be available on other devices.
+
+	  This driver can also be built as a module.  If so, the module
+	  will be called eeprom.
+
 config SENSORS_IT87
 	tristate "National Semiconductors IT87 and compatibles"
 	depends on I2C && EXPERIMENTAL
diff -Nru a/drivers/i2c/chips/Makefile b/drivers/i2c/chips/Makefile
--- a/drivers/i2c/chips/Makefile	Thu Sep 25 14:49:42 2003
+++ b/drivers/i2c/chips/Makefile	Thu Sep 25 14:49:42 2003
@@ -6,6 +6,7 @@
 obj-$(CONFIG_SENSORS_W83781D)	+= w83781d.o
 
 obj-$(CONFIG_SENSORS_ADM1021)	+= adm1021.o
+obj-$(CONFIG_SENSORS_EEPROM)	+= eeprom.o
 obj-$(CONFIG_SENSORS_IT87)	+= it87.o
 obj-$(CONFIG_SENSORS_LM75)	+= lm75.o
 obj-$(CONFIG_SENSORS_LM78)	+= lm78.o
diff -Nru a/drivers/i2c/chips/eeprom.c b/drivers/i2c/chips/eeprom.c
--- /dev/null	Wed Dec 31 16:00:00 1969
+++ b/drivers/i2c/chips/eeprom.c	Thu Sep 25 14:49:42 2003
@@ -0,0 +1,283 @@
+/*
+    eeprom.c - Part of lm_sensors, Linux kernel modules for hardware
+               monitoring
+    Copyright (C) 1998, 1999  Frodo Looijaard <frodol@dds.nl> and
+			       Philip Edelbrock <phil@netroedge.com>
+    Copyright (C) 2003 Greg Kroah-Hartman <greg@kroah.com>
+    Copyright (C) 2003 IBM Corp.
+
+    This program is free software; you can redistribute it and/or modify
+    it under the terms of the GNU General Public License as published by
+    the Free Software Foundation; either version 2 of the License, or
+    (at your option) any later version.
+
+    This program is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+    GNU General Public License for more details.
+
+    You should have received a copy of the GNU General Public License
+    along with this program; if not, write to the Free Software
+    Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+*/
+
+/* #define DEBUG */
+
+#include <linux/kernel.h>
+#include <linux/init.h>
+#include <linux/module.h>
+#include <linux/slab.h>
+#include <linux/i2c.h>
+#include <linux/i2c-sensor.h>
+
+/* Addresses to scan */
+static unsigned short normal_i2c[] = { I2C_CLIENT_END };
+static unsigned short normal_i2c_range[] = { 0x50, 0x57, I2C_CLIENT_END };
+static unsigned int normal_isa[] = { I2C_CLIENT_ISA_END };
+static unsigned int normal_isa_range[] = { I2C_CLIENT_ISA_END };
+
+/* Insmod parameters */
+SENSORS_INSMOD_1(eeprom);
+
+static int checksum = 0;
+MODULE_PARM(checksum, "i");
+MODULE_PARM_DESC(checksum, "Only accept eeproms whose checksum is correct");
+
+
+/* EEPROM registers */
+#define EEPROM_REG_CHECKSUM	0x3f
+
+/* EEPROM memory types: */
+#define ONE_K			1
+#define TWO_K			2
+#define FOUR_K			3
+#define EIGHT_K			4
+#define SIXTEEN_K		5
+
+/* Size of EEPROM in bytes */
+#define EEPROM_SIZE		256
+
+/* possible types of eeprom devices */
+enum eeprom_nature {
+	UNKNOWN,
+	VAIO,
+};
+
+/* Each client has this additional data */
+struct eeprom_data {
+	struct semaphore update_lock;
+	char valid;			/* !=0 if following fields are valid */
+	unsigned long last_updated;	/* In jiffies */
+	u8 data[EEPROM_SIZE];		/* Register values */
+};
+
+
+static int eeprom_attach_adapter(struct i2c_adapter *adapter);
+static int eeprom_detect(struct i2c_adapter *adapter, int address, int kind);
+static int eeprom_detach_client(struct i2c_client *client);
+
+/* This is the driver that will be inserted */
+static struct i2c_driver eeprom_driver = {
+	.owner		= THIS_MODULE,
+	.name		= "eeprom",
+	.id		= I2C_DRIVERID_EEPROM,
+	.flags		= I2C_DF_NOTIFY,
+	.attach_adapter	= eeprom_attach_adapter,
+	.detach_client	= eeprom_detach_client,
+};
+
+static int eeprom_id = 0;
+
+static void eeprom_update_client(struct i2c_client *client)
+{
+	struct eeprom_data *data = i2c_get_clientdata(client);
+	int i, j;
+
+	down(&data->update_lock);
+
+	if ((jiffies - data->last_updated > 300 * HZ) |
+	    (jiffies < data->last_updated) || !data->valid) {
+		dev_dbg(&client->dev, "Starting eeprom update\n");
+
+		if (i2c_check_functionality(client->adapter, I2C_FUNC_SMBUS_READ_I2C_BLOCK)) {
+			for (i=0; i < EEPROM_SIZE; i += I2C_SMBUS_I2C_BLOCK_MAX)
+				if (i2c_smbus_read_i2c_block_data(client, i, data->data + i) != I2C_SMBUS_I2C_BLOCK_MAX)
+					goto exit;
+		} else {
+			if (i2c_smbus_write_byte(client, 0)) {
+				dev_dbg(&client->dev, "eeprom read start has failed!\n");
+				goto exit;
+			}
+			for (i = 0; i < EEPROM_SIZE; i++) {
+				j = i2c_smbus_read_byte(client);
+				if (j < 0)
+					goto exit;
+				data->data[i] = (u8) j;
+			}
+		}
+		data->last_updated = jiffies;
+		data->valid = 1;
+	}
+exit:
+	up(&data->update_lock);
+}
+
+static ssize_t eeprom_read(struct kobject *kobj, char *buf, loff_t off, size_t count)
+{
+	struct i2c_client *client = to_i2c_client(container_of(kobj, struct device, kobj));
+	struct eeprom_data *data = i2c_get_clientdata(client);
+
+	eeprom_update_client(client);
+
+	if (off > EEPROM_SIZE)
+		return 0;
+	if (off + count > EEPROM_SIZE)
+		count = EEPROM_SIZE - off;
+
+	memcpy(buf, &data->data[off], count);
+	return count;
+}
+
+static struct bin_attribute eeprom_attr = {
+	.attr = {
+		.name = "eeprom",
+		.mode = S_IRUGO,
+	},
+	.size = EEPROM_SIZE,
+	.read = eeprom_read,
+};
+
+static int eeprom_attach_adapter(struct i2c_adapter *adapter)
+{
+	return i2c_detect(adapter, &addr_data, eeprom_detect);
+}
+
+/* This function is called by i2c_detect */
+int eeprom_detect(struct i2c_adapter *adapter, int address, int kind)
+{
+	int i, cs;
+	struct i2c_client *new_client;
+	struct eeprom_data *data;
+	enum eeprom_nature nature = UNKNOWN;
+	int err = 0;
+
+	/* Make sure we aren't probing the ISA bus!! This is just a safety check
+	   at this moment; i2c_detect really won't call us. */
+#ifdef DEBUG
+	if (i2c_is_isa_adapter(adapter)) {
+		dev_dbg(&adapter->dev, " eeprom_detect called for an ISA bus adapter?!?\n");
+		return 0;
+	}
+#endif
+
+	if (!i2c_check_functionality(adapter, I2C_FUNC_SMBUS_BYTE_DATA))
+		goto exit;
+
+	/* OK. For now, we presume we have a valid client. We now create the
+	   client structure, even though we cannot fill it completely yet.
+	   But it allows us to access eeprom_{read,write}_value. */
+	if (!(new_client = kmalloc(sizeof(struct i2c_client) +
+				   sizeof(struct eeprom_data),
+				   GFP_KERNEL))) {
+		err = -ENOMEM;
+		goto exit;
+	}
+	memset(new_client, 0x00, sizeof(struct i2c_client) +
+				 sizeof(struct eeprom_data));
+
+	data = (struct eeprom_data *) (new_client + 1);
+	memset(data, 0xff, EEPROM_SIZE);
+	i2c_set_clientdata(new_client, data);
+	new_client->addr = address;
+	new_client->adapter = adapter;
+	new_client->driver = &eeprom_driver;
+	new_client->flags = 0;
+
+	/* Now, we do the remaining detection. It is not there, unless you force
+	   the checksum to work out. */
+	if (checksum) {
+		/* prevent 24RF08 corruption */
+		i2c_smbus_write_quick(new_client, 0);
+		cs = 0;
+		for (i = 0; i <= 0x3e; i++)
+			cs += i2c_smbus_read_byte_data(new_client, i);
+		cs &= 0xff;
+		if (i2c_smbus_read_byte_data (new_client, EEPROM_REG_CHECKSUM) != cs)
+			goto exit_kfree;
+	}
+
+	/* Detect the Vaio nature of EEPROMs.
+	   We use the "PCG-" prefix as the signature. */
+	if (address == 0x57) {
+		if (i2c_smbus_read_byte_data(new_client, 0x80) == 'P' && 
+		    i2c_smbus_read_byte_data(new_client, 0x81) == 'C' && 
+		    i2c_smbus_read_byte_data(new_client, 0x82) == 'G' &&
+		    i2c_smbus_read_byte_data(new_client, 0x83) == '-')
+			nature = VAIO;
+	}
+
+	/* If this is a VIAO, then we only allow root to read from this file,
+	   as BIOS passwords can be present here in plaintext */
+	switch (nature) {
+ 	case VAIO:
+		eeprom_attr.attr.mode = S_IRUSR;
+		break;
+	default:
+		eeprom_attr.attr.mode = S_IRUGO;
+	}
+
+	/* Fill in the remaining client fields */
+	strncpy(new_client->name, "eeprom", I2C_NAME_SIZE);
+	new_client->id = eeprom_id++;
+	data->valid = 0;
+	init_MUTEX(&data->update_lock);
+
+	/* Tell the I2C layer a new client has arrived */
+	if ((err = i2c_attach_client(new_client)))
+		goto exit_kfree;
+
+	/* create the sysfs eeprom file */
+	sysfs_create_bin_file(&new_client->dev.kobj, &eeprom_attr);
+
+	return 0;
+
+exit_kfree:
+	kfree(new_client);
+exit:
+	return err;
+}
+
+static int eeprom_detach_client(struct i2c_client *client)
+{
+	int err;
+
+	err = i2c_detach_client(client);
+	if (err) {
+		dev_err(&client->dev, "Client deregistration failed, client not detached.\n");
+		return err;
+	}
+
+	kfree(client);
+
+	return 0;
+}
+
+static int __init eeprom_init(void)
+{
+	return i2c_add_driver(&eeprom_driver);
+}
+
+static void __exit eeprom_exit(void)
+{
+	i2c_del_driver(&eeprom_driver);
+}
+
+
+MODULE_AUTHOR("Frodo Looijaard <frodol@dds.nl> and "
+		"Philip Edelbrock <phil@netroedge.com> and "
+		"Greg Kroah-Hartman <greg@kroah.com>");
+MODULE_DESCRIPTION("I2C EEPROM driver");
+MODULE_LICENSE("GPL");
+
+module_init(eeprom_init);
+module_exit(eeprom_exit);


^ permalink raw reply	[flat|nested] 33+ messages in thread

* Re: [PATCH] More i2c driver fixes for 2.6.0-test5
  2005-05-19  6:24   ` Greg KH
@ 2005-05-19  6:24     ` Greg KH
  -1 siblings, 0 replies; 33+ messages in thread
From: Greg KH @ 2003-09-25 21:50 UTC (permalink / raw)
  To: linux-kernel, sensors

ChangeSet 1.1325.5.2, 2003/09/24 15:01:39-07:00, greg@kroah.com

[PATCH] I2C: remove unneeded #defines in the eeprom chip driver.


 drivers/i2c/chips/eeprom.c |    7 -------
 1 files changed, 7 deletions(-)


diff -Nru a/drivers/i2c/chips/eeprom.c b/drivers/i2c/chips/eeprom.c
--- a/drivers/i2c/chips/eeprom.c	Thu Sep 25 14:49:30 2003
+++ b/drivers/i2c/chips/eeprom.c	Thu Sep 25 14:49:30 2003
@@ -47,13 +47,6 @@
 /* EEPROM registers */
 #define EEPROM_REG_CHECKSUM	0x3f
 
-/* EEPROM memory types: */
-#define ONE_K			1
-#define TWO_K			2
-#define FOUR_K			3
-#define EIGHT_K			4
-#define SIXTEEN_K		5
-
 /* Size of EEPROM in bytes */
 #define EEPROM_SIZE		256
 


^ permalink raw reply	[flat|nested] 33+ messages in thread

* [PATCH] More i2c driver fixes for 2.6.0-test5
  2005-05-19  6:24     ` Greg KH
@ 2005-05-19  6:24   ` Greg KH
  -1 siblings, 0 replies; 33+ messages in thread
From: Greg KH @ 2003-09-25 21:50 UTC (permalink / raw)
  To: linux-kernel, sensors

ChangeSet 1.1325.4.1, 2003/09/23 13:54:31-07:00, greg@kroah.com

[PATCH] I2C: remove the isa address check alltogether.


 drivers/i2c/i2c-sensor.c |    5 +----
 1 files changed, 1 insertion(+), 4 deletions(-)


diff -Nru a/drivers/i2c/i2c-sensor.c b/drivers/i2c/i2c-sensor.c
--- a/drivers/i2c/i2c-sensor.c	Thu Sep 25 14:50:07 2003
+++ b/drivers/i2c/i2c-sensor.c	Thu Sep 25 14:50:07 2003
@@ -50,10 +50,7 @@
 		return -1;
 
 	for (addr = 0x00; addr <= (is_isa ? 0xffff : 0x7f); addr++) {
-		void *region_used = request_region(addr, 1, "foo");
-		release_region(addr, 1);
-		if ((is_isa && (region_used == NULL)) ||
-		    (!is_isa && i2c_check_addr(adapter, addr)))
+		if (!is_isa && i2c_check_addr(adapter, addr))
 			continue;
 
 		/* If it is in one of the force entries, we don't do any


^ permalink raw reply	[flat|nested] 33+ messages in thread

* [BK PATCH] More i2c driver fixes for 2.6.0-test7
  2005-05-19  6:24 ` Greg KH
@ 2005-05-19  6:24 ` Greg KH
  -1 siblings, 0 replies; 33+ messages in thread
From: Greg KH @ 2003-10-15 18:04 UTC (permalink / raw)
  To: torvalds; +Cc: linux-kernel, sensors

Hi,

Here are some more minor i2c driver fixes for 2.6.0-test7.  They fix
some bugs in the w83781d.c driver, and remove some unneeded MOD_INC and
MOD_DEC calls (which fixes some compiler warnings.)

Please pull from:  bk://kernel.bkbits.net/gregkh/linux/i2c-2.6

thanks,

greg k-h

------

Greg Kroah-Hartman:
  o I2C: fix more define problems in w83781d driver
  o I2C: remove unneeded MOD_INC and MOD_DEC calls

Luca Tettamanti:
  o I2C: sensors/w83781d.c creates useless sysfs entries


^ permalink raw reply	[flat|nested] 33+ messages in thread

* Re: [PATCH] More i2c driver fixes for 2.6.0-test7
  2005-05-19  6:24     ` Greg KH
@ 2005-05-19  6:24     ` Greg KH
  -1 siblings, 0 replies; 33+ messages in thread
From: Greg KH @ 2003-10-15 18:05 UTC (permalink / raw)
  To: linux-kernel, sensors

ChangeSet 1.1347.1.2, 2003/10/13 12:31:27-07:00, kronos@kronoz.cjb.net

[PATCH] I2C: sensors/w83781d.c creates useless sysfs entries

Jindrich Makovicka <makovick@kmlinux.fjfi.cvut.cz> ha scritto:
> here is a trivial fix for Winbond sensor driver, which currently creates
> useless entries in sys/bus/i2c due to missing braces after if statements
> - author probably forgot about the macro expansion.

IMHO it's better to fix the macro:


 drivers/i2c/chips/w83781d.c |    4 +++-
 1 files changed, 3 insertions(+), 1 deletion(-)


diff -Nru a/drivers/i2c/chips/w83781d.c b/drivers/i2c/chips/w83781d.c
--- a/drivers/i2c/chips/w83781d.c	Wed Oct 15 10:57:59 2003
+++ b/drivers/i2c/chips/w83781d.c	Wed Oct 15 10:57:59 2003
@@ -422,9 +422,11 @@
 sysfs_in_offsets(8);
 
 #define device_create_file_in(client, offset) \
+do { \
 device_create_file(&client->dev, &dev_attr_in_input##offset); \
 device_create_file(&client->dev, &dev_attr_in_min##offset); \
-device_create_file(&client->dev, &dev_attr_in_max##offset);
+device_create_file(&client->dev, &dev_attr_in_max##offset); \
+} while (0);
 
 #define show_fan_reg(reg) \
 static ssize_t show_##reg (struct device *dev, char *buf, int nr) \


^ permalink raw reply	[flat|nested] 33+ messages in thread

* [PATCH] More i2c driver fixes for 2.6.0-test7
  2005-05-19  6:24     ` Greg KH
@ 2005-05-19  6:24   ` Greg KH
  -1 siblings, 0 replies; 33+ messages in thread
From: Greg KH @ 2003-10-15 18:05 UTC (permalink / raw)
  To: linux-kernel, sensors

ChangeSet 1.1347.1.1, 2003/10/13 11:28:27-07:00, greg@kroah.com

[PATCH] I2C: remove unneeded MOD_INC and MOD_DEC calls.


 drivers/i2c/algos/i2c-algo-ite.c |    7 -------
 1 files changed, 7 deletions(-)


diff -Nru a/drivers/i2c/algos/i2c-algo-ite.c b/drivers/i2c/algos/i2c-algo-ite.c
--- a/drivers/i2c/algos/i2c-algo-ite.c	Wed Oct 15 10:58:15 2003
+++ b/drivers/i2c/algos/i2c-algo-ite.c	Wed Oct 15 10:58:15 2003
@@ -779,10 +779,6 @@
 	adap->retries = 3;		/* be replaced by defines	*/
 	adap->flags = 0;
 
-#ifdef MODULE
-	MOD_INC_USE_COUNT;
-#endif
-
 	i2c_add_adapter(adap);
 	iic_init(iic_adap);
 
@@ -815,9 +811,6 @@
 		return res;
 	DEB2(printk("i2c-algo-ite: adapter unregistered: %s\n",adap->name));
 
-#ifdef MODULE
-	MOD_DEC_USE_COUNT;
-#endif
 	return 0;
 }
 


^ permalink raw reply	[flat|nested] 33+ messages in thread

* Re: [PATCH] More i2c driver fixes for 2.6.0-test7
  2005-05-19  6:24     ` Greg KH
@ 2005-05-19  6:24       ` Greg KH
  -1 siblings, 0 replies; 33+ messages in thread
From: Greg KH @ 2003-10-15 18:05 UTC (permalink / raw)
  To: linux-kernel, sensors

ChangeSet 1.1347.1.3, 2003/10/14 13:30:34-07:00, greg@kroah.com

[PATCH] I2C: fix more define problems in w83781d driver


 drivers/i2c/chips/w83781d.c |   22 +++++++++++++++++++---
 1 files changed, 19 insertions(+), 3 deletions(-)


diff -Nru a/drivers/i2c/chips/w83781d.c b/drivers/i2c/chips/w83781d.c
--- a/drivers/i2c/chips/w83781d.c	Wed Oct 15 10:57:42 2003
+++ b/drivers/i2c/chips/w83781d.c	Wed Oct 15 10:57:42 2003
@@ -426,7 +426,7 @@
 device_create_file(&client->dev, &dev_attr_in_input##offset); \
 device_create_file(&client->dev, &dev_attr_in_min##offset); \
 device_create_file(&client->dev, &dev_attr_in_max##offset); \
-} while (0);
+} while (0)
 
 #define show_fan_reg(reg) \
 static ssize_t show_##reg (struct device *dev, char *buf, int nr) \
@@ -484,8 +484,10 @@
 sysfs_fan_min_offset(3);
 
 #define device_create_file_fan(client, offset) \
+do { \
 device_create_file(&client->dev, &dev_attr_fan_input##offset); \
 device_create_file(&client->dev, &dev_attr_fan_min##offset); \
+} while (0)
 
 #define show_temp_reg(reg) \
 static ssize_t show_##reg (struct device *dev, char *buf, int nr) \
@@ -568,9 +570,11 @@
 sysfs_temp_offsets(3);
 
 #define device_create_file_temp(client, offset) \
+do { \
 device_create_file(&client->dev, &dev_attr_temp_input##offset); \
 device_create_file(&client->dev, &dev_attr_temp_max##offset); \
-device_create_file(&client->dev, &dev_attr_temp_min##offset);
+device_create_file(&client->dev, &dev_attr_temp_min##offset); \
+} while (0)
 
 static ssize_t
 show_vid_reg(struct device *dev, char *buf)
@@ -693,8 +697,10 @@
 sysfs_beep(MASK, mask);
 
 #define device_create_file_beep(client) \
+do { \
 device_create_file(&client->dev, &dev_attr_beep_enable); \
-device_create_file(&client->dev, &dev_attr_beep_mask);
+device_create_file(&client->dev, &dev_attr_beep_mask); \
+} while (0)
 
 /* w83697hf only has two fans */
 static ssize_t
@@ -771,7 +777,9 @@
 sysfs_fan_div(3);
 
 #define device_create_file_fan_div(client, offset) \
+do { \
 device_create_file(&client->dev, &dev_attr_fan_div##offset); \
+} while (0)
 
 /* w83697hf only has two fans */
 static ssize_t
@@ -883,10 +891,14 @@
 sysfs_pwm(4);
 
 #define device_create_file_pwm(client, offset) \
+do { \
 device_create_file(&client->dev, &dev_attr_pwm##offset); \
+} while (0)
 
 #define device_create_file_pwmenable(client, offset) \
+do { \
 device_create_file(&client->dev, &dev_attr_pwm_enable##offset); \
+} while (0)
 
 static ssize_t
 show_sensor_reg(struct device *dev, char *buf, int nr)
@@ -959,7 +971,9 @@
 sysfs_sensor(3);
 
 #define device_create_file_sensor(client, offset) \
+do { \
 device_create_file(&client->dev, &dev_attr_sensor##offset); \
+} while (0)
 
 #ifdef W83781D_RT
 static ssize_t
@@ -1018,7 +1032,9 @@
 sysfs_rt(3);
 
 #define device_create_file_rt(client, offset) \
+do { \
 device_create_file(&client->dev, &dev_attr_rt##offset); \
+} while (0)
 
 #endif				/* ifdef W83781D_RT */
 


^ permalink raw reply	[flat|nested] 33+ messages in thread

* Re: [PATCH] More i2c driver fixes for 2.6.0-test7
  2005-05-19  6:24     ` Greg KH
@ 2005-05-19  6:24       ` Sam Ravnborg
  -1 siblings, 0 replies; 33+ messages in thread
From: Sam Ravnborg @ 2003-10-15 19:13 UTC (permalink / raw)
  To: Greg KH; +Cc: linux-kernel, sensors

On Wed, Oct 15, 2003 at 11:05:47AM -0700, Greg KH wrote:
> -device_create_file(&client->dev, &dev_attr_in_max##offset);
> +device_create_file(&client->dev, &dev_attr_in_max##offset); \
> +} while (0);
              ^
Did you really want to have that ';' there?
It is harmless in current usage, but it may be confusing.

	Sam

^ permalink raw reply	[flat|nested] 33+ messages in thread

* Re: [PATCH] More i2c driver fixes for 2.6.0-test7
  2005-05-19  6:24       ` Greg KH
@ 2005-05-19  6:24         ` Sam Ravnborg
  -1 siblings, 0 replies; 33+ messages in thread
From: Sam Ravnborg @ 2003-10-15 19:14 UTC (permalink / raw)
  To: Greg KH; +Cc: linux-kernel, sensors

On Wed, Oct 15, 2003 at 11:05:48AM -0700, Greg KH wrote:
>  device_create_file(&client->dev, &dev_attr_in_max##offset); \
> -} while (0);
> +} while (0)

Next time I better read all patches before replying - sorry for the noise.

	Sam

^ permalink raw reply	[flat|nested] 33+ messages in thread

* [BK PATCH] More i2c driver fixes for 2.6.0-test2
@ 2005-05-19  6:24 ` Greg KH
  0 siblings, 0 replies; 33+ messages in thread
From: Greg KH @ 2005-05-19  6:24 UTC (permalink / raw)
  To: torvalds; +Cc: linux-kernel, sensors

Hi,

Here are some more i2c driver fixes for 2.6.0-test2.  They include a fix
for the driver model code (no release function, so easy oopses could
happen by users), and removing usage of the struct device.name field as
that is about to go away.

Please pull from:  bk://kernel.bkbits.net/gregkh/linux/i2c-2.5

thanks,

greg k-h

 drivers/i2c/busses/i2c-ali1535.c          |    6 +----
 drivers/i2c/busses/i2c-ali15x3.c          |    6 +----
 drivers/i2c/busses/i2c-amd756.c           |    6 +----
 drivers/i2c/busses/i2c-amd8111.c          |    2 -
 drivers/i2c/busses/i2c-i801.c             |    6 +----
 drivers/i2c/busses/i2c-isa.c              |    4 ---
 drivers/i2c/busses/i2c-nforce2.c          |    6 +----
 drivers/i2c/busses/i2c-piix4.c            |    8 ++----
 drivers/i2c/busses/i2c-sis96x.c           |    6 +----
 drivers/i2c/busses/i2c-viapro.c           |    6 +----
 drivers/i2c/chips/adm1021.c               |    2 -
 drivers/i2c/chips/it87.c                  |    2 -
 drivers/i2c/chips/lm75.c                  |    2 -
 drivers/i2c/chips/lm78.c                  |    2 -
 drivers/i2c/chips/lm85.c                  |   12 +++++-----
 drivers/i2c/chips/via686a.c               |    2 -
 drivers/i2c/chips/w83781d.c               |    4 +--
 drivers/i2c/i2c-algo-bit.c                |    2 -
 drivers/i2c/i2c-core.c                    |   35 +++++++++++++++++++++++++++---
 drivers/i2c/i2c-dev.c                     |    6 +----
 drivers/i2c/i2c-elektor.c                 |    4 ---
 drivers/i2c/i2c-elv.c                     |    4 ---
 drivers/i2c/i2c-philips-par.c             |    4 ---
 drivers/i2c/i2c-prosavage.c               |    5 ----
 drivers/i2c/i2c-velleman.c                |    4 ---
 drivers/i2c/scx200_acb.c                  |    4 +--
 drivers/media/common/saa7146_i2c.c        |    3 --
 drivers/media/video/adv7175.c             |   22 +++++++-----------
 drivers/media/video/bt819.c               |   24 +++++++++-----------
 drivers/media/video/bt856.c               |   20 +++++++----------
 drivers/media/video/bttv-cards.c          |    2 -
 drivers/media/video/msp3400.c             |    2 -
 drivers/media/video/saa5249.c             |    6 +----
 drivers/media/video/saa7110.c             |   10 +++-----
 drivers/media/video/saa7111.c             |   15 +++++-------
 drivers/media/video/saa7134/saa7134-i2c.c |    2 -
 drivers/media/video/saa7185.c             |   13 ++++-------
 drivers/media/video/tda9840.c             |    6 ++---
 drivers/media/video/tda9887.c             |    4 ---
 drivers/media/video/tea6415c.c            |    6 ++---
 drivers/media/video/tea6420.c             |    6 ++---
 drivers/media/video/tuner-3036.c          |    4 ---
 drivers/media/video/tuner.c               |    8 ++----
 drivers/pci/quirks.c                      |    9 +++++--
 include/linux/i2c.h                       |   12 +++++++---
 45 files changed, 152 insertions(+), 172 deletions(-)
-----

<seanlkml:rogers.com>:
  o I2C: Additional P4B subsystem id for hidden asus smbus

<wodecki:gmx.de>:
  o I2C: i2c sysfs rant

Greg Kroah-Hartman:
  o I2C: fix up driver model programming error
  o I2C: move the name field back into the i2c_client and i2c_adapter structures

^ permalink raw reply	[flat|nested] 33+ messages in thread

* [BK PATCH] More i2c driver fixes for 2.6.0-test2
  2005-05-19  6:24 ` Greg KH
  (?)
  (?)
@ 2005-05-19  6:24 ` Jean Delvare
  -1 siblings, 0 replies; 33+ messages in thread
From: Jean Delvare @ 2005-05-19  6:24 UTC (permalink / raw)
  To: lm-sensors


> Here are some more i2c driver fixes for 2.6.0-test2.  They include a
> fix for the driver model code (no release function, so easy oopses
> could happen by users), and removing usage of the struct device.name
> field as that is about to go away.
> 
> Please pull from:  bk://kernel.bkbits.net/gregkh/linux/i2c-2.5

Do any of these apply to our CVS tree?

-- 
Jean Delvare
http://www.ensicaen.ismra.fr/~delvare/

^ permalink raw reply	[flat|nested] 33+ messages in thread

* [PATCH] More i2c driver changes 2.6.0-test2
@ 2005-05-19  6:24   ` Greg KH
  0 siblings, 0 replies; 33+ messages in thread
From: Greg KH @ 2005-05-19  6:24 UTC (permalink / raw)
  To: linux-kernel, sensors

ChangeSet 1.1124, 2003/08/08 16:15:11-07:00, greg@kroah.com

I2C: move the name field back into the i2c_client and i2c_adapter structures.

This is because the name field of struct device is going away, and the name
fields on these i2c structures are useful for people.


 drivers/i2c/busses/i2c-ali1535.c          |    6 ++----
 drivers/i2c/busses/i2c-ali15x3.c          |    6 ++----
 drivers/i2c/busses/i2c-amd756.c           |    6 ++----
 drivers/i2c/busses/i2c-amd8111.c          |    2 +-
 drivers/i2c/busses/i2c-i801.c             |    6 ++----
 drivers/i2c/busses/i2c-isa.c              |    4 +---
 drivers/i2c/busses/i2c-nforce2.c          |    6 ++----
 drivers/i2c/busses/i2c-piix4.c            |    8 +++-----
 drivers/i2c/busses/i2c-sis96x.c           |    6 ++----
 drivers/i2c/busses/i2c-viapro.c           |    6 ++----
 drivers/i2c/chips/adm1021.c               |    2 +-
 drivers/i2c/chips/it87.c                  |    2 +-
 drivers/i2c/chips/lm75.c                  |    2 +-
 drivers/i2c/chips/lm78.c                  |    2 +-
 drivers/i2c/chips/lm85.c                  |   12 ++++++------
 drivers/i2c/chips/via686a.c               |    2 +-
 drivers/i2c/chips/w83781d.c               |    4 ++--
 drivers/i2c/i2c-algo-bit.c                |    2 +-
 drivers/i2c/i2c-core.c                    |    4 ++--
 drivers/i2c/i2c-dev.c                     |    4 +---
 drivers/i2c/i2c-elektor.c                 |    4 +---
 drivers/i2c/i2c-elv.c                     |    4 +---
 drivers/i2c/i2c-philips-par.c             |    4 +---
 drivers/i2c/i2c-prosavage.c               |    5 -----
 drivers/i2c/i2c-velleman.c                |    4 +---
 drivers/i2c/scx200_acb.c                  |    4 ++--
 drivers/media/common/saa7146_i2c.c        |    3 +--
 drivers/media/video/adv7175.c             |   22 +++++++++-------------
 drivers/media/video/bt819.c               |   24 +++++++++++-------------
 drivers/media/video/bt856.c               |   20 +++++++++-----------
 drivers/media/video/bttv-cards.c          |    2 +-
 drivers/media/video/msp3400.c             |    2 +-
 drivers/media/video/saa5249.c             |    6 ++----
 drivers/media/video/saa7110.c             |   10 ++++------
 drivers/media/video/saa7111.c             |   15 ++++++---------
 drivers/media/video/saa7134/saa7134-i2c.c |    2 +-
 drivers/media/video/saa7185.c             |   13 +++++--------
 drivers/media/video/tda9840.c             |    6 +++---
 drivers/media/video/tda9887.c             |    4 +---
 drivers/media/video/tea6415c.c            |    6 +++---
 drivers/media/video/tea6420.c             |    6 +++---
 drivers/media/video/tuner-3036.c          |    4 +---
 drivers/media/video/tuner.c               |    8 +++-----
 include/linux/i2c.h                       |    6 ++++--
 44 files changed, 110 insertions(+), 166 deletions(-)


diff -Nru a/drivers/i2c/busses/i2c-ali1535.c b/drivers/i2c/busses/i2c-ali1535.c
--- a/drivers/i2c/busses/i2c-ali1535.c	Fri Aug  8 16:47:40 2003
+++ b/drivers/i2c/busses/i2c-ali1535.c	Fri Aug  8 16:47:40 2003
@@ -483,9 +483,7 @@
 	.owner		= THIS_MODULE,
 	.id		= I2C_ALGO_SMBUS | I2C_HW_SMBUS_ALI1535,
 	.algo		= &smbus_algorithm,
-	.dev		= {
-		.name	= "unset",
-	}
+	.name		= "unset",
 };
 
 static struct pci_device_id ali1535_ids[] = {
@@ -509,7 +507,7 @@
 	/* set up the driverfs linkage to our parent device */
 	ali1535_adapter.dev.parent = &dev->dev;
 
-	snprintf(ali1535_adapter.dev.name, DEVICE_NAME_SIZE, 
+	snprintf(ali1535_adapter.name, DEVICE_NAME_SIZE, 
 		"SMBus ALI1535 adapter at %04x", ali1535_smba);
 	return i2c_add_adapter(&ali1535_adapter);
 }
diff -Nru a/drivers/i2c/busses/i2c-ali15x3.c b/drivers/i2c/busses/i2c-ali15x3.c
--- a/drivers/i2c/busses/i2c-ali15x3.c	Fri Aug  8 16:47:40 2003
+++ b/drivers/i2c/busses/i2c-ali15x3.c	Fri Aug  8 16:47:40 2003
@@ -474,9 +474,7 @@
 	.id		= I2C_ALGO_SMBUS | I2C_HW_SMBUS_ALI15X3,
 	.class          = I2C_ADAP_CLASS_SMBUS,
 	.algo		= &smbus_algorithm,
-	.dev		= {
-		.name	= "unset",
-	},
+	.name		= "unset",
 };
 
 static struct pci_device_id ali15x3_ids[] = {
@@ -500,7 +498,7 @@
 	/* set up the driverfs linkage to our parent device */
 	ali15x3_adapter.dev.parent = &dev->dev;
 
-	snprintf(ali15x3_adapter.dev.name, DEVICE_NAME_SIZE,
+	snprintf(ali15x3_adapter.name, DEVICE_NAME_SIZE,
 		"SMBus ALI15X3 adapter at %04x", ali15x3_smba);
 	return i2c_add_adapter(&ali15x3_adapter);
 }
diff -Nru a/drivers/i2c/busses/i2c-amd756.c b/drivers/i2c/busses/i2c-amd756.c
--- a/drivers/i2c/busses/i2c-amd756.c	Fri Aug  8 16:47:40 2003
+++ b/drivers/i2c/busses/i2c-amd756.c	Fri Aug  8 16:47:40 2003
@@ -307,9 +307,7 @@
 	.id		= I2C_ALGO_SMBUS | I2C_HW_SMBUS_AMD756,
 	.class          = I2C_ADAP_CLASS_SMBUS,
 	.algo		= &smbus_algorithm,
-	.dev		= {
-		.name	= "unset",
-	},
+	.name		= "unset",
 };
 
 enum chiptype { AMD756, AMD766, AMD768, NFORCE };
@@ -371,7 +369,7 @@
 	/* set up the driverfs linkage to our parent device */
 	amd756_adapter.dev.parent = &pdev->dev;
 
-	snprintf(amd756_adapter.dev.name, DEVICE_NAME_SIZE,
+	snprintf(amd756_adapter.name, DEVICE_NAME_SIZE,
 		"SMBus AMD75x adapter at %04x", amd756_ioport);
 
 	error = i2c_add_adapter(&amd756_adapter);
diff -Nru a/drivers/i2c/busses/i2c-amd8111.c b/drivers/i2c/busses/i2c-amd8111.c
--- a/drivers/i2c/busses/i2c-amd8111.c	Fri Aug  8 16:47:40 2003
+++ b/drivers/i2c/busses/i2c-amd8111.c	Fri Aug  8 16:47:40 2003
@@ -356,7 +356,7 @@
 		goto out_kfree;
 
 	smbus->adapter.owner = THIS_MODULE;
-	snprintf(smbus->adapter.dev.name, DEVICE_NAME_SIZE,
+	snprintf(smbus->adapter.name, DEVICE_NAME_SIZE,
 		"SMBus2 AMD8111 adapter at %04x", smbus->base);
 	smbus->adapter.id = I2C_ALGO_SMBUS | I2C_HW_SMBUS_AMD8111;
 	smbus->adapter.class = I2C_ADAP_CLASS_SMBUS;
diff -Nru a/drivers/i2c/busses/i2c-i801.c b/drivers/i2c/busses/i2c-i801.c
--- a/drivers/i2c/busses/i2c-i801.c	Fri Aug  8 16:47:40 2003
+++ b/drivers/i2c/busses/i2c-i801.c	Fri Aug  8 16:47:40 2003
@@ -543,9 +543,7 @@
 	.id		= I2C_ALGO_SMBUS | I2C_HW_SMBUS_I801,
 	.class		= I2C_ADAP_CLASS_SMBUS,
 	.algo		= &smbus_algorithm,
-	.dev		= {
-		.name	= "unset",
-	},
+	.name		= "unset",
 };
 
 static struct pci_device_id i801_ids[] = {
@@ -600,7 +598,7 @@
 	/* set up the driverfs linkage to our parent device */
 	i801_adapter.dev.parent = &dev->dev;
 
-	snprintf(i801_adapter.dev.name, DEVICE_NAME_SIZE,
+	snprintf(i801_adapter.name, DEVICE_NAME_SIZE,
 		"SMBus I801 adapter at %04x", i801_smba);
 	return i2c_add_adapter(&i801_adapter);
 }
diff -Nru a/drivers/i2c/busses/i2c-isa.c b/drivers/i2c/busses/i2c-isa.c
--- a/drivers/i2c/busses/i2c-isa.c	Fri Aug  8 16:47:40 2003
+++ b/drivers/i2c/busses/i2c-isa.c	Fri Aug  8 16:47:40 2003
@@ -42,9 +42,7 @@
 	.id		= I2C_ALGO_ISA | I2C_HW_ISA,
 	.class          = I2C_ADAP_CLASS_SMBUS,
 	.algo		= &isa_algorithm,
-	.dev		= {
-		.name	= "ISA main adapter",
-	},
+	.name		= "ISA main adapter",
 };
 
 static int __init i2c_isa_init(void)
diff -Nru a/drivers/i2c/busses/i2c-nforce2.c b/drivers/i2c/busses/i2c-nforce2.c
--- a/drivers/i2c/busses/i2c-nforce2.c	Fri Aug  8 16:47:40 2003
+++ b/drivers/i2c/busses/i2c-nforce2.c	Fri Aug  8 16:47:40 2003
@@ -125,9 +125,7 @@
 	.id             = I2C_ALGO_SMBUS | I2C_HW_SMBUS_NFORCE2,
 	.class          = I2C_ADAP_CLASS_SMBUS,
 	.algo           = &smbus_algorithm,
-	.dev            = {
-		.name   = "unset",
-	},
+	.name   	= "unset",
 };
 
 
@@ -342,7 +340,7 @@
 */
 	smbus->adapter = nforce2_adapter;
 	smbus->adapter.dev.parent = &dev->dev;
-	snprintf(smbus->adapter.dev.name, DEVICE_NAME_SIZE,
+	snprintf(smbus->adapter.name, DEVICE_NAME_SIZE,
 		"SMBus nForce2 adapter at %04x", smbus->base);
 
 	error = i2c_add_adapter(&smbus->adapter);
diff -Nru a/drivers/i2c/busses/i2c-piix4.c b/drivers/i2c/busses/i2c-piix4.c
--- a/drivers/i2c/busses/i2c-piix4.c	Fri Aug  8 16:47:40 2003
+++ b/drivers/i2c/busses/i2c-piix4.c	Fri Aug  8 16:47:40 2003
@@ -127,7 +127,7 @@
 	if (PCI_FUNC(PIIX4_dev->devfn) != id->driver_data)
 		return -ENODEV;
 
-	dev_info(&PIIX4_dev->dev, "Found %s device\n", PIIX4_dev->dev.name);
+	dev_info(&PIIX4_dev->dev, "Found %s device\n", pci_name(PIIX4_dev));
 
 	if(ibm_dmi_probe()) {
 		dev_err(&PIIX4_dev->dev, "IBM Laptop detected; this module "
@@ -389,9 +389,7 @@
 	.id		= I2C_ALGO_SMBUS | I2C_HW_SMBUS_PIIX4,
 	.class		= I2C_ADAP_CLASS_SMBUS,
 	.algo		= &smbus_algorithm,
-	.dev		= {
-		.name	= "unset",
-	},
+	.name		= "unset",
 };
 
 static struct pci_device_id piix4_ids[] = {
@@ -444,7 +442,7 @@
 	/* set up the driverfs linkage to our parent device */
 	piix4_adapter.dev.parent = &dev->dev;
 
-	snprintf(piix4_adapter.dev.name, DEVICE_NAME_SIZE,
+	snprintf(piix4_adapter.name, DEVICE_NAME_SIZE,
 		"SMBus PIIX4 adapter at %04x", piix4_smba);
 
 	retval = i2c_add_adapter(&piix4_adapter);
diff -Nru a/drivers/i2c/busses/i2c-sis96x.c b/drivers/i2c/busses/i2c-sis96x.c
--- a/drivers/i2c/busses/i2c-sis96x.c	Fri Aug  8 16:47:40 2003
+++ b/drivers/i2c/busses/i2c-sis96x.c	Fri Aug  8 16:47:40 2003
@@ -264,9 +264,7 @@
 	.id		= I2C_ALGO_SMBUS | I2C_HW_SMBUS_SIS96X,
 	.class		= I2C_ADAP_CLASS_SMBUS,
 	.algo		= &smbus_algorithm,
-	.dev		= {
-		.name	="unset",
-	},
+	.name		= "unset",
 };
 
 static struct pci_device_id sis96x_ids[] = {
@@ -320,7 +318,7 @@
 	/* set up the driverfs linkage to our parent device */
 	sis96x_adapter.dev.parent = &dev->dev;
 
-	snprintf(sis96x_adapter.dev.name, DEVICE_NAME_SIZE,
+	snprintf(sis96x_adapter.name, DEVICE_NAME_SIZE,
 		"SiS96x SMBus adapter at 0x%04x", sis96x_smbus_base);
 
 	if ((retval = i2c_add_adapter(&sis96x_adapter))) {
diff -Nru a/drivers/i2c/busses/i2c-viapro.c b/drivers/i2c/busses/i2c-viapro.c
--- a/drivers/i2c/busses/i2c-viapro.c	Fri Aug  8 16:47:40 2003
+++ b/drivers/i2c/busses/i2c-viapro.c	Fri Aug  8 16:47:40 2003
@@ -290,9 +290,7 @@
 	.id		= I2C_ALGO_SMBUS | I2C_HW_SMBUS_VIA2,
 	.class		= I2C_ADAP_CLASS_SMBUS,
 	.algo		= &smbus_algorithm,
-	.dev		= {
-		.name	= "unset",
-	},
+	.name		= "unset",
 };
 
 static int __devinit vt596_probe(struct pci_dev *pdev,
@@ -378,7 +376,7 @@
 	dev_dbg(&pdev->dev, "VT596_smba = 0x%X\n", vt596_smba);
 
 	vt596_adapter.dev.parent = &pdev->dev;
-	snprintf(vt596_adapter.dev.name, DEVICE_NAME_SIZE,
+	snprintf(vt596_adapter.name, DEVICE_NAME_SIZE,
 			"SMBus Via Pro adapter at %04x", vt596_smba);
 	
 	return i2c_add_adapter(&vt596_adapter);
diff -Nru a/drivers/i2c/chips/adm1021.c b/drivers/i2c/chips/adm1021.c
--- a/drivers/i2c/chips/adm1021.c	Fri Aug  8 16:47:39 2003
+++ b/drivers/i2c/chips/adm1021.c	Fri Aug  8 16:47:39 2003
@@ -320,7 +320,7 @@
 	}
 
 	/* Fill in the remaining client fields and put it into the global list */
-	strlcpy(new_client->dev.name, client_name, DEVICE_NAME_SIZE);
+	strlcpy(new_client->name, client_name, DEVICE_NAME_SIZE);
 	data->type = kind;
 
 	new_client->id = adm1021_id++;
diff -Nru a/drivers/i2c/chips/it87.c b/drivers/i2c/chips/it87.c
--- a/drivers/i2c/chips/it87.c	Fri Aug  8 16:47:40 2003
+++ b/drivers/i2c/chips/it87.c	Fri Aug  8 16:47:40 2003
@@ -692,7 +692,7 @@
 	}
 
 	/* Fill in the remaining client fields and put it into the global list */
-	strlcpy(new_client->dev.name, name, DEVICE_NAME_SIZE);
+	strlcpy(new_client->name, name, DEVICE_NAME_SIZE);
 
 	data->type = kind;
 
diff -Nru a/drivers/i2c/chips/lm75.c b/drivers/i2c/chips/lm75.c
--- a/drivers/i2c/chips/lm75.c	Fri Aug  8 16:47:39 2003
+++ b/drivers/i2c/chips/lm75.c	Fri Aug  8 16:47:39 2003
@@ -194,7 +194,7 @@
 	}
 
 	/* Fill in the remaining client fields and put it into the global list */
-	strlcpy(new_client->dev.name, name, DEVICE_NAME_SIZE);
+	strlcpy(new_client->name, name, DEVICE_NAME_SIZE);
 
 	new_client->id = lm75_id++;
 	data->valid = 0;
diff -Nru a/drivers/i2c/chips/lm78.c b/drivers/i2c/chips/lm78.c
--- a/drivers/i2c/chips/lm78.c	Fri Aug  8 16:47:40 2003
+++ b/drivers/i2c/chips/lm78.c	Fri Aug  8 16:47:40 2003
@@ -638,7 +638,7 @@
 	}
 
 	/* Fill in the remaining client fields and put into the global list */
-	strlcpy(new_client->dev.name, client_name, DEVICE_NAME_SIZE);
+	strlcpy(new_client->name, client_name, DEVICE_NAME_SIZE);
 	data->type = kind;
 
 	data->valid = 0;
diff -Nru a/drivers/i2c/chips/lm85.c b/drivers/i2c/chips/lm85.c
--- a/drivers/i2c/chips/lm85.c	Fri Aug  8 16:47:40 2003
+++ b/drivers/i2c/chips/lm85.c	Fri Aug  8 16:47:40 2003
@@ -853,19 +853,19 @@
 	/* Fill in the chip specific driver values */
 	if ( kind = any_chip ) {
 		type_name = "lm85";
-		strlcpy(new_client->dev.name, "Generic LM85", DEVICE_NAME_SIZE);
+		strlcpy(new_client->name, "Generic LM85", DEVICE_NAME_SIZE);
 	} else if ( kind = lm85b ) {
 		type_name = "lm85b";
-		strlcpy(new_client->dev.name, "National LM85-B", DEVICE_NAME_SIZE);
+		strlcpy(new_client->name, "National LM85-B", DEVICE_NAME_SIZE);
 	} else if ( kind = lm85c ) {
 		type_name = "lm85c";
-		strlcpy(new_client->dev.name, "National LM85-C", DEVICE_NAME_SIZE);
+		strlcpy(new_client->name, "National LM85-C", DEVICE_NAME_SIZE);
 	} else if ( kind = adm1027 ) {
 		type_name = "adm1027";
-		strlcpy(new_client->dev.name, "Analog Devices ADM1027", DEVICE_NAME_SIZE);
+		strlcpy(new_client->name, "Analog Devices ADM1027", DEVICE_NAME_SIZE);
 	} else if ( kind = adt7463 ) {
 		type_name = "adt7463";
-		strlcpy(new_client->dev.name, "Analog Devices ADT7463", DEVICE_NAME_SIZE);
+		strlcpy(new_client->name, "Analog Devices ADT7463", DEVICE_NAME_SIZE);
 	} else {
 		dev_dbg(&adapter->dev, "Internal error, invalid kind (%d)!", kind);
 		err = -EFAULT ;
@@ -880,7 +880,7 @@
 
 	if (lm85debug) {
 		printk("lm85: Assigning ID %d to %s at %d,0x%02x\n",
-		new_client->id, new_client->dev.name,
+		new_client->id, new_client->name,
 		i2c_adapter_id(new_client->adapter),
 		new_client->addr);
 	}
diff -Nru a/drivers/i2c/chips/via686a.c b/drivers/i2c/chips/via686a.c
--- a/drivers/i2c/chips/via686a.c	Fri Aug  8 16:47:39 2003
+++ b/drivers/i2c/chips/via686a.c	Fri Aug  8 16:47:39 2003
@@ -727,7 +727,7 @@
 	new_client->dev.parent = &adapter->dev;
 
 	/* Fill in the remaining client fields and put into the global list */
-	snprintf(new_client->dev.name, DEVICE_NAME_SIZE, client_name);
+	snprintf(new_client->name, DEVICE_NAME_SIZE, client_name);
 
 	data->valid = 0;
 	init_MUTEX(&data->update_lock);
diff -Nru a/drivers/i2c/chips/w83781d.c b/drivers/i2c/chips/w83781d.c
--- a/drivers/i2c/chips/w83781d.c	Fri Aug  8 16:47:39 2003
+++ b/drivers/i2c/chips/w83781d.c	Fri Aug  8 16:47:39 2003
@@ -1116,7 +1116,7 @@
 		data->lm75[i]->adapter = adapter;
 		data->lm75[i]->driver = &w83781d_driver;
 		data->lm75[i]->flags = 0;
-		strlcpy(data->lm75[i]->dev.name, client_name,
+		strlcpy(data->lm75[i]->name, client_name,
 			DEVICE_NAME_SIZE);
 		if ((err = i2c_attach_client(data->lm75[i]))) {
 			dev_err(&new_client->dev, "Subclient %d "
@@ -1326,7 +1326,7 @@
 	}
 
 	/* Fill in the remaining client fields and put into the global list */
-	strlcpy(new_client->dev.name, client_name, DEVICE_NAME_SIZE);
+	strlcpy(new_client->name, client_name, DEVICE_NAME_SIZE);
 	data->type = kind;
 
 	data->valid = 0;
diff -Nru a/drivers/i2c/i2c-algo-bit.c b/drivers/i2c/i2c-algo-bit.c
--- a/drivers/i2c/i2c-algo-bit.c	Fri Aug  8 16:47:40 2003
+++ b/drivers/i2c/i2c-algo-bit.c	Fri Aug  8 16:47:40 2003
@@ -527,7 +527,7 @@
 	struct i2c_algo_bit_data *bit_adap = adap->algo_data;
 
 	if (bit_test) {
-		int ret = test_bus(bit_adap, adap->dev.name);
+		int ret = test_bus(bit_adap, adap->name);
 		if (ret<0)
 			return -ENODEV;
 	}
diff -Nru a/drivers/i2c/i2c-core.c b/drivers/i2c/i2c-core.c
--- a/drivers/i2c/i2c-core.c	Fri Aug  8 16:47:40 2003
+++ b/drivers/i2c/i2c-core.c	Fri Aug  8 16:47:40 2003
@@ -250,7 +250,7 @@
 					continue;
 				DEB2(printk(KERN_DEBUG "i2c-core.o: "
 					    "detaching client %s:\n",
-					    client->dev.name));
+					    client->name));
 				if ((res = driver->detach_client(client))) {
 					dev_err(&adap->dev, "while "
 						"unregistering driver "
@@ -352,7 +352,7 @@
 		if (res) {
 			printk(KERN_ERR
 			       "i2c-core.o: client_unregister [%s] failed, "
-			       "client not detached", client->dev.name);
+			       "client not detached", client->name);
 			goto out;
 		}
 	}
diff -Nru a/drivers/i2c/i2c-dev.c b/drivers/i2c/i2c-dev.c
--- a/drivers/i2c/i2c-dev.c	Fri Aug  8 16:47:40 2003
+++ b/drivers/i2c/i2c-dev.c	Fri Aug  8 16:47:40 2003
@@ -484,9 +484,7 @@
 };
 
 static struct i2c_client i2cdev_client_template = {
-	.dev		= {
-		.name	= "I2C /dev entry",
-	},
+	.name		= "I2C /dev entry",
 	.id		= 1,
 	.addr		= -1,
 	.driver		= &i2cdev_driver,
diff -Nru a/drivers/i2c/i2c-elektor.c b/drivers/i2c/i2c-elektor.c
--- a/drivers/i2c/i2c-elektor.c	Fri Aug  8 16:47:39 2003
+++ b/drivers/i2c/i2c-elektor.c	Fri Aug  8 16:47:39 2003
@@ -178,9 +178,7 @@
 	.owner		= THIS_MODULE,
 	.id		= I2C_HW_P_ELEK,
 	.algo_data	= &pcf_isa_data,
-	.dev		= {
-		.name	= "PCF8584 ISA adapter",
-	},
+	.name		= "PCF8584 ISA adapter",
 };
 
 static int __init i2c_pcfisa_init(void) 
diff -Nru a/drivers/i2c/i2c-elv.c b/drivers/i2c/i2c-elv.c
--- a/drivers/i2c/i2c-elv.c	Fri Aug  8 16:47:40 2003
+++ b/drivers/i2c/i2c-elv.c	Fri Aug  8 16:47:40 2003
@@ -131,9 +131,7 @@
 	.owner		= THIS_MODULE,
 	.id		= I2C_HW_B_ELV,
 	.algo_data	= &bit_elv_data,
-	.dev		= {
-		.name	= "ELV Parallel port adaptor",
-	},
+	.name		= "ELV Parallel port adaptor",
 };
 
 static int __init i2c_bitelv_init(void)
diff -Nru a/drivers/i2c/i2c-philips-par.c b/drivers/i2c/i2c-philips-par.c
--- a/drivers/i2c/i2c-philips-par.c	Fri Aug  8 16:47:40 2003
+++ b/drivers/i2c/i2c-philips-par.c	Fri Aug  8 16:47:40 2003
@@ -152,9 +152,7 @@
 static struct i2c_adapter bit_lp_ops = {
 	.owner		= THIS_MODULE,
 	.id		= I2C_HW_B_LP,
-	.dev		= {
-		.name	= "Philips Parallel port adapter",
-	},
+	.name		= "Philips Parallel port adapter",
 };
 
 static void i2c_parport_attach (struct parport *port)
diff -Nru a/drivers/i2c/i2c-prosavage.c b/drivers/i2c/i2c-prosavage.c
--- a/drivers/i2c/i2c-prosavage.c	Fri Aug  8 16:47:40 2003
+++ b/drivers/i2c/i2c-prosavage.c	Fri Aug  8 16:47:40 2003
@@ -70,12 +70,7 @@
 #define	DRIVER_ID	"i2c-prosavage"
 #define	DRIVER_VERSION	"20030621"
 
-/* lm_sensors2 / kernel 2.5.xx compatibility */
-#if LINUX_VERSION_CODE < KERNEL_VERSION(2,5,0)
 #define ADAPTER_NAME(x) (x).name
-#else
-#define ADAPTER_NAME(x) (x).dev.name
-#endif /* LINUX_VERSION_CODE */
 
 #define MAX_BUSSES	2
 
diff -Nru a/drivers/i2c/i2c-velleman.c b/drivers/i2c/i2c-velleman.c
--- a/drivers/i2c/i2c-velleman.c	Fri Aug  8 16:47:40 2003
+++ b/drivers/i2c/i2c-velleman.c	Fri Aug  8 16:47:40 2003
@@ -116,9 +116,7 @@
 	.owner		= THIS_MODULE,
 	.id		= I2C_HW_B_VELLE,
 	.algo_data	= &bit_velle_data,
-	.dev		= {
-		.name	= "Velleman K8000",
-	},
+	.name		= "Velleman K8000",
 };
 
 static int __init i2c_bitvelle_init(void)
diff -Nru a/drivers/i2c/scx200_acb.c b/drivers/i2c/scx200_acb.c
--- a/drivers/i2c/scx200_acb.c	Fri Aug  8 16:47:40 2003
+++ b/drivers/i2c/scx200_acb.c	Fri Aug  8 16:47:40 2003
@@ -456,14 +456,14 @@
 	memset(iface, 0, sizeof(*iface));
 	adapter = &iface->adapter;
 	i2c_set_adapdata(adapter, iface);
-	snprintf(adapter->dev.name, DEVICE_NAME_SIZE, "SCx200 ACB%d", index);
+	snprintf(adapter->name, DEVICE_NAME_SIZE, "SCx200 ACB%d", index);
 	adapter->owner = THIS_MODULE;
 	adapter->id = I2C_ALGO_SMBUS;
 	adapter->algo = &scx200_acb_algorithm;
 
 	init_MUTEX(&iface->sem);
 
-	snprintf(description, sizeof(description), "NatSemi SCx200 ACCESS.bus [%s]", adapter->dev.name);
+	snprintf(description, sizeof(description), "NatSemi SCx200 ACCESS.bus [%s]", adapter->name);
 	if (request_region(base, 8, description) = 0) {
 		dev_err(&adapter->dev, "can't allocate io 0x%x-0x%x\n",
 			base, base + 8-1);
diff -Nru a/drivers/media/common/saa7146_i2c.c b/drivers/media/common/saa7146_i2c.c
--- a/drivers/media/common/saa7146_i2c.c	Fri Aug  8 16:47:40 2003
+++ b/drivers/media/common/saa7146_i2c.c	Fri Aug  8 16:47:40 2003
@@ -407,11 +407,10 @@
 
 	if( NULL != i2c_adapter ) {
 		memset(i2c_adapter,0,sizeof(struct i2c_adapter));
-#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,5,0))
 		strcpy(i2c_adapter->name, dev->name);	
+#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,5,0))
 		i2c_adapter->data = dev;
 #else
-		strcpy(i2c_adapter->dev.name, dev->name);	
 		i2c_set_adapdata(i2c_adapter,dev);
 #endif
 		i2c_adapter->algo	   = &saa7146_algo;
diff -Nru a/drivers/media/video/adv7175.c b/drivers/media/video/adv7175.c
--- a/drivers/media/video/adv7175.c	Fri Aug  8 16:47:40 2003
+++ b/drivers/media/video/adv7175.c	Fri Aug  8 16:47:40 2003
@@ -159,7 +159,7 @@
 	0x06, 0x1a,		/* subc. phase */
 };
 
-static int adv717x_attach(struct i2c_adapter *adap, int addr, unsigned short flags, int kind)
+static int adv717x_attach(struct i2c_adapter *adap, int addr, int kind)
 {
 	struct adv7175 *encoder;
 	struct	i2c_client	*client;
@@ -191,7 +191,7 @@
 		// We should never get here!!!
 		dname = unknown_name;
 	}
-	strlcpy(client->dev.name, dname, DEVICE_NAME_SIZE);
+	strlcpy(client->name, dname, DEVICE_NAME_SIZE);
 	init_MUTEX(&encoder->lock);
 	encoder->client = client;
 	i2c_set_clientdata(client, encoder);
@@ -203,7 +203,7 @@
 	for (i=1; i<x_common; i++) {
 		rv = i2c_smbus_write_byte(client,init_common[i]);
 		if (rv < 0) {
-			printk(KERN_ERR "%s_attach: init error %d\n", client->dev.name, rv);
+			printk(KERN_ERR "%s_attach: init error %d\n", client->name, rv);
 			break;
 		}
 	}
@@ -213,7 +213,7 @@
 		i2c_smbus_write_byte_data(client,0x07, TR0MODE);
 		i2c_smbus_read_byte_data(client,0x12);
 		printk(KERN_INFO "%s_attach: %s rev. %d at 0x%02x\n",
-		       client->dev.name, dname, rv & 1, client->addr);
+		       client->name, dname, rv & 1, client->addr);
 	}
 
 	i2c_attach_client(client);
@@ -297,9 +297,8 @@
 					i2c_smbus_write_byte_data(client,0x07, TR0MODE);
 					break;
 				default:
-					printk(KERN_ERR
-					       "%s: illegal norm: %d\n",
-					       client->dev.name, iarg);
+					printk(KERN_ERR "%s: illegal norm: %d\n",
+					       client->name, iarg);
 					return -EINVAL;
 
 				}
@@ -353,9 +352,8 @@
 					break;
 
 				default:
-					printk(KERN_ERR
-					       "%s: illegal input: %d\n",
-					       client->dev.name, iarg);
+					printk(KERN_ERR "%s: illegal input: %d\n",
+					       client->name, iarg);
 					return -EINVAL;
 
 				}
@@ -422,9 +420,7 @@
 
 static struct i2c_client client_template = {
 	.driver		= &i2c_driver_adv7175,
-	.dev		= {
-		.name	= "adv7175_client",
-	},
+	.name		= "adv7175_client",
 };
 
 static int adv717x_init(void)
diff -Nru a/drivers/media/video/bt819.c b/drivers/media/video/bt819.c
--- a/drivers/media/video/bt819.c	Fri Aug  8 16:47:40 2003
+++ b/drivers/media/video/bt819.c	Fri Aug  8 16:47:40 2003
@@ -150,7 +150,7 @@
 
 /* ----------------------------------------------------------------------- */
 
-static int bt819_attach(struct i2c_adapter *adap, int addr , unsigned long flags, int kind)
+static int bt819_attach(struct i2c_adapter *adap, int addr, int kind)
 {
 	int i;
 	struct bt819 *decoder;
@@ -172,7 +172,7 @@
 	}
 
 	memset(decoder, 0, sizeof(struct bt819));
-	strlcpy(client->dev.name, "bt819", DEVICE_NAME_SIZE);
+	strlcpy(client->name, "bt819", DEVICE_NAME_SIZE);
 	i2c_set_clientdata(client, decoder);
 	decoder->client = client;
 	decoder->addr = addr;
@@ -188,10 +188,10 @@
 	i = bt819_init(client);
 	if (i < 0) {
 		printk(KERN_ERR "%s: bt819_attach: init status %d\n",
-		       decoder->client->dev.name, i);
+		       decoder->client->name, i);
 	} else {
 		printk(KERN_INFO "%s: bt819_attach: chip version %x\n",
-		       decoder->client->dev.name, i2c_smbus_read_byte_data(client,
+		       decoder->client->name, i2c_smbus_read_byte_data(client,
 						      0x17) & 0x0f);
 	}
 	init_MUTEX(&decoder->lock);
@@ -270,7 +270,7 @@
 			*iarg = res;
 
 			DEBUG(printk(KERN_INFO "%s-bt819: get status %x\n",
-				     decoder->client->dev.name, *iarg));
+				     decoder->client->name, *iarg));
 		}
 		break;
 
@@ -280,7 +280,7 @@
 			struct timing *timing;
 
 			DEBUG(printk(KERN_INFO "%s-bt819: set norm %x\n",
-				     decoder->client->dev.name, *iarg));
+				     decoder->client->name, *iarg));
 
 			if (*iarg = VIDEO_MODE_NTSC) {
 				bt819_setbit(decoder, 0x01, 0, 1);
@@ -321,7 +321,7 @@
 			int *iarg = arg;
 
 			DEBUG(printk(KERN_INFO "%s-bt819: set input %x\n",
-				     decoder->client->dev.name, *iarg));
+				     decoder->client->name, *iarg));
 
 			if (*iarg < 0 || *iarg > 7) {
 				return -EINVAL;
@@ -346,7 +346,7 @@
 			int *iarg = arg;
 
 			DEBUG(printk(KERN_INFO "%s-bt819: set output %x\n",
-				     decoder->client->dev.name, *iarg));
+				     decoder->client->name, *iarg));
 
 			/* not much choice of outputs */
 			if (*iarg != 0) {
@@ -362,7 +362,7 @@
 
 			DEBUG(printk
 			      (KERN_INFO "%s-bt819: enable output %x\n",
-			       decoder->client->dev.name, *iarg));
+			       decoder->client->name, *iarg));
 
 			if (decoder->enable != enable) {
 				decoder->enable = enable;
@@ -383,7 +383,7 @@
 			DEBUG(printk
 			      (KERN_INFO
 			       "%s-bt819: set picture brightness %d contrast %d colour %d\n",
-			       decoder->client->dev.name, pic->brightness,
+			       decoder->client->name, pic->brightness,
 			       pic->contrast, pic->colour));
 
 
@@ -452,9 +452,7 @@
 static struct i2c_client client_template = {
 	.id = -1,
 	.driver = &i2c_driver_bt819,
-	.dev = {
-		.name = "bt819_client",
-	},
+	.name = "bt819_client",
 };
 
 static int bt819_setup(void)
diff -Nru a/drivers/media/video/bt856.c b/drivers/media/video/bt856.c
--- a/drivers/media/video/bt856.c	Fri Aug  8 16:47:39 2003
+++ b/drivers/media/video/bt856.c	Fri Aug  8 16:47:39 2003
@@ -97,7 +97,7 @@
 
 /* ----------------------------------------------------------------------- */
 
-static int bt856_attach(struct i2c_adapter *adap, int addr , unsigned long flags, int kind)
+static int bt856_attach(struct i2c_adapter *adap, int addr, int kind)
 {
 	struct bt856 *encoder;
 	struct i2c_client *client;
@@ -123,14 +123,14 @@
 
 
 	memset(encoder, 0, sizeof(struct bt856));
-	strlcpy(client->dev.name, "bt856", DEVICE_NAME_SIZE);
+	strlcpy(client->name, "bt856", DEVICE_NAME_SIZE);
 	encoder->client = client;
 	i2c_set_clientdata(client, encoder);
 	encoder->addr = client->addr;
 	encoder->norm = VIDEO_MODE_NTSC;
 	encoder->enable = 1;
 
-	DEBUG(printk(KERN_INFO "%s-bt856: attach\n", encoder->client->dev.name));
+	DEBUG(printk(KERN_INFO "%s-bt856: attach\n", encoder->client->name));
 
 	i2c_smbus_write_byte_data(client, 0xdc, 0x18);
 	encoder->reg[0xdc] = 0x18;
@@ -190,7 +190,7 @@
 
 			DEBUG(printk
 			      (KERN_INFO "%s-bt856: get capabilities\n",
-			       encoder->client->dev.name));
+			       encoder->client->name));
 
 			cap->flags
 			    = VIDEO_ENCODER_PAL
@@ -205,7 +205,7 @@
 			int *iarg = arg;
 
 			DEBUG(printk(KERN_INFO "%s-bt856: set norm %d\n",
-				     encoder->client->dev.name, *iarg));
+				     encoder->client->name, *iarg));
 
 			switch (*iarg) {
 
@@ -232,7 +232,7 @@
 			int *iarg = arg;
 
 			DEBUG(printk(KERN_INFO "%s-bt856: set input %d\n",
-				     encoder->client->dev.name, *iarg));
+				     encoder->client->name, *iarg));
 
 			/*     We only have video bus.
 			   *iarg = 0: input is from bt819
@@ -268,7 +268,7 @@
 			int *iarg = arg;
 
 			DEBUG(printk(KERN_INFO "%s-bt856: set output %d\n",
-				     encoder->client->dev.name, *iarg));
+				     encoder->client->name, *iarg));
 
 			/* not much choice of outputs */
 			if (*iarg != 0) {
@@ -285,7 +285,7 @@
 
 			DEBUG(printk
 			      (KERN_INFO "%s-bt856: enable output %d\n",
-			       encoder->client->dev.name, encoder->enable));
+			       encoder->client->name, encoder->enable));
 		}
 		break;
 
@@ -311,9 +311,7 @@
 static struct i2c_client client_template = {
 	.id = -1,
 	.driver = &i2c_driver_bt856,
-	.dev = {
-		.name = "bt856_client",
-	},
+	.name = "bt856_client",
 };
 
 static int bt856_init(void)
diff -Nru a/drivers/media/video/bttv-cards.c b/drivers/media/video/bttv-cards.c
--- a/drivers/media/video/bttv-cards.c	Fri Aug  8 16:47:40 2003
+++ b/drivers/media/video/bttv-cards.c	Fri Aug  8 16:47:40 2003
@@ -3469,7 +3469,7 @@
 
 	/* print which chipset we have */
 	while ((dev = pci_find_class(PCI_CLASS_BRIDGE_HOST << 8,dev)))
-		printk(KERN_INFO "bttv: Host bridge is %s\n",dev->dev.name);
+		printk(KERN_INFO "bttv: Host bridge is %s\n",pci_name(dev));
 
 	/* print warnings about any quirks found */
 	if (triton1)
diff -Nru a/drivers/media/video/msp3400.c b/drivers/media/video/msp3400.c
--- a/drivers/media/video/msp3400.c	Fri Aug  8 16:47:40 2003
+++ b/drivers/media/video/msp3400.c	Fri Aug  8 16:47:40 2003
@@ -1316,7 +1316,7 @@
 #endif
 	msp3400c_setvolume(c,msp->muted,msp->left,msp->right);
 
-	snprintf(c->dev.name, DEVICE_NAME_SIZE, "MSP34%02d%c-%c%d",
+	snprintf(c->name, DEVICE_NAME_SIZE, "MSP34%02d%c-%c%d",
 		 (msp->rev2>>8)&0xff, (msp->rev1&0xff)+'@',
 		 ((msp->rev1>>8)&0xff)+'@', msp->rev2&0x1f);
 
diff -Nru a/drivers/media/video/saa5249.c b/drivers/media/video/saa5249.c
--- a/drivers/media/video/saa5249.c	Fri Aug  8 16:47:40 2003
+++ b/drivers/media/video/saa5249.c	Fri Aug  8 16:47:40 2003
@@ -171,7 +171,7 @@
 		return -ENOMEM;
 	}
 	memset(t, 0, sizeof(*t));
-	strlcpy(client->dev.name, IF_NAME, DEVICE_NAME_SIZE);
+	strlcpy(client->name, IF_NAME, DEVICE_NAME_SIZE);
 	init_MUTEX(&t->lock);
 	
 	/*
@@ -263,9 +263,7 @@
 static struct i2c_client client_template = {
 	.id 		= -1,
 	.driver		= &i2c_driver_videotext,
-	.dev		= {
-		.name	= "(unset)",
-	},
+	.name		= "(unset)",
 };
 
 /*
diff -Nru a/drivers/media/video/saa7110.c b/drivers/media/video/saa7110.c
--- a/drivers/media/video/saa7110.c	Fri Aug  8 16:47:39 2003
+++ b/drivers/media/video/saa7110.c	Fri Aug  8 16:47:39 2003
@@ -147,7 +147,7 @@
 }
 
 static
-int saa7110_attach(struct i2c_adapter *adap, int  addr, unsigned short flags, int kind)
+int saa7110_attach(struct i2c_adapter *adap, int  addr, int kind)
 {
 static	const unsigned char initseq[] = {
 	     0, 0x4C, 0x3C, 0x0D, 0xEF, 0xBD, 0xF0, 0x00, 0x00,
@@ -176,7 +176,7 @@
 
 	/* clear our private data */
 	memset(decoder, 0, sizeof(*decoder));
-	strlcpy(client->dev.name, IF_NAME, DEVICE_NAME_SIZE);
+	strlcpy(client->name, IF_NAME, DEVICE_NAME_SIZE);
 	decoder->client = client;
 	i2c_set_clientdata(client, decoder);
 	decoder->addr = addr;
@@ -190,7 +190,7 @@
 
 	rv = i2c_master_send(client, initseq, sizeof(initseq));
 	if (rv < 0)
-		printk(KERN_ERR "%s_attach: init status %d\n", client->dev.name, rv);
+		printk(KERN_ERR "%s_attach: init status %d\n", client->name, rv);
 	else {
 		i2c_smbus_write_byte_data(client,0x21,0x16);
 		i2c_smbus_write_byte_data(client,0x0D,0x04);
@@ -393,9 +393,7 @@
 static struct i2c_client client_template = {
 	.id 		= -1,
 	.driver 	= &i2c_driver_saa7110,
-	.dev		= {
-		.name	= "saa7110_client",
-	},
+	.name		= "saa7110_client",
 };
 
 static int saa7110_init(void)
diff -Nru a/drivers/media/video/saa7111.c b/drivers/media/video/saa7111.c
--- a/drivers/media/video/saa7111.c	Fri Aug  8 16:47:40 2003
+++ b/drivers/media/video/saa7111.c	Fri Aug  8 16:47:40 2003
@@ -122,7 +122,7 @@
 	}
 
 	memset(decoder, 0, sizeof(*decoder));
-	strlcpy(client->dev.name, "saa7111", DEVICE_NAME_SIZE);
+	strlcpy(client->name, "saa7111", DEVICE_NAME_SIZE);
 	decoder->client = client;
 	i2c_set_clientdata(client, decoder);
 	decoder->addr = addr;
@@ -137,10 +137,10 @@
 	i = i2c_master_send(client, init, sizeof(init));
 	if (i < 0) {
 		printk(KERN_ERR "%s_attach: init status %d\n",
-		       client->dev.name, i);
+		       client->name, i);
 	} else {
 		printk(KERN_INFO "%s_attach: chip version %x @ 0x%08x\n",
-		       client->dev.name, i2c_smbus_read_byte_data(client, 0x00) >> 4,addr);
+		       client->name, i2c_smbus_read_byte_data(client, 0x00) >> 4,addr);
 	}
 
 	init_MUTEX(&decoder->lock);
@@ -159,7 +159,7 @@
 	}
 	
 	printk("saa7111: probing %s i2c adapter [id=0x%x]\n",
-                       adap->dev.name,adap->id);
+                       adap->name,adap->id);
 	return i2c_probe(adap, &addr_data, saa7111_attach);
 }
 
@@ -188,8 +188,7 @@
 			for (i = 0; i < 32; i += 16) {
 				int j;
 
-				printk("KERN_DEBUG %s: %03x", client->dev.name,
-				       i);
+				printk("KERN_DEBUG %s: %03x", client->name, i);
 				for (j = 0; j < 16; ++j) {
 					printk(" %02x",
 					       i2c_smbus_read_byte_data(client,
@@ -413,9 +412,7 @@
 static struct i2c_client client_template = {
 	.id 	= -1,
 	.driver	= &i2c_driver_saa7111,
-	.dev	= {
-		.name	= "saa7111_client",
-	},
+	.name	= "saa7111_client",
 };
 
 static int saa7111_init(void)
diff -Nru a/drivers/media/video/saa7134/saa7134-i2c.c b/drivers/media/video/saa7134/saa7134-i2c.c
--- a/drivers/media/video/saa7134/saa7134-i2c.c	Fri Aug  8 16:47:40 2003
+++ b/drivers/media/video/saa7134/saa7134-i2c.c	Fri Aug  8 16:47:40 2003
@@ -399,7 +399,7 @@
 int saa7134_i2c_register(struct saa7134_dev *dev)
 {
 	dev->i2c_adap = saa7134_adap_template;
-	strcpy(dev->i2c_adap.dev.name,dev->name);
+	strcpy(dev->i2c_adap.name,dev->name);
 	dev->i2c_adap.algo_data = dev;
 	i2c_add_adapter(&dev->i2c_adap);
 	
diff -Nru a/drivers/media/video/saa7185.c b/drivers/media/video/saa7185.c
--- a/drivers/media/video/saa7185.c	Fri Aug  8 16:47:39 2003
+++ b/drivers/media/video/saa7185.c	Fri Aug  8 16:47:39 2003
@@ -181,7 +181,7 @@
 	0x66, 0x21,		/* FSC3 */
 };
 
-static int saa7185_attach(struct i2c_adapter *adap, int addr, unsigned short flags, int kind)
+static int saa7185_attach(struct i2c_adapter *adap, int addr, int kind)
 {
 	int i;
 	struct saa7185 *encoder;
@@ -202,7 +202,7 @@
 
 
 	memset(encoder, 0, sizeof(*encoder));
-	strlcpy(client->dev.name, "saa7185", DEVICE_NAME_SIZE);
+	strlcpy(client->name, "saa7185", DEVICE_NAME_SIZE);
 	encoder->client = client;
 	i2c_set_clientdata(client, encoder);
 	encoder->addr = addr;
@@ -215,11 +215,10 @@
 					sizeof(init_ntsc));
 	}
 	if (i < 0) {
-		printk(KERN_ERR "%s_attach: init error %d\n", client->dev.name,
-		       i);
+		printk(KERN_ERR "%s_attach: init error %d\n", client->name, i);
 	} else {
 		printk(KERN_INFO "%s_attach: chip version %d\n",
-		       client->dev.name, i2c_smbus_read_byte(client) >> 5);
+		       client->name, i2c_smbus_read_byte(client) >> 5);
 	}
 	init_MUTEX(&encoder->lock);
 	i2c_attach_client(client);
@@ -367,9 +366,7 @@
 static struct i2c_client client_template = {
 	.id 	= -1,
 	.driver = &i2c_driver_saa7185,
-	.dev	= {
-		.name	= "saa7185_client",
-	},
+	.name	= "saa7185_client",
 };
 
 static int saa7185_init(void)
diff -Nru a/drivers/media/video/tda9840.c b/drivers/media/video/tda9840.c
--- a/drivers/media/video/tda9840.c	Fri Aug  8 16:47:40 2003
+++ b/drivers/media/video/tda9840.c	Fri Aug  8 16:47:40 2003
@@ -198,7 +198,7 @@
 	}
 	
 	/* fill client structure */
-	sprintf(client->dev.name,"tda9840 (0x%02x)", address);
+	sprintf(client->name,"tda9840 (0x%02x)", address);
 	client->id = tda9840_id++;
 	client->flags = 0;
 	client->addr = address;
@@ -227,7 +227,7 @@
  		printk("tda9840.o: could not initialize ic #3. continuing anyway. (result:%d)\n",result);
 	} 
 	
-	printk("tda9840.o: detected @ 0x%02x on adapter %s\n",2*address,&client->adapter->dev.name[0]);
+	printk("tda9840.o: detected @ 0x%02x on adapter %s\n",2*address,&client->adapter->name[0]);
 
 	return 0;
 }
@@ -236,7 +236,7 @@
 {
 	/* let's see whether this is a know adapter we can attach to */
 	if( adapter->id != I2C_ALGO_SAA7146 ) {
-		dprintk("tda9840.o: refusing to probe on unknown adapter [name='%s',id=0x%x]\n",adapter->dev.name,adapter->id);
+		dprintk("tda9840.o: refusing to probe on unknown adapter [name='%s',id=0x%x]\n",adapter->name,adapter->id);
 		return -ENODEV;
 	}
 
diff -Nru a/drivers/media/video/tda9887.c b/drivers/media/video/tda9887.c
--- a/drivers/media/video/tda9887.c	Fri Aug  8 16:47:39 2003
+++ b/drivers/media/video/tda9887.c	Fri Aug  8 16:47:39 2003
@@ -441,9 +441,7 @@
 {
 	.flags  = I2C_CLIENT_ALLOW_USE,
         .driver = &driver,
-        .dev	= {
-		.name	= "tda9887",
-	},
+	.name	= "tda9887",
 };
 
 static int tda9887_init_module(void)
diff -Nru a/drivers/media/video/tea6415c.c b/drivers/media/video/tea6415c.c
--- a/drivers/media/video/tea6415c.c	Fri Aug  8 16:47:40 2003
+++ b/drivers/media/video/tea6415c.c	Fri Aug  8 16:47:40 2003
@@ -72,7 +72,7 @@
 	}
 
 	/* fill client structure */
-	sprintf(client->dev.name,"tea6415c (0x%02x)", address);
+	sprintf(client->name,"tea6415c (0x%02x)", address);
 	client->id = tea6415c_id++;
 	client->flags = 0;
 	client->addr = address;
@@ -85,7 +85,7 @@
 		return err;
 	}
 
-	printk("tea6415c.o: detected @ 0x%02x on adapter %s\n",2*address,&client->adapter->dev.name[0]);
+	printk("tea6415c.o: detected @ 0x%02x on adapter %s\n",2*address,&client->adapter->name[0]);
 
 	return 0;
 }
@@ -94,7 +94,7 @@
 {
 	/* let's see whether this is a know adapter we can attach to */
 	if( adapter->id != I2C_ALGO_SAA7146 ) {
-		dprintk("tea6415c.o: refusing to probe on unknown adapter [name='%s',id=0x%x]\n",adapter->dev.name,adapter->id);
+		dprintk("tea6415c.o: refusing to probe on unknown adapter [name='%s',id=0x%x]\n",adapter->name,adapter->id);
 		return -ENODEV;
 	}
 
diff -Nru a/drivers/media/video/tea6420.c b/drivers/media/video/tea6420.c
--- a/drivers/media/video/tea6420.c	Fri Aug  8 16:47:40 2003
+++ b/drivers/media/video/tea6420.c	Fri Aug  8 16:47:40 2003
@@ -112,7 +112,7 @@
 	}
 	
 	/* fill client structure */
-	sprintf(client->dev.name,"tea6420 (0x%02x)", address);
+	sprintf(client->name,"tea6420 (0x%02x)", address);
 	client->id = tea6420_id++;
 	client->flags = 0;
 	client->addr = address;
@@ -135,7 +135,7 @@
 		printk("tea6420.o: could not initialize chipset. continuing anyway.\n");
 	}
 	
-	printk("tea6420.o: detected @ 0x%02x on adapter %s\n",2*address,&client->adapter->dev.name[0]);
+	printk("tea6420.o: detected @ 0x%02x on adapter %s\n",2*address,&client->adapter->name[0]);
 
 	return 0;
 }
@@ -144,7 +144,7 @@
 {
 	/* let's see whether this is a know adapter we can attach to */
 	if( adapter->id != I2C_ALGO_SAA7146 ) {
-		dprintk("tea6420.o: refusing to probe on unknown adapter [name='%s',id=0x%x]\n",adapter->dev.name,adapter->id);
+		dprintk("tea6420.o: refusing to probe on unknown adapter [name='%s',id=0x%x]\n",adapter->name,adapter->id);
 		return -ENODEV;
 	}
 
diff -Nru a/drivers/media/video/tuner-3036.c b/drivers/media/video/tuner-3036.c
--- a/drivers/media/video/tuner-3036.c	Fri Aug  8 16:47:40 2003
+++ b/drivers/media/video/tuner-3036.c	Fri Aug  8 16:47:40 2003
@@ -197,9 +197,7 @@
 {
         .id 		= -1,
         .driver		= &i2c_driver_tuner,
-        .dev		= {
-		.name	= "SAB3036",
-	},
+	.name		= "SAB3036",
 };
 
 int __init
diff -Nru a/drivers/media/video/tuner.c b/drivers/media/video/tuner.c
--- a/drivers/media/video/tuner.c	Fri Aug  8 16:47:40 2003
+++ b/drivers/media/video/tuner.c	Fri Aug  8 16:47:40 2003
@@ -824,7 +824,7 @@
 	if (type < TUNERS) {
 		t->type = type;
 		printk("tuner(bttv): type forced to %d (%s) [insmod]\n",t->type,tuners[t->type].name);
-		strlcpy(client->dev.name, tuners[t->type].name, DEVICE_NAME_SIZE);
+		strlcpy(client->name, tuners[t->type].name, DEVICE_NAME_SIZE);
 	}
         i2c_attach_client(client);
         if (t->type = TUNER_MT2032)
@@ -875,7 +875,7 @@
 		t->type = *iarg;
 		printk("tuner: type set to %d (%s)\n",
                         t->type,tuners[t->type].name);
-		strlcpy(client->dev.name, tuners[t->type].name, DEVICE_NAME_SIZE);
+		strlcpy(client->name, tuners[t->type].name, DEVICE_NAME_SIZE);
 		if (t->type = TUNER_MT2032)
                         mt2032_init(client);
 		break;
@@ -962,9 +962,7 @@
 {
 	.flags  = I2C_CLIENT_ALLOW_USE,
 	.driver = &driver,
-	.dev  = {
-		.name   = "(tuner unset)",
-	},
+	.name   = "(tuner unset)",
 };
 
 static int tuner_init_module(void)
diff -Nru a/include/linux/i2c.h b/include/linux/i2c.h
--- a/include/linux/i2c.h	Fri Aug  8 16:47:40 2003
+++ b/include/linux/i2c.h	Fri Aug  8 16:47:40 2003
@@ -166,6 +166,7 @@
 					/* to the client		*/
 	struct device dev;		/* the device structure		*/
 	struct list_head list;
+	char name[DEVICE_NAME_SIZE];
 };
 #define to_i2c_client(d) container_of(d, struct i2c_client, dev)
 
@@ -179,11 +180,11 @@
 	dev_set_drvdata (&dev->dev, data);
 }
 
-#define I2C_DEVNAME(str)   .dev = { .name = str }
+#define I2C_DEVNAME(str)	.name = str
 
 static inline char *i2c_clientname(struct i2c_client *c)
 {
-	return c->dev.name;
+	return &c->name[0];
 }
 
 /*
@@ -251,6 +252,7 @@
 	int nr;
 	struct list_head clients;
 	struct list_head list;
+	char name[DEVICE_NAME_SIZE];
 };
 #define to_i2c_adapter(d) container_of(d, struct i2c_adapter, dev)
 


^ permalink raw reply	[flat|nested] 33+ messages in thread

* [PATCH] More i2c driver changes 2.6.0-test2
@ 2005-05-19  6:24     ` Greg KH
  0 siblings, 0 replies; 33+ messages in thread
From: Greg KH @ 2005-05-19  6:24 UTC (permalink / raw)
  To: linux-kernel, sensors

ChangeSet 1.1125, 2003/08/08 16:24:32-07:00, greg@kroah.com

I2C: fix up driver model programming error.

There was no release function for the objects.
bad greg, no biscuit...


 drivers/i2c/i2c-core.c |   31 ++++++++++++++++++++++++++++++-
 include/linux/i2c.h    |    6 +++++-
 2 files changed, 35 insertions(+), 2 deletions(-)


diff -Nru a/drivers/i2c/i2c-core.c b/drivers/i2c/i2c-core.c
--- a/drivers/i2c/i2c-core.c	Fri Aug  8 16:47:25 2003
+++ b/drivers/i2c/i2c-core.c	Fri Aug  8 16:47:25 2003
@@ -55,6 +55,12 @@
 	return 0;
 }
 
+static void i2c_adapter_dev_release(struct device *dev)
+{
+	struct i2c_adapter *adap = dev_to_i2c_adapter(dev);
+	complete(&adap->dev_released);
+}
+
 static struct device_driver i2c_adapter_driver = {
 	.name =	"i2c_adapter",
 	.bus = &i2c_bus_type,
@@ -62,10 +68,23 @@
 	.remove = i2c_device_remove,
 };
 
+static void i2c_adapter_class_dev_release(struct class_device *dev)
+{
+	struct i2c_adapter *adap = class_dev_to_i2c_adapter(dev);
+	complete(&adap->class_dev_released);
+}
+
 static struct class i2c_adapter_class = {
-	.name =		"i2c-adapter"
+	.name =		"i2c-adapter",
+	.release =	&i2c_adapter_class_dev_release,
 };
 
+static void i2c_client_release(struct device *dev)
+{
+	struct i2c_client *client = to_i2c_client(dev);
+	complete(&client->released);
+}
+
 
 /* ---------------------------------------------------
  * registering functions 
@@ -99,6 +118,7 @@
 		adap->dev.parent = &legacy_bus;
 	sprintf(adap->dev.bus_id, "i2c-%d", adap->nr);
 	adap->dev.driver = &i2c_adapter_driver;
+	adap->dev.release = &i2c_adapter_dev_release;
 	device_register(&adap->dev);
 
 	/* Add this adapter to the i2c_adapter class */
@@ -161,10 +181,16 @@
 	}
 
 	/* clean up the sysfs representation */
+	init_completion(&adap->dev_released);
+	init_completion(&adap->class_dev_released);
 	class_device_unregister(&adap->class_dev);
 	device_unregister(&adap->dev);
 	list_del(&adap->list);
 
+	/* wait for sysfs to drop all references */
+	wait_for_completion(&adap->dev_released);
+	wait_for_completion(&adap->class_dev_released);
+
 	DEB(dev_dbg(&adap->dev, "adapter unregistered\n"));
 
  out_unlock:
@@ -329,6 +355,7 @@
 	client->dev.parent = &client->adapter->dev;
 	client->dev.driver = &client->driver->driver;
 	client->dev.bus = &i2c_bus_type;
+	client->dev.release = &i2c_client_release;
 	
 	snprintf(&client->dev.bus_id[0], sizeof(client->dev.bus_id),
 		"%d-%04x", i2c_adapter_id(adapter), client->addr);
@@ -359,8 +386,10 @@
 
 	down(&adapter->clist_lock);
 	list_del(&client->list);
+	init_completion(&client->released);
 	device_unregister(&client->dev);
 	up(&adapter->clist_lock);
+	wait_for_completion(&client->released);
 
  out:
 	return res;
diff -Nru a/include/linux/i2c.h b/include/linux/i2c.h
--- a/include/linux/i2c.h	Fri Aug  8 16:47:25 2003
+++ b/include/linux/i2c.h	Fri Aug  8 16:47:25 2003
@@ -167,6 +167,7 @@
 	struct device dev;		/* the device structure		*/
 	struct list_head list;
 	char name[DEVICE_NAME_SIZE];
+	struct completion released;
 };
 #define to_i2c_client(d) container_of(d, struct i2c_client, dev)
 
@@ -253,8 +254,11 @@
 	struct list_head clients;
 	struct list_head list;
 	char name[DEVICE_NAME_SIZE];
+	struct completion dev_released;
+	struct completion class_dev_released;
 };
-#define to_i2c_adapter(d) container_of(d, struct i2c_adapter, dev)
+#define dev_to_i2c_adapter(d) container_of(d, struct i2c_adapter, dev)
+#define class_dev_to_i2c_adapter(d) container_of(d, struct i2c_adapter, class_dev)
 
 static inline void *i2c_get_adapdata (struct i2c_adapter *dev)
 {


^ permalink raw reply	[flat|nested] 33+ messages in thread

* [PATCH] More i2c driver changes 2.6.0-test2
@ 2005-05-19  6:24       ` Greg KH
  0 siblings, 0 replies; 33+ messages in thread
From: Greg KH @ 2005-05-19  6:24 UTC (permalink / raw)
  To: linux-kernel, sensors

ChangeSet 1.1126, 2003/08/08 16:33:00-07:00, wodecki@gmx.de

[PATCH] I2C: i2c sysfs rant

On Wed, Aug 06, 2003 at 04:22:44PM -0700, Greg KH wrote:
> On Wed, Aug 06, 2003 at 09:11:45PM +0200, Wiktor Wodecki wrote:
> > Hello folks,
> >
> > I just saw that I2C provides "/sys/bus/i2c/drivers/dev\ driver" in
> > 2.6.0-test2. It would be nice if you'd consider renaming this to
> > dev_driver, to avoid un-neccessary quoting in scripts.
> >
> > Thank You :-)
>
> Patches are always gladly accepted :)

here you go


 drivers/i2c/i2c-dev.c |    2 +-
 1 files changed, 1 insertion(+), 1 deletion(-)


diff -Nru a/drivers/i2c/i2c-dev.c b/drivers/i2c/i2c-dev.c
--- a/drivers/i2c/i2c-dev.c	Fri Aug  8 16:47:15 2003
+++ b/drivers/i2c/i2c-dev.c	Fri Aug  8 16:47:15 2003
@@ -474,7 +474,7 @@
 
 static struct i2c_driver i2cdev_driver = {
 	.owner		= THIS_MODULE,
-	.name		= "dev driver",
+	.name		= "dev_driver",
 	.id		= I2C_DRIVERID_I2CDEV,
 	.flags		= I2C_DF_NOTIFY,
 	.attach_adapter	= i2cdev_attach_adapter,


^ permalink raw reply	[flat|nested] 33+ messages in thread

* [PATCH] More i2c driver changes 2.6.0-test2
@ 2005-05-19  6:24         ` Greg KH
  0 siblings, 0 replies; 33+ messages in thread
From: Greg KH @ 2005-05-19  6:24 UTC (permalink / raw)
  To: linux-kernel, sensors

ChangeSet 1.1127, 2003/08/08 16:36:42-07:00, seanlkml@rogers.com

[PATCH] I2C: Additional P4B subsystem id for hidden asus smbus

  This patch adds another P4B motherboard subsystem identifier to the recent
asus sensor patch for the 2.6 kernel.


 drivers/pci/quirks.c |    9 ++++++---
 1 files changed, 6 insertions(+), 3 deletions(-)


diff -Nru a/drivers/pci/quirks.c b/drivers/pci/quirks.c
--- a/drivers/pci/quirks.c	Fri Aug  8 16:47:06 2003
+++ b/drivers/pci/quirks.c	Fri Aug  8 16:47:06 2003
@@ -681,9 +681,12 @@
 	if (likely(dev->subsystem_vendor != PCI_VENDOR_ID_ASUSTEK))
 		return;
 
-	if ((dev->device = PCI_DEVICE_ID_INTEL_82845_HB) && 
-	    (dev->subsystem_device = 0x8088)) /* P4B533 */
-		asus_hides_smbus = 1;
+	if (dev->device = PCI_DEVICE_ID_INTEL_82845_HB)
+		switch(dev->subsystem_device) {
+		case 0x8070: /* P4B */
+	    	case 0x8088: /* P4B533 */
+			asus_hides_smbus = 1;
+		}
 	if ((dev->device = PCI_DEVICE_ID_INTEL_82845G_HB) &&
 	    (dev->subsystem_device = 0x80b2)) /* P4PE */
 		asus_hides_smbus = 1;


^ permalink raw reply	[flat|nested] 33+ messages in thread

* [BK PATCH] More i2c driver fixes for 2.6.0-test2
  2005-05-19  6:24 ` Greg KH
                   ` (2 preceding siblings ...)
  (?)
@ 2005-05-19  6:24 ` Greg KH
  -1 siblings, 0 replies; 33+ messages in thread
From: Greg KH @ 2005-05-19  6:24 UTC (permalink / raw)
  To: lm-sensors

On Sat, Aug 09, 2003 at 09:38:11AM +0200, Jean Delvare wrote:
> 
> > Here are some more i2c driver fixes for 2.6.0-test2.  They include a
> > fix for the driver model code (no release function, so easy oopses
> > could happen by users), and removing usage of the struct device.name
> > field as that is about to go away.
> > 
> > Please pull from:  bk://kernel.bkbits.net/gregkh/linux/i2c-2.5
> 
> Do any of these apply to our CVS tree?

Nope, in fact it now makes the i2c drivers a bit more compatible with
the older 2.4 versions now that I had to move the name field back into
the i2c structures.

thanks,

greg k-h

^ permalink raw reply	[flat|nested] 33+ messages in thread

* [PATCH] More i2c driver fixes for 2.6.0-test5
@ 2005-05-19  6:24     ` Greg KH
  0 siblings, 0 replies; 33+ messages in thread
From: Greg KH @ 2005-05-19  6:24 UTC (permalink / raw)
  To: linux-kernel, sensors

ChangeSet 1.1325.5.2, 2003/09/24 15:01:39-07:00, greg@kroah.com

[PATCH] I2C: remove unneeded #defines in the eeprom chip driver.


 drivers/i2c/chips/eeprom.c |    7 -------
 1 files changed, 7 deletions(-)


diff -Nru a/drivers/i2c/chips/eeprom.c b/drivers/i2c/chips/eeprom.c
--- a/drivers/i2c/chips/eeprom.c	Thu Sep 25 14:49:30 2003
+++ b/drivers/i2c/chips/eeprom.c	Thu Sep 25 14:49:30 2003
@@ -47,13 +47,6 @@
 /* EEPROM registers */
 #define EEPROM_REG_CHECKSUM	0x3f
 
-/* EEPROM memory types: */
-#define ONE_K			1
-#define TWO_K			2
-#define FOUR_K			3
-#define EIGHT_K			4
-#define SIXTEEN_K		5
-
 /* Size of EEPROM in bytes */
 #define EEPROM_SIZE		256
 


^ permalink raw reply	[flat|nested] 33+ messages in thread

* [PATCH] More i2c driver fixes for 2.6.0-test5
  2005-05-19  6:24     ` Greg KH
@ 2005-05-19  6:24 Greg KH
  2005-05-19  6:24   ` Greg KH
  -1 siblings, 1 reply; 33+ messages in thread
From: Greg KH @ 2005-05-19  6:24 UTC (permalink / raw)
  To: lm-sensors

ChangeSet 1.1325.4.2, 2003/09/23 14:01:39-07:00, greg@kroah.com

[PATCH] I2C: move the i2c algorithm drivers to drivers/i2c/algos


 drivers/i2c/i2c-algo-bit.c       |  567 -------------------------
 drivers/i2c/i2c-algo-ite.c       |  872 ---------------------------------------
 drivers/i2c/i2c-algo-pcf.c       |  479 ---------------------
 drivers/i2c/i2c-ite.h            |  117 -----
 drivers/i2c/i2c-pcf8584.h        |   78 ---
 drivers/i2c/Kconfig              |   38 -
 drivers/i2c/Makefile             |    5 
 drivers/i2c/algos/Kconfig        |   45 ++
 drivers/i2c/algos/Makefile       |    7 
 drivers/i2c/algos/i2c-algo-bit.c |  567 +++++++++++++++++++++++++
 drivers/i2c/algos/i2c-algo-ite.c |  872 +++++++++++++++++++++++++++++++++++++++
 drivers/i2c/algos/i2c-algo-ite.h |  117 +++++
 drivers/i2c/algos/i2c-algo-pcf.c |  479 +++++++++++++++++++++
 drivers/i2c/algos/i2c-algo-pcf.h |   78 +++
 drivers/i2c/busses/i2c-elektor.c |    2 
 15 files changed, 2168 insertions(+), 2155 deletions(-)


diff -Nru a/drivers/i2c/Kconfig b/drivers/i2c/Kconfig
--- a/drivers/i2c/Kconfig	Thu Sep 25 14:49:55 2003
+++ b/drivers/i2c/Kconfig	Thu Sep 25 14:49:55 2003
@@ -37,43 +37,7 @@
 	  This support is also available as a module.  If so, the module 
 	  will be called i2c-dev.
 
-config I2C_ALGOBIT
-	tristate "I2C bit-banging interfaces"
-	depends on I2C
-	help
-	  This allows you to use a range of I2C adapters called bit-banging
-	  adapters.  Say Y if you own an I2C adapter belonging to this class
-	  and then say Y to the specific driver for you adapter below.
-
-	  This support is also available as a module.  If so, the module 
-	  will be called i2c-algo-bit.
-
-config I2C_ALGOPCF
-	tristate "I2C PCF 8584 interfaces"
-	depends on I2C
-	help
-	  This allows you to use a range of I2C adapters called PCF adapters.
-	  Say Y if you own an I2C adapter belonging to this class and then say
-	  Y to the specific driver for you adapter below.
-
-	  This support is also available as a module.  If so, the module 
-	  will be called i2c-algo-pcf.
-
-config I2C_ALGOITE
-	tristate "ITE I2C Algorithm"
-	depends on MIPS_ITE8172 && I2C
-	help
-	  This supports the use of the ITE8172 I2C interface found on some MIPS
-	  systems. Say Y if you have one of these. You should also say Y for
-	  the ITE I2C peripheral driver support below.
-
-	  This support is also available as a module.  If so, the module 
-	  will be called i2c-algo-ite.
-
-config I2C_ALGO8XX
-	tristate "MPC8xx CPM I2C interface"
-	depends on 8xx && I2C
-
+	source drivers/i2c/algos/Kconfig
 	source drivers/i2c/busses/Kconfig
 	source drivers/i2c/chips/Kconfig
 
diff -Nru a/drivers/i2c/Makefile b/drivers/i2c/Makefile
--- a/drivers/i2c/Makefile	Thu Sep 25 14:49:55 2003
+++ b/drivers/i2c/Makefile	Thu Sep 25 14:49:55 2003
@@ -5,7 +5,4 @@
 obj-$(CONFIG_I2C)		+= i2c-core.o
 obj-$(CONFIG_I2C_CHARDEV)	+= i2c-dev.o
 obj-$(CONFIG_I2C_SENSOR)	+= i2c-sensor.o
-obj-$(CONFIG_I2C_ALGOBIT)	+= i2c-algo-bit.o
-obj-$(CONFIG_I2C_ALGOPCF)	+= i2c-algo-pcf.o
-obj-$(CONFIG_I2C_ALGOITE)	+= i2c-algo-ite.o
-obj-y				+= busses/ chips/
+obj-y				+= busses/ chips/ algos/
diff -Nru a/drivers/i2c/algos/Kconfig b/drivers/i2c/algos/Kconfig
--- /dev/null	Wed Dec 31 16:00:00 1969
+++ b/drivers/i2c/algos/Kconfig	Thu Sep 25 14:49:55 2003
@@ -0,0 +1,45 @@
+#
+# Character device configuration
+#
+
+menu "I2C Algorithms"
+
+config I2C_ALGOBIT
+	tristate "I2C bit-banging interfaces"
+	depends on I2C
+	help
+	  This allows you to use a range of I2C adapters called bit-banging
+	  adapters.  Say Y if you own an I2C adapter belonging to this class
+	  and then say Y to the specific driver for you adapter below.
+
+	  This support is also available as a module.  If so, the module 
+	  will be called i2c-algo-bit.
+
+config I2C_ALGOPCF
+	tristate "I2C PCF 8584 interfaces"
+	depends on I2C
+	help
+	  This allows you to use a range of I2C adapters called PCF adapters.
+	  Say Y if you own an I2C adapter belonging to this class and then say
+	  Y to the specific driver for you adapter below.
+
+	  This support is also available as a module.  If so, the module 
+	  will be called i2c-algo-pcf.
+
+config I2C_ALGOITE
+	tristate "ITE I2C Algorithm"
+	depends on MIPS_ITE8172 && I2C
+	help
+	  This supports the use of the ITE8172 I2C interface found on some MIPS
+	  systems. Say Y if you have one of these. You should also say Y for
+	  the ITE I2C peripheral driver support below.
+
+	  This support is also available as a module.  If so, the module 
+	  will be called i2c-algo-ite.
+
+config I2C_ALGO8XX
+	tristate "MPC8xx CPM I2C interface"
+	depends on 8xx && I2C
+
+endmenu
+
diff -Nru a/drivers/i2c/algos/Makefile b/drivers/i2c/algos/Makefile
--- /dev/null	Wed Dec 31 16:00:00 1969
+++ b/drivers/i2c/algos/Makefile	Thu Sep 25 14:49:55 2003
@@ -0,0 +1,7 @@
+#
+# Makefile for the i2c algorithms
+#
+
+obj-$(CONFIG_I2C_ALGOBIT)	+= i2c-algo-bit.o
+obj-$(CONFIG_I2C_ALGOPCF)	+= i2c-algo-pcf.o
+obj-$(CONFIG_I2C_ALGOITE)	+= i2c-algo-ite.o
diff -Nru a/drivers/i2c/algos/i2c-algo-bit.c b/drivers/i2c/algos/i2c-algo-bit.c
--- /dev/null	Wed Dec 31 16:00:00 1969
+++ b/drivers/i2c/algos/i2c-algo-bit.c	Thu Sep 25 14:49:55 2003
@@ -0,0 +1,567 @@
+/* ------------------------------------------------------------------------- */
+/* i2c-algo-bit.c i2c driver algorithms for bit-shift adapters		     */
+/* ------------------------------------------------------------------------- */
+/*   Copyright (C) 1995-2000 Simon G. Vogl
+
+    This program is free software; you can redistribute it and/or modify
+    it under the terms of the GNU General Public License as published by
+    the Free Software Foundation; either version 2 of the License, or
+    (at your option) any later version.
+
+    This program is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+    GNU General Public License for more details.
+
+    You should have received a copy of the GNU General Public License
+    along with this program; if not, write to the Free Software
+    Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.		     */
+/* ------------------------------------------------------------------------- */
+
+/* With some changes from Ky?sti M?lkki <kmalkki@cc.hut.fi> and even
+   Frodo Looijaard <frodol@dds.nl> */
+
+/* $Id: i2c-algo-bit.c,v 1.44 2003/01/21 08:08:16 kmalkki Exp $ */
+
+/* #define DEBUG 1 */
+
+#include <linux/kernel.h>
+#include <linux/module.h>
+#include <linux/delay.h>
+#include <linux/slab.h>
+#include <linux/init.h>
+#include <linux/errno.h>
+#include <linux/sched.h>
+#include <linux/i2c.h>
+#include <linux/i2c-algo-bit.h>
+
+
+/* ----- global defines ----------------------------------------------- */
+#define DEB(x) if (i2c_debug>=1) x;
+#define DEB2(x) if (i2c_debug>=2) x;
+#define DEBSTAT(x) if (i2c_debug>=3) x; /* print several statistical values*/
+#define DEBPROTO(x) if (i2c_debug>=9) { x; }
+ 	/* debug the protocol by showing transferred bits */
+
+
+/* ----- global variables ---------------------------------------------	*/
+
+/* module parameters:
+ */
+static int i2c_debug;
+static int bit_test;	/* see if the line-setting functions work	*/
+
+/* --- setting states on the bus with the right timing: ---------------	*/
+
+#define setsda(adap,val) adap->setsda(adap->data, val)
+#define setscl(adap,val) adap->setscl(adap->data, val)
+#define getsda(adap) adap->getsda(adap->data)
+#define getscl(adap) adap->getscl(adap->data)
+
+static inline void sdalo(struct i2c_algo_bit_data *adap)
+{
+	setsda(adap,0);
+	udelay(adap->udelay);
+}
+
+static inline void sdahi(struct i2c_algo_bit_data *adap)
+{
+	setsda(adap,1);
+	udelay(adap->udelay);
+}
+
+static inline void scllo(struct i2c_algo_bit_data *adap)
+{
+	setscl(adap,0);
+	udelay(adap->udelay);
+}
+
+/*
+ * Raise scl line, and do checking for delays. This is necessary for slower
+ * devices.
+ */
+static inline int sclhi(struct i2c_algo_bit_data *adap)
+{
+	unsigned long start;
+
+	setscl(adap,1);
+
+	/* Not all adapters have scl sense line... */
+	if (adap->getscl = NULL )
+		return 0;
+
+	start=jiffies;
+	while (! getscl(adap) ) {	
+ 		/* the hw knows how to read the clock line,
+ 		 * so we wait until it actually gets high.
+ 		 * This is safer as some chips may hold it low
+ 		 * while they are processing data internally. 
+ 		 */
+		if (time_after_eq(jiffies, start+adap->timeout)) {
+			return -ETIMEDOUT;
+		}
+		cond_resched();
+	}
+	DEBSTAT(printk(KERN_DEBUG "needed %ld jiffies\n", jiffies-start));
+	udelay(adap->udelay);
+	return 0;
+} 
+
+
+/* --- other auxiliary functions --------------------------------------	*/
+static void i2c_start(struct i2c_algo_bit_data *adap) 
+{
+	/* assert: scl, sda are high */
+	DEBPROTO(printk("S "));
+	sdalo(adap);
+	scllo(adap);
+}
+
+static void i2c_repstart(struct i2c_algo_bit_data *adap) 
+{
+	/* scl, sda may not be high */
+	DEBPROTO(printk(" Sr "));
+	setsda(adap,1);
+	sclhi(adap);
+	udelay(adap->udelay);
+	
+	sdalo(adap);
+	scllo(adap);
+}
+
+
+static void i2c_stop(struct i2c_algo_bit_data *adap) 
+{
+	DEBPROTO(printk("P\n"));
+	/* assert: scl is low */
+	sdalo(adap);
+	sclhi(adap); 
+	sdahi(adap);
+}
+
+
+
+/* send a byte without start cond., look for arbitration, 
+   check ackn. from slave */
+/* returns:
+ * 1 if the device acknowledged
+ * 0 if the device did not ack
+ * -ETIMEDOUT if an error occurred (while raising the scl line)
+ */
+static int i2c_outb(struct i2c_adapter *i2c_adap, char c)
+{
+	int i;
+	int sb;
+	int ack;
+	struct i2c_algo_bit_data *adap = i2c_adap->algo_data;
+
+	/* assert: scl is low */
+	for ( i=7 ; i>=0 ; i-- ) {
+		sb = c & ( 1 << i );
+		setsda(adap,sb);
+		udelay(adap->udelay);
+		DEBPROTO(printk(KERN_DEBUG "%d",sb!=0));
+		if (sclhi(adap)<0) { /* timed out */
+			sdahi(adap); /* we don't want to block the net */
+			DEB2(printk(KERN_DEBUG " i2c_outb: 0x%02x, timeout at bit #%d\n", c&0xff, i));
+			return -ETIMEDOUT;
+		};
+		/* do arbitration here: 
+		 * if ( sb && ! getsda(adap) ) -> ouch! Get out of here.
+		 */
+		setscl(adap, 0 );
+		udelay(adap->udelay);
+	}
+	sdahi(adap);
+	if (sclhi(adap)<0){ /* timeout */
+	    DEB2(printk(KERN_DEBUG " i2c_outb: 0x%02x, timeout at ack\n", c&0xff));
+	    return -ETIMEDOUT;
+	};
+	/* read ack: SDA should be pulled down by slave */
+	ack=getsda(adap);	/* ack: sda is pulled low ->success.	 */
+	DEB2(printk(KERN_DEBUG " i2c_outb: 0x%02x , getsda() = %d\n", c & 0xff, ack));
+
+	DEBPROTO( printk(KERN_DEBUG "[%2.2x]",c&0xff) );
+	DEBPROTO(if (0=ack){ printk(KERN_DEBUG " A ");} else printk(KERN_DEBUG " NA ") );
+	scllo(adap);
+	return 0=ack;		/* return 1 if device acked	 */
+	/* assert: scl is low (sda undef) */
+}
+
+
+static int i2c_inb(struct i2c_adapter *i2c_adap) 
+{
+	/* read byte via i2c port, without start/stop sequence	*/
+	/* acknowledge is sent in i2c_read.			*/
+	int i;
+	unsigned char indata=0;
+	struct i2c_algo_bit_data *adap = i2c_adap->algo_data;
+
+	/* assert: scl is low */
+	sdahi(adap);
+	for (i=0;i<8;i++) {
+		if (sclhi(adap)<0) { /* timeout */
+			DEB2(printk(KERN_DEBUG " i2c_inb: timeout at bit #%d\n", 7-i));
+			return -ETIMEDOUT;
+		};
+		indata *= 2;
+		if ( getsda(adap) ) 
+			indata |= 0x01;
+		scllo(adap);
+	}
+	/* assert: scl is low */
+	DEB2(printk(KERN_DEBUG "i2c_inb: 0x%02x\n", indata & 0xff));
+
+	DEBPROTO(printk(KERN_DEBUG " 0x%02x", indata & 0xff));
+	return (int) (indata & 0xff);
+}
+
+/*
+ * Sanity check for the adapter hardware - check the reaction of
+ * the bus lines only if it seems to be idle.
+ */
+static int test_bus(struct i2c_algo_bit_data *adap, char* name) {
+	int scl,sda;
+	sda=getsda(adap);
+	if (adap->getscl=NULL) {
+		printk(KERN_WARNING "i2c-algo-bit.o: Warning: Adapter can't read from clock line - skipping test.\n");
+		return 0;		
+	}
+	scl=getscl(adap);
+	printk(KERN_INFO "i2c-algo-bit.o: Adapter: %s scl: %d  sda: %d -- testing...\n",
+	       name,getscl(adap),getsda(adap));
+	if (!scl || !sda ) {
+		printk(KERN_INFO " i2c-algo-bit.o: %s seems to be busy.\n",name);
+		goto bailout;
+	}
+	sdalo(adap);
+	printk(KERN_DEBUG "i2c-algo-bit.o:1 scl: %d  sda: %d \n",getscl(adap),
+	       getsda(adap));
+	if ( 0 != getsda(adap) ) {
+		printk(KERN_WARNING "i2c-algo-bit.o: %s SDA stuck high!\n",name);
+		sdahi(adap);
+		goto bailout;
+	}
+	if ( 0 = getscl(adap) ) {
+		printk(KERN_WARNING "i2c-algo-bit.o: %s SCL unexpected low while pulling SDA low!\n",
+			name);
+		goto bailout;
+	}		
+	sdahi(adap);
+	printk(KERN_DEBUG "i2c-algo-bit.o:2 scl: %d  sda: %d \n",getscl(adap),
+	       getsda(adap));
+	if ( 0 = getsda(adap) ) {
+		printk(KERN_WARNING "i2c-algo-bit.o: %s SDA stuck low!\n",name);
+		sdahi(adap);
+		goto bailout;
+	}
+	if ( 0 = getscl(adap) ) {
+		printk(KERN_WARNING "i2c-algo-bit.o: %s SCL unexpected low while SDA high!\n",
+		       name);
+	goto bailout;
+	}
+	scllo(adap);
+	printk(KERN_DEBUG "i2c-algo-bit.o:3 scl: %d  sda: %d \n",getscl(adap),
+	       getsda(adap));
+	if ( 0 != getscl(adap) ) {
+		printk(KERN_WARNING "i2c-algo-bit.o: %s SCL stuck high!\n",name);
+		sclhi(adap);
+		goto bailout;
+	}
+	if ( 0 = getsda(adap) ) {
+		printk(KERN_WARNING "i2c-algo-bit.o: %s SDA unexpected low while pulling SCL low!\n",
+			name);
+		goto bailout;
+	}
+	sclhi(adap);
+	printk(KERN_DEBUG "i2c-algo-bit.o:4 scl: %d  sda: %d \n",getscl(adap),
+	       getsda(adap));
+	if ( 0 = getscl(adap) ) {
+		printk(KERN_WARNING "i2c-algo-bit.o: %s SCL stuck low!\n",name);
+		sclhi(adap);
+		goto bailout;
+	}
+	if ( 0 = getsda(adap) ) {
+		printk(KERN_WARNING "i2c-algo-bit.o: %s SDA unexpected low while SCL high!\n",
+			name);
+		goto bailout;
+	}
+	printk(KERN_INFO "i2c-algo-bit.o: %s passed test.\n",name);
+	return 0;
+bailout:
+	sdahi(adap);
+	sclhi(adap);
+	return -ENODEV;
+}
+
+/* ----- Utility functions
+ */
+
+/* try_address tries to contact a chip for a number of
+ * times before it gives up.
+ * return values:
+ * 1 chip answered
+ * 0 chip did not answer
+ * -x transmission error
+ */
+static inline int try_address(struct i2c_adapter *i2c_adap,
+		       unsigned char addr, int retries)
+{
+	struct i2c_algo_bit_data *adap = i2c_adap->algo_data;
+	int i,ret = -1;
+	for (i=0;i<=retries;i++) {
+		ret = i2c_outb(i2c_adap,addr);
+		if (ret=1)
+			break;	/* success! */
+		i2c_stop(adap);
+		udelay(5/*adap->udelay*/);
+		if (i=retries)  /* no success */
+			break;
+		i2c_start(adap);
+		udelay(adap->udelay);
+	}
+	DEB2(if (i)
+	     printk(KERN_DEBUG "i2c-algo-bit.o: Used %d tries to %s client at 0x%02x : %s\n",
+		    i+1, addr & 1 ? "read" : "write", addr>>1,
+		    ret=1 ? "success" : ret=0 ? "no ack" : "failed, timeout?" )
+	    );
+	return ret;
+}
+
+static int sendbytes(struct i2c_adapter *i2c_adap, struct i2c_msg *msg)
+{
+	struct i2c_algo_bit_data *adap = i2c_adap->algo_data;
+	char c;
+	const char *temp = msg->buf;
+	int count = msg->len;
+	unsigned short nak_ok = msg->flags & I2C_M_IGNORE_NAK; 
+	int retval;
+	int wrcount=0;
+
+	while (count > 0) {
+		c = *temp;
+		DEB2(dev_dbg(&i2c_adap->dev, "sendbytes: writing %2.2X\n", c&0xff));
+		retval = i2c_outb(i2c_adap,c);
+		if ((retval>0) || (nak_ok && (retval=0)))  { /* ok or ignored NAK */
+			count--; 
+			temp++;
+			wrcount++;
+		} else { /* arbitration or no acknowledge */
+			dev_err(&i2c_adap->dev, "sendbytes: error - bailout.\n");
+			i2c_stop(adap);
+			return (retval<0)? retval : -EFAULT;
+			        /* got a better one ?? */
+		}
+#if 0
+		/* from asm/delay.h */
+		__delay(adap->mdelay * (loops_per_sec / 1000) );
+#endif
+	}
+	return wrcount;
+}
+
+static inline int readbytes(struct i2c_adapter *i2c_adap, struct i2c_msg *msg)
+{
+	int inval;
+	int rdcount=0;   	/* counts bytes read */
+	struct i2c_algo_bit_data *adap = i2c_adap->algo_data;
+	char *temp = msg->buf;
+	int count = msg->len;
+
+	while (count > 0) {
+		inval = i2c_inb(i2c_adap);
+/*printk("%#02x ",inval); if ( ! (count % 16) ) printk("\n"); */
+		if (inval>=0) {
+			*temp = inval;
+			rdcount++;
+		} else {   /* read timed out */
+			printk(KERN_ERR "i2c-algo-bit.o: readbytes: i2c_inb timed out.\n");
+			break;
+		}
+
+		if ( count > 1 ) {		/* send ack */
+			sdalo(adap);
+			DEBPROTO(printk(" Am "));
+		} else {
+			sdahi(adap);	/* neg. ack on last byte */
+			DEBPROTO(printk(" NAm "));
+		}
+		if (sclhi(adap)<0) {	/* timeout */
+			sdahi(adap);
+			printk(KERN_ERR "i2c-algo-bit.o: readbytes: Timeout at ack\n");
+			return -ETIMEDOUT;
+		};
+		scllo(adap);
+		sdahi(adap);
+		temp++;
+		count--;
+	}
+	return rdcount;
+}
+
+/* doAddress initiates the transfer by generating the start condition (in
+ * try_address) and transmits the address in the necessary format to handle
+ * reads, writes as well as 10bit-addresses.
+ * returns:
+ *  0 everything went okay, the chip ack'ed, or IGNORE_NAK flag was set
+ * -x an error occurred (like: -EREMOTEIO if the device did not answer, or
+ *	-ETIMEDOUT, for example if the lines are stuck...) 
+ */
+static inline int bit_doAddress(struct i2c_adapter *i2c_adap, struct i2c_msg *msg) 
+{
+	unsigned short flags = msg->flags;
+	unsigned short nak_ok = msg->flags & I2C_M_IGNORE_NAK;
+	struct i2c_algo_bit_data *adap = i2c_adap->algo_data;
+
+	unsigned char addr;
+	int ret, retries;
+
+	retries = nak_ok ? 0 : i2c_adap->retries;
+	
+	if ( (flags & I2C_M_TEN)  ) { 
+		/* a ten bit address */
+		addr = 0xf0 | (( msg->addr >> 7) & 0x03);
+		DEB2(printk(KERN_DEBUG "addr0: %d\n",addr));
+		/* try extended address code...*/
+		ret = try_address(i2c_adap, addr, retries);
+		if ((ret != 1) && !nak_ok)  {
+			printk(KERN_ERR "died at extended address code.\n");
+			return -EREMOTEIO;
+		}
+		/* the remaining 8 bit address */
+		ret = i2c_outb(i2c_adap,msg->addr & 0x7f);
+		if ((ret != 1) && !nak_ok) {
+			/* the chip did not ack / xmission error occurred */
+			printk(KERN_ERR "died at 2nd address code.\n");
+			return -EREMOTEIO;
+		}
+		if ( flags & I2C_M_RD ) {
+			i2c_repstart(adap);
+			/* okay, now switch into reading mode */
+			addr |= 0x01;
+			ret = try_address(i2c_adap, addr, retries);
+			if ((ret!=1) && !nak_ok) {
+				printk(KERN_ERR "died at extended address code.\n");
+				return -EREMOTEIO;
+			}
+		}
+	} else {		/* normal 7bit address	*/
+		addr = ( msg->addr << 1 );
+		if (flags & I2C_M_RD )
+			addr |= 1;
+		if (flags & I2C_M_REV_DIR_ADDR )
+			addr ^= 1;
+		ret = try_address(i2c_adap, addr, retries);
+		if ((ret!=1) && !nak_ok)
+			return -EREMOTEIO;
+	}
+
+	return 0;
+}
+
+static int bit_xfer(struct i2c_adapter *i2c_adap,
+		    struct i2c_msg msgs[], int num)
+{
+	struct i2c_msg *pmsg;
+	struct i2c_algo_bit_data *adap = i2c_adap->algo_data;
+	
+	int i,ret;
+	unsigned short nak_ok;
+
+	i2c_start(adap);
+	for (i=0;i<num;i++) {
+		pmsg = &msgs[i];
+		nak_ok = pmsg->flags & I2C_M_IGNORE_NAK; 
+		if (!(pmsg->flags & I2C_M_NOSTART)) {
+			if (i) {
+				i2c_repstart(adap);
+			}
+			ret = bit_doAddress(i2c_adap, pmsg);
+			if ((ret != 0) && !nak_ok) {
+			    DEB2(printk(KERN_DEBUG "i2c-algo-bit.o: NAK from device addr %2.2x msg #%d\n"
+					,msgs[i].addr,i));
+			    return (ret<0) ? ret : -EREMOTEIO;
+			}
+		}
+		if (pmsg->flags & I2C_M_RD ) {
+			/* read bytes into buffer*/
+			ret = readbytes(i2c_adap, pmsg);
+			DEB2(printk(KERN_DEBUG "i2c-algo-bit.o: read %d bytes.\n",ret));
+			if (ret < pmsg->len ) {
+				return (ret<0)? ret : -EREMOTEIO;
+			}
+		} else {
+			/* write bytes from buffer */
+			ret = sendbytes(i2c_adap, pmsg);
+			DEB2(printk(KERN_DEBUG "i2c-algo-bit.o: wrote %d bytes.\n",ret));
+			if (ret < pmsg->len ) {
+				return (ret<0) ? ret : -EREMOTEIO;
+			}
+		}
+	}
+	i2c_stop(adap);
+	return num;
+}
+
+static u32 bit_func(struct i2c_adapter *adap)
+{
+	return I2C_FUNC_SMBUS_EMUL | I2C_FUNC_10BIT_ADDR | 
+	       I2C_FUNC_PROTOCOL_MANGLING;
+}
+
+
+/* -----exported algorithm data: -------------------------------------	*/
+
+static struct i2c_algorithm i2c_bit_algo = {
+	.name		= "Bit-shift algorithm",
+	.id		= I2C_ALGO_BIT,
+	.master_xfer	= bit_xfer,
+	.functionality	= bit_func,
+};
+
+/* 
+ * registering functions to load algorithms at runtime 
+ */
+int i2c_bit_add_bus(struct i2c_adapter *adap)
+{
+	struct i2c_algo_bit_data *bit_adap = adap->algo_data;
+
+	if (bit_test) {
+		int ret = test_bus(bit_adap, adap->name);
+		if (ret<0)
+			return -ENODEV;
+	}
+
+	DEB2(dev_dbg(&adap->dev, "hw routines registered.\n"));
+
+	/* register new adapter to i2c module... */
+
+	adap->id |= i2c_bit_algo.id;
+	adap->algo = &i2c_bit_algo;
+
+	adap->timeout = 100;	/* default values, should	*/
+	adap->retries = 3;	/* be replaced by defines	*/
+
+	i2c_add_adapter(adap);
+	return 0;
+}
+
+
+int i2c_bit_del_bus(struct i2c_adapter *adap)
+{
+	return i2c_del_adapter(adap);
+}
+
+EXPORT_SYMBOL(i2c_bit_add_bus);
+EXPORT_SYMBOL(i2c_bit_del_bus);
+
+MODULE_AUTHOR("Simon G. Vogl <simon@tk.uni-linz.ac.at>");
+MODULE_DESCRIPTION("I2C-Bus bit-banging algorithm");
+MODULE_LICENSE("GPL");
+
+MODULE_PARM(bit_test, "i");
+MODULE_PARM(i2c_debug,"i");
+
+MODULE_PARM_DESC(bit_test, "Test the lines of the bus to see if it is stuck");
+MODULE_PARM_DESC(i2c_debug,
+		 "debug level - 0 off; 1 normal; 2,3 more verbose; 9 bit-protocol");
diff -Nru a/drivers/i2c/algos/i2c-algo-ite.c b/drivers/i2c/algos/i2c-algo-ite.c
--- /dev/null	Wed Dec 31 16:00:00 1969
+++ b/drivers/i2c/algos/i2c-algo-ite.c	Thu Sep 25 14:49:55 2003
@@ -0,0 +1,872 @@
+/*
+   -------------------------------------------------------------------------
+   i2c-algo-ite.c i2c driver algorithms for ITE adapters	    
+   
+   Hai-Pao Fan, MontaVista Software, Inc.
+   hpfan@mvista.com or source@mvista.com
+
+   Copyright 2000 MontaVista Software Inc.
+
+   ---------------------------------------------------------------------------
+   This file was highly leveraged from i2c-algo-pcf.c, which was created
+   by Simon G. Vogl and Hans Berglund:
+
+
+     Copyright (C) 1995-1997 Simon G. Vogl
+                   1998-2000 Hans Berglund
+
+    This program is free software; you can redistribute it and/or modify
+    it under the terms of the GNU General Public License as published by
+    the Free Software Foundation; either version 2 of the License, or
+    (at your option) any later version.
+
+    This program is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+    GNU General Public License for more details.
+
+    You should have received a copy of the GNU General Public License
+    along with this program; if not, write to the Free Software
+    Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.		     */
+/* ------------------------------------------------------------------------- */
+
+/* With some changes from Ky?sti M?lkki <kmalkki@cc.hut.fi> and 
+   Frodo Looijaard <frodol@dds.nl> ,and also from Martin Bailey
+   <mbailey@littlefeet-inc.com> */
+
+#include <linux/kernel.h>
+#include <linux/module.h>
+#include <linux/delay.h>
+#include <linux/slab.h>
+#include <linux/init.h>
+#include <asm/uaccess.h>
+#include <linux/ioport.h>
+#include <linux/errno.h>
+#include <linux/sched.h>
+
+#include <linux/i2c.h>
+#include <linux/i2c-algo-ite.h>
+#include "i2c-algo-ite.h"
+
+#define	PM_DSR		IT8172_PCI_IO_BASE + IT_PM_DSR
+#define	PM_IBSR		IT8172_PCI_IO_BASE + IT_PM_DSR + 0x04 
+#define GPIO_CCR	IT8172_PCI_IO_BASE + IT_GPCCR
+
+/* ----- global defines ----------------------------------------------- */
+#define DEB(x) if (i2c_debug>=1) x
+#define DEB2(x) if (i2c_debug>=2) x
+#define DEB3(x) if (i2c_debug>=3) x /* print several statistical values*/
+#define DEBPROTO(x) if (i2c_debug>=9) x;
+ 	/* debug the protocol by showing transferred bits */
+#define DEF_TIMEOUT 16
+
+/* debugging - slow down transfer to have a look at the data .. 	*/
+/* I use this with two leds&resistors, each one connected to sda,scl 	*/
+/* respectively. This makes sure that the algorithm works. Some chips   */
+/* might not like this, as they have an internal timeout of some mils	*/
+/*
+#define SLO_IO      jif=jiffies;while(jiffies<=jif+i2c_table[minor].veryslow)\
+                        cond_resched();
+*/
+
+
+/* ----- global variables ---------------------------------------------	*/
+
+#ifdef SLO_IO
+	int jif;
+#endif
+
+/* module parameters:
+ */
+static int i2c_debug=1;
+static int iic_test=0;	/* see if the line-setting functions work	*/
+static int iic_scan=0;	/* have a look at what's hanging 'round		*/
+
+/* --- setting states on the bus with the right timing: ---------------	*/
+
+#define get_clock(adap) adap->getclock(adap->data)
+#define iic_outw(adap, reg, val) adap->setiic(adap->data, reg, val)
+#define iic_inw(adap, reg) adap->getiic(adap->data, reg)
+
+
+/* --- other auxiliary functions --------------------------------------	*/
+
+static void iic_start(struct i2c_algo_iic_data *adap)
+{
+	iic_outw(adap,ITE_I2CHCR,ITE_CMD);
+}
+
+static void iic_stop(struct i2c_algo_iic_data *adap)
+{
+	iic_outw(adap,ITE_I2CHCR,0);
+	iic_outw(adap,ITE_I2CHSR,ITE_I2CHSR_TDI);
+}
+
+static void iic_reset(struct i2c_algo_iic_data *adap)
+{
+	iic_outw(adap, PM_IBSR, iic_inw(adap, PM_IBSR) | 0x80);
+}
+
+
+static int wait_for_bb(struct i2c_algo_iic_data *adap)
+{
+	int timeout = DEF_TIMEOUT;
+	short status;
+
+	status = iic_inw(adap, ITE_I2CHSR);
+#ifndef STUB_I2C
+	while (timeout-- && (status & ITE_I2CHSR_HB)) {
+		udelay(1000); /* How much is this? */
+		status = iic_inw(adap, ITE_I2CHSR);
+	}
+#endif
+	if (timeout<=0) {
+		printk(KERN_ERR "Timeout, host is busy\n");
+		iic_reset(adap);
+	}
+	return(timeout<=0);
+}
+
+/*
+ * Puts this process to sleep for a period equal to timeout 
+ */
+static inline void iic_sleep(unsigned long timeout)
+{
+	schedule_timeout( timeout * HZ);
+}
+
+/* After we issue a transaction on the IIC bus, this function
+ * is called.  It puts this process to sleep until we get an interrupt from
+ * from the controller telling us that the transaction we requested in complete.
+ */
+static int wait_for_pin(struct i2c_algo_iic_data *adap, short *status) {
+
+	int timeout = DEF_TIMEOUT;
+	
+	timeout = wait_for_bb(adap);
+	if (timeout) {
+  		DEB2(printk("Timeout waiting for host not busy\n");)
+  		return -EIO;
+	}                           
+	timeout = DEF_TIMEOUT;
+
+	*status = iic_inw(adap, ITE_I2CHSR);
+#ifndef STUB_I2C
+	while (timeout-- && !(*status & ITE_I2CHSR_TDI)) {
+	   adap->waitforpin();
+	   *status = iic_inw(adap, ITE_I2CHSR);
+	}
+#endif
+	if (timeout <= 0)
+		return(-1);
+	else
+		return(0);
+}
+
+static int wait_for_fe(struct i2c_algo_iic_data *adap, short *status)
+{
+	int timeout = DEF_TIMEOUT;
+
+	*status = iic_inw(adap, ITE_I2CFSR);
+#ifndef STUB_I2C 
+	while (timeout-- && (*status & ITE_I2CFSR_FE)) {
+		udelay(1000);
+		iic_inw(adap, ITE_I2CFSR);
+	}
+#endif
+	if (timeout <= 0) 
+		return(-1);
+	else
+		return(0);
+}
+
+static int iic_init (struct i2c_algo_iic_data *adap)
+{
+	short i;
+
+	/* Clear bit 7 to set I2C to normal operation mode */
+	i=iic_inw(adap, PM_DSR)& 0xff7f;
+	iic_outw(adap, PM_DSR, i);
+
+	/* set IT_GPCCR port C bit 2&3 as function 2 */
+	i = iic_inw(adap, GPIO_CCR) & 0xfc0f;
+	iic_outw(adap,GPIO_CCR,i);
+
+	/* Clear slave address/sub-address */
+	iic_outw(adap,ITE_I2CSAR, 0);
+	iic_outw(adap,ITE_I2CSSAR, 0);
+
+	/* Set clock counter register */
+	iic_outw(adap,ITE_I2CCKCNT, get_clock(adap));
+
+	/* Set START/reSTART/STOP time registers */
+	iic_outw(adap,ITE_I2CSHDR, 0x0a);
+	iic_outw(adap,ITE_I2CRSUR, 0x0a);
+	iic_outw(adap,ITE_I2CPSUR, 0x0a);
+
+	/* Enable interrupts on completing the current transaction */
+	iic_outw(adap,ITE_I2CHCR, ITE_I2CHCR_IE | ITE_I2CHCR_HCE);
+
+	/* Clear transfer count */
+	iic_outw(adap,ITE_I2CFBCR, 0x0);
+
+	DEB2(printk("iic_init: Initialized IIC on ITE 0x%x\n",
+		iic_inw(adap, ITE_I2CHSR)));
+	return 0;
+}
+
+
+/*
+ * Sanity check for the adapter hardware - check the reaction of
+ * the bus lines only if it seems to be idle.
+ */
+static int test_bus(struct i2c_algo_iic_data *adap, char *name) {
+#if 0
+	int scl,sda;
+	sda=getsda(adap);
+	if (adap->getscl=NULL) {
+		printk("test_bus: Warning: Adapter can't read from clock line - skipping test.\n");
+		return 0;		
+	}
+	scl=getscl(adap);
+	printk("test_bus: Adapter: %s scl: %d  sda: %d -- testing...\n",
+	name,getscl(adap),getsda(adap));
+	if (!scl || !sda ) {
+		printk("test_bus: %s seems to be busy.\n",adap->name);
+		goto bailout;
+	}
+	sdalo(adap);
+	printk("test_bus:1 scl: %d  sda: %d \n",getscl(adap),
+	       getsda(adap));
+	if ( 0 != getsda(adap) ) {
+		printk("test_bus: %s SDA stuck high!\n",name);
+		sdahi(adap);
+		goto bailout;
+	}
+	if ( 0 = getscl(adap) ) {
+		printk("test_bus: %s SCL unexpected low while pulling SDA low!\n",
+			name);
+		goto bailout;
+	}		
+	sdahi(adap);
+	printk("test_bus:2 scl: %d  sda: %d \n",getscl(adap),
+	       getsda(adap));
+	if ( 0 = getsda(adap) ) {
+		printk("test_bus: %s SDA stuck low!\n",name);
+		sdahi(adap);
+		goto bailout;
+	}
+	if ( 0 = getscl(adap) ) {
+		printk("test_bus: %s SCL unexpected low while SDA high!\n",
+		       adap->name);
+	goto bailout;
+	}
+	scllo(adap);
+	printk("test_bus:3 scl: %d  sda: %d \n",getscl(adap),
+	       getsda(adap));
+	if ( 0 != getscl(adap) ) {
+
+		sclhi(adap);
+		goto bailout;
+	}
+	if ( 0 = getsda(adap) ) {
+		printk("test_bus: %s SDA unexpected low while pulling SCL low!\n",
+			name);
+		goto bailout;
+	}
+	sclhi(adap);
+	printk("test_bus:4 scl: %d  sda: %d \n",getscl(adap),
+	       getsda(adap));
+	if ( 0 = getscl(adap) ) {
+		printk("test_bus: %s SCL stuck low!\n",name);
+		sclhi(adap);
+		goto bailout;
+	}
+	if ( 0 = getsda(adap) ) {
+		printk("test_bus: %s SDA unexpected low while SCL high!\n",
+			name);
+		goto bailout;
+	}
+	printk("test_bus: %s passed test.\n",name);
+	return 0;
+bailout:
+	sdahi(adap);
+	sclhi(adap);
+	return -ENODEV;
+#endif
+	return (0);
+}
+
+/* ----- Utility functions
+ */
+
+
+/* Verify the device we want to talk to on the IIC bus really exists. */
+static inline int try_address(struct i2c_algo_iic_data *adap,
+		       unsigned int addr, int retries)
+{
+	int i, ret = -1;
+	short status;
+
+	for (i=0;i<retries;i++) {
+		iic_outw(adap, ITE_I2CSAR, addr);
+		iic_start(adap);
+		if (wait_for_pin(adap, &status) = 0) {
+			if ((status & ITE_I2CHSR_DNE) = 0) { 
+				iic_stop(adap);
+				iic_outw(adap, ITE_I2CFCR, ITE_I2CFCR_FLUSH);
+				ret=1;
+				break;	/* success! */
+			}
+		}
+		iic_stop(adap);
+		udelay(adap->udelay);
+	}
+	DEB2(if (i) printk("try_address: needed %d retries for 0x%x\n",i,
+	                   addr));
+	return ret;
+}
+
+
+static int iic_sendbytes(struct i2c_adapter *i2c_adap,const char *buf,
+                         int count)
+{
+	struct i2c_algo_iic_data *adap = i2c_adap->algo_data;
+	int wrcount=0, timeout;
+	short status;
+	int loops, remainder, i, j;
+	union {
+		char byte[2];
+		unsigned short word;
+	} tmp;
+   
+	iic_outw(adap, ITE_I2CSSAR, (unsigned short)buf[wrcount++]);
+	count--;
+	if (count = 0)
+		return -EIO;
+
+	loops =  count / 32;		/* 32-byte FIFO */
+	remainder = count % 32;
+
+	if(loops) {
+		for(i=0; i<loops; i++) {
+
+			iic_outw(adap, ITE_I2CFBCR, 32);
+			for(j=0; j<32/2; j++) {
+				tmp.byte[1] = buf[wrcount++];
+				tmp.byte[0] = buf[wrcount++];
+				iic_outw(adap, ITE_I2CFDR, tmp.word); 
+			}
+
+			/* status FIFO overrun */
+			iic_inw(adap, ITE_I2CFSR);
+			iic_inw(adap, ITE_I2CFBCR);
+
+			iic_outw(adap, ITE_I2CHCR, ITE_WRITE);	/* Issue WRITE command */
+
+			/* Wait for transmission to complete */
+			timeout = wait_for_pin(adap, &status);
+			if(timeout) {
+				iic_stop(adap);
+				printk("iic_sendbytes: %s write timeout.\n", i2c_adap->name);
+				return -EREMOTEIO; /* got a better one ?? */
+     	}
+			if (status & ITE_I2CHSR_DB) {
+				iic_stop(adap);
+				printk("iic_sendbytes: %s write error - no ack.\n", i2c_adap->name);
+				return -EREMOTEIO; /* got a better one ?? */
+			}
+		}
+	}
+	if(remainder) {
+		iic_outw(adap, ITE_I2CFBCR, remainder);
+		for(i=0; i<remainder/2; i++) {
+			tmp.byte[1] = buf[wrcount++];
+			tmp.byte[0] = buf[wrcount++];
+			iic_outw(adap, ITE_I2CFDR, tmp.word);
+		}
+
+		/* status FIFO overrun */
+		iic_inw(adap, ITE_I2CFSR);
+		iic_inw(adap, ITE_I2CFBCR);
+
+		iic_outw(adap, ITE_I2CHCR, ITE_WRITE);  /* Issue WRITE command */
+
+		timeout = wait_for_pin(adap, &status);
+		if(timeout) {
+			iic_stop(adap);
+			printk("iic_sendbytes: %s write timeout.\n", i2c_adap->name);
+			return -EREMOTEIO; /* got a better one ?? */
+		}
+#ifndef STUB_I2C
+		if (status & ITE_I2CHSR_DB) { 
+			iic_stop(adap);
+			printk("iic_sendbytes: %s write error - no ack.\n", i2c_adap->name);
+			return -EREMOTEIO; /* got a better one ?? */
+		}
+#endif
+	}
+	iic_stop(adap);
+	return wrcount;
+}
+
+
+static int iic_readbytes(struct i2c_adapter *i2c_adap, char *buf, int count,
+	int sread)
+{
+	int rdcount=0, i, timeout;
+	short status;
+	struct i2c_algo_iic_data *adap = i2c_adap->algo_data;
+	int loops, remainder, j;
+	union {
+		char byte[2];
+		unsigned short word;
+	} tmp;
+		
+	loops = count / 32;				/* 32-byte FIFO */
+	remainder = count % 32;
+
+	if(loops) {
+		for(i=0; i<loops; i++) {
+			iic_outw(adap, ITE_I2CFBCR, 32);
+			if (sread)
+				iic_outw(adap, ITE_I2CHCR, ITE_SREAD);
+			else
+				iic_outw(adap, ITE_I2CHCR, ITE_READ);		/* Issue READ command */
+
+			timeout = wait_for_pin(adap, &status);
+			if(timeout) {
+				iic_stop(adap);
+				printk("iic_readbytes:  %s read timeout.\n", i2c_adap->name);
+				return (-1);
+			}
+#ifndef STUB_I2C
+			if (status & ITE_I2CHSR_DB) {
+				iic_stop(adap);
+				printk("iic_readbytes: %s read error - no ack.\n", i2c_adap->name);
+				return (-1);
+			}
+#endif
+
+			timeout = wait_for_fe(adap, &status);
+			if(timeout) {
+				iic_stop(adap);
+				printk("iic_readbytes:  %s FIFO is empty\n", i2c_adap->name);
+				return (-1); 
+			}
+
+			for(j=0; j<32/2; j++) {
+				tmp.word = iic_inw(adap, ITE_I2CFDR);
+				buf[rdcount++] = tmp.byte[1];
+				buf[rdcount++] = tmp.byte[0];
+			}
+
+			/* status FIFO underrun */
+			iic_inw(adap, ITE_I2CFSR);
+
+		}
+	}
+
+
+	if(remainder) {
+		remainder=(remainder+1)/2 * 2;
+		iic_outw(adap, ITE_I2CFBCR, remainder);
+		if (sread)
+			iic_outw(adap, ITE_I2CHCR, ITE_SREAD);
+		else
+		iic_outw(adap, ITE_I2CHCR, ITE_READ);		/* Issue READ command */
+
+		timeout = wait_for_pin(adap, &status);
+		if(timeout) {
+			iic_stop(adap);
+			printk("iic_readbytes:  %s read timeout.\n", i2c_adap->name);
+			return (-1);
+		}
+#ifndef STUB_I2C
+		if (status & ITE_I2CHSR_DB) {
+			iic_stop(adap);
+			printk("iic_readbytes: %s read error - no ack.\n", i2c_adap->name);
+			return (-1);
+		}
+#endif
+		timeout = wait_for_fe(adap, &status);
+		if(timeout) {
+			iic_stop(adap);
+			printk("iic_readbytes:  %s FIFO is empty\n", i2c_adap->name);
+			return (-1);
+		}         
+
+		for(i=0; i<(remainder+1)/2; i++) {
+			tmp.word = iic_inw(adap, ITE_I2CFDR);
+			buf[rdcount++] = tmp.byte[1];
+			buf[rdcount++] = tmp.byte[0];
+		}
+
+		/* status FIFO underrun */
+		iic_inw(adap, ITE_I2CFSR);
+
+	}
+
+	iic_stop(adap);
+	return rdcount;
+}
+
+
+/* This function implements combined transactions.  Combined
+ * transactions consist of combinations of reading and writing blocks of data.
+ * Each transfer (i.e. a read or a write) is separated by a repeated start
+ * condition.
+ */
+#if 0
+static int iic_combined_transaction(struct i2c_adapter *i2c_adap, struct i2c_msg msgs[], int num) 
+{
+   int i;
+   struct i2c_msg *pmsg;
+   int ret;
+
+   DEB2(printk("Beginning combined transaction\n"));
+
+   for(i=0; i<(num-1); i++) {
+      pmsg = &msgs[i];
+      if(pmsg->flags & I2C_M_RD) {
+         DEB2(printk("  This one is a read\n"));
+         ret = iic_readbytes(i2c_adap, pmsg->buf, pmsg->len, IIC_COMBINED_XFER);
+      }
+      else if(!(pmsg->flags & I2C_M_RD)) {
+         DEB2(printk("This one is a write\n"));
+         ret = iic_sendbytes(i2c_adap, pmsg->buf, pmsg->len, IIC_COMBINED_XFER);
+      }
+   }
+   /* Last read or write segment needs to be terminated with a stop */
+   pmsg = &msgs[i];
+
+   if(pmsg->flags & I2C_M_RD) {
+      DEB2(printk("Doing the last read\n"));
+      ret = iic_readbytes(i2c_adap, pmsg->buf, pmsg->len, IIC_SINGLE_XFER);
+   }
+   else if(!(pmsg->flags & I2C_M_RD)) {
+      DEB2(printk("Doing the last write\n"));
+      ret = iic_sendbytes(i2c_adap, pmsg->buf, pmsg->len, IIC_SINGLE_XFER);
+   }
+
+   return ret;
+}
+#endif
+
+
+/* Whenever we initiate a transaction, the first byte clocked
+ * onto the bus after the start condition is the address (7 bit) of the
+ * device we want to talk to.  This function manipulates the address specified
+ * so that it makes sense to the hardware when written to the IIC peripheral.
+ *
+ * Note: 10 bit addresses are not supported in this driver, although they are
+ * supported by the hardware.  This functionality needs to be implemented.
+ */
+static inline int iic_doAddress(struct i2c_algo_iic_data *adap,
+                                struct i2c_msg *msg, int retries) 
+{
+	unsigned short flags = msg->flags;
+	unsigned int addr;
+	int ret;
+
+/* Ten bit addresses not supported right now */
+	if ( (flags & I2C_M_TEN)  ) { 
+#if 0
+		addr = 0xf0 | (( msg->addr >> 7) & 0x03);
+		DEB2(printk("addr0: %d\n",addr));
+		ret = try_address(adap, addr, retries);
+		if (ret!=1) {
+			printk("iic_doAddress: died at extended address code.\n");
+			return -EREMOTEIO;
+		}
+		iic_outw(adap,msg->addr & 0x7f);
+		if (ret != 1) {
+			printk("iic_doAddress: died at 2nd address code.\n");
+			return -EREMOTEIO;
+		}
+		if ( flags & I2C_M_RD ) {
+			i2c_repstart(adap);
+			addr |= 0x01;
+			ret = try_address(adap, addr, retries);
+			if (ret!=1) {
+				printk("iic_doAddress: died at extended address code.\n");
+				return -EREMOTEIO;
+			}
+		}
+#endif
+	} else {
+
+		addr = ( msg->addr << 1 );
+
+#if 0
+		if (flags & I2C_M_RD )
+			addr |= 1;
+		if (flags & I2C_M_REV_DIR_ADDR )
+			addr ^= 1;
+#endif
+
+		if (iic_inw(adap, ITE_I2CSAR) != addr) {
+			iic_outw(adap, ITE_I2CSAR, addr);
+			ret = try_address(adap, addr, retries);
+			if (ret!=1) {
+				printk("iic_doAddress: died at address code.\n");
+				return -EREMOTEIO;
+			}
+		}
+
+  }
+
+	return 0;
+}
+
+
+/* Description: Prepares the controller for a transaction (clearing status
+ * registers, data buffers, etc), and then calls either iic_readbytes or
+ * iic_sendbytes to do the actual transaction.
+ *
+ * still to be done: Before we issue a transaction, we should
+ * verify that the bus is not busy or in some unknown state.
+ */
+static int iic_xfer(struct i2c_adapter *i2c_adap,
+		    struct i2c_msg msgs[], 
+		    int num)
+{
+	struct i2c_algo_iic_data *adap = i2c_adap->algo_data;
+	struct i2c_msg *pmsg;
+	int i = 0;
+	int ret, timeout;
+    
+	pmsg = &msgs[i];
+
+	if(!pmsg->len) {
+		DEB2(printk("iic_xfer: read/write length is 0\n");)
+		return -EIO;
+	}
+	if(!(pmsg->flags & I2C_M_RD) && (!(pmsg->len)%2) ) {
+		DEB2(printk("iic_xfer: write buffer length is not odd\n");)
+		return -EIO; 
+	}
+
+	/* Wait for any pending transfers to complete */
+	timeout = wait_for_bb(adap);
+	if (timeout) {
+		DEB2(printk("iic_xfer: Timeout waiting for host not busy\n");)
+		return -EIO;
+	}
+
+	/* Flush FIFO */
+	iic_outw(adap, ITE_I2CFCR, ITE_I2CFCR_FLUSH);
+
+	/* Load address */
+	ret = iic_doAddress(adap, pmsg, i2c_adap->retries);
+	if (ret)
+		return -EIO;
+
+#if 0
+	/* Combined transaction (read and write) */
+	if(num > 1) {
+           DEB2(printk("iic_xfer: Call combined transaction\n"));
+           ret = iic_combined_transaction(i2c_adap, msgs, num);
+  }
+#endif
+
+	DEB3(printk("iic_xfer: Msg %d, addr=0x%x, flags=0x%x, len=%d\n",
+		i, msgs[i].addr, msgs[i].flags, msgs[i].len);)
+
+	if(pmsg->flags & I2C_M_RD) 		/* Read */
+		ret = iic_readbytes(i2c_adap, pmsg->buf, pmsg->len, 0);
+	else {													/* Write */ 
+		udelay(1000);
+		ret = iic_sendbytes(i2c_adap, pmsg->buf, pmsg->len);
+	}
+
+	if (ret != pmsg->len)
+		DEB3(printk("iic_xfer: error or fail on read/write %d bytes.\n",ret)); 
+	else
+		DEB3(printk("iic_xfer: read/write %d bytes.\n",ret));
+
+	return ret;
+}
+
+
+/* Implements device specific ioctls.  Higher level ioctls can
+ * be found in i2c-core.c and are typical of any i2c controller (specifying
+ * slave address, timeouts, etc).  These ioctls take advantage of any hardware
+ * features built into the controller for which this algorithm-adapter set
+ * was written.  These ioctls allow you to take control of the data and clock
+ * lines and set the either high or low,
+ * similar to a GPIO pin.
+ */
+static int algo_control(struct i2c_adapter *adapter, 
+	unsigned int cmd, unsigned long arg)
+{
+
+  struct i2c_algo_iic_data *adap = adapter->algo_data;
+  struct i2c_iic_msg s_msg;
+  char *buf;
+	int ret;
+
+  if (cmd = I2C_SREAD) {
+		if(copy_from_user(&s_msg, (struct i2c_iic_msg *)arg, 
+				sizeof(struct i2c_iic_msg))) 
+			return -EFAULT;
+		buf = kmalloc(s_msg.len, GFP_KERNEL);
+		if (buf= NULL)
+			return -ENOMEM;
+
+		/* Flush FIFO */
+		iic_outw(adap, ITE_I2CFCR, ITE_I2CFCR_FLUSH);
+
+		/* Load address */
+		iic_outw(adap, ITE_I2CSAR,s_msg.addr<<1);
+		iic_outw(adap, ITE_I2CSSAR,s_msg.waddr & 0xff);
+
+		ret = iic_readbytes(adapter, buf, s_msg.len, 1);
+		if (ret>=0) {
+			if(copy_to_user( s_msg.buf, buf, s_msg.len) ) 
+				ret = -EFAULT;
+		}
+		kfree(buf);
+	}
+	return 0;
+}
+
+
+static u32 iic_func(struct i2c_adapter *adap)
+{
+	return I2C_FUNC_SMBUS_EMUL | I2C_FUNC_10BIT_ADDR | 
+	       I2C_FUNC_PROTOCOL_MANGLING; 
+}
+
+/* -----exported algorithm data: -------------------------------------	*/
+
+static struct i2c_algorithm iic_algo = {
+	"ITE IIC algorithm",
+	I2C_ALGO_IIC,
+	iic_xfer,		/* master_xfer	*/
+	NULL,				/* smbus_xfer	*/
+	NULL,				/* slave_xmit		*/
+	NULL,				/* slave_recv		*/
+	algo_control,			/* ioctl		*/
+	iic_func,			/* functionality	*/
+};
+
+
+/* 
+ * registering functions to load algorithms at runtime 
+ */
+int i2c_iic_add_bus(struct i2c_adapter *adap)
+{
+	int i;
+	short status;
+	struct i2c_algo_iic_data *iic_adap = adap->algo_data;
+
+	if (iic_test) {
+		int ret = test_bus(iic_adap, adap->name);
+		if (ret<0)
+			return -ENODEV;
+	}
+
+	DEB2(printk("i2c-algo-ite: hw routines for %s registered.\n",
+	            adap->name));
+
+	/* register new adapter to i2c module... */
+
+	adap->id |= iic_algo.id;
+	adap->algo = &iic_algo;
+
+	adap->timeout = 100;	/* default values, should	*/
+	adap->retries = 3;		/* be replaced by defines	*/
+	adap->flags = 0;
+
+#ifdef MODULE
+	MOD_INC_USE_COUNT;
+#endif
+
+	i2c_add_adapter(adap);
+	iic_init(iic_adap);
+
+	/* scan bus */
+	/* By default scanning the bus is turned off. */
+	if (iic_scan) {
+		printk(KERN_INFO " i2c-algo-ite: scanning bus %s.\n",
+		       adap->name);
+		for (i = 0x00; i < 0xff; i+=2) {
+			iic_outw(iic_adap, ITE_I2CSAR, i);
+			iic_start(iic_adap);
+			if ( (wait_for_pin(iic_adap, &status) = 0) && 
+			    ((status & ITE_I2CHSR_DNE) = 0) ) { 
+				printk(KERN_INFO "\n(%02x)\n",i>>1); 
+			} else {
+				printk(KERN_INFO "."); 
+				iic_reset(iic_adap);
+			}
+			udelay(iic_adap->udelay);
+		}
+	}
+	return 0;
+}
+
+
+int i2c_iic_del_bus(struct i2c_adapter *adap)
+{
+	int res;
+	if ((res = i2c_del_adapter(adap)) < 0)
+		return res;
+	DEB2(printk("i2c-algo-ite: adapter unregistered: %s\n",adap->name));
+
+#ifdef MODULE
+	MOD_DEC_USE_COUNT;
+#endif
+	return 0;
+}
+
+
+int __init i2c_algo_iic_init (void)
+{
+	printk(KERN_INFO "ITE iic (i2c) algorithm module\n");
+	return 0;
+}
+
+
+void i2c_algo_iic_exit(void)
+{
+	return;
+}
+
+
+EXPORT_SYMBOL(i2c_iic_add_bus);
+EXPORT_SYMBOL(i2c_iic_del_bus);
+
+/* The MODULE_* macros resolve to nothing if MODULES is not defined
+ * when this file is compiled.
+ */
+MODULE_AUTHOR("MontaVista Software <www.mvista.com>");
+MODULE_DESCRIPTION("ITE iic algorithm");
+MODULE_LICENSE("GPL");
+
+MODULE_PARM(iic_test, "i");
+MODULE_PARM(iic_scan, "i");
+MODULE_PARM(i2c_debug,"i");
+
+MODULE_PARM_DESC(iic_test, "Test if the I2C bus is available");
+MODULE_PARM_DESC(iic_scan, "Scan for active chips on the bus");
+MODULE_PARM_DESC(i2c_debug,
+        "debug level - 0 off; 1 normal; 2,3 more verbose; 9 iic-protocol");
+
+
+/* This function resolves to init_module (the function invoked when a module
+ * is loaded via insmod) when this file is compiled with MODULES defined.
+ * Otherwise (i.e. if you want this driver statically linked to the kernel),
+ * a pointer to this function is stored in a table and called
+ * during the initialization of the kernel (in do_basic_setup in /init/main.c) 
+ *
+ * All this functionality is complements of the macros defined in linux/init.h
+ */
+module_init(i2c_algo_iic_init);
+
+
+/* If MODULES is defined when this file is compiled, then this function will
+ * resolved to cleanup_module.
+ */
+module_exit(i2c_algo_iic_exit);
diff -Nru a/drivers/i2c/algos/i2c-algo-ite.h b/drivers/i2c/algos/i2c-algo-ite.h
--- /dev/null	Wed Dec 31 16:00:00 1969
+++ b/drivers/i2c/algos/i2c-algo-ite.h	Thu Sep 25 14:49:55 2003
@@ -0,0 +1,117 @@
+/*
+   --------------------------------------------------------------------
+   i2c-ite.h: Global defines for the I2C controller on board the    
+                 ITE MIPS processor.                                
+   --------------------------------------------------------------------
+   Hai-Pao Fan, MontaVista Software, Inc.
+   hpfan@mvista.com or source@mvista.com
+
+   Copyright 2001 MontaVista Software Inc.
+
+ *  This program is free software; you can redistribute  it and/or modify it
+ *  under  the terms of  the GNU General  Public License as published by the
+ *  Free Software Foundation;  either version 2 of the  License, or (at your
+ *  option) any later version.
+ *
+ *  THIS  SOFTWARE  IS PROVIDED   ``AS  IS'' AND   ANY  EXPRESS OR IMPLIED
+ *  WARRANTIES,   INCLUDING, BUT NOT  LIMITED  TO, THE IMPLIED WARRANTIES OF
+ *  MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.  IN
+ *  NO  EVENT  SHALL   THE AUTHOR  BE    LIABLE FOR ANY   DIRECT, INDIRECT,
+ *  INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+ *  NOT LIMITED   TO, PROCUREMENT OF  SUBSTITUTE GOODS  OR SERVICES; LOSS OF
+ *  USE, DATA,  OR PROFITS; OR  BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ *  ANY THEORY OF LIABILITY, WHETHER IN  CONTRACT, STRICT LIABILITY, OR TORT
+ *  (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ *  THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ *  You should have received a copy of the  GNU General Public License along
+ *  with this program; if not, write  to the Free Software Foundation, Inc.,
+ *  675 Mass Ave, Cambridge, MA 02139, USA.
+
+ */
+
+#ifndef I2C_ITE_H
+#define I2C_ITE_H 1
+
+#include <asm/it8172/it8172.h>
+
+/* I2C Registers */
+#define ITE_I2CHCR	IT8172_PCI_IO_BASE + IT_I2C_BASE + 0x30
+#define ITE_I2CHSR	IT8172_PCI_IO_BASE + IT_I2C_BASE + 0x34
+#define ITE_I2CSAR	IT8172_PCI_IO_BASE + IT_I2C_BASE + 0x38
+#define ITE_I2CSSAR	IT8172_PCI_IO_BASE + IT_I2C_BASE + 0x3c
+#define ITE_I2CCKCNT	IT8172_PCI_IO_BASE + IT_I2C_BASE + 0x48
+#define ITE_I2CSHDR	IT8172_PCI_IO_BASE + IT_I2C_BASE + 0x4c
+#define ITE_I2CRSUR	IT8172_PCI_IO_BASE + IT_I2C_BASE + 0x50
+#define ITE_I2CPSUR	IT8172_PCI_IO_BASE + IT_I2C_BASE + 0x54
+
+#define ITE_I2CFDR	IT8172_PCI_IO_BASE + IT_I2C_BASE + 0x70
+#define ITE_I2CFBCR	IT8172_PCI_IO_BASE + IT_I2C_BASE + 0x74
+#define ITE_I2CFCR	IT8172_PCI_IO_BASE + IT_I2C_BASE + 0x78
+#define ITE_I2CFSR	IT8172_PCI_IO_BASE + IT_I2C_BASE + 0x7c
+
+
+/* Host Control Register ITE_I2CHCR */
+#define	ITE_I2CHCR_HCE	0x01	/* Enable I2C Host Controller */
+#define	ITE_I2CHCR_IE	0x02	/* Enable the interrupt after completing
+				   the current transaction */
+#define ITE_I2CHCR_CP_W	0x00	/* bit2-4 000 - Write */
+#define	ITE_I2CHCR_CP_R	0x08	/*	  010 - Current address read */
+#define	ITE_I2CHCR_CP_S	0x10	/*	  100 - Sequential read */
+#define ITE_I2CHCR_ST	0x20	/* Initiates the I2C host controller to execute
+				   the command and send the data programmed in
+				   all required registers to I2C bus */
+#define ITE_CMD		ITE_I2CHCR_HCE | ITE_I2CHCR_IE | ITE_I2CHCR_ST
+#define ITE_WRITE	ITE_CMD | ITE_I2CHCR_CP_W
+#define ITE_READ	ITE_CMD | ITE_I2CHCR_CP_R
+#define ITE_SREAD	ITE_CMD | ITE_I2CHCR_CP_S
+
+/* Host Status Register ITE_I2CHSR */
+#define	ITE_I2CHSR_DB	0x01	/* Device is busy, receives NACK response except
+				   in the first and last bytes */
+#define	ITE_I2CHSR_DNE	0x02	/* Target address on I2C bus does not exist */
+#define	ITE_I2CHSR_TDI	0x04	/* R/W Transaction on I2C bus was completed */
+#define	ITE_I2CHSR_HB	0x08	/* Host controller is processing transactions */
+#define	ITE_I2CHSR_FER	0x10	/* Error occurs in the FIFO */
+
+/* Slave Address Register ITE_I2CSAR */
+#define	ITE_I2CSAR_SA_MASK	0xfe	/* Target I2C device address */
+#define	ITE_I2CSAR_ASO		0x0100	/* Output 1/0 to I2CAS port when the
+					   next slave address is addressed */
+
+/* Slave Sub-address Register ITE_I2CSSAR */
+#define	ITE_I2CSSAR_SUBA_MASK	0xff	/* Target I2C device sub-address */
+
+/* Clock Counter Register ITE_I2CCKCNT */
+#define	ITE_I2CCKCNT_STOP	0x00	/* stop I2C clock */
+#define	ITE_I2CCKCNT_HPCC_MASK	0x7f	/* SCL high period counter */
+#define	ITE_I2CCKCNT_LPCC_MASK	0x7f00	/* SCL low period counter */
+
+/* START Hold Time Register ITE_I2CSHDR */
+/* value is counted based on 16 MHz internal clock */
+#define ITE_I2CSHDR_FM	0x0a	/* START condition at fast mode */
+#define	ITE_I2CSHDR_SM	0x47	/* START contition at standard mode */
+
+/* (Repeated) START Setup Time Register ITE_I2CRSUR */
+/* value is counted based on 16 MHz internal clock */
+#define	ITE_I2CRSUR_FM	0x0a	/* repeated START condition at fast mode */
+#define	ITE_I2CRSUR_SM	0x50	/* repeated START condition at standard mode */
+
+/* STOP setup Time Register ITE_I2CPSUR */
+
+/* FIFO Data Register ITE_I2CFDR */
+#define	ITE_I2CFDR_MASK		0xff
+
+/* FIFO Byte Count Register ITE_I2CFBCR */
+#define ITE_I2CFBCR_MASK	0x3f
+
+/* FIFO Control Register ITE_I2CFCR */
+#define	ITE_I2CFCR_FLUSH	0x01	/* Flush FIFO and reset the FIFO point
+					   and I2CFSR */
+/* FIFO Status Register ITE_I2CFSR */
+#define	ITE_I2CFSR_FO	0x01	/* FIFO is overrun when write */
+#define	ITE_I2CFSR_FU	0x02	/* FIFO is underrun when read */
+#define	ITE_I2CFSR_FF	0x04	/* FIFO is full when write */
+#define	ITE_I2CFSR_FE	0x08	/* FIFO is empty when read */
+
+#endif  /* I2C_ITE_H */
diff -Nru a/drivers/i2c/algos/i2c-algo-pcf.c b/drivers/i2c/algos/i2c-algo-pcf.c
--- /dev/null	Wed Dec 31 16:00:00 1969
+++ b/drivers/i2c/algos/i2c-algo-pcf.c	Thu Sep 25 14:49:55 2003
@@ -0,0 +1,479 @@
+/* ------------------------------------------------------------------------- */
+/* i2c-algo-pcf.c i2c driver algorithms for PCF8584 adapters		     */
+/* ------------------------------------------------------------------------- */
+/*   Copyright (C) 1995-1997 Simon G. Vogl
+                   1998-2000 Hans Berglund
+
+    This program is free software; you can redistribute it and/or modify
+    it under the terms of the GNU General Public License as published by
+    the Free Software Foundation; either version 2 of the License, or
+    (at your option) any later version.
+
+    This program is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+    GNU General Public License for more details.
+
+    You should have received a copy of the GNU General Public License
+    along with this program; if not, write to the Free Software
+    Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.		     */
+/* ------------------------------------------------------------------------- */
+
+/* With some changes from Ky?sti M?lkki <kmalkki@cc.hut.fi> and 
+   Frodo Looijaard <frodol@dds.nl> ,and also from Martin Bailey
+   <mbailey@littlefeet-inc.com> */
+
+/* Partially rewriten by Oleg I. Vdovikin <vdovikin@jscc.ru> to handle multiple
+   messages, proper stop/repstart signaling during receive,
+   added detect code */
+
+/* #define DEBUG 1 */		/* to pick up dev_dbg calls */
+
+#include <linux/kernel.h>
+#include <linux/module.h>
+#include <linux/delay.h>
+#include <linux/slab.h>
+#include <linux/init.h>
+#include <linux/errno.h>
+#include <linux/i2c.h>
+#include <linux/i2c-algo-pcf.h>
+#include "i2c-algo-pcf.h"
+
+
+/* ----- global defines ----------------------------------------------- */
+#define DEB(x) if (i2c_debug>=1) x
+#define DEB2(x) if (i2c_debug>=2) x
+#define DEB3(x) if (i2c_debug>=3) x /* print several statistical values*/
+#define DEBPROTO(x) if (i2c_debug>=9) x;
+ 	/* debug the protocol by showing transferred bits */
+#define DEF_TIMEOUT 16
+
+/* module parameters:
+ */
+static int i2c_debug=0;
+
+/* --- setting states on the bus with the right timing: ---------------	*/
+
+#define set_pcf(adap, ctl, val) adap->setpcf(adap->data, ctl, val)
+#define get_pcf(adap, ctl) adap->getpcf(adap->data, ctl)
+#define get_own(adap) adap->getown(adap->data)
+#define get_clock(adap) adap->getclock(adap->data)
+#define i2c_outb(adap, val) adap->setpcf(adap->data, 0, val)
+#define i2c_inb(adap) adap->getpcf(adap->data, 0)
+
+/* --- other auxiliary functions --------------------------------------	*/
+
+static void i2c_start(struct i2c_algo_pcf_data *adap) 
+{
+	DEBPROTO(printk("S "));
+	set_pcf(adap, 1, I2C_PCF_START);
+}
+
+static void i2c_repstart(struct i2c_algo_pcf_data *adap) 
+{
+	DEBPROTO(printk(" Sr "));
+	set_pcf(adap, 1, I2C_PCF_REPSTART);
+}
+
+
+static void i2c_stop(struct i2c_algo_pcf_data *adap) 
+{
+	DEBPROTO(printk("P\n"));
+	set_pcf(adap, 1, I2C_PCF_STOP);
+}
+
+
+static int wait_for_bb(struct i2c_algo_pcf_data *adap) {
+
+	int timeout = DEF_TIMEOUT;
+	int status;
+
+	status = get_pcf(adap, 1);
+#ifndef STUB_I2C
+	while (timeout-- && !(status & I2C_PCF_BB)) {
+		udelay(100); /* wait for 100 us */
+		status = get_pcf(adap, 1);
+	}
+#endif
+	if (timeout <= 0) {
+		printk(KERN_ERR "Timeout waiting for Bus Busy\n");
+	}
+	
+	return (timeout<=0);
+}
+
+
+static inline void pcf_sleep(unsigned long timeout)
+{
+	schedule_timeout( timeout * HZ);
+}
+
+
+static int wait_for_pin(struct i2c_algo_pcf_data *adap, int *status) {
+
+	int timeout = DEF_TIMEOUT;
+
+	*status = get_pcf(adap, 1);
+#ifndef STUB_I2C
+	while (timeout-- && (*status & I2C_PCF_PIN)) {
+		adap->waitforpin();
+		*status = get_pcf(adap, 1);
+	}
+#endif
+	if (timeout <= 0)
+		return(-1);
+	else
+		return(0);
+}
+
+/* 
+ * This should perform the 'PCF8584 initialization sequence' as described
+ * in the Philips IC12 data book (1995, Aug 29).
+ * There should be a 30 clock cycle wait after reset, I assume this
+ * has been fulfilled.
+ * There should be a delay at the end equal to the longest I2C message
+ * to synchronize the BB-bit (in multimaster systems). How long is
+ * this? I assume 1 second is always long enough.
+ *
+ * vdovikin: added detect code for PCF8584
+ */
+static int pcf_init_8584 (struct i2c_algo_pcf_data *adap)
+{
+	unsigned char temp;
+
+	DEB3(printk(KERN_DEBUG "i2c-algo-pcf.o: PCF state 0x%02x\n", get_pcf(adap, 1)));
+
+	/* S1=0x80: S0 selected, serial interface off */
+	set_pcf(adap, 1, I2C_PCF_PIN);
+	/* check to see S1 now used as R/W ctrl -
+	   PCF8584 does that when ESO is zero */
+	if (((temp = get_pcf(adap, 1)) & 0x7f) != (0)) {
+		DEB2(printk(KERN_ERR "i2c-algo-pcf.o: PCF detection failed -- can't select S0 (0x%02x).\n", temp));
+		return -ENXIO; /* definetly not PCF8584 */
+	}
+
+	/* load own address in S0, effective address is (own << 1)	*/
+	i2c_outb(adap, get_own(adap));
+	/* check it's really written */
+	if ((temp = i2c_inb(adap)) != get_own(adap)) {
+		DEB2(printk(KERN_ERR "i2c-algo-pcf.o: PCF detection failed -- can't set S0 (0x%02x).\n", temp));
+		return -ENXIO;
+	}
+
+	/* S1=0xA0, next byte in S2					*/
+	set_pcf(adap, 1, I2C_PCF_PIN | I2C_PCF_ES1);
+	/* check to see S2 now selected */
+	if (((temp = get_pcf(adap, 1)) & 0x7f) != I2C_PCF_ES1) {
+		DEB2(printk(KERN_ERR "i2c-algo-pcf.o: PCF detection failed -- can't select S2 (0x%02x).\n", temp));
+		return -ENXIO;
+	}
+
+	/* load clock register S2					*/
+	i2c_outb(adap, get_clock(adap));
+	/* check it's really written, the only 5 lowest bits does matter */
+	if (((temp = i2c_inb(adap)) & 0x1f) != get_clock(adap)) {
+		DEB2(printk(KERN_ERR "i2c-algo-pcf.o: PCF detection failed -- can't set S2 (0x%02x).\n", temp));
+		return -ENXIO;
+	}
+
+	/* Enable serial interface, idle, S0 selected			*/
+	set_pcf(adap, 1, I2C_PCF_IDLE);
+
+	/* check to see PCF is really idled and we can access status register */
+	if ((temp = get_pcf(adap, 1)) != (I2C_PCF_PIN | I2C_PCF_BB)) {
+		DEB2(printk(KERN_ERR "i2c-algo-pcf.o: PCF detection failed -- can't select S1` (0x%02x).\n", temp));
+		return -ENXIO;
+	}
+	
+	printk(KERN_DEBUG "i2c-algo-pcf.o: deteted and initialized PCF8584.\n");
+
+	return 0;
+}
+
+
+/* ----- Utility functions
+ */
+
+static inline int try_address(struct i2c_algo_pcf_data *adap,
+		       unsigned char addr, int retries)
+{
+	int i, status, ret = -1;
+	for (i=0;i<retries;i++) {
+		i2c_outb(adap, addr);
+		i2c_start(adap);
+		status = get_pcf(adap, 1);
+		if (wait_for_pin(adap, &status) >= 0) {
+			if ((status & I2C_PCF_LRB) = 0) { 
+				i2c_stop(adap);
+				break;	/* success! */
+			}
+		}
+		i2c_stop(adap);
+		udelay(adap->udelay);
+	}
+	DEB2(if (i) printk(KERN_DEBUG "i2c-algo-pcf.o: needed %d retries for %d\n",i,
+	                   addr));
+	return ret;
+}
+
+
+static int pcf_sendbytes(struct i2c_adapter *i2c_adap, const char *buf,
+                         int count, int last)
+{
+	struct i2c_algo_pcf_data *adap = i2c_adap->algo_data;
+	int wrcount, status, timeout;
+    
+	for (wrcount=0; wrcount<count; ++wrcount) {
+		DEB2(dev_dbg(&i2c_adap->dev, "i2c_write: writing %2.2X\n",
+				buf[wrcount]&0xff));
+		i2c_outb(adap, buf[wrcount]);
+		timeout = wait_for_pin(adap, &status);
+		if (timeout) {
+			i2c_stop(adap);
+			dev_err(&i2c_adap->dev, "i2c_write: error - timeout.\n");
+			return -EREMOTEIO; /* got a better one ?? */
+		}
+#ifndef STUB_I2C
+		if (status & I2C_PCF_LRB) {
+			i2c_stop(adap);
+			dev_err(&i2c_adap->dev, "i2c_write: error - no ack.\n");
+			return -EREMOTEIO; /* got a better one ?? */
+		}
+#endif
+	}
+	if (last) {
+		i2c_stop(adap);
+	}
+	else {
+		i2c_repstart(adap);
+	}
+
+	return (wrcount);
+}
+
+
+static int pcf_readbytes(struct i2c_adapter *i2c_adap, char *buf,
+                         int count, int last)
+{
+	int i, status;
+	struct i2c_algo_pcf_data *adap = i2c_adap->algo_data;
+
+	/* increment number of bytes to read by one -- read dummy byte */
+	for (i = 0; i <= count; i++) {
+
+		if (wait_for_pin(adap, &status)) {
+			i2c_stop(adap);
+			dev_err(&i2c_adap->dev, "pcf_readbytes timed out.\n");
+			return (-1);
+		}
+
+#ifndef STUB_I2C
+		if ((status & I2C_PCF_LRB) && (i != count)) {
+			i2c_stop(adap);
+			dev_err(&i2c_adap->dev, "i2c_read: i2c_inb, No ack.\n");
+			return (-1);
+		}
+#endif
+		
+		if (i = count - 1) {
+			set_pcf(adap, 1, I2C_PCF_ESO);
+		} else 
+		if (i = count) {
+			if (last) {
+				i2c_stop(adap);
+			} else {
+				i2c_repstart(adap);
+			}
+		};
+
+		if (i) {
+			buf[i - 1] = i2c_inb(adap);
+		} else {
+			i2c_inb(adap); /* dummy read */
+		}
+	}
+
+	return (i - 1);
+}
+
+
+static inline int pcf_doAddress(struct i2c_algo_pcf_data *adap,
+                                struct i2c_msg *msg, int retries) 
+{
+	unsigned short flags = msg->flags;
+	unsigned char addr;
+	int ret;
+	if ( (flags & I2C_M_TEN)  ) { 
+		/* a ten bit address */
+		addr = 0xf0 | (( msg->addr >> 7) & 0x03);
+		DEB2(printk(KERN_DEBUG "addr0: %d\n",addr));
+		/* try extended address code...*/
+		ret = try_address(adap, addr, retries);
+		if (ret!=1) {
+			printk(KERN_ERR "died at extended address code.\n");
+			return -EREMOTEIO;
+		}
+		/* the remaining 8 bit address */
+		i2c_outb(adap,msg->addr & 0x7f);
+/* Status check comes here */
+		if (ret != 1) {
+			printk(KERN_ERR "died at 2nd address code.\n");
+			return -EREMOTEIO;
+		}
+		if ( flags & I2C_M_RD ) {
+			i2c_repstart(adap);
+			/* okay, now switch into reading mode */
+			addr |= 0x01;
+			ret = try_address(adap, addr, retries);
+			if (ret!=1) {
+				printk(KERN_ERR "died at extended address code.\n");
+				return -EREMOTEIO;
+			}
+		}
+	} else {		/* normal 7bit address	*/
+		addr = ( msg->addr << 1 );
+		if (flags & I2C_M_RD )
+			addr |= 1;
+		if (flags & I2C_M_REV_DIR_ADDR )
+			addr ^= 1;
+		i2c_outb(adap, addr);
+	}
+	return 0;
+}
+
+static int pcf_xfer(struct i2c_adapter *i2c_adap,
+		    struct i2c_msg msgs[], 
+		    int num)
+{
+	struct i2c_algo_pcf_data *adap = i2c_adap->algo_data;
+	struct i2c_msg *pmsg;
+	int i;
+	int ret=0, timeout, status;
+    
+
+	/* Check for bus busy */
+	timeout = wait_for_bb(adap);
+	if (timeout) {
+		DEB2(printk(KERN_ERR "i2c-algo-pcf.o: "
+		            "Timeout waiting for BB in pcf_xfer\n");)
+		return -EIO;
+	}
+	
+	for (i = 0;ret >= 0 && i < num; i++) {
+		pmsg = &msgs[i];
+
+		DEB2(printk(KERN_DEBUG "i2c-algo-pcf.o: Doing %s %d bytes to 0x%02x - %d of %d messages\n",
+		     pmsg->flags & I2C_M_RD ? "read" : "write",
+                     pmsg->len, pmsg->addr, i + 1, num);)
+    
+		ret = pcf_doAddress(adap, pmsg, i2c_adap->retries);
+
+		/* Send START */
+		if (i = 0) {
+			i2c_start(adap); 
+		}
+    
+		/* Wait for PIN (pending interrupt NOT) */
+		timeout = wait_for_pin(adap, &status);
+		if (timeout) {
+			i2c_stop(adap);
+			DEB2(printk(KERN_ERR "i2c-algo-pcf.o: Timeout waiting "
+				    "for PIN(1) in pcf_xfer\n");)
+			return (-EREMOTEIO);
+		}
+    
+#ifndef STUB_I2C
+		/* Check LRB (last rcvd bit - slave ack) */
+		if (status & I2C_PCF_LRB) {
+			i2c_stop(adap);
+			DEB2(printk(KERN_ERR "i2c-algo-pcf.o: No LRB(1) in pcf_xfer\n");)
+			return (-EREMOTEIO);
+		}
+#endif
+    
+		DEB3(printk(KERN_DEBUG "i2c-algo-pcf.o: Msg %d, addr=0x%x, flags=0x%x, len=%d\n",
+			    i, msgs[i].addr, msgs[i].flags, msgs[i].len);)
+    
+		/* Read */
+		if (pmsg->flags & I2C_M_RD) {
+			/* read bytes into buffer*/
+			ret = pcf_readbytes(i2c_adap, pmsg->buf, pmsg->len,
+                                            (i + 1 = num));
+        
+			if (ret != pmsg->len) {
+				DEB2(printk(KERN_DEBUG "i2c-algo-pcf.o: fail: "
+					    "only read %d bytes.\n",ret));
+			} else {
+				DEB2(printk(KERN_DEBUG "i2c-algo-pcf.o: read %d bytes.\n",ret));
+			}
+		} else { /* Write */
+			ret = pcf_sendbytes(i2c_adap, pmsg->buf, pmsg->len,
+                                            (i + 1 = num));
+        
+			if (ret != pmsg->len) {
+				DEB2(printk(KERN_DEBUG "i2c-algo-pcf.o: fail: "
+					    "only wrote %d bytes.\n",ret));
+			} else {
+				DEB2(printk(KERN_DEBUG "i2c-algo-pcf.o: wrote %d bytes.\n",ret));
+			}
+		}
+	}
+
+	return (i);
+}
+
+static u32 pcf_func(struct i2c_adapter *adap)
+{
+	return I2C_FUNC_SMBUS_EMUL | I2C_FUNC_10BIT_ADDR | 
+	       I2C_FUNC_PROTOCOL_MANGLING; 
+}
+
+/* -----exported algorithm data: -------------------------------------	*/
+
+static struct i2c_algorithm pcf_algo = {
+	.name		= "PCF8584 algorithm",
+	.id		= I2C_ALGO_PCF,
+	.master_xfer	= pcf_xfer,
+	.functionality	= pcf_func,
+};
+
+/* 
+ * registering functions to load algorithms at runtime 
+ */
+int i2c_pcf_add_bus(struct i2c_adapter *adap)
+{
+	struct i2c_algo_pcf_data *pcf_adap = adap->algo_data;
+	int rval;
+
+	DEB2(dev_dbg(&adap->dev, "hw routines registered.\n"));
+
+	/* register new adapter to i2c module... */
+
+	adap->id |= pcf_algo.id;
+	adap->algo = &pcf_algo;
+
+	adap->timeout = 100;		/* default values, should	*/
+	adap->retries = 3;		/* be replaced by defines	*/
+
+	rval = pcf_init_8584(pcf_adap);
+	if (!rval)
+		i2c_add_adapter(adap);
+	return rval;
+}
+
+
+int i2c_pcf_del_bus(struct i2c_adapter *adap)
+{
+	return i2c_del_adapter(adap);
+}
+
+EXPORT_SYMBOL(i2c_pcf_add_bus);
+EXPORT_SYMBOL(i2c_pcf_del_bus);
+
+MODULE_AUTHOR("Hans Berglund <hb@spacetec.no>");
+MODULE_DESCRIPTION("I2C-Bus PCF8584 algorithm");
+MODULE_LICENSE("GPL");
+
+MODULE_PARM(i2c_debug,"i");
+MODULE_PARM_DESC(i2c_debug,
+        "debug level - 0 off; 1 normal; 2,3 more verbose; 9 pcf-protocol");
diff -Nru a/drivers/i2c/algos/i2c-algo-pcf.h b/drivers/i2c/algos/i2c-algo-pcf.h
--- /dev/null	Wed Dec 31 16:00:00 1969
+++ b/drivers/i2c/algos/i2c-algo-pcf.h	Thu Sep 25 14:49:55 2003
@@ -0,0 +1,78 @@
+/* -------------------------------------------------------------------- */
+/* i2c-pcf8584.h: PCF 8584 global defines				*/
+/* -------------------------------------------------------------------- */
+/*   Copyright (C) 1996 Simon G. Vogl
+                   1999 Hans Berglund
+
+    This program is free software; you can redistribute it and/or modify
+    it under the terms of the GNU General Public License as published by
+    the Free Software Foundation; either version 2 of the License, or
+    (at your option) any later version.
+
+    This program is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+    GNU General Public License for more details.
+
+    You should have received a copy of the GNU General Public License
+    along with this program; if not, write to the Free Software
+    Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.		*/
+/* --------------------------------------------------------------------	*/
+
+/* With some changes from Frodo Looijaard <frodol@dds.nl> */
+
+/* $Id: i2c-pcf8584.h,v 1.3 2000/01/18 23:54:07 frodo Exp $ */
+
+#ifndef I2C_PCF8584_H
+#define I2C_PCF8584_H 1
+
+/* ----- Control register bits ----------------------------------------	*/
+#define I2C_PCF_PIN	0x80
+#define I2C_PCF_ESO	0x40
+#define I2C_PCF_ES1	0x20
+#define I2C_PCF_ES2	0x10
+#define I2C_PCF_ENI	0x08
+#define I2C_PCF_STA	0x04
+#define I2C_PCF_STO	0x02
+#define I2C_PCF_ACK	0x01
+
+#define I2C_PCF_START    (I2C_PCF_PIN | I2C_PCF_ESO | I2C_PCF_STA | I2C_PCF_ACK)
+#define I2C_PCF_STOP     (I2C_PCF_PIN | I2C_PCF_ESO | I2C_PCF_STO | I2C_PCF_ACK)
+#define I2C_PCF_REPSTART (              I2C_PCF_ESO | I2C_PCF_STA | I2C_PCF_ACK)
+#define I2C_PCF_IDLE     (I2C_PCF_PIN | I2C_PCF_ESO               | I2C_PCF_ACK)
+
+/* ----- Status register bits -----------------------------------------	*/
+/*#define I2C_PCF_PIN  0x80    as above*/
+
+#define I2C_PCF_INI 0x40   /* 1 if not initialized */
+#define I2C_PCF_STS 0x20
+#define I2C_PCF_BER 0x10
+#define I2C_PCF_AD0 0x08
+#define I2C_PCF_LRB 0x08
+#define I2C_PCF_AAS 0x04
+#define I2C_PCF_LAB 0x02
+#define I2C_PCF_BB  0x01
+
+/* ----- Chip clock frequencies ---------------------------------------	*/
+#define I2C_PCF_CLK3	0x00
+#define I2C_PCF_CLK443	0x10
+#define I2C_PCF_CLK6	0x14
+#define I2C_PCF_CLK	0x18
+#define I2C_PCF_CLK12	0x1c
+
+/* ----- transmission frequencies -------------------------------------	*/
+#define I2C_PCF_TRNS90 0x00	/*  90 kHz */
+#define I2C_PCF_TRNS45 0x01	/*  45 kHz */
+#define I2C_PCF_TRNS11 0x02	/*  11 kHz */
+#define I2C_PCF_TRNS15 0x03	/* 1.5 kHz */
+
+
+/* ----- Access to internal registers according to ES1,ES2 ------------	*/
+/* they are mapped to the data port ( a0 = 0 ) 				*/
+/* available when ESO = 0 :						*/
+
+#define I2C_PCF_OWNADR	0
+#define I2C_PCF_INTREG	I2C_PCF_ES2
+#define I2C_PCF_CLKREG	I2C_PCF_ES1
+
+#endif /* I2C_PCF8584_H */
diff -Nru a/drivers/i2c/busses/i2c-elektor.c b/drivers/i2c/busses/i2c-elektor.c
--- a/drivers/i2c/busses/i2c-elektor.c	Thu Sep 25 14:49:55 2003
+++ b/drivers/i2c/busses/i2c-elektor.c	Thu Sep 25 14:49:55 2003
@@ -41,7 +41,7 @@
 #include <asm/io.h>
 #include <asm/irq.h>
 
-#include "../i2c-pcf8584.h"
+#include "../algos/i2c-algo-pcf.h"
 
 #define DEFAULT_BASE 0x330
 
diff -Nru a/drivers/i2c/i2c-algo-bit.c b/drivers/i2c/i2c-algo-bit.c
--- a/drivers/i2c/i2c-algo-bit.c	Thu Sep 25 14:49:55 2003
+++ /dev/null	Wed Dec 31 16:00:00 1969
@@ -1,567 +0,0 @@
-/* ------------------------------------------------------------------------- */
-/* i2c-algo-bit.c i2c driver algorithms for bit-shift adapters		     */
-/* ------------------------------------------------------------------------- */
-/*   Copyright (C) 1995-2000 Simon G. Vogl
-
-    This program is free software; you can redistribute it and/or modify
-    it under the terms of the GNU General Public License as published by
-    the Free Software Foundation; either version 2 of the License, or
-    (at your option) any later version.
-
-    This program is distributed in the hope that it will be useful,
-    but WITHOUT ANY WARRANTY; without even the implied warranty of
-    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-    GNU General Public License for more details.
-
-    You should have received a copy of the GNU General Public License
-    along with this program; if not, write to the Free Software
-    Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.		     */
-/* ------------------------------------------------------------------------- */
-
-/* With some changes from Ky?sti M?lkki <kmalkki@cc.hut.fi> and even
-   Frodo Looijaard <frodol@dds.nl> */
-
-/* $Id: i2c-algo-bit.c,v 1.44 2003/01/21 08:08:16 kmalkki Exp $ */
-
-/* #define DEBUG 1 */
-
-#include <linux/kernel.h>
-#include <linux/module.h>
-#include <linux/delay.h>
-#include <linux/slab.h>
-#include <linux/init.h>
-#include <linux/errno.h>
-#include <linux/sched.h>
-#include <linux/i2c.h>
-#include <linux/i2c-algo-bit.h>
-
-
-/* ----- global defines ----------------------------------------------- */
-#define DEB(x) if (i2c_debug>=1) x;
-#define DEB2(x) if (i2c_debug>=2) x;
-#define DEBSTAT(x) if (i2c_debug>=3) x; /* print several statistical values*/
-#define DEBPROTO(x) if (i2c_debug>=9) { x; }
- 	/* debug the protocol by showing transferred bits */
-
-
-/* ----- global variables ---------------------------------------------	*/
-
-/* module parameters:
- */
-static int i2c_debug;
-static int bit_test;	/* see if the line-setting functions work	*/
-
-/* --- setting states on the bus with the right timing: ---------------	*/
-
-#define setsda(adap,val) adap->setsda(adap->data, val)
-#define setscl(adap,val) adap->setscl(adap->data, val)
-#define getsda(adap) adap->getsda(adap->data)
-#define getscl(adap) adap->getscl(adap->data)
-
-static inline void sdalo(struct i2c_algo_bit_data *adap)
-{
-	setsda(adap,0);
-	udelay(adap->udelay);
-}
-
-static inline void sdahi(struct i2c_algo_bit_data *adap)
-{
-	setsda(adap,1);
-	udelay(adap->udelay);
-}
-
-static inline void scllo(struct i2c_algo_bit_data *adap)
-{
-	setscl(adap,0);
-	udelay(adap->udelay);
-}
-
-/*
- * Raise scl line, and do checking for delays. This is necessary for slower
- * devices.
- */
-static inline int sclhi(struct i2c_algo_bit_data *adap)
-{
-	unsigned long start;
-
-	setscl(adap,1);
-
-	/* Not all adapters have scl sense line... */
-	if (adap->getscl = NULL )
-		return 0;
-
-	start=jiffies;
-	while (! getscl(adap) ) {	
- 		/* the hw knows how to read the clock line,
- 		 * so we wait until it actually gets high.
- 		 * This is safer as some chips may hold it low
- 		 * while they are processing data internally. 
- 		 */
-		if (time_after_eq(jiffies, start+adap->timeout)) {
-			return -ETIMEDOUT;
-		}
-		cond_resched();
-	}
-	DEBSTAT(printk(KERN_DEBUG "needed %ld jiffies\n", jiffies-start));
-	udelay(adap->udelay);
-	return 0;
-} 
-
-
-/* --- other auxiliary functions --------------------------------------	*/
-static void i2c_start(struct i2c_algo_bit_data *adap) 
-{
-	/* assert: scl, sda are high */
-	DEBPROTO(printk("S "));
-	sdalo(adap);
-	scllo(adap);
-}
-
-static void i2c_repstart(struct i2c_algo_bit_data *adap) 
-{
-	/* scl, sda may not be high */
-	DEBPROTO(printk(" Sr "));
-	setsda(adap,1);
-	sclhi(adap);
-	udelay(adap->udelay);
-	
-	sdalo(adap);
-	scllo(adap);
-}
-
-
-static void i2c_stop(struct i2c_algo_bit_data *adap) 
-{
-	DEBPROTO(printk("P\n"));
-	/* assert: scl is low */
-	sdalo(adap);
-	sclhi(adap); 
-	sdahi(adap);
-}
-
-
-
-/* send a byte without start cond., look for arbitration, 
-   check ackn. from slave */
-/* returns:
- * 1 if the device acknowledged
- * 0 if the device did not ack
- * -ETIMEDOUT if an error occurred (while raising the scl line)
- */
-static int i2c_outb(struct i2c_adapter *i2c_adap, char c)
-{
-	int i;
-	int sb;
-	int ack;
-	struct i2c_algo_bit_data *adap = i2c_adap->algo_data;
-
-	/* assert: scl is low */
-	for ( i=7 ; i>=0 ; i-- ) {
-		sb = c & ( 1 << i );
-		setsda(adap,sb);
-		udelay(adap->udelay);
-		DEBPROTO(printk(KERN_DEBUG "%d",sb!=0));
-		if (sclhi(adap)<0) { /* timed out */
-			sdahi(adap); /* we don't want to block the net */
-			DEB2(printk(KERN_DEBUG " i2c_outb: 0x%02x, timeout at bit #%d\n", c&0xff, i));
-			return -ETIMEDOUT;
-		};
-		/* do arbitration here: 
-		 * if ( sb && ! getsda(adap) ) -> ouch! Get out of here.
-		 */
-		setscl(adap, 0 );
-		udelay(adap->udelay);
-	}
-	sdahi(adap);
-	if (sclhi(adap)<0){ /* timeout */
-	    DEB2(printk(KERN_DEBUG " i2c_outb: 0x%02x, timeout at ack\n", c&0xff));
-	    return -ETIMEDOUT;
-	};
-	/* read ack: SDA should be pulled down by slave */
-	ack=getsda(adap);	/* ack: sda is pulled low ->success.	 */
-	DEB2(printk(KERN_DEBUG " i2c_outb: 0x%02x , getsda() = %d\n", c & 0xff, ack));
-
-	DEBPROTO( printk(KERN_DEBUG "[%2.2x]",c&0xff) );
-	DEBPROTO(if (0=ack){ printk(KERN_DEBUG " A ");} else printk(KERN_DEBUG " NA ") );
-	scllo(adap);
-	return 0=ack;		/* return 1 if device acked	 */
-	/* assert: scl is low (sda undef) */
-}
-
-
-static int i2c_inb(struct i2c_adapter *i2c_adap) 
-{
-	/* read byte via i2c port, without start/stop sequence	*/
-	/* acknowledge is sent in i2c_read.			*/
-	int i;
-	unsigned char indata=0;
-	struct i2c_algo_bit_data *adap = i2c_adap->algo_data;
-
-	/* assert: scl is low */
-	sdahi(adap);
-	for (i=0;i<8;i++) {
-		if (sclhi(adap)<0) { /* timeout */
-			DEB2(printk(KERN_DEBUG " i2c_inb: timeout at bit #%d\n", 7-i));
-			return -ETIMEDOUT;
-		};
-		indata *= 2;
-		if ( getsda(adap) ) 
-			indata |= 0x01;
-		scllo(adap);
-	}
-	/* assert: scl is low */
-	DEB2(printk(KERN_DEBUG "i2c_inb: 0x%02x\n", indata & 0xff));
-
-	DEBPROTO(printk(KERN_DEBUG " 0x%02x", indata & 0xff));
-	return (int) (indata & 0xff);
-}
-
-/*
- * Sanity check for the adapter hardware - check the reaction of
- * the bus lines only if it seems to be idle.
- */
-static int test_bus(struct i2c_algo_bit_data *adap, char* name) {
-	int scl,sda;
-	sda=getsda(adap);
-	if (adap->getscl=NULL) {
-		printk(KERN_WARNING "i2c-algo-bit.o: Warning: Adapter can't read from clock line - skipping test.\n");
-		return 0;		
-	}
-	scl=getscl(adap);
-	printk(KERN_INFO "i2c-algo-bit.o: Adapter: %s scl: %d  sda: %d -- testing...\n",
-	       name,getscl(adap),getsda(adap));
-	if (!scl || !sda ) {
-		printk(KERN_INFO " i2c-algo-bit.o: %s seems to be busy.\n",name);
-		goto bailout;
-	}
-	sdalo(adap);
-	printk(KERN_DEBUG "i2c-algo-bit.o:1 scl: %d  sda: %d \n",getscl(adap),
-	       getsda(adap));
-	if ( 0 != getsda(adap) ) {
-		printk(KERN_WARNING "i2c-algo-bit.o: %s SDA stuck high!\n",name);
-		sdahi(adap);
-		goto bailout;
-	}
-	if ( 0 = getscl(adap) ) {
-		printk(KERN_WARNING "i2c-algo-bit.o: %s SCL unexpected low while pulling SDA low!\n",
-			name);
-		goto bailout;
-	}		
-	sdahi(adap);
-	printk(KERN_DEBUG "i2c-algo-bit.o:2 scl: %d  sda: %d \n",getscl(adap),
-	       getsda(adap));
-	if ( 0 = getsda(adap) ) {
-		printk(KERN_WARNING "i2c-algo-bit.o: %s SDA stuck low!\n",name);
-		sdahi(adap);
-		goto bailout;
-	}
-	if ( 0 = getscl(adap) ) {
-		printk(KERN_WARNING "i2c-algo-bit.o: %s SCL unexpected low while SDA high!\n",
-		       name);
-	goto bailout;
-	}
-	scllo(adap);
-	printk(KERN_DEBUG "i2c-algo-bit.o:3 scl: %d  sda: %d \n",getscl(adap),
-	       getsda(adap));
-	if ( 0 != getscl(adap) ) {
-		printk(KERN_WARNING "i2c-algo-bit.o: %s SCL stuck high!\n",name);
-		sclhi(adap);
-		goto bailout;
-	}
-	if ( 0 = getsda(adap) ) {
-		printk(KERN_WARNING "i2c-algo-bit.o: %s SDA unexpected low while pulling SCL low!\n",
-			name);
-		goto bailout;
-	}
-	sclhi(adap);
-	printk(KERN_DEBUG "i2c-algo-bit.o:4 scl: %d  sda: %d \n",getscl(adap),
-	       getsda(adap));
-	if ( 0 = getscl(adap) ) {
-		printk(KERN_WARNING "i2c-algo-bit.o: %s SCL stuck low!\n",name);
-		sclhi(adap);
-		goto bailout;
-	}
-	if ( 0 = getsda(adap) ) {
-		printk(KERN_WARNING "i2c-algo-bit.o: %s SDA unexpected low while SCL high!\n",
-			name);
-		goto bailout;
-	}
-	printk(KERN_INFO "i2c-algo-bit.o: %s passed test.\n",name);
-	return 0;
-bailout:
-	sdahi(adap);
-	sclhi(adap);
-	return -ENODEV;
-}
-
-/* ----- Utility functions
- */
-
-/* try_address tries to contact a chip for a number of
- * times before it gives up.
- * return values:
- * 1 chip answered
- * 0 chip did not answer
- * -x transmission error
- */
-static inline int try_address(struct i2c_adapter *i2c_adap,
-		       unsigned char addr, int retries)
-{
-	struct i2c_algo_bit_data *adap = i2c_adap->algo_data;
-	int i,ret = -1;
-	for (i=0;i<=retries;i++) {
-		ret = i2c_outb(i2c_adap,addr);
-		if (ret=1)
-			break;	/* success! */
-		i2c_stop(adap);
-		udelay(5/*adap->udelay*/);
-		if (i=retries)  /* no success */
-			break;
-		i2c_start(adap);
-		udelay(adap->udelay);
-	}
-	DEB2(if (i)
-	     printk(KERN_DEBUG "i2c-algo-bit.o: Used %d tries to %s client at 0x%02x : %s\n",
-		    i+1, addr & 1 ? "read" : "write", addr>>1,
-		    ret=1 ? "success" : ret=0 ? "no ack" : "failed, timeout?" )
-	    );
-	return ret;
-}
-
-static int sendbytes(struct i2c_adapter *i2c_adap, struct i2c_msg *msg)
-{
-	struct i2c_algo_bit_data *adap = i2c_adap->algo_data;
-	char c;
-	const char *temp = msg->buf;
-	int count = msg->len;
-	unsigned short nak_ok = msg->flags & I2C_M_IGNORE_NAK; 
-	int retval;
-	int wrcount=0;
-
-	while (count > 0) {
-		c = *temp;
-		DEB2(dev_dbg(&i2c_adap->dev, "sendbytes: writing %2.2X\n", c&0xff));
-		retval = i2c_outb(i2c_adap,c);
-		if ((retval>0) || (nak_ok && (retval=0)))  { /* ok or ignored NAK */
-			count--; 
-			temp++;
-			wrcount++;
-		} else { /* arbitration or no acknowledge */
-			dev_err(&i2c_adap->dev, "sendbytes: error - bailout.\n");
-			i2c_stop(adap);
-			return (retval<0)? retval : -EFAULT;
-			        /* got a better one ?? */
-		}
-#if 0
-		/* from asm/delay.h */
-		__delay(adap->mdelay * (loops_per_sec / 1000) );
-#endif
-	}
-	return wrcount;
-}
-
-static inline int readbytes(struct i2c_adapter *i2c_adap, struct i2c_msg *msg)
-{
-	int inval;
-	int rdcount=0;   	/* counts bytes read */
-	struct i2c_algo_bit_data *adap = i2c_adap->algo_data;
-	char *temp = msg->buf;
-	int count = msg->len;
-
-	while (count > 0) {
-		inval = i2c_inb(i2c_adap);
-/*printk("%#02x ",inval); if ( ! (count % 16) ) printk("\n"); */
-		if (inval>=0) {
-			*temp = inval;
-			rdcount++;
-		} else {   /* read timed out */
-			printk(KERN_ERR "i2c-algo-bit.o: readbytes: i2c_inb timed out.\n");
-			break;
-		}
-
-		if ( count > 1 ) {		/* send ack */
-			sdalo(adap);
-			DEBPROTO(printk(" Am "));
-		} else {
-			sdahi(adap);	/* neg. ack on last byte */
-			DEBPROTO(printk(" NAm "));
-		}
-		if (sclhi(adap)<0) {	/* timeout */
-			sdahi(adap);
-			printk(KERN_ERR "i2c-algo-bit.o: readbytes: Timeout at ack\n");
-			return -ETIMEDOUT;
-		};
-		scllo(adap);
-		sdahi(adap);
-		temp++;
-		count--;
-	}
-	return rdcount;
-}
-
-/* doAddress initiates the transfer by generating the start condition (in
- * try_address) and transmits the address in the necessary format to handle
- * reads, writes as well as 10bit-addresses.
- * returns:
- *  0 everything went okay, the chip ack'ed, or IGNORE_NAK flag was set
- * -x an error occurred (like: -EREMOTEIO if the device did not answer, or
- *	-ETIMEDOUT, for example if the lines are stuck...) 
- */
-static inline int bit_doAddress(struct i2c_adapter *i2c_adap, struct i2c_msg *msg) 
-{
-	unsigned short flags = msg->flags;
-	unsigned short nak_ok = msg->flags & I2C_M_IGNORE_NAK;
-	struct i2c_algo_bit_data *adap = i2c_adap->algo_data;
-
-	unsigned char addr;
-	int ret, retries;
-
-	retries = nak_ok ? 0 : i2c_adap->retries;
-	
-	if ( (flags & I2C_M_TEN)  ) { 
-		/* a ten bit address */
-		addr = 0xf0 | (( msg->addr >> 7) & 0x03);
-		DEB2(printk(KERN_DEBUG "addr0: %d\n",addr));
-		/* try extended address code...*/
-		ret = try_address(i2c_adap, addr, retries);
-		if ((ret != 1) && !nak_ok)  {
-			printk(KERN_ERR "died at extended address code.\n");
-			return -EREMOTEIO;
-		}
-		/* the remaining 8 bit address */
-		ret = i2c_outb(i2c_adap,msg->addr & 0x7f);
-		if ((ret != 1) && !nak_ok) {
-			/* the chip did not ack / xmission error occurred */
-			printk(KERN_ERR "died at 2nd address code.\n");
-			return -EREMOTEIO;
-		}
-		if ( flags & I2C_M_RD ) {
-			i2c_repstart(adap);
-			/* okay, now switch into reading mode */
-			addr |= 0x01;
-			ret = try_address(i2c_adap, addr, retries);
-			if ((ret!=1) && !nak_ok) {
-				printk(KERN_ERR "died at extended address code.\n");
-				return -EREMOTEIO;
-			}
-		}
-	} else {		/* normal 7bit address	*/
-		addr = ( msg->addr << 1 );
-		if (flags & I2C_M_RD )
-			addr |= 1;
-		if (flags & I2C_M_REV_DIR_ADDR )
-			addr ^= 1;
-		ret = try_address(i2c_adap, addr, retries);
-		if ((ret!=1) && !nak_ok)
-			return -EREMOTEIO;
-	}
-
-	return 0;
-}
-
-static int bit_xfer(struct i2c_adapter *i2c_adap,
-		    struct i2c_msg msgs[], int num)
-{
-	struct i2c_msg *pmsg;
-	struct i2c_algo_bit_data *adap = i2c_adap->algo_data;
-	
-	int i,ret;
-	unsigned short nak_ok;
-
-	i2c_start(adap);
-	for (i=0;i<num;i++) {
-		pmsg = &msgs[i];
-		nak_ok = pmsg->flags & I2C_M_IGNORE_NAK; 
-		if (!(pmsg->flags & I2C_M_NOSTART)) {
-			if (i) {
-				i2c_repstart(adap);
-			}
-			ret = bit_doAddress(i2c_adap, pmsg);
-			if ((ret != 0) && !nak_ok) {
-			    DEB2(printk(KERN_DEBUG "i2c-algo-bit.o: NAK from device addr %2.2x msg #%d\n"
-					,msgs[i].addr,i));
-			    return (ret<0) ? ret : -EREMOTEIO;
-			}
-		}
-		if (pmsg->flags & I2C_M_RD ) {
-			/* read bytes into buffer*/
-			ret = readbytes(i2c_adap, pmsg);
-			DEB2(printk(KERN_DEBUG "i2c-algo-bit.o: read %d bytes.\n",ret));
-			if (ret < pmsg->len ) {
-				return (ret<0)? ret : -EREMOTEIO;
-			}
-		} else {
-			/* write bytes from buffer */
-			ret = sendbytes(i2c_adap, pmsg);
-			DEB2(printk(KERN_DEBUG "i2c-algo-bit.o: wrote %d bytes.\n",ret));
-			if (ret < pmsg->len ) {
-				return (ret<0) ? ret : -EREMOTEIO;
-			}
-		}
-	}
-	i2c_stop(adap);
-	return num;
-}
-
-static u32 bit_func(struct i2c_adapter *adap)
-{
-	return I2C_FUNC_SMBUS_EMUL | I2C_FUNC_10BIT_ADDR | 
-	       I2C_FUNC_PROTOCOL_MANGLING;
-}
-
-
-/* -----exported algorithm data: -------------------------------------	*/
-
-static struct i2c_algorithm i2c_bit_algo = {
-	.name		= "Bit-shift algorithm",
-	.id		= I2C_ALGO_BIT,
-	.master_xfer	= bit_xfer,
-	.functionality	= bit_func,
-};
-
-/* 
- * registering functions to load algorithms at runtime 
- */
-int i2c_bit_add_bus(struct i2c_adapter *adap)
-{
-	struct i2c_algo_bit_data *bit_adap = adap->algo_data;
-
-	if (bit_test) {
-		int ret = test_bus(bit_adap, adap->name);
-		if (ret<0)
-			return -ENODEV;
-	}
-
-	DEB2(dev_dbg(&adap->dev, "hw routines registered.\n"));
-
-	/* register new adapter to i2c module... */
-
-	adap->id |= i2c_bit_algo.id;
-	adap->algo = &i2c_bit_algo;
-
-	adap->timeout = 100;	/* default values, should	*/
-	adap->retries = 3;	/* be replaced by defines	*/
-
-	i2c_add_adapter(adap);
-	return 0;
-}
-
-
-int i2c_bit_del_bus(struct i2c_adapter *adap)
-{
-	return i2c_del_adapter(adap);
-}
-
-EXPORT_SYMBOL(i2c_bit_add_bus);
-EXPORT_SYMBOL(i2c_bit_del_bus);
-
-MODULE_AUTHOR("Simon G. Vogl <simon@tk.uni-linz.ac.at>");
-MODULE_DESCRIPTION("I2C-Bus bit-banging algorithm");
-MODULE_LICENSE("GPL");
-
-MODULE_PARM(bit_test, "i");
-MODULE_PARM(i2c_debug,"i");
-
-MODULE_PARM_DESC(bit_test, "Test the lines of the bus to see if it is stuck");
-MODULE_PARM_DESC(i2c_debug,
-		 "debug level - 0 off; 1 normal; 2,3 more verbose; 9 bit-protocol");
diff -Nru a/drivers/i2c/i2c-algo-ite.c b/drivers/i2c/i2c-algo-ite.c
--- a/drivers/i2c/i2c-algo-ite.c	Thu Sep 25 14:49:55 2003
+++ /dev/null	Wed Dec 31 16:00:00 1969
@@ -1,872 +0,0 @@
-/*
-   -------------------------------------------------------------------------
-   i2c-algo-ite.c i2c driver algorithms for ITE adapters	    
-   
-   Hai-Pao Fan, MontaVista Software, Inc.
-   hpfan@mvista.com or source@mvista.com
-
-   Copyright 2000 MontaVista Software Inc.
-
-   ---------------------------------------------------------------------------
-   This file was highly leveraged from i2c-algo-pcf.c, which was created
-   by Simon G. Vogl and Hans Berglund:
-
-
-     Copyright (C) 1995-1997 Simon G. Vogl
-                   1998-2000 Hans Berglund
-
-    This program is free software; you can redistribute it and/or modify
-    it under the terms of the GNU General Public License as published by
-    the Free Software Foundation; either version 2 of the License, or
-    (at your option) any later version.
-
-    This program is distributed in the hope that it will be useful,
-    but WITHOUT ANY WARRANTY; without even the implied warranty of
-    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-    GNU General Public License for more details.
-
-    You should have received a copy of the GNU General Public License
-    along with this program; if not, write to the Free Software
-    Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.		     */
-/* ------------------------------------------------------------------------- */
-
-/* With some changes from Ky?sti M?lkki <kmalkki@cc.hut.fi> and 
-   Frodo Looijaard <frodol@dds.nl> ,and also from Martin Bailey
-   <mbailey@littlefeet-inc.com> */
-
-#include <linux/kernel.h>
-#include <linux/module.h>
-#include <linux/delay.h>
-#include <linux/slab.h>
-#include <linux/init.h>
-#include <asm/uaccess.h>
-#include <linux/ioport.h>
-#include <linux/errno.h>
-#include <linux/sched.h>
-
-#include <linux/i2c.h>
-#include <linux/i2c-algo-ite.h>
-#include "i2c-ite.h"
-
-#define	PM_DSR		IT8172_PCI_IO_BASE + IT_PM_DSR
-#define	PM_IBSR		IT8172_PCI_IO_BASE + IT_PM_DSR + 0x04 
-#define GPIO_CCR	IT8172_PCI_IO_BASE + IT_GPCCR
-
-/* ----- global defines ----------------------------------------------- */
-#define DEB(x) if (i2c_debug>=1) x
-#define DEB2(x) if (i2c_debug>=2) x
-#define DEB3(x) if (i2c_debug>=3) x /* print several statistical values*/
-#define DEBPROTO(x) if (i2c_debug>=9) x;
- 	/* debug the protocol by showing transferred bits */
-#define DEF_TIMEOUT 16
-
-/* debugging - slow down transfer to have a look at the data .. 	*/
-/* I use this with two leds&resistors, each one connected to sda,scl 	*/
-/* respectively. This makes sure that the algorithm works. Some chips   */
-/* might not like this, as they have an internal timeout of some mils	*/
-/*
-#define SLO_IO      jif=jiffies;while(jiffies<=jif+i2c_table[minor].veryslow)\
-                        cond_resched();
-*/
-
-
-/* ----- global variables ---------------------------------------------	*/
-
-#ifdef SLO_IO
-	int jif;
-#endif
-
-/* module parameters:
- */
-static int i2c_debug=1;
-static int iic_test=0;	/* see if the line-setting functions work	*/
-static int iic_scan=0;	/* have a look at what's hanging 'round		*/
-
-/* --- setting states on the bus with the right timing: ---------------	*/
-
-#define get_clock(adap) adap->getclock(adap->data)
-#define iic_outw(adap, reg, val) adap->setiic(adap->data, reg, val)
-#define iic_inw(adap, reg) adap->getiic(adap->data, reg)
-
-
-/* --- other auxiliary functions --------------------------------------	*/
-
-static void iic_start(struct i2c_algo_iic_data *adap)
-{
-	iic_outw(adap,ITE_I2CHCR,ITE_CMD);
-}
-
-static void iic_stop(struct i2c_algo_iic_data *adap)
-{
-	iic_outw(adap,ITE_I2CHCR,0);
-	iic_outw(adap,ITE_I2CHSR,ITE_I2CHSR_TDI);
-}
-
-static void iic_reset(struct i2c_algo_iic_data *adap)
-{
-	iic_outw(adap, PM_IBSR, iic_inw(adap, PM_IBSR) | 0x80);
-}
-
-
-static int wait_for_bb(struct i2c_algo_iic_data *adap)
-{
-	int timeout = DEF_TIMEOUT;
-	short status;
-
-	status = iic_inw(adap, ITE_I2CHSR);
-#ifndef STUB_I2C
-	while (timeout-- && (status & ITE_I2CHSR_HB)) {
-		udelay(1000); /* How much is this? */
-		status = iic_inw(adap, ITE_I2CHSR);
-	}
-#endif
-	if (timeout<=0) {
-		printk(KERN_ERR "Timeout, host is busy\n");
-		iic_reset(adap);
-	}
-	return(timeout<=0);
-}
-
-/*
- * Puts this process to sleep for a period equal to timeout 
- */
-static inline void iic_sleep(unsigned long timeout)
-{
-	schedule_timeout( timeout * HZ);
-}
-
-/* After we issue a transaction on the IIC bus, this function
- * is called.  It puts this process to sleep until we get an interrupt from
- * from the controller telling us that the transaction we requested in complete.
- */
-static int wait_for_pin(struct i2c_algo_iic_data *adap, short *status) {
-
-	int timeout = DEF_TIMEOUT;
-	
-	timeout = wait_for_bb(adap);
-	if (timeout) {
-  		DEB2(printk("Timeout waiting for host not busy\n");)
-  		return -EIO;
-	}                           
-	timeout = DEF_TIMEOUT;
-
-	*status = iic_inw(adap, ITE_I2CHSR);
-#ifndef STUB_I2C
-	while (timeout-- && !(*status & ITE_I2CHSR_TDI)) {
-	   adap->waitforpin();
-	   *status = iic_inw(adap, ITE_I2CHSR);
-	}
-#endif
-	if (timeout <= 0)
-		return(-1);
-	else
-		return(0);
-}
-
-static int wait_for_fe(struct i2c_algo_iic_data *adap, short *status)
-{
-	int timeout = DEF_TIMEOUT;
-
-	*status = iic_inw(adap, ITE_I2CFSR);
-#ifndef STUB_I2C 
-	while (timeout-- && (*status & ITE_I2CFSR_FE)) {
-		udelay(1000);
-		iic_inw(adap, ITE_I2CFSR);
-	}
-#endif
-	if (timeout <= 0) 
-		return(-1);
-	else
-		return(0);
-}
-
-static int iic_init (struct i2c_algo_iic_data *adap)
-{
-	short i;
-
-	/* Clear bit 7 to set I2C to normal operation mode */
-	i=iic_inw(adap, PM_DSR)& 0xff7f;
-	iic_outw(adap, PM_DSR, i);
-
-	/* set IT_GPCCR port C bit 2&3 as function 2 */
-	i = iic_inw(adap, GPIO_CCR) & 0xfc0f;
-	iic_outw(adap,GPIO_CCR,i);
-
-	/* Clear slave address/sub-address */
-	iic_outw(adap,ITE_I2CSAR, 0);
-	iic_outw(adap,ITE_I2CSSAR, 0);
-
-	/* Set clock counter register */
-	iic_outw(adap,ITE_I2CCKCNT, get_clock(adap));
-
-	/* Set START/reSTART/STOP time registers */
-	iic_outw(adap,ITE_I2CSHDR, 0x0a);
-	iic_outw(adap,ITE_I2CRSUR, 0x0a);
-	iic_outw(adap,ITE_I2CPSUR, 0x0a);
-
-	/* Enable interrupts on completing the current transaction */
-	iic_outw(adap,ITE_I2CHCR, ITE_I2CHCR_IE | ITE_I2CHCR_HCE);
-
-	/* Clear transfer count */
-	iic_outw(adap,ITE_I2CFBCR, 0x0);
-
-	DEB2(printk("iic_init: Initialized IIC on ITE 0x%x\n",
-		iic_inw(adap, ITE_I2CHSR)));
-	return 0;
-}
-
-
-/*
- * Sanity check for the adapter hardware - check the reaction of
- * the bus lines only if it seems to be idle.
- */
-static int test_bus(struct i2c_algo_iic_data *adap, char *name) {
-#if 0
-	int scl,sda;
-	sda=getsda(adap);
-	if (adap->getscl=NULL) {
-		printk("test_bus: Warning: Adapter can't read from clock line - skipping test.\n");
-		return 0;		
-	}
-	scl=getscl(adap);
-	printk("test_bus: Adapter: %s scl: %d  sda: %d -- testing...\n",
-	name,getscl(adap),getsda(adap));
-	if (!scl || !sda ) {
-		printk("test_bus: %s seems to be busy.\n",adap->name);
-		goto bailout;
-	}
-	sdalo(adap);
-	printk("test_bus:1 scl: %d  sda: %d \n",getscl(adap),
-	       getsda(adap));
-	if ( 0 != getsda(adap) ) {
-		printk("test_bus: %s SDA stuck high!\n",name);
-		sdahi(adap);
-		goto bailout;
-	}
-	if ( 0 = getscl(adap) ) {
-		printk("test_bus: %s SCL unexpected low while pulling SDA low!\n",
-			name);
-		goto bailout;
-	}		
-	sdahi(adap);
-	printk("test_bus:2 scl: %d  sda: %d \n",getscl(adap),
-	       getsda(adap));
-	if ( 0 = getsda(adap) ) {
-		printk("test_bus: %s SDA stuck low!\n",name);
-		sdahi(adap);
-		goto bailout;
-	}
-	if ( 0 = getscl(adap) ) {
-		printk("test_bus: %s SCL unexpected low while SDA high!\n",
-		       adap->name);
-	goto bailout;
-	}
-	scllo(adap);
-	printk("test_bus:3 scl: %d  sda: %d \n",getscl(adap),
-	       getsda(adap));
-	if ( 0 != getscl(adap) ) {
-
-		sclhi(adap);
-		goto bailout;
-	}
-	if ( 0 = getsda(adap) ) {
-		printk("test_bus: %s SDA unexpected low while pulling SCL low!\n",
-			name);
-		goto bailout;
-	}
-	sclhi(adap);
-	printk("test_bus:4 scl: %d  sda: %d \n",getscl(adap),
-	       getsda(adap));
-	if ( 0 = getscl(adap) ) {
-		printk("test_bus: %s SCL stuck low!\n",name);
-		sclhi(adap);
-		goto bailout;
-	}
-	if ( 0 = getsda(adap) ) {
-		printk("test_bus: %s SDA unexpected low while SCL high!\n",
-			name);
-		goto bailout;
-	}
-	printk("test_bus: %s passed test.\n",name);
-	return 0;
-bailout:
-	sdahi(adap);
-	sclhi(adap);
-	return -ENODEV;
-#endif
-	return (0);
-}
-
-/* ----- Utility functions
- */
-
-
-/* Verify the device we want to talk to on the IIC bus really exists. */
-static inline int try_address(struct i2c_algo_iic_data *adap,
-		       unsigned int addr, int retries)
-{
-	int i, ret = -1;
-	short status;
-
-	for (i=0;i<retries;i++) {
-		iic_outw(adap, ITE_I2CSAR, addr);
-		iic_start(adap);
-		if (wait_for_pin(adap, &status) = 0) {
-			if ((status & ITE_I2CHSR_DNE) = 0) { 
-				iic_stop(adap);
-				iic_outw(adap, ITE_I2CFCR, ITE_I2CFCR_FLUSH);
-				ret=1;
-				break;	/* success! */
-			}
-		}
-		iic_stop(adap);
-		udelay(adap->udelay);
-	}
-	DEB2(if (i) printk("try_address: needed %d retries for 0x%x\n",i,
-	                   addr));
-	return ret;
-}
-
-
-static int iic_sendbytes(struct i2c_adapter *i2c_adap,const char *buf,
-                         int count)
-{
-	struct i2c_algo_iic_data *adap = i2c_adap->algo_data;
-	int wrcount=0, timeout;
-	short status;
-	int loops, remainder, i, j;
-	union {
-		char byte[2];
-		unsigned short word;
-	} tmp;
-   
-	iic_outw(adap, ITE_I2CSSAR, (unsigned short)buf[wrcount++]);
-	count--;
-	if (count = 0)
-		return -EIO;
-
-	loops =  count / 32;		/* 32-byte FIFO */
-	remainder = count % 32;
-
-	if(loops) {
-		for(i=0; i<loops; i++) {
-
-			iic_outw(adap, ITE_I2CFBCR, 32);
-			for(j=0; j<32/2; j++) {
-				tmp.byte[1] = buf[wrcount++];
-				tmp.byte[0] = buf[wrcount++];
-				iic_outw(adap, ITE_I2CFDR, tmp.word); 
-			}
-
-			/* status FIFO overrun */
-			iic_inw(adap, ITE_I2CFSR);
-			iic_inw(adap, ITE_I2CFBCR);
-
-			iic_outw(adap, ITE_I2CHCR, ITE_WRITE);	/* Issue WRITE command */
-
-			/* Wait for transmission to complete */
-			timeout = wait_for_pin(adap, &status);
-			if(timeout) {
-				iic_stop(adap);
-				printk("iic_sendbytes: %s write timeout.\n", i2c_adap->name);
-				return -EREMOTEIO; /* got a better one ?? */
-     	}
-			if (status & ITE_I2CHSR_DB) {
-				iic_stop(adap);
-				printk("iic_sendbytes: %s write error - no ack.\n", i2c_adap->name);
-				return -EREMOTEIO; /* got a better one ?? */
-			}
-		}
-	}
-	if(remainder) {
-		iic_outw(adap, ITE_I2CFBCR, remainder);
-		for(i=0; i<remainder/2; i++) {
-			tmp.byte[1] = buf[wrcount++];
-			tmp.byte[0] = buf[wrcount++];
-			iic_outw(adap, ITE_I2CFDR, tmp.word);
-		}
-
-		/* status FIFO overrun */
-		iic_inw(adap, ITE_I2CFSR);
-		iic_inw(adap, ITE_I2CFBCR);
-
-		iic_outw(adap, ITE_I2CHCR, ITE_WRITE);  /* Issue WRITE command */
-
-		timeout = wait_for_pin(adap, &status);
-		if(timeout) {
-			iic_stop(adap);
-			printk("iic_sendbytes: %s write timeout.\n", i2c_adap->name);
-			return -EREMOTEIO; /* got a better one ?? */
-		}
-#ifndef STUB_I2C
-		if (status & ITE_I2CHSR_DB) { 
-			iic_stop(adap);
-			printk("iic_sendbytes: %s write error - no ack.\n", i2c_adap->name);
-			return -EREMOTEIO; /* got a better one ?? */
-		}
-#endif
-	}
-	iic_stop(adap);
-	return wrcount;
-}
-
-
-static int iic_readbytes(struct i2c_adapter *i2c_adap, char *buf, int count,
-	int sread)
-{
-	int rdcount=0, i, timeout;
-	short status;
-	struct i2c_algo_iic_data *adap = i2c_adap->algo_data;
-	int loops, remainder, j;
-	union {
-		char byte[2];
-		unsigned short word;
-	} tmp;
-		
-	loops = count / 32;				/* 32-byte FIFO */
-	remainder = count % 32;
-
-	if(loops) {
-		for(i=0; i<loops; i++) {
-			iic_outw(adap, ITE_I2CFBCR, 32);
-			if (sread)
-				iic_outw(adap, ITE_I2CHCR, ITE_SREAD);
-			else
-				iic_outw(adap, ITE_I2CHCR, ITE_READ);		/* Issue READ command */
-
-			timeout = wait_for_pin(adap, &status);
-			if(timeout) {
-				iic_stop(adap);
-				printk("iic_readbytes:  %s read timeout.\n", i2c_adap->name);
-				return (-1);
-			}
-#ifndef STUB_I2C
-			if (status & ITE_I2CHSR_DB) {
-				iic_stop(adap);
-				printk("iic_readbytes: %s read error - no ack.\n", i2c_adap->name);
-				return (-1);
-			}
-#endif
-
-			timeout = wait_for_fe(adap, &status);
-			if(timeout) {
-				iic_stop(adap);
-				printk("iic_readbytes:  %s FIFO is empty\n", i2c_adap->name);
-				return (-1); 
-			}
-
-			for(j=0; j<32/2; j++) {
-				tmp.word = iic_inw(adap, ITE_I2CFDR);
-				buf[rdcount++] = tmp.byte[1];
-				buf[rdcount++] = tmp.byte[0];
-			}
-
-			/* status FIFO underrun */
-			iic_inw(adap, ITE_I2CFSR);
-
-		}
-	}
-
-
-	if(remainder) {
-		remainder=(remainder+1)/2 * 2;
-		iic_outw(adap, ITE_I2CFBCR, remainder);
-		if (sread)
-			iic_outw(adap, ITE_I2CHCR, ITE_SREAD);
-		else
-		iic_outw(adap, ITE_I2CHCR, ITE_READ);		/* Issue READ command */
-
-		timeout = wait_for_pin(adap, &status);
-		if(timeout) {
-			iic_stop(adap);
-			printk("iic_readbytes:  %s read timeout.\n", i2c_adap->name);
-			return (-1);
-		}
-#ifndef STUB_I2C
-		if (status & ITE_I2CHSR_DB) {
-			iic_stop(adap);
-			printk("iic_readbytes: %s read error - no ack.\n", i2c_adap->name);
-			return (-1);
-		}
-#endif
-		timeout = wait_for_fe(adap, &status);
-		if(timeout) {
-			iic_stop(adap);
-			printk("iic_readbytes:  %s FIFO is empty\n", i2c_adap->name);
-			return (-1);
-		}         
-
-		for(i=0; i<(remainder+1)/2; i++) {
-			tmp.word = iic_inw(adap, ITE_I2CFDR);
-			buf[rdcount++] = tmp.byte[1];
-			buf[rdcount++] = tmp.byte[0];
-		}
-
-		/* status FIFO underrun */
-		iic_inw(adap, ITE_I2CFSR);
-
-	}
-
-	iic_stop(adap);
-	return rdcount;
-}
-
-
-/* This function implements combined transactions.  Combined
- * transactions consist of combinations of reading and writing blocks of data.
- * Each transfer (i.e. a read or a write) is separated by a repeated start
- * condition.
- */
-#if 0
-static int iic_combined_transaction(struct i2c_adapter *i2c_adap, struct i2c_msg msgs[], int num) 
-{
-   int i;
-   struct i2c_msg *pmsg;
-   int ret;
-
-   DEB2(printk("Beginning combined transaction\n"));
-
-   for(i=0; i<(num-1); i++) {
-      pmsg = &msgs[i];
-      if(pmsg->flags & I2C_M_RD) {
-         DEB2(printk("  This one is a read\n"));
-         ret = iic_readbytes(i2c_adap, pmsg->buf, pmsg->len, IIC_COMBINED_XFER);
-      }
-      else if(!(pmsg->flags & I2C_M_RD)) {
-         DEB2(printk("This one is a write\n"));
-         ret = iic_sendbytes(i2c_adap, pmsg->buf, pmsg->len, IIC_COMBINED_XFER);
-      }
-   }
-   /* Last read or write segment needs to be terminated with a stop */
-   pmsg = &msgs[i];
-
-   if(pmsg->flags & I2C_M_RD) {
-      DEB2(printk("Doing the last read\n"));
-      ret = iic_readbytes(i2c_adap, pmsg->buf, pmsg->len, IIC_SINGLE_XFER);
-   }
-   else if(!(pmsg->flags & I2C_M_RD)) {
-      DEB2(printk("Doing the last write\n"));
-      ret = iic_sendbytes(i2c_adap, pmsg->buf, pmsg->len, IIC_SINGLE_XFER);
-   }
-
-   return ret;
-}
-#endif
-
-
-/* Whenever we initiate a transaction, the first byte clocked
- * onto the bus after the start condition is the address (7 bit) of the
- * device we want to talk to.  This function manipulates the address specified
- * so that it makes sense to the hardware when written to the IIC peripheral.
- *
- * Note: 10 bit addresses are not supported in this driver, although they are
- * supported by the hardware.  This functionality needs to be implemented.
- */
-static inline int iic_doAddress(struct i2c_algo_iic_data *adap,
-                                struct i2c_msg *msg, int retries) 
-{
-	unsigned short flags = msg->flags;
-	unsigned int addr;
-	int ret;
-
-/* Ten bit addresses not supported right now */
-	if ( (flags & I2C_M_TEN)  ) { 
-#if 0
-		addr = 0xf0 | (( msg->addr >> 7) & 0x03);
-		DEB2(printk("addr0: %d\n",addr));
-		ret = try_address(adap, addr, retries);
-		if (ret!=1) {
-			printk("iic_doAddress: died at extended address code.\n");
-			return -EREMOTEIO;
-		}
-		iic_outw(adap,msg->addr & 0x7f);
-		if (ret != 1) {
-			printk("iic_doAddress: died at 2nd address code.\n");
-			return -EREMOTEIO;
-		}
-		if ( flags & I2C_M_RD ) {
-			i2c_repstart(adap);
-			addr |= 0x01;
-			ret = try_address(adap, addr, retries);
-			if (ret!=1) {
-				printk("iic_doAddress: died at extended address code.\n");
-				return -EREMOTEIO;
-			}
-		}
-#endif
-	} else {
-
-		addr = ( msg->addr << 1 );
-
-#if 0
-		if (flags & I2C_M_RD )
-			addr |= 1;
-		if (flags & I2C_M_REV_DIR_ADDR )
-			addr ^= 1;
-#endif
-
-		if (iic_inw(adap, ITE_I2CSAR) != addr) {
-			iic_outw(adap, ITE_I2CSAR, addr);
-			ret = try_address(adap, addr, retries);
-			if (ret!=1) {
-				printk("iic_doAddress: died at address code.\n");
-				return -EREMOTEIO;
-			}
-		}
-
-  }
-
-	return 0;
-}
-
-
-/* Description: Prepares the controller for a transaction (clearing status
- * registers, data buffers, etc), and then calls either iic_readbytes or
- * iic_sendbytes to do the actual transaction.
- *
- * still to be done: Before we issue a transaction, we should
- * verify that the bus is not busy or in some unknown state.
- */
-static int iic_xfer(struct i2c_adapter *i2c_adap,
-		    struct i2c_msg msgs[], 
-		    int num)
-{
-	struct i2c_algo_iic_data *adap = i2c_adap->algo_data;
-	struct i2c_msg *pmsg;
-	int i = 0;
-	int ret, timeout;
-    
-	pmsg = &msgs[i];
-
-	if(!pmsg->len) {
-		DEB2(printk("iic_xfer: read/write length is 0\n");)
-		return -EIO;
-	}
-	if(!(pmsg->flags & I2C_M_RD) && (!(pmsg->len)%2) ) {
-		DEB2(printk("iic_xfer: write buffer length is not odd\n");)
-		return -EIO; 
-	}
-
-	/* Wait for any pending transfers to complete */
-	timeout = wait_for_bb(adap);
-	if (timeout) {
-		DEB2(printk("iic_xfer: Timeout waiting for host not busy\n");)
-		return -EIO;
-	}
-
-	/* Flush FIFO */
-	iic_outw(adap, ITE_I2CFCR, ITE_I2CFCR_FLUSH);
-
-	/* Load address */
-	ret = iic_doAddress(adap, pmsg, i2c_adap->retries);
-	if (ret)
-		return -EIO;
-
-#if 0
-	/* Combined transaction (read and write) */
-	if(num > 1) {
-           DEB2(printk("iic_xfer: Call combined transaction\n"));
-           ret = iic_combined_transaction(i2c_adap, msgs, num);
-  }
-#endif
-
-	DEB3(printk("iic_xfer: Msg %d, addr=0x%x, flags=0x%x, len=%d\n",
-		i, msgs[i].addr, msgs[i].flags, msgs[i].len);)
-
-	if(pmsg->flags & I2C_M_RD) 		/* Read */
-		ret = iic_readbytes(i2c_adap, pmsg->buf, pmsg->len, 0);
-	else {													/* Write */ 
-		udelay(1000);
-		ret = iic_sendbytes(i2c_adap, pmsg->buf, pmsg->len);
-	}
-
-	if (ret != pmsg->len)
-		DEB3(printk("iic_xfer: error or fail on read/write %d bytes.\n",ret)); 
-	else
-		DEB3(printk("iic_xfer: read/write %d bytes.\n",ret));
-
-	return ret;
-}
-
-
-/* Implements device specific ioctls.  Higher level ioctls can
- * be found in i2c-core.c and are typical of any i2c controller (specifying
- * slave address, timeouts, etc).  These ioctls take advantage of any hardware
- * features built into the controller for which this algorithm-adapter set
- * was written.  These ioctls allow you to take control of the data and clock
- * lines and set the either high or low,
- * similar to a GPIO pin.
- */
-static int algo_control(struct i2c_adapter *adapter, 
-	unsigned int cmd, unsigned long arg)
-{
-
-  struct i2c_algo_iic_data *adap = adapter->algo_data;
-  struct i2c_iic_msg s_msg;
-  char *buf;
-	int ret;
-
-  if (cmd = I2C_SREAD) {
-		if(copy_from_user(&s_msg, (struct i2c_iic_msg *)arg, 
-				sizeof(struct i2c_iic_msg))) 
-			return -EFAULT;
-		buf = kmalloc(s_msg.len, GFP_KERNEL);
-		if (buf= NULL)
-			return -ENOMEM;
-
-		/* Flush FIFO */
-		iic_outw(adap, ITE_I2CFCR, ITE_I2CFCR_FLUSH);
-
-		/* Load address */
-		iic_outw(adap, ITE_I2CSAR,s_msg.addr<<1);
-		iic_outw(adap, ITE_I2CSSAR,s_msg.waddr & 0xff);
-
-		ret = iic_readbytes(adapter, buf, s_msg.len, 1);
-		if (ret>=0) {
-			if(copy_to_user( s_msg.buf, buf, s_msg.len) ) 
-				ret = -EFAULT;
-		}
-		kfree(buf);
-	}
-	return 0;
-}
-
-
-static u32 iic_func(struct i2c_adapter *adap)
-{
-	return I2C_FUNC_SMBUS_EMUL | I2C_FUNC_10BIT_ADDR | 
-	       I2C_FUNC_PROTOCOL_MANGLING; 
-}
-
-/* -----exported algorithm data: -------------------------------------	*/
-
-static struct i2c_algorithm iic_algo = {
-	"ITE IIC algorithm",
-	I2C_ALGO_IIC,
-	iic_xfer,		/* master_xfer	*/
-	NULL,				/* smbus_xfer	*/
-	NULL,				/* slave_xmit		*/
-	NULL,				/* slave_recv		*/
-	algo_control,			/* ioctl		*/
-	iic_func,			/* functionality	*/
-};
-
-
-/* 
- * registering functions to load algorithms at runtime 
- */
-int i2c_iic_add_bus(struct i2c_adapter *adap)
-{
-	int i;
-	short status;
-	struct i2c_algo_iic_data *iic_adap = adap->algo_data;
-
-	if (iic_test) {
-		int ret = test_bus(iic_adap, adap->name);
-		if (ret<0)
-			return -ENODEV;
-	}
-
-	DEB2(printk("i2c-algo-ite: hw routines for %s registered.\n",
-	            adap->name));
-
-	/* register new adapter to i2c module... */
-
-	adap->id |= iic_algo.id;
-	adap->algo = &iic_algo;
-
-	adap->timeout = 100;	/* default values, should	*/
-	adap->retries = 3;		/* be replaced by defines	*/
-	adap->flags = 0;
-
-#ifdef MODULE
-	MOD_INC_USE_COUNT;
-#endif
-
-	i2c_add_adapter(adap);
-	iic_init(iic_adap);
-
-	/* scan bus */
-	/* By default scanning the bus is turned off. */
-	if (iic_scan) {
-		printk(KERN_INFO " i2c-algo-ite: scanning bus %s.\n",
-		       adap->name);
-		for (i = 0x00; i < 0xff; i+=2) {
-			iic_outw(iic_adap, ITE_I2CSAR, i);
-			iic_start(iic_adap);
-			if ( (wait_for_pin(iic_adap, &status) = 0) && 
-			    ((status & ITE_I2CHSR_DNE) = 0) ) { 
-				printk(KERN_INFO "\n(%02x)\n",i>>1); 
-			} else {
-				printk(KERN_INFO "."); 
-				iic_reset(iic_adap);
-			}
-			udelay(iic_adap->udelay);
-		}
-	}
-	return 0;
-}
-
-
-int i2c_iic_del_bus(struct i2c_adapter *adap)
-{
-	int res;
-	if ((res = i2c_del_adapter(adap)) < 0)
-		return res;
-	DEB2(printk("i2c-algo-ite: adapter unregistered: %s\n",adap->name));
-
-#ifdef MODULE
-	MOD_DEC_USE_COUNT;
-#endif
-	return 0;
-}
-
-
-int __init i2c_algo_iic_init (void)
-{
-	printk(KERN_INFO "ITE iic (i2c) algorithm module\n");
-	return 0;
-}
-
-
-void i2c_algo_iic_exit(void)
-{
-	return;
-}
-
-
-EXPORT_SYMBOL(i2c_iic_add_bus);
-EXPORT_SYMBOL(i2c_iic_del_bus);
-
-/* The MODULE_* macros resolve to nothing if MODULES is not defined
- * when this file is compiled.
- */
-MODULE_AUTHOR("MontaVista Software <www.mvista.com>");
-MODULE_DESCRIPTION("ITE iic algorithm");
-MODULE_LICENSE("GPL");
-
-MODULE_PARM(iic_test, "i");
-MODULE_PARM(iic_scan, "i");
-MODULE_PARM(i2c_debug,"i");
-
-MODULE_PARM_DESC(iic_test, "Test if the I2C bus is available");
-MODULE_PARM_DESC(iic_scan, "Scan for active chips on the bus");
-MODULE_PARM_DESC(i2c_debug,
-        "debug level - 0 off; 1 normal; 2,3 more verbose; 9 iic-protocol");
-
-
-/* This function resolves to init_module (the function invoked when a module
- * is loaded via insmod) when this file is compiled with MODULES defined.
- * Otherwise (i.e. if you want this driver statically linked to the kernel),
- * a pointer to this function is stored in a table and called
- * during the initialization of the kernel (in do_basic_setup in /init/main.c) 
- *
- * All this functionality is complements of the macros defined in linux/init.h
- */
-module_init(i2c_algo_iic_init);
-
-
-/* If MODULES is defined when this file is compiled, then this function will
- * resolved to cleanup_module.
- */
-module_exit(i2c_algo_iic_exit);
diff -Nru a/drivers/i2c/i2c-algo-pcf.c b/drivers/i2c/i2c-algo-pcf.c
--- a/drivers/i2c/i2c-algo-pcf.c	Thu Sep 25 14:49:55 2003
+++ /dev/null	Wed Dec 31 16:00:00 1969
@@ -1,479 +0,0 @@
-/* ------------------------------------------------------------------------- */
-/* i2c-algo-pcf.c i2c driver algorithms for PCF8584 adapters		     */
-/* ------------------------------------------------------------------------- */
-/*   Copyright (C) 1995-1997 Simon G. Vogl
-                   1998-2000 Hans Berglund
-
-    This program is free software; you can redistribute it and/or modify
-    it under the terms of the GNU General Public License as published by
-    the Free Software Foundation; either version 2 of the License, or
-    (at your option) any later version.
-
-    This program is distributed in the hope that it will be useful,
-    but WITHOUT ANY WARRANTY; without even the implied warranty of
-    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-    GNU General Public License for more details.
-
-    You should have received a copy of the GNU General Public License
-    along with this program; if not, write to the Free Software
-    Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.		     */
-/* ------------------------------------------------------------------------- */
-
-/* With some changes from Ky?sti M?lkki <kmalkki@cc.hut.fi> and 
-   Frodo Looijaard <frodol@dds.nl> ,and also from Martin Bailey
-   <mbailey@littlefeet-inc.com> */
-
-/* Partially rewriten by Oleg I. Vdovikin <vdovikin@jscc.ru> to handle multiple
-   messages, proper stop/repstart signaling during receive,
-   added detect code */
-
-/* #define DEBUG 1 */		/* to pick up dev_dbg calls */
-
-#include <linux/kernel.h>
-#include <linux/module.h>
-#include <linux/delay.h>
-#include <linux/slab.h>
-#include <linux/init.h>
-#include <linux/errno.h>
-#include <linux/i2c.h>
-#include <linux/i2c-algo-pcf.h>
-#include "i2c-pcf8584.h"
-
-
-/* ----- global defines ----------------------------------------------- */
-#define DEB(x) if (i2c_debug>=1) x
-#define DEB2(x) if (i2c_debug>=2) x
-#define DEB3(x) if (i2c_debug>=3) x /* print several statistical values*/
-#define DEBPROTO(x) if (i2c_debug>=9) x;
- 	/* debug the protocol by showing transferred bits */
-#define DEF_TIMEOUT 16
-
-/* module parameters:
- */
-static int i2c_debug=0;
-
-/* --- setting states on the bus with the right timing: ---------------	*/
-
-#define set_pcf(adap, ctl, val) adap->setpcf(adap->data, ctl, val)
-#define get_pcf(adap, ctl) adap->getpcf(adap->data, ctl)
-#define get_own(adap) adap->getown(adap->data)
-#define get_clock(adap) adap->getclock(adap->data)
-#define i2c_outb(adap, val) adap->setpcf(adap->data, 0, val)
-#define i2c_inb(adap) adap->getpcf(adap->data, 0)
-
-/* --- other auxiliary functions --------------------------------------	*/
-
-static void i2c_start(struct i2c_algo_pcf_data *adap) 
-{
-	DEBPROTO(printk("S "));
-	set_pcf(adap, 1, I2C_PCF_START);
-}
-
-static void i2c_repstart(struct i2c_algo_pcf_data *adap) 
-{
-	DEBPROTO(printk(" Sr "));
-	set_pcf(adap, 1, I2C_PCF_REPSTART);
-}
-
-
-static void i2c_stop(struct i2c_algo_pcf_data *adap) 
-{
-	DEBPROTO(printk("P\n"));
-	set_pcf(adap, 1, I2C_PCF_STOP);
-}
-
-
-static int wait_for_bb(struct i2c_algo_pcf_data *adap) {
-
-	int timeout = DEF_TIMEOUT;
-	int status;
-
-	status = get_pcf(adap, 1);
-#ifndef STUB_I2C
-	while (timeout-- && !(status & I2C_PCF_BB)) {
-		udelay(100); /* wait for 100 us */
-		status = get_pcf(adap, 1);
-	}
-#endif
-	if (timeout <= 0) {
-		printk(KERN_ERR "Timeout waiting for Bus Busy\n");
-	}
-	
-	return (timeout<=0);
-}
-
-
-static inline void pcf_sleep(unsigned long timeout)
-{
-	schedule_timeout( timeout * HZ);
-}
-
-
-static int wait_for_pin(struct i2c_algo_pcf_data *adap, int *status) {
-
-	int timeout = DEF_TIMEOUT;
-
-	*status = get_pcf(adap, 1);
-#ifndef STUB_I2C
-	while (timeout-- && (*status & I2C_PCF_PIN)) {
-		adap->waitforpin();
-		*status = get_pcf(adap, 1);
-	}
-#endif
-	if (timeout <= 0)
-		return(-1);
-	else
-		return(0);
-}
-
-/* 
- * This should perform the 'PCF8584 initialization sequence' as described
- * in the Philips IC12 data book (1995, Aug 29).
- * There should be a 30 clock cycle wait after reset, I assume this
- * has been fulfilled.
- * There should be a delay at the end equal to the longest I2C message
- * to synchronize the BB-bit (in multimaster systems). How long is
- * this? I assume 1 second is always long enough.
- *
- * vdovikin: added detect code for PCF8584
- */
-static int pcf_init_8584 (struct i2c_algo_pcf_data *adap)
-{
-	unsigned char temp;
-
-	DEB3(printk(KERN_DEBUG "i2c-algo-pcf.o: PCF state 0x%02x\n", get_pcf(adap, 1)));
-
-	/* S1=0x80: S0 selected, serial interface off */
-	set_pcf(adap, 1, I2C_PCF_PIN);
-	/* check to see S1 now used as R/W ctrl -
-	   PCF8584 does that when ESO is zero */
-	if (((temp = get_pcf(adap, 1)) & 0x7f) != (0)) {
-		DEB2(printk(KERN_ERR "i2c-algo-pcf.o: PCF detection failed -- can't select S0 (0x%02x).\n", temp));
-		return -ENXIO; /* definetly not PCF8584 */
-	}
-
-	/* load own address in S0, effective address is (own << 1)	*/
-	i2c_outb(adap, get_own(adap));
-	/* check it's really written */
-	if ((temp = i2c_inb(adap)) != get_own(adap)) {
-		DEB2(printk(KERN_ERR "i2c-algo-pcf.o: PCF detection failed -- can't set S0 (0x%02x).\n", temp));
-		return -ENXIO;
-	}
-
-	/* S1=0xA0, next byte in S2					*/
-	set_pcf(adap, 1, I2C_PCF_PIN | I2C_PCF_ES1);
-	/* check to see S2 now selected */
-	if (((temp = get_pcf(adap, 1)) & 0x7f) != I2C_PCF_ES1) {
-		DEB2(printk(KERN_ERR "i2c-algo-pcf.o: PCF detection failed -- can't select S2 (0x%02x).\n", temp));
-		return -ENXIO;
-	}
-
-	/* load clock register S2					*/
-	i2c_outb(adap, get_clock(adap));
-	/* check it's really written, the only 5 lowest bits does matter */
-	if (((temp = i2c_inb(adap)) & 0x1f) != get_clock(adap)) {
-		DEB2(printk(KERN_ERR "i2c-algo-pcf.o: PCF detection failed -- can't set S2 (0x%02x).\n", temp));
-		return -ENXIO;
-	}
-
-	/* Enable serial interface, idle, S0 selected			*/
-	set_pcf(adap, 1, I2C_PCF_IDLE);
-
-	/* check to see PCF is really idled and we can access status register */
-	if ((temp = get_pcf(adap, 1)) != (I2C_PCF_PIN | I2C_PCF_BB)) {
-		DEB2(printk(KERN_ERR "i2c-algo-pcf.o: PCF detection failed -- can't select S1` (0x%02x).\n", temp));
-		return -ENXIO;
-	}
-	
-	printk(KERN_DEBUG "i2c-algo-pcf.o: deteted and initialized PCF8584.\n");
-
-	return 0;
-}
-
-
-/* ----- Utility functions
- */
-
-static inline int try_address(struct i2c_algo_pcf_data *adap,
-		       unsigned char addr, int retries)
-{
-	int i, status, ret = -1;
-	for (i=0;i<retries;i++) {
-		i2c_outb(adap, addr);
-		i2c_start(adap);
-		status = get_pcf(adap, 1);
-		if (wait_for_pin(adap, &status) >= 0) {
-			if ((status & I2C_PCF_LRB) = 0) { 
-				i2c_stop(adap);
-				break;	/* success! */
-			}
-		}
-		i2c_stop(adap);
-		udelay(adap->udelay);
-	}
-	DEB2(if (i) printk(KERN_DEBUG "i2c-algo-pcf.o: needed %d retries for %d\n",i,
-	                   addr));
-	return ret;
-}
-
-
-static int pcf_sendbytes(struct i2c_adapter *i2c_adap, const char *buf,
-                         int count, int last)
-{
-	struct i2c_algo_pcf_data *adap = i2c_adap->algo_data;
-	int wrcount, status, timeout;
-    
-	for (wrcount=0; wrcount<count; ++wrcount) {
-		DEB2(dev_dbg(&i2c_adap->dev, "i2c_write: writing %2.2X\n",
-				buf[wrcount]&0xff));
-		i2c_outb(adap, buf[wrcount]);
-		timeout = wait_for_pin(adap, &status);
-		if (timeout) {
-			i2c_stop(adap);
-			dev_err(&i2c_adap->dev, "i2c_write: error - timeout.\n");
-			return -EREMOTEIO; /* got a better one ?? */
-		}
-#ifndef STUB_I2C
-		if (status & I2C_PCF_LRB) {
-			i2c_stop(adap);
-			dev_err(&i2c_adap->dev, "i2c_write: error - no ack.\n");
-			return -EREMOTEIO; /* got a better one ?? */
-		}
-#endif
-	}
-	if (last) {
-		i2c_stop(adap);
-	}
-	else {
-		i2c_repstart(adap);
-	}
-
-	return (wrcount);
-}
-
-
-static int pcf_readbytes(struct i2c_adapter *i2c_adap, char *buf,
-                         int count, int last)
-{
-	int i, status;
-	struct i2c_algo_pcf_data *adap = i2c_adap->algo_data;
-
-	/* increment number of bytes to read by one -- read dummy byte */
-	for (i = 0; i <= count; i++) {
-
-		if (wait_for_pin(adap, &status)) {
-			i2c_stop(adap);
-			dev_err(&i2c_adap->dev, "pcf_readbytes timed out.\n");
-			return (-1);
-		}
-
-#ifndef STUB_I2C
-		if ((status & I2C_PCF_LRB) && (i != count)) {
-			i2c_stop(adap);
-			dev_err(&i2c_adap->dev, "i2c_read: i2c_inb, No ack.\n");
-			return (-1);
-		}
-#endif
-		
-		if (i = count - 1) {
-			set_pcf(adap, 1, I2C_PCF_ESO);
-		} else 
-		if (i = count) {
-			if (last) {
-				i2c_stop(adap);
-			} else {
-				i2c_repstart(adap);
-			}
-		};
-
-		if (i) {
-			buf[i - 1] = i2c_inb(adap);
-		} else {
-			i2c_inb(adap); /* dummy read */
-		}
-	}
-
-	return (i - 1);
-}
-
-
-static inline int pcf_doAddress(struct i2c_algo_pcf_data *adap,
-                                struct i2c_msg *msg, int retries) 
-{
-	unsigned short flags = msg->flags;
-	unsigned char addr;
-	int ret;
-	if ( (flags & I2C_M_TEN)  ) { 
-		/* a ten bit address */
-		addr = 0xf0 | (( msg->addr >> 7) & 0x03);
-		DEB2(printk(KERN_DEBUG "addr0: %d\n",addr));
-		/* try extended address code...*/
-		ret = try_address(adap, addr, retries);
-		if (ret!=1) {
-			printk(KERN_ERR "died at extended address code.\n");
-			return -EREMOTEIO;
-		}
-		/* the remaining 8 bit address */
-		i2c_outb(adap,msg->addr & 0x7f);
-/* Status check comes here */
-		if (ret != 1) {
-			printk(KERN_ERR "died at 2nd address code.\n");
-			return -EREMOTEIO;
-		}
-		if ( flags & I2C_M_RD ) {
-			i2c_repstart(adap);
-			/* okay, now switch into reading mode */
-			addr |= 0x01;
-			ret = try_address(adap, addr, retries);
-			if (ret!=1) {
-				printk(KERN_ERR "died at extended address code.\n");
-				return -EREMOTEIO;
-			}
-		}
-	} else {		/* normal 7bit address	*/
-		addr = ( msg->addr << 1 );
-		if (flags & I2C_M_RD )
-			addr |= 1;
-		if (flags & I2C_M_REV_DIR_ADDR )
-			addr ^= 1;
-		i2c_outb(adap, addr);
-	}
-	return 0;
-}
-
-static int pcf_xfer(struct i2c_adapter *i2c_adap,
-		    struct i2c_msg msgs[], 
-		    int num)
-{
-	struct i2c_algo_pcf_data *adap = i2c_adap->algo_data;
-	struct i2c_msg *pmsg;
-	int i;
-	int ret=0, timeout, status;
-    
-
-	/* Check for bus busy */
-	timeout = wait_for_bb(adap);
-	if (timeout) {
-		DEB2(printk(KERN_ERR "i2c-algo-pcf.o: "
-		            "Timeout waiting for BB in pcf_xfer\n");)
-		return -EIO;
-	}
-	
-	for (i = 0;ret >= 0 && i < num; i++) {
-		pmsg = &msgs[i];
-
-		DEB2(printk(KERN_DEBUG "i2c-algo-pcf.o: Doing %s %d bytes to 0x%02x - %d of %d messages\n",
-		     pmsg->flags & I2C_M_RD ? "read" : "write",
-                     pmsg->len, pmsg->addr, i + 1, num);)
-    
-		ret = pcf_doAddress(adap, pmsg, i2c_adap->retries);
-
-		/* Send START */
-		if (i = 0) {
-			i2c_start(adap); 
-		}
-    
-		/* Wait for PIN (pending interrupt NOT) */
-		timeout = wait_for_pin(adap, &status);
-		if (timeout) {
-			i2c_stop(adap);
-			DEB2(printk(KERN_ERR "i2c-algo-pcf.o: Timeout waiting "
-				    "for PIN(1) in pcf_xfer\n");)
-			return (-EREMOTEIO);
-		}
-    
-#ifndef STUB_I2C
-		/* Check LRB (last rcvd bit - slave ack) */
-		if (status & I2C_PCF_LRB) {
-			i2c_stop(adap);
-			DEB2(printk(KERN_ERR "i2c-algo-pcf.o: No LRB(1) in pcf_xfer\n");)
-			return (-EREMOTEIO);
-		}
-#endif
-    
-		DEB3(printk(KERN_DEBUG "i2c-algo-pcf.o: Msg %d, addr=0x%x, flags=0x%x, len=%d\n",
-			    i, msgs[i].addr, msgs[i].flags, msgs[i].len);)
-    
-		/* Read */
-		if (pmsg->flags & I2C_M_RD) {
-			/* read bytes into buffer*/
-			ret = pcf_readbytes(i2c_adap, pmsg->buf, pmsg->len,
-                                            (i + 1 = num));
-        
-			if (ret != pmsg->len) {
-				DEB2(printk(KERN_DEBUG "i2c-algo-pcf.o: fail: "
-					    "only read %d bytes.\n",ret));
-			} else {
-				DEB2(printk(KERN_DEBUG "i2c-algo-pcf.o: read %d bytes.\n",ret));
-			}
-		} else { /* Write */
-			ret = pcf_sendbytes(i2c_adap, pmsg->buf, pmsg->len,
-                                            (i + 1 = num));
-        
-			if (ret != pmsg->len) {
-				DEB2(printk(KERN_DEBUG "i2c-algo-pcf.o: fail: "
-					    "only wrote %d bytes.\n",ret));
-			} else {
-				DEB2(printk(KERN_DEBUG "i2c-algo-pcf.o: wrote %d bytes.\n",ret));
-			}
-		}
-	}
-
-	return (i);
-}
-
-static u32 pcf_func(struct i2c_adapter *adap)
-{
-	return I2C_FUNC_SMBUS_EMUL | I2C_FUNC_10BIT_ADDR | 
-	       I2C_FUNC_PROTOCOL_MANGLING; 
-}
-
-/* -----exported algorithm data: -------------------------------------	*/
-
-static struct i2c_algorithm pcf_algo = {
-	.name		= "PCF8584 algorithm",
-	.id		= I2C_ALGO_PCF,
-	.master_xfer	= pcf_xfer,
-	.functionality	= pcf_func,
-};
-
-/* 
- * registering functions to load algorithms at runtime 
- */
-int i2c_pcf_add_bus(struct i2c_adapter *adap)
-{
-	struct i2c_algo_pcf_data *pcf_adap = adap->algo_data;
-	int rval;
-
-	DEB2(dev_dbg(&adap->dev, "hw routines registered.\n"));
-
-	/* register new adapter to i2c module... */
-
-	adap->id |= pcf_algo.id;
-	adap->algo = &pcf_algo;
-
-	adap->timeout = 100;		/* default values, should	*/
-	adap->retries = 3;		/* be replaced by defines	*/
-
-	rval = pcf_init_8584(pcf_adap);
-	if (!rval)
-		i2c_add_adapter(adap);
-	return rval;
-}
-
-
-int i2c_pcf_del_bus(struct i2c_adapter *adap)
-{
-	return i2c_del_adapter(adap);
-}
-
-EXPORT_SYMBOL(i2c_pcf_add_bus);
-EXPORT_SYMBOL(i2c_pcf_del_bus);
-
-MODULE_AUTHOR("Hans Berglund <hb@spacetec.no>");
-MODULE_DESCRIPTION("I2C-Bus PCF8584 algorithm");
-MODULE_LICENSE("GPL");
-
-MODULE_PARM(i2c_debug,"i");
-MODULE_PARM_DESC(i2c_debug,
-        "debug level - 0 off; 1 normal; 2,3 more verbose; 9 pcf-protocol");
diff -Nru a/drivers/i2c/i2c-ite.h b/drivers/i2c/i2c-ite.h
--- a/drivers/i2c/i2c-ite.h	Thu Sep 25 14:49:55 2003
+++ /dev/null	Wed Dec 31 16:00:00 1969
@@ -1,117 +0,0 @@
-/*
-   --------------------------------------------------------------------
-   i2c-ite.h: Global defines for the I2C controller on board the    
-                 ITE MIPS processor.                                
-   --------------------------------------------------------------------
-   Hai-Pao Fan, MontaVista Software, Inc.
-   hpfan@mvista.com or source@mvista.com
-
-   Copyright 2001 MontaVista Software Inc.
-
- *  This program is free software; you can redistribute  it and/or modify it
- *  under  the terms of  the GNU General  Public License as published by the
- *  Free Software Foundation;  either version 2 of the  License, or (at your
- *  option) any later version.
- *
- *  THIS  SOFTWARE  IS PROVIDED   ``AS  IS'' AND   ANY  EXPRESS OR IMPLIED
- *  WARRANTIES,   INCLUDING, BUT NOT  LIMITED  TO, THE IMPLIED WARRANTIES OF
- *  MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.  IN
- *  NO  EVENT  SHALL   THE AUTHOR  BE    LIABLE FOR ANY   DIRECT, INDIRECT,
- *  INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
- *  NOT LIMITED   TO, PROCUREMENT OF  SUBSTITUTE GOODS  OR SERVICES; LOSS OF
- *  USE, DATA,  OR PROFITS; OR  BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
- *  ANY THEORY OF LIABILITY, WHETHER IN  CONTRACT, STRICT LIABILITY, OR TORT
- *  (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
- *  THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- *  You should have received a copy of the  GNU General Public License along
- *  with this program; if not, write  to the Free Software Foundation, Inc.,
- *  675 Mass Ave, Cambridge, MA 02139, USA.
-
- */
-
-#ifndef I2C_ITE_H
-#define I2C_ITE_H 1
-
-#include <asm/it8172/it8172.h>
-
-/* I2C Registers */
-#define ITE_I2CHCR	IT8172_PCI_IO_BASE + IT_I2C_BASE + 0x30
-#define ITE_I2CHSR	IT8172_PCI_IO_BASE + IT_I2C_BASE + 0x34
-#define ITE_I2CSAR	IT8172_PCI_IO_BASE + IT_I2C_BASE + 0x38
-#define ITE_I2CSSAR	IT8172_PCI_IO_BASE + IT_I2C_BASE + 0x3c
-#define ITE_I2CCKCNT	IT8172_PCI_IO_BASE + IT_I2C_BASE + 0x48
-#define ITE_I2CSHDR	IT8172_PCI_IO_BASE + IT_I2C_BASE + 0x4c
-#define ITE_I2CRSUR	IT8172_PCI_IO_BASE + IT_I2C_BASE + 0x50
-#define ITE_I2CPSUR	IT8172_PCI_IO_BASE + IT_I2C_BASE + 0x54
-
-#define ITE_I2CFDR	IT8172_PCI_IO_BASE + IT_I2C_BASE + 0x70
-#define ITE_I2CFBCR	IT8172_PCI_IO_BASE + IT_I2C_BASE + 0x74
-#define ITE_I2CFCR	IT8172_PCI_IO_BASE + IT_I2C_BASE + 0x78
-#define ITE_I2CFSR	IT8172_PCI_IO_BASE + IT_I2C_BASE + 0x7c
-
-
-/* Host Control Register ITE_I2CHCR */
-#define	ITE_I2CHCR_HCE	0x01	/* Enable I2C Host Controller */
-#define	ITE_I2CHCR_IE	0x02	/* Enable the interrupt after completing
-				   the current transaction */
-#define ITE_I2CHCR_CP_W	0x00	/* bit2-4 000 - Write */
-#define	ITE_I2CHCR_CP_R	0x08	/*	  010 - Current address read */
-#define	ITE_I2CHCR_CP_S	0x10	/*	  100 - Sequential read */
-#define ITE_I2CHCR_ST	0x20	/* Initiates the I2C host controller to execute
-				   the command and send the data programmed in
-				   all required registers to I2C bus */
-#define ITE_CMD		ITE_I2CHCR_HCE | ITE_I2CHCR_IE | ITE_I2CHCR_ST
-#define ITE_WRITE	ITE_CMD | ITE_I2CHCR_CP_W
-#define ITE_READ	ITE_CMD | ITE_I2CHCR_CP_R
-#define ITE_SREAD	ITE_CMD | ITE_I2CHCR_CP_S
-
-/* Host Status Register ITE_I2CHSR */
-#define	ITE_I2CHSR_DB	0x01	/* Device is busy, receives NACK response except
-				   in the first and last bytes */
-#define	ITE_I2CHSR_DNE	0x02	/* Target address on I2C bus does not exist */
-#define	ITE_I2CHSR_TDI	0x04	/* R/W Transaction on I2C bus was completed */
-#define	ITE_I2CHSR_HB	0x08	/* Host controller is processing transactions */
-#define	ITE_I2CHSR_FER	0x10	/* Error occurs in the FIFO */
-
-/* Slave Address Register ITE_I2CSAR */
-#define	ITE_I2CSAR_SA_MASK	0xfe	/* Target I2C device address */
-#define	ITE_I2CSAR_ASO		0x0100	/* Output 1/0 to I2CAS port when the
-					   next slave address is addressed */
-
-/* Slave Sub-address Register ITE_I2CSSAR */
-#define	ITE_I2CSSAR_SUBA_MASK	0xff	/* Target I2C device sub-address */
-
-/* Clock Counter Register ITE_I2CCKCNT */
-#define	ITE_I2CCKCNT_STOP	0x00	/* stop I2C clock */
-#define	ITE_I2CCKCNT_HPCC_MASK	0x7f	/* SCL high period counter */
-#define	ITE_I2CCKCNT_LPCC_MASK	0x7f00	/* SCL low period counter */
-
-/* START Hold Time Register ITE_I2CSHDR */
-/* value is counted based on 16 MHz internal clock */
-#define ITE_I2CSHDR_FM	0x0a	/* START condition at fast mode */
-#define	ITE_I2CSHDR_SM	0x47	/* START contition at standard mode */
-
-/* (Repeated) START Setup Time Register ITE_I2CRSUR */
-/* value is counted based on 16 MHz internal clock */
-#define	ITE_I2CRSUR_FM	0x0a	/* repeated START condition at fast mode */
-#define	ITE_I2CRSUR_SM	0x50	/* repeated START condition at standard mode */
-
-/* STOP setup Time Register ITE_I2CPSUR */
-
-/* FIFO Data Register ITE_I2CFDR */
-#define	ITE_I2CFDR_MASK		0xff
-
-/* FIFO Byte Count Register ITE_I2CFBCR */
-#define ITE_I2CFBCR_MASK	0x3f
-
-/* FIFO Control Register ITE_I2CFCR */
-#define	ITE_I2CFCR_FLUSH	0x01	/* Flush FIFO and reset the FIFO point
-					   and I2CFSR */
-/* FIFO Status Register ITE_I2CFSR */
-#define	ITE_I2CFSR_FO	0x01	/* FIFO is overrun when write */
-#define	ITE_I2CFSR_FU	0x02	/* FIFO is underrun when read */
-#define	ITE_I2CFSR_FF	0x04	/* FIFO is full when write */
-#define	ITE_I2CFSR_FE	0x08	/* FIFO is empty when read */
-
-#endif  /* I2C_ITE_H */
diff -Nru a/drivers/i2c/i2c-pcf8584.h b/drivers/i2c/i2c-pcf8584.h
--- a/drivers/i2c/i2c-pcf8584.h	Thu Sep 25 14:49:55 2003
+++ /dev/null	Wed Dec 31 16:00:00 1969
@@ -1,78 +0,0 @@
-/* -------------------------------------------------------------------- */
-/* i2c-pcf8584.h: PCF 8584 global defines				*/
-/* -------------------------------------------------------------------- */
-/*   Copyright (C) 1996 Simon G. Vogl
-                   1999 Hans Berglund
-
-    This program is free software; you can redistribute it and/or modify
-    it under the terms of the GNU General Public License as published by
-    the Free Software Foundation; either version 2 of the License, or
-    (at your option) any later version.
-
-    This program is distributed in the hope that it will be useful,
-    but WITHOUT ANY WARRANTY; without even the implied warranty of
-    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-    GNU General Public License for more details.
-
-    You should have received a copy of the GNU General Public License
-    along with this program; if not, write to the Free Software
-    Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.		*/
-/* --------------------------------------------------------------------	*/
-
-/* With some changes from Frodo Looijaard <frodol@dds.nl> */
-
-/* $Id: i2c-pcf8584.h,v 1.3 2000/01/18 23:54:07 frodo Exp $ */
-
-#ifndef I2C_PCF8584_H
-#define I2C_PCF8584_H 1
-
-/* ----- Control register bits ----------------------------------------	*/
-#define I2C_PCF_PIN	0x80
-#define I2C_PCF_ESO	0x40
-#define I2C_PCF_ES1	0x20
-#define I2C_PCF_ES2	0x10
-#define I2C_PCF_ENI	0x08
-#define I2C_PCF_STA	0x04
-#define I2C_PCF_STO	0x02
-#define I2C_PCF_ACK	0x01
-
-#define I2C_PCF_START    (I2C_PCF_PIN | I2C_PCF_ESO | I2C_PCF_STA | I2C_PCF_ACK)
-#define I2C_PCF_STOP     (I2C_PCF_PIN | I2C_PCF_ESO | I2C_PCF_STO | I2C_PCF_ACK)
-#define I2C_PCF_REPSTART (              I2C_PCF_ESO | I2C_PCF_STA | I2C_PCF_ACK)
-#define I2C_PCF_IDLE     (I2C_PCF_PIN | I2C_PCF_ESO               | I2C_PCF_ACK)
-
-/* ----- Status register bits -----------------------------------------	*/
-/*#define I2C_PCF_PIN  0x80    as above*/
-
-#define I2C_PCF_INI 0x40   /* 1 if not initialized */
-#define I2C_PCF_STS 0x20
-#define I2C_PCF_BER 0x10
-#define I2C_PCF_AD0 0x08
-#define I2C_PCF_LRB 0x08
-#define I2C_PCF_AAS 0x04
-#define I2C_PCF_LAB 0x02
-#define I2C_PCF_BB  0x01
-
-/* ----- Chip clock frequencies ---------------------------------------	*/
-#define I2C_PCF_CLK3	0x00
-#define I2C_PCF_CLK443	0x10
-#define I2C_PCF_CLK6	0x14
-#define I2C_PCF_CLK	0x18
-#define I2C_PCF_CLK12	0x1c
-
-/* ----- transmission frequencies -------------------------------------	*/
-#define I2C_PCF_TRNS90 0x00	/*  90 kHz */
-#define I2C_PCF_TRNS45 0x01	/*  45 kHz */
-#define I2C_PCF_TRNS11 0x02	/*  11 kHz */
-#define I2C_PCF_TRNS15 0x03	/* 1.5 kHz */
-
-
-/* ----- Access to internal registers according to ES1,ES2 ------------	*/
-/* they are mapped to the data port ( a0 = 0 ) 				*/
-/* available when ESO = 0 :						*/
-
-#define I2C_PCF_OWNADR	0
-#define I2C_PCF_INTREG	I2C_PCF_ES2
-#define I2C_PCF_CLKREG	I2C_PCF_ES1
-
-#endif /* I2C_PCF8584_H */


^ permalink raw reply	[flat|nested] 33+ messages in thread

* [PATCH] More i2c driver fixes for 2.6.0-test5
@ 2005-05-19  6:24   ` Greg KH
  0 siblings, 0 replies; 33+ messages in thread
From: Greg KH @ 2005-05-19  6:24 UTC (permalink / raw)
  To: linux-kernel, sensors

ChangeSet 1.1325.4.1, 2003/09/23 13:54:31-07:00, greg@kroah.com

[PATCH] I2C: remove the isa address check alltogether.


 drivers/i2c/i2c-sensor.c |    5 +----
 1 files changed, 1 insertion(+), 4 deletions(-)


diff -Nru a/drivers/i2c/i2c-sensor.c b/drivers/i2c/i2c-sensor.c
--- a/drivers/i2c/i2c-sensor.c	Thu Sep 25 14:50:07 2003
+++ b/drivers/i2c/i2c-sensor.c	Thu Sep 25 14:50:07 2003
@@ -50,10 +50,7 @@
 		return -1;
 
 	for (addr = 0x00; addr <= (is_isa ? 0xffff : 0x7f); addr++) {
-		void *region_used = request_region(addr, 1, "foo");
-		release_region(addr, 1);
-		if ((is_isa && (region_used = NULL)) ||
-		    (!is_isa && i2c_check_addr(adapter, addr)))
+		if (!is_isa && i2c_check_addr(adapter, addr))
 			continue;
 
 		/* If it is in one of the force entries, we don't do any


^ permalink raw reply	[flat|nested] 33+ messages in thread

* [PATCH] More i2c driver fixes for 2.6.0-test5
@ 2005-05-19  6:24   ` Greg KH
  0 siblings, 0 replies; 33+ messages in thread
From: Greg KH @ 2005-05-19  6:24 UTC (permalink / raw)
  To: linux-kernel, sensors

ChangeSet 1.1325.4.3, 2003/09/23 16:23:08-07:00, greg@kroah.com

[PATCH] I2C: add eeprom i2c chip driver.

This is based on the i2c cvs driver, but ported to 2.6 and rewritten
to use the sysfs binary file interface.


 Documentation/i2c/sysfs-interface |    5 
 drivers/i2c/chips/Kconfig         |   12 +
 drivers/i2c/chips/Makefile        |    1 
 drivers/i2c/chips/eeprom.c        |  283 ++++++++++++++++++++++++++++++++++++++
 4 files changed, 300 insertions(+), 1 deletion(-)


diff -Nru a/Documentation/i2c/sysfs-interface b/Documentation/i2c/sysfs-interface
--- a/Documentation/i2c/sysfs-interface	Thu Sep 25 14:49:42 2003
+++ b/Documentation/i2c/sysfs-interface	Thu Sep 25 14:49:42 2003
@@ -77,7 +77,10 @@
 curr_input[1-n]	Current input value
 		Fixed point XXXXX, divide by 1000 to get Amps.
 		Read only.
-		
+
+eeprom		Raw EEPROM data in binary form.
+		Read only.
+
 fan_min[1-3]	Fan minimum value
 		Integer value indicating RPM
 		Read/Write.
diff -Nru a/drivers/i2c/chips/Kconfig b/drivers/i2c/chips/Kconfig
--- a/drivers/i2c/chips/Kconfig	Thu Sep 25 14:49:42 2003
+++ b/drivers/i2c/chips/Kconfig	Thu Sep 25 14:49:42 2003
@@ -21,6 +21,18 @@
 	  This driver can also be built as a module.  If so, the module
 	  will be called adm1021.
 
+config SENSORS_EEPROM
+	tristate "EEPROM (DIMM) reader"
+	depends on I2C && EXPERIMENTAL
+	select I2C_SENSOR
+	help
+	  If you say yes here you get read-only access to the EEPROM data
+	  available on modern memory DIMMs, and which could theoretically
+	  also be available on other devices.
+
+	  This driver can also be built as a module.  If so, the module
+	  will be called eeprom.
+
 config SENSORS_IT87
 	tristate "National Semiconductors IT87 and compatibles"
 	depends on I2C && EXPERIMENTAL
diff -Nru a/drivers/i2c/chips/Makefile b/drivers/i2c/chips/Makefile
--- a/drivers/i2c/chips/Makefile	Thu Sep 25 14:49:42 2003
+++ b/drivers/i2c/chips/Makefile	Thu Sep 25 14:49:42 2003
@@ -6,6 +6,7 @@
 obj-$(CONFIG_SENSORS_W83781D)	+= w83781d.o
 
 obj-$(CONFIG_SENSORS_ADM1021)	+= adm1021.o
+obj-$(CONFIG_SENSORS_EEPROM)	+= eeprom.o
 obj-$(CONFIG_SENSORS_IT87)	+= it87.o
 obj-$(CONFIG_SENSORS_LM75)	+= lm75.o
 obj-$(CONFIG_SENSORS_LM78)	+= lm78.o
diff -Nru a/drivers/i2c/chips/eeprom.c b/drivers/i2c/chips/eeprom.c
--- /dev/null	Wed Dec 31 16:00:00 1969
+++ b/drivers/i2c/chips/eeprom.c	Thu Sep 25 14:49:42 2003
@@ -0,0 +1,283 @@
+/*
+    eeprom.c - Part of lm_sensors, Linux kernel modules for hardware
+               monitoring
+    Copyright (C) 1998, 1999  Frodo Looijaard <frodol@dds.nl> and
+			       Philip Edelbrock <phil@netroedge.com>
+    Copyright (C) 2003 Greg Kroah-Hartman <greg@kroah.com>
+    Copyright (C) 2003 IBM Corp.
+
+    This program is free software; you can redistribute it and/or modify
+    it under the terms of the GNU General Public License as published by
+    the Free Software Foundation; either version 2 of the License, or
+    (at your option) any later version.
+
+    This program is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+    GNU General Public License for more details.
+
+    You should have received a copy of the GNU General Public License
+    along with this program; if not, write to the Free Software
+    Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+*/
+
+/* #define DEBUG */
+
+#include <linux/kernel.h>
+#include <linux/init.h>
+#include <linux/module.h>
+#include <linux/slab.h>
+#include <linux/i2c.h>
+#include <linux/i2c-sensor.h>
+
+/* Addresses to scan */
+static unsigned short normal_i2c[] = { I2C_CLIENT_END };
+static unsigned short normal_i2c_range[] = { 0x50, 0x57, I2C_CLIENT_END };
+static unsigned int normal_isa[] = { I2C_CLIENT_ISA_END };
+static unsigned int normal_isa_range[] = { I2C_CLIENT_ISA_END };
+
+/* Insmod parameters */
+SENSORS_INSMOD_1(eeprom);
+
+static int checksum = 0;
+MODULE_PARM(checksum, "i");
+MODULE_PARM_DESC(checksum, "Only accept eeproms whose checksum is correct");
+
+
+/* EEPROM registers */
+#define EEPROM_REG_CHECKSUM	0x3f
+
+/* EEPROM memory types: */
+#define ONE_K			1
+#define TWO_K			2
+#define FOUR_K			3
+#define EIGHT_K			4
+#define SIXTEEN_K		5
+
+/* Size of EEPROM in bytes */
+#define EEPROM_SIZE		256
+
+/* possible types of eeprom devices */
+enum eeprom_nature {
+	UNKNOWN,
+	VAIO,
+};
+
+/* Each client has this additional data */
+struct eeprom_data {
+	struct semaphore update_lock;
+	char valid;			/* !=0 if following fields are valid */
+	unsigned long last_updated;	/* In jiffies */
+	u8 data[EEPROM_SIZE];		/* Register values */
+};
+
+
+static int eeprom_attach_adapter(struct i2c_adapter *adapter);
+static int eeprom_detect(struct i2c_adapter *adapter, int address, int kind);
+static int eeprom_detach_client(struct i2c_client *client);
+
+/* This is the driver that will be inserted */
+static struct i2c_driver eeprom_driver = {
+	.owner		= THIS_MODULE,
+	.name		= "eeprom",
+	.id		= I2C_DRIVERID_EEPROM,
+	.flags		= I2C_DF_NOTIFY,
+	.attach_adapter	= eeprom_attach_adapter,
+	.detach_client	= eeprom_detach_client,
+};
+
+static int eeprom_id = 0;
+
+static void eeprom_update_client(struct i2c_client *client)
+{
+	struct eeprom_data *data = i2c_get_clientdata(client);
+	int i, j;
+
+	down(&data->update_lock);
+
+	if ((jiffies - data->last_updated > 300 * HZ) |
+	    (jiffies < data->last_updated) || !data->valid) {
+		dev_dbg(&client->dev, "Starting eeprom update\n");
+
+		if (i2c_check_functionality(client->adapter, I2C_FUNC_SMBUS_READ_I2C_BLOCK)) {
+			for (i=0; i < EEPROM_SIZE; i += I2C_SMBUS_I2C_BLOCK_MAX)
+				if (i2c_smbus_read_i2c_block_data(client, i, data->data + i) != I2C_SMBUS_I2C_BLOCK_MAX)
+					goto exit;
+		} else {
+			if (i2c_smbus_write_byte(client, 0)) {
+				dev_dbg(&client->dev, "eeprom read start has failed!\n");
+				goto exit;
+			}
+			for (i = 0; i < EEPROM_SIZE; i++) {
+				j = i2c_smbus_read_byte(client);
+				if (j < 0)
+					goto exit;
+				data->data[i] = (u8) j;
+			}
+		}
+		data->last_updated = jiffies;
+		data->valid = 1;
+	}
+exit:
+	up(&data->update_lock);
+}
+
+static ssize_t eeprom_read(struct kobject *kobj, char *buf, loff_t off, size_t count)
+{
+	struct i2c_client *client = to_i2c_client(container_of(kobj, struct device, kobj));
+	struct eeprom_data *data = i2c_get_clientdata(client);
+
+	eeprom_update_client(client);
+
+	if (off > EEPROM_SIZE)
+		return 0;
+	if (off + count > EEPROM_SIZE)
+		count = EEPROM_SIZE - off;
+
+	memcpy(buf, &data->data[off], count);
+	return count;
+}
+
+static struct bin_attribute eeprom_attr = {
+	.attr = {
+		.name = "eeprom",
+		.mode = S_IRUGO,
+	},
+	.size = EEPROM_SIZE,
+	.read = eeprom_read,
+};
+
+static int eeprom_attach_adapter(struct i2c_adapter *adapter)
+{
+	return i2c_detect(adapter, &addr_data, eeprom_detect);
+}
+
+/* This function is called by i2c_detect */
+int eeprom_detect(struct i2c_adapter *adapter, int address, int kind)
+{
+	int i, cs;
+	struct i2c_client *new_client;
+	struct eeprom_data *data;
+	enum eeprom_nature nature = UNKNOWN;
+	int err = 0;
+
+	/* Make sure we aren't probing the ISA bus!! This is just a safety check
+	   at this moment; i2c_detect really won't call us. */
+#ifdef DEBUG
+	if (i2c_is_isa_adapter(adapter)) {
+		dev_dbg(&adapter->dev, " eeprom_detect called for an ISA bus adapter?!?\n");
+		return 0;
+	}
+#endif
+
+	if (!i2c_check_functionality(adapter, I2C_FUNC_SMBUS_BYTE_DATA))
+		goto exit;
+
+	/* OK. For now, we presume we have a valid client. We now create the
+	   client structure, even though we cannot fill it completely yet.
+	   But it allows us to access eeprom_{read,write}_value. */
+	if (!(new_client = kmalloc(sizeof(struct i2c_client) +
+				   sizeof(struct eeprom_data),
+				   GFP_KERNEL))) {
+		err = -ENOMEM;
+		goto exit;
+	}
+	memset(new_client, 0x00, sizeof(struct i2c_client) +
+				 sizeof(struct eeprom_data));
+
+	data = (struct eeprom_data *) (new_client + 1);
+	memset(data, 0xff, EEPROM_SIZE);
+	i2c_set_clientdata(new_client, data);
+	new_client->addr = address;
+	new_client->adapter = adapter;
+	new_client->driver = &eeprom_driver;
+	new_client->flags = 0;
+
+	/* Now, we do the remaining detection. It is not there, unless you force
+	   the checksum to work out. */
+	if (checksum) {
+		/* prevent 24RF08 corruption */
+		i2c_smbus_write_quick(new_client, 0);
+		cs = 0;
+		for (i = 0; i <= 0x3e; i++)
+			cs += i2c_smbus_read_byte_data(new_client, i);
+		cs &= 0xff;
+		if (i2c_smbus_read_byte_data (new_client, EEPROM_REG_CHECKSUM) != cs)
+			goto exit_kfree;
+	}
+
+	/* Detect the Vaio nature of EEPROMs.
+	   We use the "PCG-" prefix as the signature. */
+	if (address = 0x57) {
+		if (i2c_smbus_read_byte_data(new_client, 0x80) = 'P' && 
+		    i2c_smbus_read_byte_data(new_client, 0x81) = 'C' && 
+		    i2c_smbus_read_byte_data(new_client, 0x82) = 'G' &&
+		    i2c_smbus_read_byte_data(new_client, 0x83) = '-')
+			nature = VAIO;
+	}
+
+	/* If this is a VIAO, then we only allow root to read from this file,
+	   as BIOS passwords can be present here in plaintext */
+	switch (nature) {
+ 	case VAIO:
+		eeprom_attr.attr.mode = S_IRUSR;
+		break;
+	default:
+		eeprom_attr.attr.mode = S_IRUGO;
+	}
+
+	/* Fill in the remaining client fields */
+	strncpy(new_client->name, "eeprom", I2C_NAME_SIZE);
+	new_client->id = eeprom_id++;
+	data->valid = 0;
+	init_MUTEX(&data->update_lock);
+
+	/* Tell the I2C layer a new client has arrived */
+	if ((err = i2c_attach_client(new_client)))
+		goto exit_kfree;
+
+	/* create the sysfs eeprom file */
+	sysfs_create_bin_file(&new_client->dev.kobj, &eeprom_attr);
+
+	return 0;
+
+exit_kfree:
+	kfree(new_client);
+exit:
+	return err;
+}
+
+static int eeprom_detach_client(struct i2c_client *client)
+{
+	int err;
+
+	err = i2c_detach_client(client);
+	if (err) {
+		dev_err(&client->dev, "Client deregistration failed, client not detached.\n");
+		return err;
+	}
+
+	kfree(client);
+
+	return 0;
+}
+
+static int __init eeprom_init(void)
+{
+	return i2c_add_driver(&eeprom_driver);
+}
+
+static void __exit eeprom_exit(void)
+{
+	i2c_del_driver(&eeprom_driver);
+}
+
+
+MODULE_AUTHOR("Frodo Looijaard <frodol@dds.nl> and "
+		"Philip Edelbrock <phil@netroedge.com> and "
+		"Greg Kroah-Hartman <greg@kroah.com>");
+MODULE_DESCRIPTION("I2C EEPROM driver");
+MODULE_LICENSE("GPL");
+
+module_init(eeprom_init);
+module_exit(eeprom_exit);


^ permalink raw reply	[flat|nested] 33+ messages in thread

* [BK PATCH] More i2c driver fixes for 2.6.0-test5
@ 2005-05-19  6:24 ` Greg KH
  0 siblings, 0 replies; 33+ messages in thread
From: Greg KH @ 2005-05-19  6:24 UTC (permalink / raw)
  To: torvalds; +Cc: linux-kernel, sensors

Hi,

Here are some more i2c driver fixes and additions for 2.6.0-test5.  I've
fixed up the check_region/request_region logic for isa drivers and moved
the i2c algorithms into their own subdirectory, both as recommended by
Christoph, and added the eeprom i2c chip driver (ported from the 2.4
tree and converted to use the sysfs binary file interface).

There are a also a few other minor i2c cleanups and fixes in here.

Please pull from:  bk://kernel.bkbits.net/gregkh/linux/i2c-2.6

thanks,

greg k-h

 drivers/i2c/i2c-algo-bit.c        |  567 ------------------------
 drivers/i2c/i2c-algo-ite.c        |  872 --------------------------------------
 drivers/i2c/i2c-algo-pcf.c        |  479 --------------------
 drivers/i2c/i2c-ite.h             |  117 -----
 drivers/i2c/i2c-pcf8584.h         |   78 ---
 Documentation/i2c/sysfs-interface |    5 
 drivers/i2c/Kconfig               |   38 -
 drivers/i2c/Makefile              |    5 
 drivers/i2c/algos/Kconfig         |   45 +
 drivers/i2c/algos/Makefile        |    7 
 drivers/i2c/algos/i2c-algo-bit.c  |  567 ++++++++++++++++++++++++
 drivers/i2c/algos/i2c-algo-ite.c  |  872 ++++++++++++++++++++++++++++++++++++++
 drivers/i2c/algos/i2c-algo-ite.h  |  117 +++++
 drivers/i2c/algos/i2c-algo-pcf.c  |  479 ++++++++++++++++++++
 drivers/i2c/algos/i2c-algo-pcf.h  |   78 +++
 drivers/i2c/busses/i2c-elektor.c  |    2 
 drivers/i2c/chips/Kconfig         |   12 
 drivers/i2c/chips/Makefile        |    1 
 drivers/i2c/chips/eeprom.c        |  290 ++++++++++++
 drivers/i2c/i2c-sensor.c          |    5 
 20 files changed, 2469 insertions(+), 2167 deletions(-)
-----

Greg Kroah-Hartman:
  o I2C: remove unneeded #defines in the eeprom chip driver
  o I2C: add eeprom i2c chip driver
  o I2C: move the i2c algorithm drivers to drivers/i2c/algos
  o I2C: remove the isa address check alltogether

^ permalink raw reply	[flat|nested] 33+ messages in thread

* [PATCH] More i2c driver fixes for 2.6.0-test7
@ 2005-05-19  6:24     ` Greg KH
  0 siblings, 0 replies; 33+ messages in thread
From: Greg KH @ 2005-05-19  6:24 UTC (permalink / raw)
  To: linux-kernel, sensors

ChangeSet 1.1347.1.2, 2003/10/13 12:31:27-07:00, kronos@kronoz.cjb.net

[PATCH] I2C: sensors/w83781d.c creates useless sysfs entries

Jindrich Makovicka <makovick@kmlinux.fjfi.cvut.cz> ha scritto:
> here is a trivial fix for Winbond sensor driver, which currently creates
> useless entries in sys/bus/i2c due to missing braces after if statements
> - author probably forgot about the macro expansion.

IMHO it's better to fix the macro:


 drivers/i2c/chips/w83781d.c |    4 +++-
 1 files changed, 3 insertions(+), 1 deletion(-)


diff -Nru a/drivers/i2c/chips/w83781d.c b/drivers/i2c/chips/w83781d.c
--- a/drivers/i2c/chips/w83781d.c	Wed Oct 15 10:57:59 2003
+++ b/drivers/i2c/chips/w83781d.c	Wed Oct 15 10:57:59 2003
@@ -422,9 +422,11 @@
 sysfs_in_offsets(8);
 
 #define device_create_file_in(client, offset) \
+do { \
 device_create_file(&client->dev, &dev_attr_in_input##offset); \
 device_create_file(&client->dev, &dev_attr_in_min##offset); \
-device_create_file(&client->dev, &dev_attr_in_max##offset);
+device_create_file(&client->dev, &dev_attr_in_max##offset); \
+} while (0);
 
 #define show_fan_reg(reg) \
 static ssize_t show_##reg (struct device *dev, char *buf, int nr) \


^ permalink raw reply	[flat|nested] 33+ messages in thread

* [PATCH] More i2c driver fixes for 2.6.0-test7
@ 2005-05-19  6:24   ` Greg KH
  0 siblings, 0 replies; 33+ messages in thread
From: Greg KH @ 2005-05-19  6:24 UTC (permalink / raw)
  To: linux-kernel, sensors

ChangeSet 1.1347.1.1, 2003/10/13 11:28:27-07:00, greg@kroah.com

[PATCH] I2C: remove unneeded MOD_INC and MOD_DEC calls.


 drivers/i2c/algos/i2c-algo-ite.c |    7 -------
 1 files changed, 7 deletions(-)


diff -Nru a/drivers/i2c/algos/i2c-algo-ite.c b/drivers/i2c/algos/i2c-algo-ite.c
--- a/drivers/i2c/algos/i2c-algo-ite.c	Wed Oct 15 10:58:15 2003
+++ b/drivers/i2c/algos/i2c-algo-ite.c	Wed Oct 15 10:58:15 2003
@@ -779,10 +779,6 @@
 	adap->retries = 3;		/* be replaced by defines	*/
 	adap->flags = 0;
 
-#ifdef MODULE
-	MOD_INC_USE_COUNT;
-#endif
-
 	i2c_add_adapter(adap);
 	iic_init(iic_adap);
 
@@ -815,9 +811,6 @@
 		return res;
 	DEB2(printk("i2c-algo-ite: adapter unregistered: %s\n",adap->name));
 
-#ifdef MODULE
-	MOD_DEC_USE_COUNT;
-#endif
 	return 0;
 }
 


^ permalink raw reply	[flat|nested] 33+ messages in thread

* [PATCH] More i2c driver fixes for 2.6.0-test7
@ 2005-05-19  6:24       ` Greg KH
  0 siblings, 0 replies; 33+ messages in thread
From: Greg KH @ 2005-05-19  6:24 UTC (permalink / raw)
  To: linux-kernel, sensors

ChangeSet 1.1347.1.3, 2003/10/14 13:30:34-07:00, greg@kroah.com

[PATCH] I2C: fix more define problems in w83781d driver


 drivers/i2c/chips/w83781d.c |   22 +++++++++++++++++++---
 1 files changed, 19 insertions(+), 3 deletions(-)


diff -Nru a/drivers/i2c/chips/w83781d.c b/drivers/i2c/chips/w83781d.c
--- a/drivers/i2c/chips/w83781d.c	Wed Oct 15 10:57:42 2003
+++ b/drivers/i2c/chips/w83781d.c	Wed Oct 15 10:57:42 2003
@@ -426,7 +426,7 @@
 device_create_file(&client->dev, &dev_attr_in_input##offset); \
 device_create_file(&client->dev, &dev_attr_in_min##offset); \
 device_create_file(&client->dev, &dev_attr_in_max##offset); \
-} while (0);
+} while (0)
 
 #define show_fan_reg(reg) \
 static ssize_t show_##reg (struct device *dev, char *buf, int nr) \
@@ -484,8 +484,10 @@
 sysfs_fan_min_offset(3);
 
 #define device_create_file_fan(client, offset) \
+do { \
 device_create_file(&client->dev, &dev_attr_fan_input##offset); \
 device_create_file(&client->dev, &dev_attr_fan_min##offset); \
+} while (0)
 
 #define show_temp_reg(reg) \
 static ssize_t show_##reg (struct device *dev, char *buf, int nr) \
@@ -568,9 +570,11 @@
 sysfs_temp_offsets(3);
 
 #define device_create_file_temp(client, offset) \
+do { \
 device_create_file(&client->dev, &dev_attr_temp_input##offset); \
 device_create_file(&client->dev, &dev_attr_temp_max##offset); \
-device_create_file(&client->dev, &dev_attr_temp_min##offset);
+device_create_file(&client->dev, &dev_attr_temp_min##offset); \
+} while (0)
 
 static ssize_t
 show_vid_reg(struct device *dev, char *buf)
@@ -693,8 +697,10 @@
 sysfs_beep(MASK, mask);
 
 #define device_create_file_beep(client) \
+do { \
 device_create_file(&client->dev, &dev_attr_beep_enable); \
-device_create_file(&client->dev, &dev_attr_beep_mask);
+device_create_file(&client->dev, &dev_attr_beep_mask); \
+} while (0)
 
 /* w83697hf only has two fans */
 static ssize_t
@@ -771,7 +777,9 @@
 sysfs_fan_div(3);
 
 #define device_create_file_fan_div(client, offset) \
+do { \
 device_create_file(&client->dev, &dev_attr_fan_div##offset); \
+} while (0)
 
 /* w83697hf only has two fans */
 static ssize_t
@@ -883,10 +891,14 @@
 sysfs_pwm(4);
 
 #define device_create_file_pwm(client, offset) \
+do { \
 device_create_file(&client->dev, &dev_attr_pwm##offset); \
+} while (0)
 
 #define device_create_file_pwmenable(client, offset) \
+do { \
 device_create_file(&client->dev, &dev_attr_pwm_enable##offset); \
+} while (0)
 
 static ssize_t
 show_sensor_reg(struct device *dev, char *buf, int nr)
@@ -959,7 +971,9 @@
 sysfs_sensor(3);
 
 #define device_create_file_sensor(client, offset) \
+do { \
 device_create_file(&client->dev, &dev_attr_sensor##offset); \
+} while (0)
 
 #ifdef W83781D_RT
 static ssize_t
@@ -1018,7 +1032,9 @@
 sysfs_rt(3);
 
 #define device_create_file_rt(client, offset) \
+do { \
 device_create_file(&client->dev, &dev_attr_rt##offset); \
+} while (0)
 
 #endif				/* ifdef W83781D_RT */
 


^ permalink raw reply	[flat|nested] 33+ messages in thread

* [PATCH] More i2c driver fixes for 2.6.0-test7
@ 2005-05-19  6:24       ` Sam Ravnborg
  0 siblings, 0 replies; 33+ messages in thread
From: Sam Ravnborg @ 2005-05-19  6:24 UTC (permalink / raw)
  To: Greg KH; +Cc: linux-kernel, sensors

On Wed, Oct 15, 2003 at 11:05:47AM -0700, Greg KH wrote:
> -device_create_file(&client->dev, &dev_attr_in_max##offset);
> +device_create_file(&client->dev, &dev_attr_in_max##offset); \
> +} while (0);
              ^
Did you really want to have that ';' there?
It is harmless in current usage, but it may be confusing.

	Sam

^ permalink raw reply	[flat|nested] 33+ messages in thread

* [PATCH] More i2c driver fixes for 2.6.0-test7
@ 2005-05-19  6:24         ` Sam Ravnborg
  0 siblings, 0 replies; 33+ messages in thread
From: Sam Ravnborg @ 2005-05-19  6:24 UTC (permalink / raw)
  To: Greg KH; +Cc: linux-kernel, sensors

On Wed, Oct 15, 2003 at 11:05:48AM -0700, Greg KH wrote:
>  device_create_file(&client->dev, &dev_attr_in_max##offset); \
> -} while (0);
> +} while (0)

Next time I better read all patches before replying - sorry for the noise.

	Sam

^ permalink raw reply	[flat|nested] 33+ messages in thread

* [BK PATCH] More i2c driver fixes for 2.6.0-test7
@ 2005-05-19  6:24 ` Greg KH
  0 siblings, 0 replies; 33+ messages in thread
From: Greg KH @ 2005-05-19  6:24 UTC (permalink / raw)
  To: torvalds; +Cc: linux-kernel, sensors

Hi,

Here are some more minor i2c driver fixes for 2.6.0-test7.  They fix
some bugs in the w83781d.c driver, and remove some unneeded MOD_INC and
MOD_DEC calls (which fixes some compiler warnings.)

Please pull from:  bk://kernel.bkbits.net/gregkh/linux/i2c-2.6

thanks,

greg k-h

------

Greg Kroah-Hartman:
  o I2C: fix more define problems in w83781d driver
  o I2C: remove unneeded MOD_INC and MOD_DEC calls

Luca Tettamanti:
  o I2C: sensors/w83781d.c creates useless sysfs entries

^ permalink raw reply	[flat|nested] 33+ messages in thread

end of thread, other threads:[~2005-05-19  6:24 UTC | newest]

Thread overview: 33+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2003-08-08 23:55 [BK PATCH] More i2c driver fixes for 2.6.0-test2 Greg KH
2005-05-19  6:24 ` Greg KH
2003-08-08 23:55 ` [PATCH] More i2c driver changes 2.6.0-test2 Greg KH
2005-05-19  6:24   ` Greg KH
2003-08-08 23:55   ` Greg KH
2005-05-19  6:24     ` Greg KH
2003-08-08 23:55     ` Greg KH
2005-05-19  6:24       ` Greg KH
2003-08-08 23:55       ` Greg KH
2005-05-19  6:24         ` Greg KH
2005-05-19  6:24 ` [BK PATCH] More i2c driver fixes for 2.6.0-test2 Jean Delvare
2005-05-19  6:24 ` Greg KH
  -- strict thread matches above, loose matches on Subject: below --
2003-09-25 21:48 [BK PATCH] More i2c driver fixes for 2.6.0-test5 Greg KH
2005-05-19  6:24 ` Greg KH
2003-09-25 21:50 ` [PATCH] " Greg KH
2005-05-19  6:24   ` Greg KH
2003-10-15 18:04 [BK PATCH] More i2c driver fixes for 2.6.0-test7 Greg KH
2005-05-19  6:24 ` Greg KH
2003-10-15 18:05 ` [PATCH] " Greg KH
2005-05-19  6:24   ` Greg KH
2003-10-15 18:05   ` Greg KH
2005-05-19  6:24     ` Greg KH
2003-10-15 18:05     ` Greg KH
2005-05-19  6:24       ` Greg KH
2003-10-15 19:14       ` Sam Ravnborg
2005-05-19  6:24         ` Sam Ravnborg
2003-10-15 19:13     ` Sam Ravnborg
2005-05-19  6:24       ` Sam Ravnborg
2005-05-19  6:24 [PATCH] More i2c driver fixes for 2.6.0-test5 Greg KH
2003-09-25 21:50 ` Greg KH
2005-05-19  6:24   ` Greg KH
2003-09-25 21:50   ` Greg KH
2005-05-19  6:24     ` Greg KH

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.