nfsd41: Create the recovery entry for the NFSv4.1 client
[safe/jmp/linux-2.6] / drivers / i2c / busses / i2c-pca-isa.c
index c420a7c..0ed68e2 100644 (file)
@@ -23,6 +23,7 @@
 #include <linux/module.h>
 #include <linux/moduleparam.h>
 #include <linux/delay.h>
+#include <linux/jiffies.h>
 #include <linux/init.h>
 #include <linux/interrupt.h>
 #include <linux/wait.h>
@@ -41,8 +42,9 @@ static int irq = -1;
 
 /* Data sheet recommends 59kHz for 100kHz operation due to variation
  * in the actual clock rate */
-static int clock  = I2C_PCA_CON_59kHz;
+static int clock  = 59000;
 
+static struct i2c_adapter pca_isa_ops;
 static wait_queue_head_t pca_wait;
 
 static void pca_isa_writebyte(void *pd, int reg, int val)
@@ -69,16 +71,22 @@ static int pca_isa_readbyte(void *pd, int reg)
 
 static int pca_isa_waitforcompletion(void *pd)
 {
-       int ret = 0;
+       long ret = ~0;
+       unsigned long timeout;
 
        if (irq > -1) {
-               ret = wait_event_interruptible(pca_wait,
-                                              pca_isa_readbyte(pd, I2C_PCA_CON) & I2C_PCA_CON_SI);
+               ret = wait_event_interruptible_timeout(pca_wait,
+                               pca_isa_readbyte(pd, I2C_PCA_CON)
+                               & I2C_PCA_CON_SI, pca_isa_ops.timeout);
        } else {
-               while ((pca_isa_readbyte(pd, I2C_PCA_CON) & I2C_PCA_CON_SI) == 0)
+               /* Do polling */
+               timeout = jiffies + pca_isa_ops.timeout;
+               while (((pca_isa_readbyte(pd, I2C_PCA_CON)
+                               & I2C_PCA_CON_SI) == 0)
+                               && (ret = time_before(jiffies, timeout)))
                        udelay(100);
        }
-       return ret;
+       return ret > 0;
 }
 
 static void pca_isa_resetchip(void *pd)
@@ -103,8 +111,8 @@ static struct i2c_algo_pca_data pca_isa_data = {
 static struct i2c_adapter pca_isa_ops = {
        .owner          = THIS_MODULE,
        .algo_data      = &pca_isa_data,
-       .name           = "PCA9564 ISA Adapter",
-       .timeout        = 100,
+       .name           = "PCA9564/PCA9665 ISA Adapter",
+       .timeout        = HZ,
 };
 
 static int __devinit pca_isa_match(struct device *dev, unsigned int id)
@@ -196,7 +204,7 @@ static void __exit pca_isa_exit(void)
 }
 
 MODULE_AUTHOR("Ian Campbell <icampbell@arcom.com>");
-MODULE_DESCRIPTION("ISA base PCA9564 driver");
+MODULE_DESCRIPTION("ISA base PCA9564/PCA9665 driver");
 MODULE_LICENSE("GPL");
 
 module_param(base, ulong, 0);
@@ -205,7 +213,13 @@ MODULE_PARM_DESC(base, "I/O base address");
 module_param(irq, int, 0);
 MODULE_PARM_DESC(irq, "IRQ");
 module_param(clock, int, 0);
-MODULE_PARM_DESC(clock, "Clock rate as described in table 1 of PCA9564 datasheet");
+MODULE_PARM_DESC(clock, "Clock rate in hertz.\n\t\t"
+               "For PCA9564: 330000,288000,217000,146000,"
+               "88000,59000,44000,36000\n"
+               "\t\tFor PCA9665:\tStandard: 60300 - 100099\n"
+               "\t\t\t\tFast: 100100 - 400099\n"
+               "\t\t\t\tFast+: 400100 - 10000099\n"
+               "\t\t\t\tTurbo: Up to 1265800");
 
 module_init(pca_isa_init);
 module_exit(pca_isa_exit);