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

Commit 839d8810 authored by Linus Torvalds's avatar Linus Torvalds
Browse files
* 'i2c-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/jdelvare/staging:
  i2c: Functions for byte-swapped smbus_write/read_word_data
  i2c-algo-pca: Return standard fault codes
  i2c-algo-bit: Return standard fault codes
  i2c-algo-bit: Be verbose on bus testing failure
  i2c-algo-bit: Let user test buses without failing
  i2c/scx200_acb: Fix section mismatch warning in scx200_pci_drv
  i2c: I2C_ELEKTOR should depend on HAS_IOPORT
parents 0cfdc724 06a67848
Loading
Loading
Loading
Loading
+8 −0
Original line number Original line Diff line number Diff line
@@ -88,6 +88,10 @@ byte. But this time, the data is a complete word (16 bits).


S Addr Wr [A] Comm [A] S Addr Rd [A] [DataLow] A [DataHigh] NA P
S Addr Wr [A] Comm [A] S Addr Rd [A] [DataLow] A [DataHigh] NA P


Note the convenience function i2c_smbus_read_word_swapped is
available for reads where the two data bytes are the other way
around (not SMBus compliant, but very popular.)



SMBus Write Byte:  i2c_smbus_write_byte_data()
SMBus Write Byte:  i2c_smbus_write_byte_data()
==============================================
==============================================
@@ -108,6 +112,10 @@ specified through the Comm byte.


S Addr Wr [A] Comm [A] DataLow [A] DataHigh [A] P
S Addr Wr [A] Comm [A] DataLow [A] DataHigh [A] P


Note the convenience function i2c_smbus_write_word_swapped is
available for writes where the two data bytes are the other way
around (not SMBus compliant, but very popular.)



SMBus Process Call:  i2c_smbus_process_call()
SMBus Process Call:  i2c_smbus_process_call()
=============================================
=============================================
+13 −11
Original line number Original line Diff line number Diff line
@@ -47,8 +47,8 @@
/* ----- global variables ---------------------------------------------	*/
/* ----- global variables ---------------------------------------------	*/


static int bit_test;	/* see if the line-setting functions work	*/
static int bit_test;	/* see if the line-setting functions work	*/
module_param(bit_test, bool, 0);
module_param(bit_test, int, S_IRUGO);
MODULE_PARM_DESC(bit_test, "Test the lines of the bus to see if it is stuck");
MODULE_PARM_DESC(bit_test, "lines testing - 0 off; 1 report; 2 fail if stuck");


#ifdef DEBUG
#ifdef DEBUG
static int i2c_debug = 1;
static int i2c_debug = 1;
@@ -250,7 +250,9 @@ static int test_bus(struct i2c_adapter *i2c_adap)
	sda = getsda(adap);
	sda = getsda(adap);
	scl = (adap->getscl == NULL) ? 1 : getscl(adap);
	scl = (adap->getscl == NULL) ? 1 : getscl(adap);
	if (!scl || !sda) {
	if (!scl || !sda) {
		printk(KERN_WARNING "%s: bus seems to be busy\n", name);
		printk(KERN_WARNING
		       "%s: bus seems to be busy (scl=%d, sda=%d)\n",
		       name, scl, sda);
		goto bailout;
		goto bailout;
	}
	}


@@ -441,7 +443,7 @@ static int readbytes(struct i2c_adapter *i2c_adap, struct i2c_msg *msg)
					acknak(i2c_adap, 0);
					acknak(i2c_adap, 0);
				dev_err(&i2c_adap->dev, "readbytes: invalid "
				dev_err(&i2c_adap->dev, "readbytes: invalid "
					"block length (%d)\n", inval);
					"block length (%d)\n", inval);
				return -EREMOTEIO;
				return -EPROTO;
			}
			}
			/* The original count value accounts for the extra
			/* The original count value accounts for the extra
			   bytes, that is, either 1 for a regular transaction,
			   bytes, that is, either 1 for a regular transaction,
@@ -470,7 +472,7 @@ static int readbytes(struct i2c_adapter *i2c_adap, struct i2c_msg *msg)
 * reads, writes as well as 10bit-addresses.
 * reads, writes as well as 10bit-addresses.
 * returns:
 * returns:
 *  0 everything went okay, the chip ack'ed, or IGNORE_NAK flag was set
 *  0 everything went okay, the chip ack'ed, or IGNORE_NAK flag was set
 * -x an error occurred (like: -EREMOTEIO if the device did not answer, or
 * -x an error occurred (like: -ENXIO if the device did not answer, or
 *	-ETIMEDOUT, for example if the lines are stuck...)
 *	-ETIMEDOUT, for example if the lines are stuck...)
 */
 */
