* [BK PATCH] i2c driver changes for 2.6.0-test1 @ 2003-07-19 15:52 Greg KH 2003-07-19 15:54 ` [PATCH] i2c driver changes 2.6.0-test1 Greg KH 0 siblings, 1 reply; 9+ messages in thread From: Greg KH @ 2003-07-19 15:52 UTC (permalink / raw) To: torvalds; +Cc: linux-kernel, sensors 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(-) ----- <j.dittmer@portrix.net>: o I2C: convert via686a temp_* to milli degree celsius <nikkne@hotpop.com>: o I2C: fix Kconfig info <patrick@dreker.de>: o I2C: add ncforce2 i2c bus driver Benjamin Herrenschmidt <benh@kernel.crashing.org>: o I2C: timer clean up for i2c-keywest.c Greg Kroah-Hartman <greg@kroah.com>: o I2C: consolidate the i2c delay functions o I2C: minor cleanups to the i2c-nforce2 driver ^ permalink raw reply [flat|nested] 9+ messages in thread
* [PATCH] i2c driver changes 2.6.0-test1 2003-07-19 15:52 [BK PATCH] i2c driver changes for 2.6.0-test1 Greg KH @ 2003-07-19 15:54 ` Greg KH 2003-07-19 15:54 ` Greg KH 0 siblings, 1 reply; 9+ messages in thread From: Greg KH @ 2003-07-19 15:54 UTC (permalink / raw) To: linux-kernel, sensors ChangeSet 1.1310.80.1, 2003/06/24 14:58:09-07:00, nikkne@hotpop.com [PATCH] I2C: fix Kconfig info drivers/i2c/Kconfig | 4 +--- 1 files changed, 1 insertion(+), 3 deletions(-) diff -Nru a/drivers/i2c/Kconfig b/drivers/i2c/Kconfig --- a/drivers/i2c/Kconfig Sat Jul 19 08:48:43 2003 +++ b/drivers/i2c/Kconfig Sat Jul 19 08:48:43 2003 @@ -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 ^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: [PATCH] i2c driver changes 2.6.0-test1 2003-07-19 15:54 ` [PATCH] i2c driver changes 2.6.0-test1 Greg KH @ 2003-07-19 15:54 ` Greg KH 2003-07-19 15:54 ` Greg KH 0 siblings, 1 reply; 9+ messages in thread From: Greg KH @ 2003-07-19 15:54 UTC (permalink / raw) To: linux-kernel, sensors ChangeSet 1.1358.10.2, 2003/07/03 12:22:45-07:00, j.dittmer@portrix.net [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(-) diff -Nru a/drivers/i2c/chips/via686a.c b/drivers/i2c/chips/via686a.c --- a/drivers/i2c/chips/via686a.c Sat Jul 19 08:48:34 2003 +++ b/drivers/i2c/chips/via686a.c Sat Jul 19 08:48:34 2003 @@ -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; ^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: [PATCH] i2c driver changes 2.6.0-test1 2003-07-19 15:54 ` Greg KH @ 2003-07-19 15:54 ` Greg KH 2003-07-19 15:54 ` Greg KH 0 siblings, 1 reply; 9+ messages in thread From: Greg KH @ 2003-07-19 15:54 UTC (permalink / raw) To: linux-kernel, sensors ChangeSet 1.1358.10.3, 2003/07/10 13:26:49-07:00, benh@kernel.crashing.org [PATCH] I2C: timer clean up for i2c-keywest.c On Tue, 2003-07-08 at 12:26, Benjamin Herrenschmidt wrote: > On Mon, 2003-07-07 at 09:03, Paul Mackerras wrote: > > 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(-) diff -Nru a/drivers/i2c/i2c-keywest.c b/drivers/i2c/i2c-keywest.c --- a/drivers/i2c/i2c-keywest.c Sat Jul 19 08:48:26 2003 +++ b/drivers/i2c/i2c-keywest.c Sat Jul 19 08:48:26 2003 @@ -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 */ ^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: [PATCH] i2c driver changes 2.6.0-test1 2003-07-19 15:54 ` Greg KH @ 2003-07-19 15:54 ` Greg KH 2003-07-19 15:54 ` Greg KH 0 siblings, 1 reply; 9+ messages in thread From: Greg KH @ 2003-07-19 15:54 UTC (permalink / raw) To: linux-kernel, sensors ChangeSet 1.1526, 2003/07/18 23:28:44-07:00, patrick@dreker.de [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(+) diff -Nru a/drivers/i2c/busses/Kconfig b/drivers/i2c/busses/Kconfig --- a/drivers/i2c/busses/Kconfig Sat Jul 19 08:48:17 2003 +++ b/drivers/i2c/busses/Kconfig Sat Jul 19 08:48:17 2003 @@ -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" diff -Nru a/drivers/i2c/busses/Makefile b/drivers/i2c/busses/Makefile --- a/drivers/i2c/busses/Makefile Sat Jul 19 08:48:17 2003 +++ b/drivers/i2c/busses/Makefile Sat Jul 19 08:48:17 2003 @@ -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 diff -Nru a/drivers/i2c/busses/i2c-nforce2.c b/drivers/i2c/busses/i2c-nforce2.c --- /dev/null Wed Dec 31 16:00:00 1969 +++ b/drivers/i2c/busses/i2c-nforce2.c Sat Jul 19 08:48:17 2003 @@ -0,0 +1,444 @@ +/* + SMBus driver for nVidia nForce2 MCP + + Ported to 2.5 Patrick Dreker <patrick@dreker.de>, + Copyright (c) 2003 Hans-Frieder Vogt <hfvogt@arcor.de>, + Based on + SMBus 2.0 driver for AMD-8111 IO-Hub + Copyright (c) 2002 Vojtech Pavlik + + 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. +*/ + +/* + SUPPORTED DEVICES PCI ID + nForce2 MCP 0064 + + This driver supports the 2 SMBuses that are included in the MCP2 of the + nForce2 chipset. +*/ + +/* Note: we assume there can only be one nForce2, with two SMBus interfaces */ + +#include <linux/module.h> +#include <linux/pci.h> +#include <linux/kernel.h> +#include <linux/stddef.h> +#include <linux/sched.h> +#include <linux/ioport.h> +#include <linux/init.h> +#include <linux/i2c.h> +#include <linux/delay.h> +#include <asm/io.h> + +#ifdef MODULE_LICENSE +MODULE_LICENSE("GPL"); +#endif +MODULE_AUTHOR ("Hans-Frieder Vogt <hfvogt@arcor.de>"); +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 +#endif +/* TODO: sync with lm-sensors */ +#ifndef I2C_HW_SMBUS_NFORCE2 +#define I2C_HW_SMBUS_NFORCE2 0x0c +#endif + + +struct nforce2_smbus { + struct pci_dev *dev; + struct i2c_adapter adapter; + int base; + int size; +}; + + +/* + * nVidia nForce2 SMBus control register definitions + */ +#define NFORCE_PCI_SMB1 0x50 +#define NFORCE_PCI_SMB2 0x54 + + +/* + * ACPI 2.0 chapter 13 SMBus 2.0 EC register model + */ +#define NVIDIA_SMB_PRTCL (smbus->base + 0x00) /* protocol, PEC */ +#define NVIDIA_SMB_STS (smbus->base + 0x01) /* status */ +#define NVIDIA_SMB_ADDR (smbus->base + 0x02) /* address */ +#define NVIDIA_SMB_CMD (smbus->base + 0x03) /* command */ +#define NVIDIA_SMB_DATA (smbus->base + 0x04) /* 32 data registers */ +#define NVIDIA_SMB_BCNT (smbus->base + 0x24) /* number of data bytes */ +#define NVIDIA_SMB_ALRM_A (smbus->base + 0x25) /* alarm address */ +#define NVIDIA_SMB_ALRM_D (smbus->base + 0x26) /* 2 bytes alarm data */ + +#define NVIDIA_SMB_STS_DONE 0x80 +#define NVIDIA_SMB_STS_ALRM 0x40 +#define NVIDIA_SMB_STS_RES 0x20 +#define NVIDIA_SMB_STS_STATUS 0x1f + +#define NVIDIA_SMB_PRTCL_WRITE 0x00 +#define NVIDIA_SMB_PRTCL_READ 0x01 +#define NVIDIA_SMB_PRTCL_QUICK 0x02 +#define NVIDIA_SMB_PRTCL_BYTE 0x04 +#define NVIDIA_SMB_PRTCL_BYTE_DATA 0x06 +#define NVIDIA_SMB_PRTCL_WORD_DATA 0x08 +#define NVIDIA_SMB_PRTCL_BLOCK_DATA 0x0a +#define NVIDIA_SMB_PRTCL_PROC_CALL 0x0c +#define NVIDIA_SMB_PRTCL_BLOCK_PROC_CALL 0x0d +#define NVIDIA_SMB_PRTCL_I2C_BLOCK_DATA 0x4a +#define NVIDIA_SMB_PRTCL_PEC 0x80 + + +/* Other settings */ +#define MAX_TIMEOUT 256 + + + +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); + + +static struct i2c_algorithm smbus_algorithm = { + .name = "Non-I2C SMBus adapter", + .id = I2C_ALGO_SMBUS, + .smbus_xfer = nforce2_access, + .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 */ +static void nforce2_do_pause(unsigned int amount) +{ + current->state = TASK_INTERRUPTIBLE; + schedule_timeout(amount); +} +#endif + +/* Return -1 on error. See smbus.h for more information */ +static s32 nforce2_access(struct i2c_adapter * adap, u16 addr, unsigned short flags, + char read_write, u8 command, int size, + union i2c_smbus_data * data) +{ + struct nforce2_smbus *smbus = adap->algo_data; + unsigned char protocol, pec, temp; + unsigned char len = 0; /* to keep the compiler quiet */ + int timeout = 0; + int i; + + protocol = (read_write == I2C_SMBUS_READ) ? NVIDIA_SMB_PRTCL_READ : + NVIDIA_SMB_PRTCL_WRITE; + pec = (flags & I2C_CLIENT_PEC) ? NVIDIA_SMB_PRTCL_PEC : 0; + + switch (size) { + + case I2C_SMBUS_QUICK: + protocol |= NVIDIA_SMB_PRTCL_QUICK; + read_write = I2C_SMBUS_WRITE; + break; + + case I2C_SMBUS_BYTE: + if (read_write == I2C_SMBUS_WRITE) + outb_p(data->byte, NVIDIA_SMB_DATA); + protocol |= NVIDIA_SMB_PRTCL_BYTE; + break; + + case I2C_SMBUS_BYTE_DATA: + outb_p(command, NVIDIA_SMB_CMD); + if (read_write == I2C_SMBUS_WRITE) + outb_p(data->byte, NVIDIA_SMB_DATA); + protocol |= NVIDIA_SMB_PRTCL_BYTE_DATA; + break; + + case I2C_SMBUS_WORD_DATA: + outb_p(command, NVIDIA_SMB_CMD); + if (read_write == I2C_SMBUS_WRITE) { + outb_p(data->word, NVIDIA_SMB_DATA); + outb_p(data->word >> 8, NVIDIA_SMB_DATA+1); + } + protocol |= NVIDIA_SMB_PRTCL_WORD_DATA | pec; + break; + + case I2C_SMBUS_BLOCK_DATA: + outb_p(command, NVIDIA_SMB_CMD); + if (read_write == I2C_SMBUS_WRITE) { + len = min_t(u8, data->block[0], 32); + outb_p(len, NVIDIA_SMB_BCNT); + for (i = 0; i < len; i++) + outb_p(data->block[i + 1], NVIDIA_SMB_DATA+i); + } + protocol |= NVIDIA_SMB_PRTCL_BLOCK_DATA | pec; + break; + + case I2C_SMBUS_I2C_BLOCK_DATA: + len = min_t(u8, data->block[0], 32); + outb_p(command, NVIDIA_SMB_CMD); + outb_p(len, NVIDIA_SMB_BCNT); + if (read_write == I2C_SMBUS_WRITE) + for (i = 0; i < len; i++) + outb_p(data->block[i + 1], NVIDIA_SMB_DATA+i); + protocol |= NVIDIA_SMB_PRTCL_I2C_BLOCK_DATA; + break; + + case I2C_SMBUS_PROC_CALL: + dev_err(&adap->dev, "I2C_SMBUS_PROC_CALL not supported!\n"); + return -1; + /* + outb_p(command, NVIDIA_SMB_CMD); + outb_p(data->word, NVIDIA_SMB_DATA); + outb_p(data->word >> 8, NVIDIA_SMB_DATA + 1); + protocol = NVIDIA_SMB_PRTCL_PROC_CALL | pec; + read_write = I2C_SMBUS_READ; + break; + */ + + case I2C_SMBUS_BLOCK_PROC_CALL: + dev_err(&adap->dev, "I2C_SMBUS_BLOCK_PROC_CALL not supported!\n"); + return -1; + /* + protocol |= pec; + len = min_t(u8, data->block[0], 31); + outb_p(command, NVIDIA_SMB_CMD); + outb_p(len, NVIDIA_SMB_BCNT); + for (i = 0; i < len; i++) + outb_p(data->block[i + 1], NVIDIA_SMB_DATA + i); + protocol = NVIDIA_SMB_PRTCL_BLOCK_PROC_CALL | pec; + read_write = I2C_SMBUS_READ; + break; + */ + + case I2C_SMBUS_WORD_DATA_PEC: + case I2C_SMBUS_BLOCK_DATA_PEC: + case I2C_SMBUS_PROC_CALL_PEC: + case I2C_SMBUS_BLOCK_PROC_CALL_PEC: + dev_err(&adap->dev, "Unexpected software PEC transaction %d\n.", size); + return -1; + + default: + dev_err(&adap->dev, "Unsupported transaction %d\n", size); + return -1; + } + + outb_p((addr & 0x7f) << 1, NVIDIA_SMB_ADDR); + outb_p(protocol, NVIDIA_SMB_PRTCL); + + temp = inb_p(NVIDIA_SMB_STS); + +#if 0 + do { + nforce2_do_pause(1); + temp = inb_p(NVIDIA_SMB_STS); + } while (((temp & NVIDIA_SMB_STS_DONE) == 0) && (timeout++ < MAX_TIMEOUT)); +#endif + if (~temp & NVIDIA_SMB_STS_DONE) { + udelay(500); + temp = inb_p(NVIDIA_SMB_STS); + } + if (~temp & NVIDIA_SMB_STS_DONE) { + current->state = TASK_INTERRUPTIBLE; + schedule_timeout(HZ/100); + temp = inb_p(NVIDIA_SMB_STS); + } + + if ((timeout >= MAX_TIMEOUT) || (~temp & NVIDIA_SMB_STS_DONE) + || (temp & NVIDIA_SMB_STS_STATUS)) + return -1; + + if (read_write == I2C_SMBUS_WRITE) + return 0; + + switch (size) { + + case I2C_SMBUS_BYTE: + case I2C_SMBUS_BYTE_DATA: + data->byte = inb_p(NVIDIA_SMB_DATA); + break; + + case I2C_SMBUS_WORD_DATA: + /* case I2C_SMBUS_PROC_CALL: not supported */ + data->word = inb_p(NVIDIA_SMB_DATA) | (inb_p(NVIDIA_SMB_DATA+1) << 8); + break; + + case I2C_SMBUS_BLOCK_DATA: + /* case I2C_SMBUS_BLOCK_PROC_CALL: not supported */ + len = inb_p(NVIDIA_SMB_BCNT); + len = min_t(u8, len, 32); + case I2C_SMBUS_I2C_BLOCK_DATA: + for (i = 0; i < len; i++) + data->block[i+1] = inb_p(NVIDIA_SMB_DATA + i); + data->block[0] = len; + break; + } + + return 0; +} + + +static u32 nforce2_func(struct i2c_adapter *adapter) +{ + /* other functionality might be possible, but is not tested */ + return I2C_FUNC_SMBUS_QUICK | I2C_FUNC_SMBUS_BYTE | + I2C_FUNC_SMBUS_BYTE_DATA | I2C_FUNC_SMBUS_WORD_DATA /* | + I2C_FUNC_SMBUS_BLOCK_DATA */; +} + + +static struct pci_device_id nforce2_ids[] __devinitdata = { + { PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_NFORCE2_SMBUS, + PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0 }, + { 0 } +}; + + +static int __devinit nforce2_probe_smb (struct pci_dev *dev, int reg, + struct nforce2_smbus *smbus, char *name) +{ + u16 iobase; + int error; + + if (pci_read_config_word(dev, reg, &iobase) != PCIBIOS_SUCCESSFUL) { + dev_err(&smbus->adapter.dev, "Error reading PCI config for %s\n", name); + return -1; + } + smbus->dev = dev; + smbus->base = iobase & 0xfffc; + smbus->size = 8; + + if (!request_region(smbus->base, smbus->size, "nForce2 SMBus")) { + dev_err(&smbus->adapter.dev, "Error requesting region %02x .. %02X for %s\n", + 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 = nforce2_adapter; + smbus->adapter.dev.parent = &dev->dev; + snprintf(smbus->adapter.dev.name, DEVICE_NAME_SIZE, + "SMBus nForce2 adapter at %04x", smbus->base); + + error = i2c_add_adapter(&smbus->adapter); + if (error) { + dev_err(&smbus->adapter.dev, "Failed to register adapter.\n"); + release_region(smbus->base, smbus->size); + return -1; + } + dev_info(&smbus->adapter.dev, "nForce2 SMBus adapter at %#x\n", smbus->base); + return 0; +} + + +static int __devinit nforce2_probe(struct pci_dev *dev, const struct pci_device_id *id) +{ + struct nforce2_smbus *smbuses; + int res1, res2; + + /* we support 2 SMBus adapters */ + if (!(smbuses = (void *)kmalloc(2*sizeof(struct nforce2_smbus), + GFP_KERNEL))) + return -ENOMEM; + memset (smbuses, 0, 2*sizeof(struct nforce2_smbus)); + pci_set_drvdata(dev, smbuses); + + /* SMBus adapter 1 */ + res1 = nforce2_probe_smb (dev, NFORCE_PCI_SMB1, &smbuses[0], "SMB1"); + if (res1 < 0) { + dev_err(&dev->dev, "Error probing SMB1.\n"); + smbuses[0].base = 0; /* to have a check value */ + } + res2 = nforce2_probe_smb (dev, NFORCE_PCI_SMB2, &smbuses[1], "SMB2"); + if (res2 < 0) { + dev_err(&dev->dev, "Error probing SMB2.\n"); + smbuses[1].base = 0; /* to have a check value */ + } + if ((res1 < 0) && (res2 < 0)) { + /* we did not find even one of the SMBuses, so we give up */ + kfree(smbuses); + return -ENODEV; + } + + return 0; +} + + +static void __devexit nforce2_remove(struct pci_dev *dev) +{ + struct nforce2_smbus *smbuses = (void*) pci_get_drvdata(dev); + + if (smbuses[0].base) { + i2c_del_adapter(&smbuses[0].adapter); + release_region(smbuses[0].base, smbuses[0].size); + } + if (smbuses[1].base) { + i2c_del_adapter(&smbuses[1].adapter); + release_region(smbuses[1].base, smbuses[1].size); + } + kfree(smbuses); +} + +static struct pci_driver nforce2_driver = { + .name = "nForce2 SMBus", + .id_table = nforce2_ids, + .probe = nforce2_probe, + .remove = __devexit_p(nforce2_remove), +}; + +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); +} + +static void __exit nforce2_exit(void) +{ + pci_unregister_driver(&nforce2_driver); +} + +module_init(nforce2_init); +module_exit(nforce2_exit); + ^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: [PATCH] i2c driver changes 2.6.0-test1 2003-07-19 15:54 ` Greg KH @ 2003-07-19 15:54 ` Greg KH 2003-07-19 15:54 ` Greg KH 2003-07-23 17:43 ` Marcelo Penna Guerra 0 siblings, 2 replies; 9+ messages in thread From: Greg KH @ 2003-07-19 15:54 UTC (permalink / raw) To: linux-kernel, sensors ChangeSet 1.1527, 2003/07/18 23:32:43-07:00, greg@kroah.com [PATCH] I2C: minor cleanups to the i2c-nforce2 driver. drivers/i2c/busses/i2c-nforce2.c | 24 +++--------------------- 1 files changed, 3 insertions(+), 21 deletions(-) diff -Nru a/drivers/i2c/busses/i2c-nforce2.c b/drivers/i2c/busses/i2c-nforce2.c --- a/drivers/i2c/busses/i2c-nforce2.c Sat Jul 19 08:48:02 2003 +++ b/drivers/i2c/busses/i2c-nforce2.c Sat Jul 19 08:48:02 2003 @@ -43,14 +43,10 @@ #include <linux/delay.h> #include <asm/io.h> -#ifdef MODULE_LICENSE MODULE_LICENSE("GPL"); -#endif MODULE_AUTHOR ("Hans-Frieder Vogt <hfvogt@arcor.de>"); 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); } ^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: [PATCH] i2c driver changes 2.6.0-test1 2003-07-19 15:54 ` Greg KH @ 2003-07-19 15:54 ` Greg KH 2003-07-23 17:43 ` Marcelo Penna Guerra 1 sibling, 0 replies; 9+ messages in thread From: Greg KH @ 2003-07-19 15:54 UTC (permalink / raw) To: linux-kernel, sensors ChangeSet 1.1528, 2003/07/19 08:41:08-07:00, greg@kroah.com [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(-) diff -Nru a/drivers/i2c/busses/i2c-ali1535.c b/drivers/i2c/busses/i2c-ali1535.c --- a/drivers/i2c/busses/i2c-ali1535.c Sat Jul 19 08:47:51 2003 +++ b/drivers/i2c/busses/i2c-ali1535.c Sat Jul 19 08:47:51 2003 @@ -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) diff -Nru a/drivers/i2c/busses/i2c-ali15x3.c b/drivers/i2c/busses/i2c-ali15x3.c --- a/drivers/i2c/busses/i2c-ali15x3.c Sat Jul 19 08:47:51 2003 +++ b/drivers/i2c/busses/i2c-ali15x3.c Sat Jul 19 08:47:51 2003 @@ -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) { diff -Nru a/drivers/i2c/busses/i2c-amd756.c b/drivers/i2c/busses/i2c-amd756.c --- a/drivers/i2c/busses/i2c-amd756.c Sat Jul 19 08:47:51 2003 +++ b/drivers/i2c/busses/i2c-amd756.c Sat Jul 19 08:47:51 2003 @@ -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; } diff -Nru a/drivers/i2c/busses/i2c-amd8111.c b/drivers/i2c/busses/i2c-amd8111.c --- a/drivers/i2c/busses/i2c-amd8111.c Sat Jul 19 08:47:51 2003 +++ b/drivers/i2c/busses/i2c-amd8111.c Sat Jul 19 08:47:51 2003 @@ -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); } diff -Nru a/drivers/i2c/busses/i2c-i801.c b/drivers/i2c/busses/i2c-i801.c --- a/drivers/i2c/busses/i2c-i801.c Sat Jul 19 08:47:51 2003 +++ b/drivers/i2c/busses/i2c-i801.c Sat Jul 19 08:47:51 2003 @@ -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)); diff -Nru a/drivers/i2c/busses/i2c-piix4.c b/drivers/i2c/busses/i2c-piix4.c --- a/drivers/i2c/busses/i2c-piix4.c Sat Jul 19 08:47:51 2003 +++ b/drivers/i2c/busses/i2c-piix4.c Sat Jul 19 08:47:51 2003 @@ -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)); diff -Nru a/drivers/i2c/busses/i2c-sis96x.c b/drivers/i2c/busses/i2c-sis96x.c --- a/drivers/i2c/busses/i2c-sis96x.c Sat Jul 19 08:47:51 2003 +++ b/drivers/i2c/busses/i2c-sis96x.c Sat Jul 19 08:47:51 2003 @@ -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)); diff -Nru a/drivers/i2c/busses/i2c-viapro.c b/drivers/i2c/busses/i2c-viapro.c --- a/drivers/i2c/busses/i2c-viapro.c Sat Jul 19 08:47:51 2003 +++ b/drivers/i2c/busses/i2c-viapro.c Sat Jul 19 08:47:51 2003 @@ -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)); diff -Nru a/include/linux/i2c.h b/include/linux/i2c.h --- a/include/linux/i2c.h Sat Jul 19 08:47:51 2003 +++ b/include/linux/i2c.h Sat Jul 19 08:47:51 2003 @@ -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 */ ^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: [PATCH] i2c driver changes 2.6.0-test1 2003-07-19 15:54 ` Greg KH 2003-07-19 15:54 ` Greg KH @ 2003-07-23 17:43 ` Marcelo Penna Guerra 2003-07-24 13:27 ` Greg KH 1 sibling, 1 reply; 9+ messages in thread From: Marcelo Penna Guerra @ 2003-07-23 17:43 UTC (permalink / raw) To: Greg KH, linux-kernel, sensors [-- Attachment #1: Type: text/plain, Size: 810 bytes --] 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. On Saturday 19 July 2003 12:54, Greg KH wrote: > + 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. > 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 [-- Attachment #2: i2c-nforce2.diff --] [-- Type: text/x-diff, Size: 2087 bytes --] 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 --- linux-2.6.0-test1/drivers/i2c/busses/i2c-nforce2.c 2003-07-23 09:49:38.093802760 -0300 +++ linux-2.6.0-test1.new/drivers/i2c/busses/i2c-nforce2.c 2003-07-23 09:58:07.000000000 -0300 @@ -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); diff -Naur linux-2.6.0-test1/include/linux/pci_ids.h linux-2.6.0-test1.new/include/linux/pci_ids.h --- linux-2.6.0-test1/include/linux/pci_ids.h 2003-07-23 10:04:27.268627640 -0300 +++ linux-2.6.0-test1.new/include/linux/pci_ids.h 2003-07-23 09:52:12.000000000 -0300 @@ -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 ^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: [PATCH] i2c driver changes 2.6.0-test1 2003-07-23 17:43 ` Marcelo Penna Guerra @ 2003-07-24 13:27 ` Greg KH 0 siblings, 0 replies; 9+ messages in thread From: Greg KH @ 2003-07-24 13:27 UTC (permalink / raw) To: Marcelo Penna Guerra; +Cc: linux-kernel, sensors On Wed, Jul 23, 2003 at 02:43:55PM -0300, Marcelo Penna Guerra wrote: > 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. > > On Saturday 19 July 2003 12:54, Greg KH wrote: > > > + 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. > > > 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. 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 ^ permalink raw reply [flat|nested] 9+ messages in thread
end of thread, other threads:[~2003-07-24 13:18 UTC | newest] Thread overview: 9+ messages (download: mbox.gz / follow: Atom feed) -- links below jump to the message on this page -- 2003-07-19 15:52 [BK PATCH] i2c driver changes for 2.6.0-test1 Greg KH 2003-07-19 15:54 ` [PATCH] i2c driver changes 2.6.0-test1 Greg KH 2003-07-19 15:54 ` Greg KH 2003-07-19 15:54 ` Greg KH 2003-07-19 15:54 ` Greg KH 2003-07-19 15:54 ` Greg KH 2003-07-19 15:54 ` Greg KH 2003-07-23 17:43 ` Marcelo Penna Guerra 2003-07-24 13:27 ` Greg KH
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox; as well as URLs for NNTP newsgroup(s).