Skip to contentSkip to conversation

i2c driver changes for 2.6.0-test1

PATCH New Greg KH 2 participants 9 messages Jul 19, 2003 – Jul 24, 2003

Subsystems (4)
lore
Share & tools
lore

Greg KH

author
#0 lore raw

PATCH 1/1 i2c driver changes for 2.6.0-test1

Hi,

Here are some i2c driver fixes for 2.6.0-test1. They include a number of minor i2c fixes and add a new i2c bus controller driver.

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

thanks,

greg k-h

 drivers/i2c/Kconfig              |    4 
 drivers/i2c/busses/Kconfig       |   17 +
 drivers/i2c/busses/Makefile      |    1 
 drivers/i2c/busses/i2c-ali1535.c |   10 
 drivers/i2c/busses/i2c-ali15x3.c |   11 
 drivers/i2c/busses/i2c-amd756.c  |   14 -
 drivers/i2c/busses/i2c-amd8111.c |    3 
 drivers/i2c/busses/i2c-i801.c    |   14 -
 drivers/i2c/busses/i2c-nforce2.c |  468 +++++++++++++++++++++++++++++++++++++--
 drivers/i2c/busses/i2c-piix4.c   |   10 
 drivers/i2c/busses/i2c-sis96x.c  |    9 
 drivers/i2c/busses/i2c-viapro.c  |    9 
 drivers/i2c/chips/via686a.c      |   10 
 drivers/i2c/i2c-keywest.c        |   90 +------
 include/linux/i2c.h              |    7 
 15 files changed, 508 insertions(+), 169 deletions(-)

-----

<[email protected]>:
o I2C: convert via686a temp_* to milli degree celsius

<[email protected]>:
o I2C: fix Kconfig info

<[email protected]>:
o I2C: add ncforce2 i2c bus driver

Benjamin Herrenschmidt <[email protected]>:
o I2C: timer clean up for i2c-keywest.c

Greg Kroah-Hartman <[email protected]>:
o I2C: consolidate the i2c delay functions
o I2C: minor cleanups to the i2c-nforce2 driver

author
#1 lore raw

PATCH 1/1 i2c driver changes 2.6.0-test1

ChangeSet 1.1310.80.1, 2003/06/24 14:58:09-07:00, [email protected]

[PATCH] I2C: fix Kconfig info

 drivers/i2c/Kconfig |    4 +---
 1 files changed, 1 insertion(+), 3 deletions(-)
drivers/i2c/Kconfig +1 -3
diff -Nru a/drivers/i2c/Kconfig b/drivers/i2c/Kconfig
@@ -20,9 +20,7 @@
 	  interfaces", below.
 
 	  If you want I2C support, you should say Y here and also to the
-	  specific driver for your bus adapter(s) below.  If you say Y to
-	  "/proc file system" below, you will then get a /proc interface which
-	  is documented in <file:Documentation/i2c/proc-interface>.
+	  specific driver for your bus adapter(s) below.
 
 	  This I2C support is also available as a module.  If you want to
 	  compile it as a module, say M here and read
author
#2 lore raw

Re: [PATCH] i2c driver changes 2.6.0-test1

ChangeSet 1.1358.10.2, 2003/07/03 12:22:45-07:00, [email protected]

[PATCH] I2C: convert via686a temp_* to milli degree celsius

Forgot to send this.

This converts the i2c chip driver via686a to handle milli degree celsius instead of centi degree celsius. Applies for temp_input, temp_min, temp_max.

 drivers/i2c/chips/via686a.c |   10 +++++-----
 1 files changed, 5 insertions(+), 5 deletions(-)
drivers/i2c/chips/via686a.c +5 -5
diff -Nru a/drivers/i2c/chips/via686a.c b/drivers/i2c/chips/via686a.c
@@ -494,27 +494,27 @@
 	struct i2c_client *client = to_i2c_client(dev);
 	struct via686a_data *data = i2c_get_clientdata(client);
 	via686a_update_client(client);
