diff --git a/i2c/MODIFICATIONS b/i2c/MODIFICATIONS index 2a065232..62d89cae 100644 --- a/i2c/MODIFICATIONS +++ b/i2c/MODIFICATIONS @@ -7,6 +7,8 @@ of the i2c code and not compile the version in here. be applied! If there are changes like this in this list, you *must* use our version of the i2c module! +The current version of Simon's code is called mod-19990118.tar.gz. + Here come the changes: * EXPORT_SYMBOL declarations put between #ifdef statements @@ -15,14 +17,6 @@ Here come the changes: influence on the resulting object code; a few more functions may be exported, but this should do no harm. -* bit-mb.c: Linux 2.0.x fixes - Some small changes to make this file compile with 2.0 kernels. These - changes will probably be included in the next i2c version. - -* algo-bit.c, i2c-core.c: Debugging level turned down - The transfer functions are now on debug level 2, to keep the noise within - acceptable limits. - * New file: Module.mk The Makefile fragment we use to compile the files in this directory. @@ -32,16 +26,3 @@ Here come the changes: * Removed files: object files and executables Everywhere, remakeable files are removed, to keep the source distribution small and lean. - -! i2c-core.c: i2c_del_adapter() change - Replaced - i2c_detach_client(client); - with: - client->driver->detach_client(client); - -! i2c-core.c, i2c-core.h: function i2c_adapter_id added - We needed a function that would return a low, unique identifier for each - adapter. Putting it anywhere else would have created new, unneeded - module dependencies. - -! bit-mb.c: removed spurious semicolon diff --git a/i2c/Makefile b/i2c/Makefile index ed1a7663..0433d056 100644 --- a/i2c/Makefile +++ b/i2c/Makefile @@ -11,7 +11,7 @@ MOD_SUB_DIRS = drivers #MX_OBJS = i2c-core.o algo-bit.o i2c-dev.o bit-lp.o bit-velle.o algo-pcf.o MX_OBJS = i2c-core.o algo-bit.o i2c-dev.o -M_OBJS = bit-lp.o bit-velle.o bit-mb.o +M_OBJS = bit-lp.o bit-velle.o bit-via.o EXTRA_CFLAGS = -Wno-unused here: diff --git a/i2c/Module.mk b/i2c/Module.mk index ad07a622..5aeb41fe 100644 --- a/i2c/Module.mk +++ b/i2c/Module.mk @@ -24,7 +24,7 @@ MODULE_DIR := i2c # defined value verbatim into the command-list of rules... I2CTARGETS := $(MODULE_DIR)/i2c-core.o $(MODULE_DIR)/algo-bit.o \ $(MODULE_DIR)/bit-lp.o \ - $(MODULE_DIR)/bit-velle.o $(MODULE_DIR)/bit-mb.o + $(MODULE_DIR)/bit-velle.o $(MODULE_DIR)/bit-via.o I2CADDTARGETS := $(MODULE_DIR)/i2c-dev.o I2CHEADERFILES := $(MODULE_DIR)/i2c.h diff --git a/i2c/README b/i2c/README index b87e646a..bf71bd39 100644 --- a/i2c/README +++ b/i2c/README @@ -13,6 +13,11 @@ Currently, the following modules are running in the new mode: The other modules, esp. algo-pcf.c still need to be converted. For the hw specific mods, this should be relatively easy & quick. +* +* NOTE: The algo-pcf part is currently in the works, thanks to Hans Berglund +* (hb@mailhost.spacetec.no). +* + A simple driver example is in drivers -- a piece of code to access EEPROMs. Simon (simon@tk.uni-linz.ac.at) diff --git a/i2c/README.bitmb b/i2c/README.bit-via similarity index 100% rename from i2c/README.bitmb rename to i2c/README.bit-via diff --git a/i2c/algo-bit.c b/i2c/algo-bit.c index b05cd325..1f04dae7 100644 --- a/i2c/algo-bit.c +++ b/i2c/algo-bit.c @@ -17,7 +17,7 @@ along with this program; if not, write to the Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ /* ------------------------------------------------------------------------- */ -static char alg_rcsid[] = "$Id: algo-bit.c,v 1.7 1998/09/28 06:45:38 i2c Exp i2c $"; +static char alg_rcsid[] = "$Id: algo-bit.c,v 1.8 1998/12/30 08:36:08 i2c Exp i2c $"; #include #include @@ -70,7 +70,7 @@ static char alg_rcsid[] = "$Id: algo-bit.c,v 1.7 1998/09/28 06:45:38 i2c Exp i2c /* module parameters: */ -int i2c_debug=0; +int i2c_debug=1; int bit_test=0; /* see if the line-setting functions work */ int bit_scan=0; /* have a look at what's hanging 'round */ @@ -639,10 +639,8 @@ MODULE_PARM_DESC(bit_scan, "Scan for active chips on the bus"); MODULE_PARM_DESC(i2c_debug,"debug level - 0 off; 1 normal; 2,3 more verbose; 9 bit-protocol"); -#ifndef LM_SENSORS EXPORT_SYMBOL(i2c_bit_add_bus); EXPORT_SYMBOL(i2c_bit_del_bus); -#endif int init_module(void) diff --git a/i2c/bit-lp.c b/i2c/bit-lp.c index 8ecb62b3..985bf21b 100644 --- a/i2c/bit-lp.c +++ b/i2c/bit-lp.c @@ -17,7 +17,7 @@ along with this program; if not, write to the Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ /* ------------------------------------------------------------------------- */ -static char rcsid[] = "$Id: bit-lp.c,v 1.5 1998/09/28 06:45:38 i2c Exp i2c $"; +static char rcsid[] = "$Id: bit-lp.c,v 1.6 1998/12/30 08:36:08 i2c Exp i2c $"; /* ------------------------------------------------------------------------- */ #include @@ -151,9 +151,7 @@ MODULE_DESCRIPTION("I2C-Bus adapter routines for Philips parallel port adapter") MODULE_PARM(base, "i"); -#ifndef LM_SENSORS EXPORT_NO_SYMBOLS; -#endif int init_module(void) { diff --git a/i2c/bit-velle.c b/i2c/bit-velle.c index ffababcb..6c8a2b47 100644 --- a/i2c/bit-velle.c +++ b/i2c/bit-velle.c @@ -17,9 +17,12 @@ along with this program; if not, write to the Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ /* ------------------------------------------------------------------------- */ -static char rcsid[] = "$Id: bit-velle.c,v 1.3 1998/09/15 18:50:04 i2c Exp $"; +static char rcsid[] = "$Id: bit-velle.c,v 1.4 1998/12/30 08:36:08 i2c Exp i2c $"; /* * $Log: bit-velle.c,v $ + * Revision 1.4 1998/12/30 08:36:08 i2c + * *** empty log message *** + * * Revision 1.3 1998/09/15 18:50:04 i2c * *** empty log message *** * diff --git a/i2c/bit-mb.c b/i2c/bit-via.c similarity index 100% rename from i2c/bit-mb.c rename to i2c/bit-via.c diff --git a/i2c/hw-monitor.c b/i2c/hw-monitor.c deleted file mode 100644 index 8ff86ef7..00000000 --- a/i2c/hw-monitor.c +++ /dev/null @@ -1,182 +0,0 @@ - /* - EISCA Fan SMBus (or i2c) driver - Based on various char-device sources. - - Copyright (c) 1998 Kyösti Mälkki - - 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. - */ - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include "i2c.h" -#include "algo-bit.h" - -/* Fan defines */ -#define I2C_GL518SM 0x2d /* 7-bit i2c slave address */ -#define REGMASK 0x1f -#define PROCNAME "temperature" - -/* i2c */ -static struct i2c_driver driver; -static struct i2c_client client_template; -static struct i2c_client *client = &client_template; - -/* ---------------------------------------------------------------------- */ - -static unsigned int gl_sysmon_read(int reg, int count) -{ - struct i2c_msg msgs[2]; - char write[1]={0}; - char read[2]={0,0}; - int ret; - unsigned int val; - - msgs[0].addr = msgs[1].addr = client->addr; - msgs[0].flags = msgs[1].flags = - (client->flags & (I2C_M_TEN|I2C_M_TENMASK)); - - msgs[0].len = 1; - msgs[0].buf = write; - write[0] = reg & REGMASK; - - msgs[1].flags |= I2C_M_RD; - msgs[1].len = count; - msgs[1].buf = read; - - ret = i2c_transfer(client->adapter, msgs, 2); - - if ( 2 != ret ) return ret; - if (count==1) - val = read[0] & 0xff; - else - val = ( (read[0]<<8)|(read[1] & 0xff) ) & 0xffff; - - return val; -} - -static int gl_sysmon_write(int reg, unsigned int val, int count) -{ - unsigned char buffer[5]; - - buffer[0] = reg & REGMASK; - if (count==2) { - buffer[1] = (val >> 8) & 0xff; - buffer[2] = val & 0xff; - count = 3; - } else { - buffer[1] = val & 0xff; - count = 2; - } - - if (count != i2c_master_send(client, buffer, count)) - return -1; - return 0; -} - -static int gl_sysmon_info(char *buf, char **start, off_t fpos, int length, int dummy) -{ - char * p=buf; - int i; - unsigned int regs[32]; - - for (i=0; i<32; i++) { - regs[i] = 0; - regs[i] = gl_sysmon_read(i, (i>6 && i<13) ? 2 : 1); - } - - p += sprintf(buf, "CPU temperature %d Celsius\n", (regs[4]-119)); - - return p - buf; -} - -/* ----------------------------------------------------------------------- */ - -static struct proc_dir_entry *ent; - -static int gl_sysmon_attach(struct i2c_adapter *adap) -{ - client->adapter = adap; - - i2c_attach_client(client); - gl_sysmon_write(3, 64, 1); - - ent = create_proc_entry(PROCNAME, 0, 0); - ent->get_info = gl_sysmon_info; - - printk("EISCA Fan connected\n"); - return 0; -} - -static int gl_sysmon_detach(struct i2c_client *client) -{ - gl_sysmon_write(3, 128, 1); - i2c_detach_client(client); - remove_proc_entry(PROCNAME, 0); - - printk("EISCA Fan disconnected\n"); - return 0; -} - -static int -gl_sysmon_command(struct i2c_client *client, unsigned int cmd, void *arg) -{ - return -1; -} - -/* ----------------------------------------------------------------------- */ - -static struct i2c_driver driver = { - "GL518SM", - -1, - DF_NOTIFY, - gl_sysmon_attach, - gl_sysmon_detach, - gl_sysmon_command, -}; - -static struct i2c_client client_template = { - "EISCA Cooler", - I2C_DRIVERID_GL518SM, - 0, - I2C_GL518SM, - NULL, - &driver -}; - -#ifdef MODULE -MODULE_AUTHOR("Kyosti Malkki "); -MODULE_DESCRIPTION("i2c driver for GL518SM"); - -int init_module(void) -{ - i2c_add_driver(&driver); - return 0; -} - -void cleanup_module(void) -{ - i2c_del_driver(&driver); -} -#endif diff --git a/i2c/i2c-core.c b/i2c/i2c-core.c index 68e6397b..25e9e075 100644 --- a/i2c/i2c-core.c +++ b/i2c/i2c-core.c @@ -17,7 +17,7 @@ along with this program; if not, write to the Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ /* ------------------------------------------------------------------------- */ -#define RCSID "$Id: i2c.c,v 1.7 1998/09/28 06:45:38 i2c Exp i2c $" +#define RCSID "$Id: i2c-core.c,v 1.1 1998/12/30 08:36:08 i2c Exp i2c $" /* ------------------------------------------------------------------------- */ #include @@ -30,8 +30,8 @@ /* ----- global defines ---------------------------------------------------- */ /* exclusive access to the bus */ -/*#define SPINLOCK*/ -#ifdef SPINLOCK +/*#define I2C_SPINLOCK*/ +#ifdef I2C_SPINLOCK #define I2C_LOCK(adap) spin_lock_irqsave(&adap->lock,adap->lockflags) #define I2C_UNLOCK(adap) spin_unlock_irqrestore(&adap->lock,adap->lockflags) #else @@ -135,7 +135,7 @@ int i2c_add_adapter(struct i2c_adapter *adap) adap_count++; /* init data types */ -#ifdef SPINLOCK +#ifdef I2C_SPINLOCK adap->lock = (spinlock_t)SPIN_LOCK_UNLOCKED; #else adap->lock = MUTEX; @@ -173,8 +173,8 @@ int i2c_del_adapter(struct i2c_adapter *adap) * flag, as _all_ clients that reside on the adapter * must be deleted, as this would cause invalid states. */ - /* i2c_detach_client(client); */ client->driver->detach_client(client); + /* i2c_detach_client(client); --- frodo */ } /* all done, now unregister */ adapters[i] = NULL; @@ -336,7 +336,7 @@ int i2c_transfer(struct i2c_adapter * adap, struct i2c_msg msgs[],int num) { int ret; - DEB2(printk("master_xfer: %s with %d msgs.\n",adap->name,num)); + DEB(printk("master_xfer: %s with %d msgs.\n",adap->name,num)); I2C_LOCK(adap); ret = adap->algo->master_xfer(adap,msgs,num); @@ -355,7 +355,7 @@ int i2c_master_send(struct i2c_client *client,const char *buf ,int count) msg.len = count; (const char *)msg.buf = buf; - DEB2(printk("master_send: writing %d bytes on %s.\n", + DEB(printk("master_send: writing %d bytes on %s.\n", count,client->adapter->name)); I2C_LOCK(adap); @@ -379,7 +379,7 @@ int i2c_master_recv(struct i2c_client *client, char *buf ,int count) msg.len = count; msg.buf = buf; - DEB2(printk("master_recv: reading %d bytes on %s.\n", + DEB(printk("master_recv: reading %d bytes on %s.\n", count,client->adapter->name)); I2C_LOCK(adap); @@ -435,7 +435,9 @@ int i2c_probe(struct i2c_client *client, int low_addr, int hi_addr) I2C_UNLOCK(client->adapter); return (i <= hi_addr) ? i : -1; } - +/* +++ frodo + * return id number for a specific adapter + */ int i2c_adapter_id(struct i2c_adapter *adap) { int i; @@ -445,15 +447,12 @@ int i2c_adapter_id(struct i2c_adapter *adap) return -1; } - - #ifdef MODULE MODULE_AUTHOR("Simon G. Vogl "); MODULE_DESCRIPTION("I2C-Bus main module"); MODULE_PARM(i2c_debug, "i"); MODULE_PARM_DESC(i2c_debug,"debug level"); -#ifndef LM_SENSORS EXPORT_SYMBOL(i2c_add_algorithm); EXPORT_SYMBOL(i2c_del_algorithm); EXPORT_SYMBOL(i2c_add_adapter); @@ -467,7 +466,6 @@ EXPORT_SYMBOL(i2c_master_send); EXPORT_SYMBOL(i2c_master_recv); EXPORT_SYMBOL(i2c_control); EXPORT_SYMBOL(i2c_transfer); -#endif int init_module(void) diff --git a/i2c/i2c-dev.c b/i2c/i2c-dev.c index 8b7c3348..5a3adc6f 100644 --- a/i2c/i2c-dev.c +++ b/i2c/i2c-dev.c @@ -17,7 +17,7 @@ along with this program; if not, write to the Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ /* ------------------------------------------------------------------------- */ -#define RCSID "$Id: i2c-dev.c,v 1.6 1998/09/28 06:45:38 i2c Exp i2c $" +#define RCSID "$Id: i2c-dev.c,v 1.7 1998/12/30 08:36:08 i2c Exp i2c $" /* ------------------------------------------------------------------------- */ #include @@ -183,7 +183,7 @@ int i2c_read (struct inode *inode, struct file *file, char *buf, int count) #else memcpy_tofs(buf,tmp,count); #endif - + kfree(tmp); return ret; } @@ -337,9 +337,7 @@ struct i2c_driver driver = { MODULE_AUTHOR("Simon G. Vogl "); MODULE_DESCRIPTION("I2C-Bus character device interface"); -#ifndef LM_SENSORS EXPORT_NO_SYMBOLS; -#endif int init_module(void) { diff --git a/i2c/i2c.h b/i2c/i2c.h index 65a33259..f656e975 100644 --- a/i2c/i2c.h +++ b/i2c/i2c.h @@ -25,9 +25,9 @@ #ifdef __KERNEL__ /* define spinlock to use spinlocks for sync., else use semaphores*/ -/*#define SPINLOCK*/ +/*#define I2C_SPINLOCK*/ -#ifdef SPINLOCK +#ifdef I2C_SPINLOCK #include /* for spinlock_t */ #else #include @@ -194,7 +194,7 @@ struct i2c_adapter { /* and can be set via the i2c_ioctl call */ /* data fields that are valid for all devices */ -#ifdef SPINLOCK +#ifdef I2C_SPINLOCK spinlock_t lock;/* used to access the adapter exclusively */ unsigned long lockflags; #else @@ -215,17 +215,6 @@ struct i2c_adapter { #define DF_NOTIFY 0x01 /* notify on bus (de/a)ttaches */ -#if 0 /* deprecate! */ -/*flags for the client struct: - */ -#define CF_TEN 0x100000 /* we have a ten bit chip address */ -#define CF_TEN0 0x100000 /* herein lie the first 2 bits */ -#define CF_TEN1 0x110000 -#define CF_TEN2 0x120000 -#define CF_TEN3 0x130000 -#define TENMASK 0x130000 -#endif - /* ----- functions exported by i2c.o */ /* administration... @@ -253,9 +242,9 @@ extern int i2c_probe(struct i2c_client *client, int low_addr, int hi_addr); */ extern int i2c_control(struct i2c_client *,unsigned int, unsigned long); - /* This call returns a unique low identifier for each registered adapter, - or -1 if the adapter was not regisitered. */ + * or -1 if the adapter was not regisitered. + */ extern int i2c_adapter_id(struct i2c_adapter *adap); #endif /* __KERNEL__ */ @@ -304,7 +293,16 @@ extern int i2c_adapter_id(struct i2c_adapter *adap); #define I2C_DRIVERID_MSP3400 1 #define I2C_DRIVERID_TUNER 2 #define I2C_DRIVERID_VIDEOTEXT 3 -#define I2C_DRIVERID_GL518SM 4 +#define I2C_DRIVERID_GL518SM 4 /* hardware monitor cpu temp. */ +#define I2C_DRIVERID_TEA6420 5 /* audio matrix switch */ +#define I2C_DRIVERID_TEA6415 6 /* video matrix switch */ +#define I2C_DRIVERID_TDA9840 7 /* stereo sound processor */ +#define I2C_DRIVERID_SAA7111 8 /* video input processor */ + +#define I2C_DRIVERID_EXP0 0xF0 /* experimental use id's */ +#define I2C_DRIVERID_EXP1 0xF1 +#define I2C_DRIVERID_EXP2 0xF2 +#define I2C_DRIVERID_EXP3 0xF3 /* * ---- Adapter types ---------------------------------------------------- @@ -313,11 +311,13 @@ extern int i2c_adapter_id(struct i2c_adapter *adap); * interface types, as a PCF 8584 needs other care than a bit adapter. */ -#define ALGO_NONE 0x00000 -#define ALGO_BIT 0x10000 /* bit style adapters */ -#define ALGO_PCF 0x20000 /* PCF 8584 style adapters */ +#define ALGO_NONE 0x000000 +#define ALGO_BIT 0x010000 /* bit style adapters */ +#define ALGO_PCF 0x020000 /* PCF 8584 style adapters */ -#define ALGO_MASK 0xf0000 /* Mask for algorithms */ +#define ALGO_EXP 0x800000 /* experimental */ + +#define ALGO_MASK 0xff0000 /* Mask for algorithms */ #define ALGO_SHIFT 0x10 /* right shift to get index values */ #define I2C_HW_ADAPS 0x10000 /* number of different hw implements per*/ diff --git a/kernel/busses/i2c-isa.c b/kernel/busses/i2c-isa.c index 0bb32381..e9224910 100644 --- a/kernel/busses/i2c-isa.c +++ b/kernel/busses/i2c-isa.c @@ -28,7 +28,7 @@ #include #include "i2c.h" -#ifdef SPINLOCK +#ifdef I2C_SPINLOCK #include #else #include diff --git a/kernel/include/i2c-isa.h b/kernel/include/i2c-isa.h index 57af3e48..0fa4f1be 100644 --- a/kernel/include/i2c-isa.h +++ b/kernel/include/i2c-isa.h @@ -35,8 +35,8 @@ */ #include -/* SPINLOCK is defined in i2c.h. */ -#ifdef SPINLOCK +/* I2C_SPINLOCK is defined in i2c.h. */ +#ifdef I2C_SPINLOCK #include #else #include @@ -104,14 +104,14 @@ struct isa_algorithm { /* An adapter is a specifc instance of a bus: for each detected bus, there will be an adapter. Its operation is controlled by an algorithm. - SPINLOCK must be the same as declared in i2c.h. + I2C_SPINLOCK must be the same as declared in i2c.h. This structure is essentially the same as i2c_algorithm. */ struct isa_adapter { char name[32]; unsigned int id; struct isa_algorithm *algo; void *data; -#ifdef SPINLOCK +#ifdef I2C_SPINLOCK spinlock_t lock; unsigned long lockflags; #else diff --git a/kernel/include/smbus.h b/kernel/include/smbus.h index 077ed087..aee6d068 100644 --- a/kernel/include/smbus.h +++ b/kernel/include/smbus.h @@ -54,8 +54,8 @@ union smbus_data { #ifdef __KERNEL__ -/* SPINLOCK is defined in i2c.h. */ -#ifdef SPINLOCK +/* I2C_SPINLOCK is defined in i2c.h. */ +#ifdef I2C_SPINLOCK #include #else #include @@ -118,14 +118,14 @@ struct smbus_algorithm { /* An adapter is a specifc instance of a bus: for each detected bus, there will be an adapter. Its operation is controlled by an algorithm. - SPINLOCK must be the same as declared in i2c.h. + I2C_SPINLOCK must be the same as declared in i2c.h. This structure is an extension of i2c_algorithm. */ struct smbus_adapter { char name[32]; unsigned int id; struct smbus_algorithm *algo; void *data; -#ifdef SPINLOCK +#ifdef I2C_SPINLOCK spinlock_t lock; unsigned long lockflags; #else diff --git a/kernel/smbus.c b/kernel/smbus.c index d61c2e94..4c9a4b5a 100644 --- a/kernel/smbus.c +++ b/kernel/smbus.c @@ -23,7 +23,7 @@ #include #include "i2c.h" -#ifdef SPINLOCK +#ifdef I2C_SPINLOCK #include #else #include @@ -76,14 +76,14 @@ s32 smbus_access (struct i2c_adapter * adapter, u8 addr, char read_write, { int res; if ((adapter->id & ALGO_MASK) == ALGO_SMBUS) { -#ifdef SPINLOCK +#ifdef I2C_SPINLOCK spin_lock_irqsave(&adapter->lock,adapter->lockflags); #else down(&adapter->lock); #endif res = ((struct smbus_adapter *) adapter) -> smbus_access(addr,read_write,command,size,data); -#ifdef SPINLOCK +#ifdef I2C_SPINLOCK spin_unlock_irqrestore(&adapter->lock,adapter->lockflags); #else up(&adapter->lock); diff --git a/lib/Module.mk b/lib/Module.mk index c0463c9a..901afa46 100644 --- a/lib/Module.mk +++ b/lib/Module.mk @@ -88,5 +88,4 @@ clean-lib: $(RM) $(LIBTARGETS) $(LIBSHOBJECTS) $(LIBSTOBJECTS) $(RM) $(LIBSHOBJECTS:.lo=.ld) $(LIBSTOBJECTS:.ao=.ad) $(RM) $(LIBOTHEROBJECTS:.o=.c) $(LIBEXTRACLEAN) - $(RM) clean :: clean-lib