static int bit_doAddress(struct i2c_adapter *i2c_adap, struct i2c_msg *msg)
static int bit_doAddress(struct i2c_adapter *i2c_adap, struct i2c_msg *msg)
@@ -493,14 +495,14 @@ static int bit_doAddress(struct i2c_adapter *i2c_adap, struct i2c_msg *msg)
		if ((ret != 1) && !nak_ok)  {
		if ((ret != 1) && !nak_ok)  {
			dev_err(&i2c_adap->dev,
			dev_err(&i2c_adap->dev,
				"died at extended address code\n");
				"died at extended address code\n");
			return -EREMOTEIO;
			return -ENXIO;
		}
		}
		/* the remaining 8 bit address */
		/* the remaining 8 bit address */
		ret = i2c_outb(i2c_adap, msg->addr & 0x7f);
		ret = i2c_outb(i2c_adap, msg->addr & 0x7f);
		if ((ret != 1) && !nak_ok) {
		if ((ret != 1) && !nak_ok) {
			/* the chip did not ack / xmission error occurred */
			/* the chip did not ack / xmission error occurred */
			dev_err(&i2c_adap->dev, "died at 2nd address code\n");
			dev_err(&i2c_adap->dev, "died at 2nd address code\n");
			return -EREMOTEIO;
			return -ENXIO;
		}
		}
		if (flags & I2C_M_RD) {
		if (flags & I2C_M_RD) {
			bit_dbg(3, &i2c_adap->dev, "emitting repeated "
			bit_dbg(3, &i2c_adap->dev, "emitting repeated "
@@ -512,7 +514,7 @@ static int bit_doAddress(struct i2c_adapter *i2c_adap, struct i2c_msg *msg)
			if ((ret != 1) && !nak_ok) {
			if ((ret != 1) && !nak_ok) {
				dev_err(&i2c_adap->dev,
				dev_err(&i2c_adap->dev,
					"died at repeated address code\n");
					"died at repeated address code\n");
				return -EREMOTEIO;
				return -EIO;
			}
			}
		}
		}
	} else {		/* normal 7bit address	*/
	} else {		/* normal 7bit address	*/
@@ -570,7 +572,7 @@ static int bit_xfer(struct i2c_adapter *i2c_adap,
					ret, ret == 1 ? "" : "s");
					ret, ret == 1 ? "" : "s");
			if (ret < pmsg->len) {
			if (ret < pmsg->len) {
				if (ret >= 0)
				if (ret >= 0)
					ret = -EREMOTEIO;
					ret = -EIO;
				goto bailout;
				goto bailout;
			}
			}
		} else {
		} else {
@@ -581,7 +583,7 @@ static int bit_xfer(struct i2c_adapter *i2c_adap,
					ret, ret == 1 ? "" : "s");
					ret, ret == 1 ? "" : "s");
			if (ret < pmsg->len) {
			if (ret < pmsg->len) {
				if (ret >= 0)
				if (ret >= 0)
					ret = -EREMOTEIO;
					ret = -EIO;
				goto bailout;
				goto bailout;
			}
			}
		}
		}
@@ -624,7 +626,7 @@ static int __i2c_bit_add_bus(struct i2c_adapter *adap,


	if (bit_test) {
	if (bit_test) {
		ret = test_bus(adap);
		ret = test_bus(adap);
		if (ret < 0)
		if (bit_test >= 2 && ret < 0)
			return -ENODEV;
			return -ENODEV;
	}
	}


+4 −2
Original line number Original line Diff line number Diff line
@@ -196,7 +196,7 @@ static int pca_xfer(struct i2c_adapter *i2c_adap,
		} else {
		} else {
			dev_dbg(&i2c_adap->dev, "bus is not idle. status is "
			dev_dbg(&i2c_adap->dev, "bus is not idle. status is "
				"%#04x\n", state);
				"%#04x\n", state);
			return -EAGAIN;
			return -EBUSY;
		}
		}
	}
	}