-	return sprintf(buf, "%ld\n", TEMP_FROM_REG10(data->temp[nr])*10 );
+	return sprintf(buf, "%ld\n", TEMP_FROM_REG10(data->temp[nr])*100 );
 }
 /* more like overshoot temperature */
 static ssize_t show_temp_max(struct device *dev, char *buf, int nr) {
 	struct i2c_client *client = to_i2c_client(dev);
 	struct via686a_data *data = i2c_get_clientdata(client);
 	via686a_update_client(client);
-	return sprintf(buf, "%ld\n", TEMP_FROM_REG(data->temp_over[nr])*10);
+	return sprintf(buf, "%ld\n", TEMP_FROM_REG(data->temp_over[nr])*100);
 }
 /* more like hysteresis temperature */
 static ssize_t show_temp_min(struct device *dev, char *buf, int nr) {
 	struct i2c_client *client = to_i2c_client(dev);
 	struct via686a_data *data = i2c_get_clientdata(client);
 	via686a_update_client(client);
-	return sprintf(buf, "%ld\n", TEMP_FROM_REG(data->temp_hyst[nr])*10);
+	return sprintf(buf, "%ld\n", TEMP_FROM_REG(data->temp_hyst[nr])*100);
 }
 static ssize_t set_temp_max(struct device *dev, const char *buf, 
 		size_t count, int nr) {
 	struct i2c_client *client = to_i2c_client(dev);
 	struct via686a_data *data = i2c_get_clientdata(client);
-	int val = simple_strtol(buf, NULL, 10)/10;
+	int val = simple_strtol(buf, NULL, 10)/100;
 	data->temp_over[nr] = TEMP_TO_REG(val);
 	via686a_write_value(client, VIA686A_REG_TEMP_OVER(nr), data->temp_over[nr]);
 	return count;
@@ -523,7 +523,7 @@
 		size_t count, int nr) {
 	struct i2c_client *client = to_i2c_client(dev);
 	struct via686a_data *data = i2c_get_clientdata(client);
-	int val = simple_strtol(buf, NULL, 10)/10;
+	int val = simple_strtol(buf, NULL, 10)/100;
 	data->temp_hyst[nr] = TEMP_TO_REG(val);
 	via686a_write_value(client, VIA686A_REG_TEMP_HYST(nr), data->temp_hyst[nr]);
 	return count;
author
#3 lore raw

Re: [PATCH] i2c driver changes 2.6.0-test1

ChangeSet 1.1358.10.3, 2003/07/10 13:26:49-07:00, [email protected]

[PATCH] I2C: timer clean up for i2c-keywest.c

Quoted 10 lines · Benjamin Herrenschmidt
Quoted 3 lines · Paul Mackerras

This patch changes i2c-keywest.c to use mod_timer instead of a two-line sequence to compute .expires and call add_timer in 3 places. Without this patch I get a BUG from time to time in add_timer.

Ok, here it is. It also remove the never used "polled" mode. The driver is now in sync with the more up-to-date 2.4 version ;)

Sorry for not sending that earlier, I forgot about it and didn't notice it was out of sync.

And just in case you didn't merge it yet... Here's a version changing the timer->expire ; add_timer() pairs into calls to mod_timer, makes the code slighly cleaner.

 drivers/i2c/i2c-keywest.c |   90 ++++++++--------------------------------------
 1 files changed, 16 insertions(+), 74 deletions(-)
drivers/i2c/i2c-keywest.c +16 -74
diff -Nru a/drivers/i2c/i2c-keywest.c b/drivers/i2c/i2c-keywest.c
@@ -66,8 +66,6 @@
 
 #include "i2c-keywest.h"
 
-#undef POLLED_MODE
-
 #define DBG(x...) do {\
 	if (debug > 0) \
 		printk(KERN_DEBUG "KW:" x); \
@@ -85,27 +83,6 @@
 
 static struct keywest_iface *ifaces = NULL;
 
-#ifdef POLLED_MODE
-/* This isn't fast, but will go once I implement interrupt with
- * proper timeout
- */
-static u8
-wait_interrupt(struct keywest_iface* iface)
-{
-	int i;
-	u8 isr;
-	
-	for (i = 0; i < POLL_TIMEOUT; i++) {
-		isr = read_reg(reg_isr) & KW_I2C_IRQ_MASK;
-		if (isr != 0)
-			return isr;
-		current->state = TASK_UNINTERRUPTIBLE;
-		schedule_timeout(1);
-	}
-	return isr;
-}
-#endif /* POLLED_MODE */
-
 
 static void
 do_stop(struct keywest_iface* iface, int result)
@@ -116,16 +93,17 @@
 }
 
 /* Main state machine for standard & standard sub mode */
-static void
+static int
 handle_interrupt(struct keywest_iface *iface, u8 isr)
 {
 	int ack;
+	int rearm_timer = 1;
 	
 	DBG("handle_interrupt(), got: %x, status: %x, state: %d\n",
 		isr, read_reg(reg_status), iface->state);
 	if (isr == 0 && iface->state != state_stop) {
 		do_stop(iface, -1);
-		return;
+		return rearm_timer;
 	}
 	if (isr & KW_I2C_IRQ_STOP && iface->state != state_stop) {
 		iface->result = -1;
@@ -196,20 +174,19 @@
 		if (!(isr & KW_I2C_IRQ_STOP) && (++iface->stopretry) < 10)
 			do_stop(iface, -1);
 		else {
+			rearm_timer = 0;
 			iface->state = state_idle;
 			write_reg(reg_control, 0x00);
 			write_reg(reg_ier, 0x00);
-#ifndef POLLED_MODE
 			complete(&iface->complete);
-#endif /* POLLED_MODE */			
 		}
 		break;
 	}
 	
 	write_reg(reg_isr, isr);
-}
 
