i2c driver changes for 2.6.0-test1
Subsystems (4)
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
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
@@ -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
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
@@ -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;
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.cto usemod_timerinstead of a two-line sequence to compute .expires and calladd_timerin 3 places. Without this patch I get a BUG from time to time inadd_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
@@ -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 */
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
@@ -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
@@ -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
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
@@ -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); }
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
@@ -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
@@ -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
@@ -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
@@ -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
@@ -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
@@ -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
@@ -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
@@ -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
@@ -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 */
Re: [PATCH] i2c driver changes 2.6.0-test1
In reply to Greg KHHi,
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
@@ -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
@@ -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
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_adapterstruct. 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.hfile.
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