summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--packages/linux/nas100d-kernel/2.6.14/60-nas100d-i2c.patch193
-rw-r--r--packages/linux/nas100d-kernel/2.6.14/defconfig10
2 files changed, 158 insertions, 45 deletions
diff --git a/packages/linux/nas100d-kernel/2.6.14/60-nas100d-i2c.patch b/packages/linux/nas100d-kernel/2.6.14/60-nas100d-i2c.patch
index 2587fc5803..e5b77b48de 100644
--- a/packages/linux/nas100d-kernel/2.6.14/60-nas100d-i2c.patch
+++ b/packages/linux/nas100d-kernel/2.6.14/60-nas100d-i2c.patch
@@ -1,9 +1,9 @@
- drivers/i2c/algos/i2c-algo-bit.c | 24 +++++++++++++++++++
- drivers/i2c/busses/i2c-ixp4xx.c | 47 ++++++++++++++++++++++++++++++++++++---
- 2 files changed, 67 insertions(+), 4 deletions(-)
+ drivers/i2c/algos/i2c-algo-bit.c | 77 +++++++++++++++++++--------------------
+ drivers/i2c/busses/i2c-ixp4xx.c | 46 +++++++++++++++++++++--
+ 2 files changed, 82 insertions(+), 41 deletions(-)
--- linux-nas100d.orig/drivers/i2c/busses/i2c-ixp4xx.c 2005-11-11 22:22:43.000000000 +0100
-+++ linux-nas100d/drivers/i2c/busses/i2c-ixp4xx.c 2005-11-14 17:06:04.000000000 +0100
++++ linux-nas100d/drivers/i2c/busses/i2c-ixp4xx.c 2005-11-15 00:41:39.000000000 +0100
@@ -47,16 +47,26 @@ static inline int ixp4xx_sda_pin(void *d
static void ixp4xx_bit_setscl(void *data, int val)
@@ -68,15 +68,14 @@
return sda;
}
-@@ -127,17 +158,27 @@ static int ixp4xx_i2c_probe(struct devic
+@@ -127,17 +158,26 @@ static int ixp4xx_i2c_probe(struct devic
drv_data->algo_data.udelay = 10;
drv_data->algo_data.mdelay = 10;
drv_data->algo_data.timeout = 100;
-
+#ifdef CONFIG_MACH_NAS100D
-+ drv_data->algo_data.getscl = NULL;
-+ drv_data->algo_data.udelay = 120;
-+ drv_data->algo_data.mdelay = 120;
++ drv_data->algo_data.udelay = 100;
++ drv_data->algo_data.mdelay = 100;
+#endif
drv_data->adapter.id = I2C_HW_B_IXP4XX;
drv_data->adapter.algo_data = &drv_data->algo_data;
@@ -99,73 +98,187 @@
printk(KERN_ERR "ERROR: Could not install %s\n", dev->bus_id);
--- linux-nas100d.orig/drivers/i2c/algos/i2c-algo-bit.c 2005-11-14 14:28:20.000000000 +0100
-+++ linux-nas100d/drivers/i2c/algos/i2c-algo-bit.c 2005-11-14 17:10:32.000000000 +0100
-@@ -81,7 +81,6 @@ static inline int sclhi(struct i2c_algo_
- unsigned long start;
++++ linux-nas100d/drivers/i2c/algos/i2c-algo-bit.c 2005-11-15 08:46:27.000000000 +0100
+@@ -78,30 +78,31 @@ static inline void scllo(struct i2c_algo
+ */
+ static inline int sclhi(struct i2c_algo_bit_data *adap)
+ {
+- unsigned long start;
++ int i=0;
++// unsigned long start;
setscl(adap,1);
--
++ udelay(adap->udelay);
+
/* Not all adapters have scl sense line... */
if (adap->getscl == NULL ) {
- udelay(adap->udelay);
-@@ -111,6 +110,10 @@ static void i2c_start(struct i2c_algo_bi
+- udelay(adap->udelay);
+ return 0;
+ }
+
+- start=jiffies;
++ getscl(adap);
+ while (! getscl(adap) ) {
+ /* the hw knows how to read the clock line,
+ * so we wait until it actually gets high.
+ * This is safer as some chips may hold it low
+ * while they are processing data internally.
+ */
+- if (time_after_eq(jiffies, start+adap->timeout)) {
++ setscl(adap,1);
++ getscl(adap);
++ if (i++ > 10)
+ return -ETIMEDOUT;
+- }
+- cond_resched();
+ }
+- DEBSTAT(printk(KERN_DEBUG "needed %ld jiffies\n", jiffies-start));
+- udelay(adap->udelay);
++// DEBSTAT(printk(KERN_DEBUG "needed %ld jiffies\n", jiffies-start));
++// udelay(adap->udelay);
+ return 0;
+ }
+
+@@ -111,6 +112,8 @@ static void i2c_start(struct i2c_algo_bi
{
/* assert: scl, sda are high */
DEBPROTO(printk("S "));
-+#ifdef CONFIG_MACH_NAS100D
+ sclhi(adap);
+ sdahi(adap);
-+#endif
sdalo(adap);
scllo(adap);
}
-@@ -132,6 +135,9 @@ static void i2c_stop(struct i2c_algo_bit
+@@ -120,7 +123,7 @@ static void i2c_repstart(struct i2c_algo
+ /* scl, sda may not be high */
+ DEBPROTO(printk(" Sr "));
+ setsda(adap,1);
+- sclhi(adap);
++ setscl(adap,1);
+ udelay(adap->udelay);
+
+ sdalo(adap);
+@@ -132,8 +135,8 @@ static void i2c_stop(struct i2c_algo_bit
{
DEBPROTO(printk("P\n"));
/* assert: scl is low */
-+#ifdef CONFIG_MACH_NAS100D
-+ scllo(adap);
-+#endif
++ sclhi(adap);
sdalo(adap);
- sclhi(adap);
+- sclhi(adap);
sdahi(adap);
-@@ -154,6 +160,9 @@ static int i2c_outb(struct i2c_adapter *
+ }
+
+@@ -154,34 +157,28 @@ static int i2c_outb(struct i2c_adapter *
struct i2c_algo_bit_data *adap = i2c_adap->algo_data;
/* assert: scl is low */
-+#ifdef CONFIG_MACH_NAS100D
-+ scllo(adap);
-+#endif
++ setscl(adap,0);
for ( i=7 ; i>=0 ; i-- ) {
sb = c & ( 1 << i );
setsda(adap,sb);
-@@ -181,7 +190,14 @@ static int i2c_outb(struct i2c_adapter *
-
- DEBPROTO( printk(KERN_DEBUG "[%2.2x]",c&0xff) );
+ udelay(adap->udelay);
+ DEBPROTO(printk(KERN_DEBUG "%d",sb!=0));
+- if (sclhi(adap)<0) { /* timed out */
+- sdahi(adap); /* we don't want to block the net */
+- DEB2(printk(KERN_DEBUG " i2c_outb: 0x%02x, timeout at bit #%d\n", c&0xff, i));
+- return -ETIMEDOUT;
+- };
+- /* do arbitration here:
+- * if ( sb && ! getsda(adap) ) -> ouch! Get out of here.
+- */
+- setscl(adap, 0 );
+- udelay(adap->udelay);
++ sclhi(adap);
++ printk(" ");
++ scllo(adap);
+ }
+- sdahi(adap);
+- if (sclhi(adap)<0){ /* timeout */
+- DEB2(printk(KERN_DEBUG " i2c_outb: 0x%02x, timeout at ack\n", c&0xff));
+- return -ETIMEDOUT;
+- };
++ setscl(adap,0);
++ setsda(adap,1);
++ udelay(adap->udelay);
++ ack=getsda(adap);
++ sclhi(adap);
+ /* read ack: SDA should be pulled down by slave */
+ ack=getsda(adap); /* ack: sda is pulled low ->success. */
+- DEB2(printk(KERN_DEBUG " i2c_outb: 0x%02x , getsda() = %d\n", c & 0xff, ack));
+-
+- DEBPROTO( printk(KERN_DEBUG "[%2.2x]",c&0xff) );
DEBPROTO(if (0==ack){ printk(KERN_DEBUG " A ");} else printk(KERN_DEBUG " NA ") );
-+#ifdef CONFIG_MACH_NAS100D
-+ sdalo(adap);
-+#endif
- scllo(adap);
+- scllo(adap);
++ setsda(adap,0);
++ setscl(adap,0);
+
-+#ifdef CONFIG_MACH_NAS100D
+ udelay(adap->udelay);
-+#endif
return 0==ack; /* return 1 if device acked */
/* assert: scl is low (sda undef) */
}
-@@ -196,8 +212,14 @@ static int i2c_inb(struct i2c_adapter *i
+@@ -196,14 +193,15 @@ static int i2c_inb(struct i2c_adapter *i
struct i2c_algo_bit_data *adap = i2c_adap->algo_data;
/* assert: scl is low */
-+#ifdef CONFIG_MACH_NAS100D
+- sdahi(adap);
+ setscl(adap,0);
-+#endif
- sdahi(adap);
for (i=0;i<8;i++) {
-+#ifdef CONFIG_MAC_NAS100D
+ getsda(adap);
-+#endif
if (sclhi(adap)<0) { /* timeout */
DEB2(printk(KERN_DEBUG " i2c_inb: timeout at bit #%d\n", 7-i));
return -ETIMEDOUT;
+ };
+- indata *= 2;
+- if ( getsda(adap) )
++ indata = indata << 1;
++ if (getsda(adap))
+ indata |= 0x01;
+ scllo(adap);
+ }
+@@ -469,16 +467,16 @@ static int bit_xfer(struct i2c_adapter *
+ struct i2c_msg msgs[], int num)
+ {
+ struct i2c_msg *pmsg;
+- struct i2c_algo_bit_data *adap = i2c_adap->algo_data;
++// struct i2c_algo_bit_data *adap = i2c_adap->algo_data;
+
+ int i,ret;
+- unsigned short nak_ok;
++// unsigned short nak_ok;
+
+- i2c_start(adap);
++// i2c_start(adap);
+ for (i=0;i<num;i++) {
+ pmsg = &msgs[i];
+- nak_ok = pmsg->flags & I2C_M_IGNORE_NAK;
+- if (!(pmsg->flags & I2C_M_NOSTART)) {
++// nak_ok = pmsg->flags & I2C_M_IGNORE_NAK;
++/* if (!(pmsg->flags & I2C_M_NOSTART)) {
+ if (i) {
+ i2c_repstart(adap);
+ }
+@@ -489,6 +487,7 @@ static int bit_xfer(struct i2c_adapter *
+ return (ret<0) ? ret : -EREMOTEIO;
+ }
+ }
++*/
+ if (pmsg->flags & I2C_M_RD ) {
+ /* read bytes into buffer*/
+ ret = readbytes(i2c_adap, pmsg);
+@@ -505,7 +504,7 @@ static int bit_xfer(struct i2c_adapter *
+ }
+ }
+ }
+- i2c_stop(adap);
++// i2c_stop(adap);
+ return num;
+ }
+
+@@ -530,6 +529,8 @@ int i2c_bit_add_bus(struct i2c_adapter *
+ {
+ struct i2c_algo_bit_data *bit_adap = adap->algo_data;
+
++ printk(KERN_INFO "i2c: nas100d 0.0.3\n");
++
+ if (bit_test) {
+ int ret = test_bus(bit_adap, adap->name);
+ if (ret<0)
diff --git a/packages/linux/nas100d-kernel/2.6.14/defconfig b/packages/linux/nas100d-kernel/2.6.14/defconfig
index 7ad2bc67db..e4f21957a6 100644
--- a/packages/linux/nas100d-kernel/2.6.14/defconfig
+++ b/packages/linux/nas100d-kernel/2.6.14/defconfig
@@ -956,16 +956,16 @@ CONFIG_I2C_IXP4XX=y
#
# CONFIG_SENSORS_DS1337 is not set
# CONFIG_SENSORS_DS1374 is not set
-CONFIG_SENSORS_EEPROM=y
+CONFIG_SENSORS_EEPROM=n
# CONFIG_SENSORS_PCF8574 is not set
# CONFIG_SENSORS_PCA9539 is not set
# CONFIG_SENSORS_PCF8591 is not set
# CONFIG_SENSORS_RTC8564 is not set
# CONFIG_SENSORS_MAX6875 is not set
-# CONFIG_I2C_DEBUG_CORE is not set
-# CONFIG_I2C_DEBUG_ALGO is not set
-# CONFIG_I2C_DEBUG_BUS is not set
-# CONFIG_I2C_DEBUG_CHIP is not set
+CONFIG_I2C_DEBUG_CORE=y
+CONFIG_I2C_DEBUG_ALGO=y
+CONFIG_I2C_DEBUG_BUS=n
+CONFIG_I2C_DEBUG_CHIP=n
#
# Hardware Monitoring support