-#ifndef POLLED_MODE
+	return rearm_timer;
+}
 
 /* Interrupt handler */
 static irqreturn_t
@@ -219,11 +196,8 @@
 
 	spin_lock(&iface->lock);
 	del_timer(&iface->timeout_timer);
-	handle_interrupt(iface, read_reg(reg_isr));
-	if (iface->state != state_idle) {
-		iface->timeout_timer.expires = jiffies + POLL_TIMEOUT;
-		add_timer(&iface->timeout_timer);
-	}
+	if (handle_interrupt(iface, read_reg(reg_isr)))
+		mod_timer(&iface->timeout_timer, jiffies + POLL_TIMEOUT);
 	spin_unlock(&iface->lock);
 	return IRQ_HANDLED;
 }
@@ -235,16 +209,11 @@
 
 	DBG("timeout !\n");
 	spin_lock_irq(&iface->lock);
-	handle_interrupt(iface, read_reg(reg_isr));
-	if (iface->state != state_idle) {
-		iface->timeout_timer.expires = jiffies + POLL_TIMEOUT;
-		add_timer(&iface->timeout_timer);
-	}
+	if (handle_interrupt(iface, read_reg(reg_isr)))
+		mod_timer(&iface->timeout_timer, jiffies + POLL_TIMEOUT);
 	spin_unlock(&iface->lock);
 }
 
-#endif /* POLLED_MODE */
-
 /*
  * SMBUS-type transfer entrypoint
  */
@@ -331,24 +300,13 @@
 		write_reg(reg_subaddr, command);
 
 	/* Arm timeout */
-	iface->timeout_timer.expires = jiffies + POLL_TIMEOUT;
-	add_timer(&iface->timeout_timer);
+	mod_timer(&iface->timeout_timer, jiffies + POLL_TIMEOUT);
 
 	/* Start sending address & enable interrupt*/
 	write_reg(reg_control, read_reg(reg_control) | KW_I2C_CTL_XADDR);
 	write_reg(reg_ier, KW_I2C_IRQ_MASK);
 
-#ifdef POLLED_MODE
-	DBG("using polled mode...\n");
-	/* State machine, to turn into an interrupt handler */
-	while(iface->state != state_idle) {
-		u8 isr = wait_interrupt(iface);
-		handle_interrupt(iface, isr);
-	}
-#else /* POLLED_MODE */
-	DBG("using interrupt mode...\n");
 	wait_for_completion(&iface->complete);	
-#endif /* POLLED_MODE */	
 
 	rc = iface->result;	
 	DBG("transfer done, result: %d\n", rc);
@@ -421,24 +379,13 @@
 			((iface->read_write == I2C_SMBUS_READ) ? 0x01 : 0x00));
 
 		/* Arm timeout */
-		iface->timeout_timer.expires = jiffies + POLL_TIMEOUT;
-		add_timer(&iface->timeout_timer);
+		mod_timer(&iface->timeout_timer, jiffies + POLL_TIMEOUT);
 
 		/* Start sending address & enable interrupt*/
 		write_reg(reg_control, read_reg(reg_control) | KW_I2C_CTL_XADDR);
 		write_reg(reg_ier, KW_I2C_IRQ_MASK);
 
-#ifdef POLLED_MODE
-		DBG("using polled mode...\n");
-		/* State machine, to turn into an interrupt handler */
-		while(iface->state != state_idle) {
-			u8 isr = wait_interrupt(iface);
-			handle_interrupt(iface, isr);
-		}
-#else /* POLLED_MODE */
-		DBG("using interrupt mode...\n");
 		wait_for_completion(&iface->complete);	
-#endif /* POLLED_MODE */	
 
 		rc = iface->result;
 		if (rc == 0)
@@ -540,8 +487,8 @@
 			*prate);
 	}
 	
-	/* Select standard sub mode */
-	iface->cur_mode |= KW_I2C_MODE_STANDARDSUB;
+	/* Select standard mode by default */
+	iface->cur_mode |= KW_I2C_MODE_STANDARD;
 	
 	/* Write mode */
 	write_reg(reg_mode, iface->cur_mode);
@@ -550,7 +497,6 @@
 	write_reg(reg_ier, 0x00);
 	write_reg(reg_isr, KW_I2C_IRQ_MASK);
 
