diff options
author | Linus Torvalds <torvalds@g5.osdl.org> | 2006-07-13 08:19:23 +0400 |
---|---|---|
committer | Linus Torvalds <torvalds@g5.osdl.org> | 2006-07-13 08:19:23 +0400 |
commit | a0486407bea3f0545ee3fcfb768b6763c5c2b459 (patch) | |
tree | df25e25f6c5c0c3d8db2c42835174cc081af71a5 /drivers/i2c/busses/i2c-iop3xx.c | |
parent | 2513eb8e67a2483aecb5bf7fead7692d5aabbdcd (diff) | |
parent | 5cab828bf0f52f3697a61aa99c54ee43844f53c0 (diff) | |
download | linux-a0486407bea3f0545ee3fcfb768b6763c5c2b459.tar.xz |
Merge commit master.kernel.org:/pub/scm/linux/kernel/git/gregkh/i2c-2.6 of HEAD
* HEAD:
[PATCH] hwmon: Documentation update for abituguru
[PATCH] hwmon: Fix for first generation Abit uGuru chips
[PATCH] hwmon: New maintainer for w83791d
[PATCH] pca9539: Honor the force parameter
[PATCH] i2c-algo-bit: Wipe out dead code
[PATCH] i2c: Handle i2c_add_adapter failure in i2c algorithm drivers
[PATCH] i2c: New mailing list
[PATCH] i2c-ite: Plan for removal
[PATCH] i2c-powermac: Fix master_xfer return value
[PATCH] scx200_acb: Fix the block transactions
[PATCH] scx200_acb: Fix the state machine
[PATCH] i2c-iop3xx: Avoid addressing self
[PATCH] i2c: Fix 'ignore' module parameter handling in i2c-core
Diffstat (limited to 'drivers/i2c/busses/i2c-iop3xx.c')
-rw-r--r-- | drivers/i2c/busses/i2c-iop3xx.c | 17 |
1 files changed, 10 insertions, 7 deletions
diff --git a/drivers/i2c/busses/i2c-iop3xx.c b/drivers/i2c/busses/i2c-iop3xx.c index aca7e1668605..48c56939c861 100644 --- a/drivers/i2c/busses/i2c-iop3xx.c +++ b/drivers/i2c/busses/i2c-iop3xx.c @@ -21,6 +21,9 @@ * - Make it work with IXP46x chips * - Cleanup function names, coding style, etc * + * - writing to slave address causes latchup on iop331. + * fix: driver refuses to address self. + * * 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, version 2. @@ -73,12 +76,6 @@ iop3xx_i2c_reset(struct i2c_algo_iop3xx_data *iop3xx_adap) } static void -iop3xx_i2c_set_slave_addr(struct i2c_algo_iop3xx_data *iop3xx_adap) -{ - __raw_writel(MYSAR, iop3xx_adap->ioaddr + SAR_OFFSET); -} - -static void iop3xx_i2c_enable(struct i2c_algo_iop3xx_data *iop3xx_adap) { u32 cr = IOP3XX_ICR_GCD | IOP3XX_ICR_SCLEN | IOP3XX_ICR_UE; @@ -248,6 +245,13 @@ iop3xx_i2c_send_target_addr(struct i2c_algo_iop3xx_data *iop3xx_adap, int status; int rc; + /* avoid writing to my slave address (hangs on 80331), + * forbidden in Intel developer manual + */ + if (msg->addr == MYSAR) { + return -EBUSY; + } + __raw_writel(iic_cook_addr(msg), iop3xx_adap->ioaddr + DBR_OFFSET); cr &= ~(IOP3XX_ICR_MSTOP | IOP3XX_ICR_NACK); @@ -498,7 +502,6 @@ iop3xx_i2c_probe(struct platform_device *pdev) spin_lock_init(&adapter_data->lock); iop3xx_i2c_reset(adapter_data); - iop3xx_i2c_set_slave_addr(adapter_data); iop3xx_i2c_enable(adapter_data); platform_set_drvdata(pdev, new_adapter); |