@@ -224,7 +224,7 @@ static int pca_xfer(struct i2c_adapter *i2c_adap,
	}
	}


	curmsg = 0;
	curmsg = 0;
	ret = -EREMOTEIO;
	ret = -EIO;
	while (curmsg < num) {
	while (curmsg < num) {
		state = pca_status(adap);
		state = pca_status(adap);


@@ -259,6 +259,7 @@ static int pca_xfer(struct i2c_adapter *i2c_adap,
		case 0x20: /* SLA+W has been transmitted; NOT ACK has been received */
		case 0x20: /* SLA+W has been transmitted; NOT ACK has been received */
			DEB2("NOT ACK received after SLA+W\n");
			DEB2("NOT ACK received after SLA+W\n");
			pca_stop(adap);
			pca_stop(adap);
			ret = -ENXIO;
			goto out;
			goto out;


		case 0x40: /* SLA+R has been transmitted; ACK has been received */
		case 0x40: /* SLA+R has been transmitted; ACK has been received */
@@ -283,6 +284,7 @@ static int pca_xfer(struct i2c_adapter *i2c_adap,
		case 0x48: /* SLA+R has been transmitted; NOT ACK has been received */
		case 0x48: /* SLA+R has been transmitted; NOT ACK has been received */
			DEB2("NOT ACK received after SLA+R\n");
			DEB2("NOT ACK received after SLA+R\n");
			pca_stop(adap);
			pca_stop(adap);
			ret = -ENXIO;
			goto out;
			goto out;


		case 0x30: /* Data byte in I2CDAT has been transmitted; NOT ACK has been received */
		case 0x30: /* Data byte in I2CDAT has been transmitted; NOT ACK has been received */
+1 −1
Original line number Original line Diff line number Diff line
@@ -789,7 +789,7 @@ config I2C_ACORN


config I2C_ELEKTOR
config I2C_ELEKTOR
	tristate "Elektor ISA card"
	tristate "Elektor ISA card"
	depends on ISA && BROKEN_ON_SMP
	depends on ISA && HAS_IOPORT && BROKEN_ON_SMP
	select I2C_ALGOPCF
	select I2C_ALGOPCF
	help
	help
	  This supports the PCF8584 ISA bus I2C adapter.  Say Y if you own
	  This supports the PCF8584 ISA bus I2C adapter.  Say Y if you own
+3 −3
Original line number Original line Diff line number Diff line
@@ -550,7 +550,7 @@ static int __devexit scx200_remove(struct platform_device *pdev)
	return 0;
	return 0;
}
}


static struct platform_driver scx200_pci_drv = {
static struct platform_driver scx200_pci_driver = {
	.driver = {
	.driver = {
		.name = "cs5535-smb",
		.name = "cs5535-smb",
		.owner = THIS_MODULE,
		.owner = THIS_MODULE,
@@ -593,14 +593,14 @@ static int __init scx200_acb_init(void)
		return 0;
		return 0;


	/* No ISA devices; register the platform driver for PCI-based devices */
	/* No ISA devices; register the platform driver for PCI-based devices */
	return platform_driver_register(&scx200_pci_drv);
	return platform_driver_register(&scx200_pci_driver);
}
}


static void __exit scx200_acb_cleanup(void)
static void __exit scx200_acb_cleanup(void)
{
{
	struct scx200_acb_iface *iface;
	struct scx200_acb_iface *iface;


	platform_driver_unregister(&scx200_pci_drv);
	platform_driver_unregister(&scx200_pci_driver);


	mutex_lock(&scx200_acb_list_mutex);
	mutex_lock(&scx200_acb_list_mutex);
	while ((iface = scx200_acb_list) != NULL) {
	while ((iface = scx200_acb_list) != NULL) {
Loading