-#ifndef POLLED_MODE
 	/* Request chip interrupt */	
 	rc = request_irq(iface->irq, keywest_irq, 0, "keywest i2c", iface);
 	if (rc) {
@@ -559,7 +505,6 @@
 		kfree(iface);
 		return -ENODEV;
 	}
-#endif /* POLLED_MODE */
 
 	for (i=0; i<nchan; i++) {
 		struct keywest_chan* chan = &iface->channels[i];
@@ -609,19 +554,16 @@
 
 	/* Make sure we stop all activity */
 	down(&iface->sem);
-#ifndef POLLED_MODE
 	spin_lock_irq(&iface->lock);
 	while (iface->state != state_idle) {
 		spin_unlock_irq(&iface->lock);
-		schedule();
+		set_task_state(current,TASK_UNINTERRUPTIBLE);
+		schedule_timeout(HZ/10);
 		spin_lock_irq(&iface->lock);
 	}
-#endif /* POLLED_MODE */
 	iface->state = state_dead;
-#ifndef POLLED_MODE
 	spin_unlock_irq(&iface->lock);
 	free_irq(iface->irq, iface);
-#endif /* POLLED_MODE */
 	up(&iface->sem);
 
 	/* Release all channels */
author
#4 lore raw

Re: [PATCH] i2c driver changes 2.6.0-test1

ChangeSet 1.1526, 2003/07/18 23:28:44-07:00, [email protected]

[PATCH] I2C: add ncforce2 i2c bus driver

Ported from lmsensor's cvs tree

 drivers/i2c/busses/Kconfig       |   17 +
 drivers/i2c/busses/Makefile      |    1 
 drivers/i2c/busses/i2c-nforce2.c |  444 +++++++++++++++++++++++++++++++++++++++
 3 files changed, 462 insertions(+)
drivers/i2c/busses/Kconfig +17 -0
diff -Nru a/drivers/i2c/busses/Kconfig b/drivers/i2c/busses/Kconfig
@@ -108,6 +108,23 @@
 	  in the lm_sensors package, which you can download at 
 	  http://www.lm-sensors.nu
 
+config I2C_NFORCE2
+	tristate "  Nvidia Nforce2"
+	depends on I2C && PCI && EXPERIMENTAL
+	help
+	  If you say yes to this option, support will be included for the Nvidia
+	  Nforce2 family of mainboard I2C interfaces.
+
+	  This can also be built as a module which can be inserted and removed
+	  while the kernel is running.  If you want to compile it as a module,
+	  say M here and read <file:Documentation/modules.txt>.
+
+	  The module will be called i2c-nforce2.
+
+	  You will also need the latest user-space utilties: you can find them
+	  in the lm_sensors package, which you can download at
+	  http://www.lm-sensors.nu
+
 
 config I2C_PIIX4
 	tristate "  Intel PIIX4"
drivers/i2c/busses/Makefile +1 -0
diff -Nru a/drivers/i2c/busses/Makefile b/drivers/i2c/busses/Makefile
@@ -8,6 +8,7 @@
 obj-$(CONFIG_I2C_AMD8111)	+= i2c-amd8111.o
 obj-$(CONFIG_I2C_I801)		+= i2c-i801.o
 obj-$(CONFIG_I2C_ISA)		+= i2c-isa.o
+obj-$(CONFIG_I2C_NFORCE2)	+= i2c-nforce2.o
 obj-$(CONFIG_I2C_PIIX4)		+= i2c-piix4.o
 obj-$(CONFIG_I2C_SIS96X)	+= i2c-sis96x.o
 obj-$(CONFIG_I2C_VIAPRO)	+= i2c-viapro.o
drivers/i2c/busses/i2c-nforce2.c new file +444 -0

444 lines not on this page · raw message

author
#5 lore raw

Re: [PATCH] i2c driver changes 2.6.0-test1

ChangeSet 1.1527, 2003/07/18 23:32:43-07:00, [email protected]

[PATCH] I2C: minor cleanups to the i2c-nforce2 driver.

 drivers/i2c/busses/i2c-nforce2.c |   24 +++---------------------
 1 files changed, 3 insertions(+), 21 deletions(-)
drivers/i2c/busses/i2c-nforce2.c +3 -21
diff -Nru a/drivers/i2c/busses/i2c-nforce2.c b/drivers/i2c/busses/i2c-nforce2.c
@@ -43,14 +43,10 @@
 #include <linux/delay.h>
 #include <asm/io.h>
 
-#ifdef MODULE_LICENSE
 MODULE_LICENSE("GPL");
-#endif
 MODULE_AUTHOR ("Hans-Frieder Vogt <[email protected]>");
 MODULE_DESCRIPTION("nForce2 SMBus driver");
 
-#define LM_VERSION "2.80-lk1"
-#define LM_DATE    "2003/07/12"
 
 #ifndef PCI_DEVICE_ID_NVIDIA_NFORCE2_SMBUS
 #define PCI_DEVICE_ID_NVIDIA_NFORCE2_SMBUS   0x0064
@@ -114,13 +110,6 @@
 static s32 nforce2_access(struct i2c_adapter *adap, u16 addr,
 		       unsigned short flags, char read_write,
 		       u8 command, int size, union i2c_smbus_data *data);
-#if 0
-static void nforce2_do_pause(unsigned int amount);
-#endif
-/*
-static int nforce2_block_transaction(union i2c_smbus_data *data,
-				  char read_write, int i2c_enable);
- */
 static u32 nforce2_func(struct i2c_adapter *adapter);
 
 
@@ -345,18 +334,12 @@
 			smbus->base, smbus->base+smbus->size-1, name);
 		return -1;
 	}
