diff options
Diffstat (limited to 'drivers/i2c/i2c-elektor.c')
-rw-r--r-- | drivers/i2c/i2c-elektor.c | 213 |
1 files changed, 90 insertions, 123 deletions
diff --git a/drivers/i2c/i2c-elektor.c b/drivers/i2c/i2c-elektor.c index fb965df0f..ad7b9d41c 100644 --- a/drivers/i2c/i2c-elektor.c +++ b/drivers/i2c/i2c-elektor.c @@ -22,7 +22,7 @@ /* With some changes from Kyösti Mälkki <kmalkki@cc.hut.fi> and even Frodo Looijaard <frodol@dds.nl> */ -/* $Id: i2c-elektor.c,v 1.13 1999/12/21 23:45:58 frodo Exp $ */ +/* $Id: i2c-elektor.c,v 1.16 2000/01/24 02:06:33 mds Exp $ */ #include <linux/kernel.h> #include <linux/ioport.h> @@ -30,24 +30,10 @@ #include <linux/delay.h> #include <linux/malloc.h> #include <linux/version.h> -#if LINUX_VERSION_CODE >= 0x020135 #include <linux/init.h> -#else -#define __init -#endif #include <asm/irq.h> #include <asm/io.h> -/* 2.0.0 kernel compatibility */ -#if LINUX_VERSION_CODE < 0x020100 -#define MODULE_AUTHOR(noone) -#define MODULE_DESCRIPTION(none) -#define MODULE_PARM(no,param) -#define MODULE_PARM_DESC(no,description) -#define EXPORT_SYMBOL(noexport) -#define EXPORT_NO_SYMBOLS -#endif - #include <linux/i2c.h> #include <linux/i2c-algo-pcf.h> #include <linux/i2c-elektor.h> @@ -87,56 +73,48 @@ static int pcf_pending; static void pcf_isa_setbyte(void *data, int ctl, int val) { - if (ctl) { - if (gpi.pi_irq > 0) { - DEB3(printk("i2c-elektor.o: Write control 0x%x\n", val|I2C_PCF_ENI)); - outb(val | I2C_PCF_ENI, CTRL); - } else { - DEB3(printk("i2c-elektor.o: Write control 0x%x\n", val)); - outb(val, CTRL); - } - } else { - DEB3(printk("i2c-elektor.o: Write data 0x%x\n", val)); - outb(val, DATA); - } + if (ctl) { + if (gpi.pi_irq > 0) { + DEB3(printk("i2c-elektor.o: Write control 0x%x\n", + val|I2C_PCF_ENI)); + outb(val | I2C_PCF_ENI, CTRL); + } else { + DEB3(printk("i2c-elektor.o: Write control 0x%x\n", val)); + outb(val, CTRL); + } + } else { + DEB3(printk("i2c-elektor.o: Write data 0x%x\n", val)); + outb(val, DATA); + } } static int pcf_isa_getbyte(void *data, int ctl) { - int val; - - if (ctl) { - val = inb(CTRL); - DEB3(printk("i2c-elektor.o: Read control 0x%x\n", val)); - } else { - val = inb(DATA); - DEB3(printk("i2c-elektor.o: Read data 0x%x\n", val)); - } - return (val); + int val; + + if (ctl) { + val = inb(CTRL); + DEB3(printk("i2c-elektor.o: Read control 0x%x\n", val)); + } else { + val = inb(DATA); + DEB3(printk("i2c-elektor.o: Read data 0x%x\n", val)); + } + return (val); } static int pcf_isa_getown(void *data) { - return (gpi.pi_own); + return (gpi.pi_own); } static int pcf_isa_getclock(void *data) { - return (gpi.pi_clock); + return (gpi.pi_clock); } -#if LINUX_VERSION_CODE < 0x02017f -static void schedule_timeout(int j) -{ - current->state = TASK_INTERRUPTIBLE; - current->timeout = jiffies + j; - schedule(); -} -#endif - #if 0 static void pcf_isa_sleep(unsigned long timeout) { @@ -147,64 +125,53 @@ static void pcf_isa_sleep(unsigned long timeout) static void pcf_isa_waitforpin(void) { - int timeout = 2; - - if (gpi.pi_irq > 0) { - cli(); - if (pcf_pending == 0) { -#if LINUX_VERSION_CODE < 0x02017f - current->timeout = jiffies + timeout * HZ; - interruptible_sleep_on(&pcf_wait); -#else - interruptible_sleep_on_timeout(&pcf_wait, timeout*HZ ); -#endif - } - else - pcf_pending = 0; - sti(); -#if LINUX_VERSION_CODE < 0x02017f - current->timeout = 0; -#endif - } - else { - udelay(100); - } + int timeout = 2; + + if (gpi.pi_irq > 0) { + cli(); + if (pcf_pending == 0) { + interruptible_sleep_on_timeout(&pcf_wait, timeout*HZ ); + } else + pcf_pending = 0; + sti(); + } else { + udelay(100); + } } static void pcf_isa_handler(int this_irq, void *dev_id, struct pt_regs *regs) { - - pcf_pending = 1; - wake_up_interruptible(&pcf_wait); + pcf_pending = 1; + wake_up_interruptible(&pcf_wait); } static int pcf_isa_init(void) { - if (check_region(gpi.pi_base, 2) < 0 ) { - return -ENODEV; - } else { - request_region(gpi.pi_base, 2, "i2c (isa bus adapter)"); - } - if (gpi.pi_irq > 0) { - if (request_irq(gpi.pi_irq, pcf_isa_handler, 0, "PCF8584", 0) < 0) { - printk("i2c-elektor.o: Request irq%d failed\n", gpi.pi_irq); - gpi.pi_irq = 0; - } - else - enable_irq(gpi.pi_irq); - } - return 0; + if (check_region(gpi.pi_base, 2) < 0 ) { + return -ENODEV; + } else { + request_region(gpi.pi_base, 2, "i2c (isa bus adapter)"); + } + if (gpi.pi_irq > 0) { + if (request_irq(gpi.pi_irq, pcf_isa_handler, 0, "PCF8584", 0) + < 0) { + printk("i2c-elektor.o: Request irq%d failed\n", gpi.pi_irq); + gpi.pi_irq = 0; + } else + enable_irq(gpi.pi_irq); + } + return 0; } static void pcf_isa_exit(void) { - if (gpi.pi_irq > 0) { - disable_irq(gpi.pi_irq); - free_irq(gpi.pi_irq, 0); - } - release_region(gpi.pi_base , 2); + if (gpi.pi_irq > 0) { + disable_irq(gpi.pi_irq); + free_irq(gpi.pi_irq, 0); + } + release_region(gpi.pi_base , 2); } @@ -222,14 +189,14 @@ static int pcf_isa_unreg(struct i2c_client *client) static void pcf_isa_inc_use(struct i2c_adapter *adap) { #ifdef MODULE - MOD_INC_USE_COUNT; + MOD_INC_USE_COUNT; #endif } static void pcf_isa_dec_use(struct i2c_adapter *adap) { #ifdef MODULE - MOD_DEC_USE_COUNT; + MOD_DEC_USE_COUNT; #endif } @@ -262,41 +229,41 @@ static struct i2c_adapter pcf_isa_ops = { int __init i2c_pcfisa_init(void) { - struct i2c_pcf_isa *pisa = &gpi; + struct i2c_pcf_isa *pisa = &gpi; - printk("i2c-elektor.o: i2c pcf8584-isa adapter module\n"); - if (base == 0) - pisa->pi_base = DEFAULT_BASE; - else - pisa->pi_base = base; + printk("i2c-elektor.o: i2c pcf8584-isa adapter module\n"); + if (base == 0) + pisa->pi_base = DEFAULT_BASE; + else + pisa->pi_base = base; - if (irq == 0) - pisa->pi_irq = DEFAULT_IRQ; - else - pisa->pi_irq = irq; + if (irq == 0) + pisa->pi_irq = DEFAULT_IRQ; + else + pisa->pi_irq = irq; - if (clock == 0) - pisa->pi_clock = DEFAULT_CLOCK; - else - pisa->pi_clock = clock; + if (clock == 0) + pisa->pi_clock = DEFAULT_CLOCK; + else + pisa->pi_clock = clock; - if (own == 0) - pisa->pi_own = DEFAULT_OWN; - else - pisa->pi_own = own; + if (own == 0) + pisa->pi_own = DEFAULT_OWN; + else + pisa->pi_own = own; - pcf_isa_data.data = (void *)pisa; + pcf_isa_data.data = (void *)pisa; #if (LINUX_VERSION_CODE >= 0x020301) - init_waitqueue_head(&pcf_wait); + init_waitqueue_head(&pcf_wait); #endif - if (pcf_isa_init() == 0) { - if (i2c_pcf_add_bus(&pcf_isa_ops) < 0) - return -ENODEV; - } else { - return -ENODEV; - } - printk("i2c-elektor.o: found device at %#x.\n", pisa->pi_base); - return 0; + if (pcf_isa_init() == 0) { + if (i2c_pcf_add_bus(&pcf_isa_ops) < 0) + return -ENODEV; + } else { + return -ENODEV; + } + printk("i2c-elektor.o: found device at %#x.\n", pisa->pi_base); + return 0; } @@ -313,7 +280,7 @@ MODULE_PARM(own, "i"); int init_module(void) { - return i2c_pcfisa_init(); + return i2c_pcfisa_init(); } void cleanup_module(void) |