Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 39288e1a authored by Peter Milne's avatar Peter Milne Committed by Greg Kroah-Hartman
Browse files

[PATCH] i2c-iop3xx: Avoid addressing self



Avoid addressing self when sending a slave address. Follows instruction
in Intel 80331/80321 manuals.
Ignoring this worked previously on 80321, but causes a hang on i2cdetect
on 80331.

Signed-off-by: default avatarPeter Milne <peter.milne@d-tacq.com>
Signed-off-by: default avatarJean Delvare <khali@linux-fr.org>
Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@suse.de>
parent 2369df93
Loading
Loading
Loading
Loading
+10 −7
Original line number Diff line number Diff line
@@ -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.
@@ -72,12 +75,6 @@ iop3xx_i2c_reset(struct i2c_algo_iop3xx_data *iop3xx_adap)
	__raw_writel(0, iop3xx_adap->ioaddr + CR_OFFSET);
} 

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)
{
@@ -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);
+1 −1
Original line number Diff line number Diff line
@@ -80,7 +80,7 @@
#define IOP3XX_GPOD_I2C0	0x00c0	/* clear these bits to enable ch0 */
#define IOP3XX_GPOD_I2C1	0x0030	/* clear these bits to enable ch1 */

#define MYSAR			0x02	/* SWAG a suitable slave address */
#define MYSAR			0	/* default slave address */

#define I2C_ERR			321
#define I2C_ERR_BERR		(I2C_ERR+0)