-
-	/* TODO: find a better way to find out whether this file is compiled
-	 * with i2c 2.7.0 of earlier
-	 */
-/*#ifdef I2C_HW_SMBUS_AMD8111
+/*
 	smbus->adapter.owner = THIS_MODULE;
-#endif
-
 	smbus->adapter.id = I2C_ALGO_SMBUS | I2C_HW_SMBUS_NFORCE2;
 	smbus->adapter.algo = &smbus_algorithm;
-	smbus->adapter.algo_data = smbus;*/
-
+	smbus->adapter.algo_data = smbus;
+*/
 	smbus->adapter = nforce2_adapter;
 	smbus->adapter.dev.parent = &dev->dev;
 	snprintf(smbus->adapter.dev.name, DEVICE_NAME_SIZE,
@@ -430,7 +413,6 @@
 
 static int __init nforce2_init(void)
 {
-	printk(KERN_INFO "i2c-nforce2 version %s (%s)\n", LM_VERSION, LM_DATE);
 	return pci_module_init(&nforce2_driver);
 }
 
author
#6 lore raw

Re: [PATCH] i2c driver changes 2.6.0-test1

ChangeSet 1.1528, 2003/07/19 08:41:08-07:00, [email protected]

[PATCH] I2C: consolidate the i2c delay functions.

 drivers/i2c/busses/i2c-ali1535.c |   10 ++--------
 drivers/i2c/busses/i2c-ali15x3.c |   11 ++---------
 drivers/i2c/busses/i2c-amd756.c  |   14 +++-----------
 drivers/i2c/busses/i2c-amd8111.c |    3 +--
 drivers/i2c/busses/i2c-i801.c    |   14 +++-----------
 drivers/i2c/busses/i2c-piix4.c   |   10 +---------
 drivers/i2c/busses/i2c-sis96x.c  |    9 +--------
 drivers/i2c/busses/i2c-viapro.c  |    9 +--------
 include/linux/i2c.h              |    7 +++++++
 9 files changed, 21 insertions(+), 66 deletions(-)
drivers/i2c/busses/i2c-ali1535.c +2 -8
diff -Nru a/drivers/i2c/busses/i2c-ali1535.c b/drivers/i2c/busses/i2c-ali1535.c
@@ -206,12 +206,6 @@
 	return retval;
 }
 
-static void ali1535_do_pause(unsigned int amount)
-{
-	current->state = TASK_INTERRUPTIBLE;
-	schedule_timeout(amount);
-}
-
 static int ali1535_transaction(struct i2c_adapter *adap)
 {
 	int temp;
@@ -283,7 +277,7 @@
 	/* We will always wait for a fraction of a second! */
 	timeout = 0;
 	do {
-		ali1535_do_pause(1);
+		i2c_delay(1);
 		temp = inb_p(SMBHSTSTS);
 	} while (((temp & ALI1535_STS_BUSY) && !(temp & ALI1535_STS_IDLE))
 		 && (timeout++ < MAX_TIMEOUT));
@@ -357,7 +351,7 @@
 	for (timeout = 0;
 	     (timeout < MAX_TIMEOUT) && !(temp & ALI1535_STS_IDLE);
 	     timeout++) {
-		ali1535_do_pause(1);
+		i2c_delay(1);
 		temp = inb_p(SMBHSTSTS);
 	}
 	if (timeout >= MAX_TIMEOUT)
drivers/i2c/busses/i2c-ali15x3.c +2 -9
diff -Nru a/drivers/i2c/busses/i2c-ali15x3.c b/drivers/i2c/busses/i2c-ali15x3.c
@@ -225,13 +225,6 @@
 	return -ENODEV;
 }
 
-/* Internally used pause function */
-static void ali15x3_do_pause(unsigned int amount)
-{
-	current->state = TASK_INTERRUPTIBLE;
-	schedule_timeout(amount);
-}
-
 /* Another internally used function */
 static int ali15x3_transaction(struct i2c_adapter *adap)
 {
@@ -304,7 +297,7 @@
 	/* We will always wait for a fraction of a second! */
 	timeout = 0;
 	do {
-		ali15x3_do_pause(1);
+		i2c_delay(1);
 		temp = inb_p(SMBHSTSTS);
 	} while ((!(temp & (ALI15X3_STS_ERR | ALI15X3_STS_DONE)))
 		 && (timeout++ < MAX_TIMEOUT));
@@ -361,7 +354,7 @@
 	for (timeout = 0;
 	     (timeout < MAX_TIMEOUT) && !(temp & ALI15X3_STS_IDLE);
 	     timeout++) {
-		ali15x3_do_pause(1);
+		i2c_delay(1);
 		temp = inb_p(SMBHSTSTS);
 	}
 	if (timeout >= MAX_TIMEOUT) {
drivers/i2c/busses/i2c-amd756.c +3 -11
diff -Nru a/drivers/i2c/busses/i2c-amd756.c b/drivers/i2c/busses/i2c-amd756.c
@@ -93,14 +93,6 @@
      see E0 for the status bits and enabled in E2
      
 */
-
-/* Internally used pause function */
-static void amd756_do_pause(unsigned int amount)
-{
-	current->state = TASK_INTERRUPTIBLE;
-	schedule_timeout(amount);
-}
-
 #define GS_ABRT_STS	(1 << 0)
 #define GS_COL_STS	(1 << 1)
 #define GS_PRERR_STS	(1 << 2)
@@ -132,7 +124,7 @@
 	if ((temp = inw_p(SMB_GLOBAL_STATUS)) & (GS_HST_STS | GS_SMB_STS)) {
 		dev_dbg(&adap->dev, ": SMBus busy (%04x). Waiting... \n", temp);
 		do {
-			amd756_do_pause(1);
+			i2c_delay(1);
 			temp = inw_p(SMB_GLOBAL_STATUS);
 		} while ((temp & (GS_HST_STS | GS_SMB_STS)) &&
 		         (timeout++ < MAX_TIMEOUT));
@@ -149,7 +141,7 @@
 
 	/* We will always wait for a fraction of a second! */
 	do {
-		amd756_do_pause(1);
+		i2c_delay(1);
 		temp = inw_p(SMB_GLOBAL_STATUS);
 	} while ((temp & GS_HST_STS) && (timeout++ < MAX_TIMEOUT));
 
@@ -196,7 +188,7 @@
  abort:
 	dev_warn(&adap->dev, ": Sending abort.\n");
 	outw_p(inw(SMB_GLOBAL_ENABLE) | GE_ABORT, SMB_GLOBAL_ENABLE);
-	amd756_do_pause(100);
+	i2c_delay(100);
 	outw_p(GS_CLEAR_STS, SMB_GLOBAL_STATUS);
 	return -1;
 }
drivers/i2c/busses/i2c-amd8111.c +1 -2
diff -Nru a/drivers/i2c/busses/i2c-amd8111.c b/drivers/i2c/busses/i2c-amd8111.c
@@ -275,8 +275,7 @@
 	}
 
 	if (~temp[0] & AMD_SMB_STS_DONE) {
-		current->state = TASK_INTERRUPTIBLE;
-		schedule_timeout(HZ/100);
+		i2c_delay(HZ/100);
 		amd_ec_read(smbus, AMD_SMB_STS, temp + 0);
 	}
 
drivers/i2c/busses/i2c-i801.c +3 -11
diff -Nru a/drivers/i2c/busses/i2c-i801.c b/drivers/i2c/busses/i2c-i801.c
@@ -103,7 +103,6 @@
 		 "Forcibly enable the I801 at the given address. "
 		 "EXTREMELY DANGEROUS!");
 
-static void i801_do_pause(unsigned int amount);
 static int i801_transaction(void);
 static int i801_block_transaction(union i2c_smbus_data *data,
 				  char read_write, int command);
@@ -178,13 +177,6 @@
 	return error_return;
 }
 
-
-static void i801_do_pause(unsigned int amount)
-{
-	current->state = TASK_INTERRUPTIBLE;
-	schedule_timeout(amount);
-}
-
 static int i801_transaction(void)
 {
 	int temp;
@@ -214,7 +206,7 @@
 
 	/* We will always wait for a fraction of a second! */
 	do {
-		i801_do_pause(1);
+		i2c_delay(1);
 		temp = inb_p(SMBHSTSTS);
 	} while ((temp & 0x01) && (timeout++ < MAX_TIMEOUT));
 
@@ -342,7 +334,7 @@
 		timeout = 0;
 		do {
 			temp = inb_p(SMBHSTSTS);
-			i801_do_pause(1);
+			i2c_delay(1);
 		}
 		    while ((!(temp & 0x80))
 			   && (timeout++ < MAX_TIMEOUT));
@@ -402,7 +394,7 @@
 		timeout = 0;
 		do {
 			temp = inb_p(SMBHSTSTS);
-			i801_do_pause(1);
+			i2c_delay(1);
 		} while ((!(temp & 0x02))
 			   && (timeout++ < MAX_TIMEOUT));
 
drivers/i2c/busses/i2c-piix4.c +1 -9
diff -Nru a/drivers/i2c/busses/i2c-piix4.c b/drivers/i2c/busses/i2c-piix4.c
@@ -99,7 +99,6 @@
 		 "Forcibly enable the PIIX4 at the given address. "
 		 "EXTREMELY DANGEROUS!");
 
-static void piix4_do_pause(unsigned int amount);
 static int piix4_transaction(void);
 
 
@@ -208,13 +207,6 @@
 	return error_return;
 }
 
-/* Internally used pause function */
-static void piix4_do_pause(unsigned int amount)
-{
-	current->state = TASK_INTERRUPTIBLE;
-	schedule_timeout(amount);
-}
-
 /* Another internally used function */
 static int piix4_transaction(void)
 {
@@ -245,7 +237,7 @@
 
 	/* We will always wait for a fraction of a second! (See PIIX4 docs errata) */
 	do {
-		piix4_do_pause(1);
+		i2c_delay(1);
 		temp = inb_p(SMBHSTSTS);
 	} while ((temp & 0x01) && (timeout++ < MAX_TIMEOUT));
 
drivers/i2c/busses/i2c-sis96x.c +1 -8
diff -Nru a/drivers/i2c/busses/i2c-sis96x.c b/drivers/i2c/busses/i2c-sis96x.c
@@ -99,13 +99,6 @@
 	outb(data, sis96x_smbus_base + reg) ;
 }
 
-/* Internally used pause function */
-static void sis96x_do_pause(unsigned int amount)
-{
-	current->state = TASK_INTERRUPTIBLE;
-	schedule_timeout(amount);
-}
-
 /* Execute a SMBus transaction.
    int size is from SIS96x_QUICK to SIS96x_BLOCK_DATA
  */
@@ -147,7 +140,7 @@
 
 	/* We will always wait for a fraction of a second! */
 	do {
-		sis96x_do_pause(1);
+		i2c_delay(1);
 		temp = sis96x_read(SMB_STS);
 	} while (!(temp & 0x0e) && (timeout++ < MAX_TIMEOUT));
 
drivers/i2c/busses/i2c-viapro.c +1 -8
diff -Nru a/drivers/i2c/busses/i2c-viapro.c b/drivers/i2c/busses/i2c-viapro.c
@@ -103,13 +103,6 @@
 
 static struct i2c_adapter vt596_adapter;
 
-/* Internally used pause function */
-static void vt596_do_pause(unsigned int amount)
-{
-	current->state = TASK_INTERRUPTIBLE;
-	schedule_timeout(amount);
-}
-
 /* Another internally used function */
 static int vt596_transaction(void)
 {
@@ -143,7 +136,7 @@
 	/* We will always wait for a fraction of a second! 
 	   I don't know if VIA needs this, Intel did  */
 	do {
-		vt596_do_pause(1);
+		i2c_delay(1);
 		temp = inb_p(SMBHSTSTS);
 	} while ((temp & 0x01) && (timeout++ < MAX_TIMEOUT));
 
include/linux/i2c.h +7 -0
diff -Nru a/include/linux/i2c.h b/include/linux/i2c.h
@@ -594,4 +594,11 @@
 #define i2c_is_isa_adapter(adapptr) \
         ((adapptr)->algo->id == I2C_ALGO_ISA)
 
+/* Tiny delay function used by the i2c bus drivers */
+static inline void i2c_delay(signed long timeout)
+{
+	set_current_state(TASK_INTERRUPTIBLE);
+	schedule_timeout(timeout);
+}
+
 #endif /* _LINUX_I2C_H */
#7 lore raw

Re: [PATCH] i2c driver changes 2.6.0-test1

In reply to Greg KH

Hi,

This code doesn't work well. I was porting this code to 2.5 myself, so I did some fixes to the code in 2.6.0-test1-ac3.

Review

Quoted 2 lines · Greg KH
(quoted diff) +2 -0
+	smbus->adapter.algo_data = smbus;
+*/

The problem is here. If you leave this line commented out, you'll have problems when inserting the chip module.

Quoted 1 line

smbus->adapter = nforce2_adapter;

Also, I don't see the point in commenting out all this lines just to introduce a nforce2_adapter struct. If this is the correct aprouch, just remove the duplicate code instead of just commenting it out.

Attached is a patch to fix this problems. I can't test it very well as I can only see the sensors in my board with i2c-isa, but everything loads fine. This patch also moves the PCI ids to the pci_ids.h file.

Marcelo Penna Guerra

drivers/i2c/busses/i2c-nforce2.c +2 -16
diff -Naur linux-2.6.0-test1/drivers/i2c/busses/i2c-nforce2.c linux-2.6.0-test1.new/drivers/i2c/busses/i2c-nforce2.c
@@ -48,9 +48,6 @@
 MODULE_DESCRIPTION("nForce2 SMBus driver");
 
 
-#ifndef PCI_DEVICE_ID_NVIDIA_NFORCE2_SMBUS
-#define PCI_DEVICE_ID_NVIDIA_NFORCE2_SMBUS   0x0064
-#endif
 /* TODO: sync with lm-sensors */
 #ifndef I2C_HW_SMBUS_NFORCE2
 #define I2C_HW_SMBUS_NFORCE2	0x0c
@@ -120,16 +117,6 @@
 	.functionality = nforce2_func,
 };
 
-static struct i2c_adapter nforce2_adapter = {
-	.owner          = THIS_MODULE,
-	.id             = I2C_ALGO_SMBUS | I2C_HW_SMBUS_NFORCE2,
-	.class          = I2C_ADAP_CLASS_SMBUS,
-	.algo           = &smbus_algorithm,
-	.dev            = {
-		.name   = "unset",
-	},
-};
-
 
 #if 0
 /* Internally used pause function */
@@ -334,13 +321,12 @@
 			smbus->base, smbus->base+smbus->size-1, name);
 		return -1;
 	}
-/*
+
 	smbus->adapter.owner = THIS_MODULE;
 	smbus->adapter.id = I2C_ALGO_SMBUS | I2C_HW_SMBUS_NFORCE2;
 	smbus->adapter.algo = &smbus_algorithm;
 	smbus->adapter.algo_data = smbus;
-*/
-	smbus->adapter = nforce2_adapter;
+	smbus->adapter.class = I2C_ADAP_CLASS_SMBUS;
 	smbus->adapter.dev.parent = &dev->dev;
 	snprintf(smbus->adapter.dev.name, DEVICE_NAME_SIZE,
 		"SMBus nForce2 adapter at %04x", smbus->base);
include/linux/pci_ids.h +1 -0
diff -Naur linux-2.6.0-test1/include/linux/pci_ids.h linux-2.6.0-test1.new/include/linux/pci_ids.h
@@ -1024,6 +1024,7 @@
 #define PCI_DEVICE_ID_NVIDIA_NFORCE		0x01a4
 #define PCI_DEVICE_ID_NVIDIA_NFORCE_IDE		0x01bc
 #define PCI_DEVICE_ID_NVIDIA_NFORCE2		0x01e0
+#define PCI_DEVICE_ID_NVIDIA_NFORCE2_SMBUS	0x0064
 #define PCI_DEVICE_ID_NVIDIA_GEFORCE3		0x0200
 #define PCI_DEVICE_ID_NVIDIA_GEFORCE3_1		0x0201
 #define PCI_DEVICE_ID_NVIDIA_GEFORCE3_2		0x0202
author
#8 lore raw

Re: [PATCH] i2c driver changes 2.6.0-test1

Quoted 15 lines · Marcelo Penna Guerra

Hi,

This code doesn't work well. I was porting this code to 2.5 myself, so I did some fixes to the code in 2.6.0-test1-ac3.

Review

Quoted 2 lines · Greg KH
(quoted diff) +2 -0
+	smbus->adapter.algo_data = smbus;
+*/

The problem is here. If you leave this line commented out, you'll have problems when inserting the chip module.

Quoted 1 line

smbus->adapter = nforce2_adapter;

Quoted 7 lines

Also, I don't see the point in commenting out all this lines just to introduce a nforce2_adapter struct. If this is the correct aprouch, just remove the duplicate code instead of just commenting it out.

Attached is a patch to fix this problems. I can't test it very well as I can only see the sensors in my board with i2c-isa, but everything loads fine. This patch also moves the PCI ids to the pci_ids.h file.

I'd like to see someone who has this hardware test these changes before taking them.

Anyone want to verify that things still work properly with this patch?

thanks,

greg k-h