Merge branch 'i2c-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/jdelvare/staging
* '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
This commit is contained in:
commit
839d881074
|
@ -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()
|
||||||
=============================================
|
=============================================
|
||||||
|
|
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -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 */
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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) {
|
||||||
|
|
|
@ -34,6 +34,7 @@
|
||||||
#include <linux/sched.h> /* for completion */
|
#include <linux/sched.h> /* for completion */
|
||||||
#include <linux/mutex.h>
|
#include <linux/mutex.h>
|
||||||
#include <linux/of.h> /* for struct device_node */
|
#include <linux/of.h> /* for struct device_node */
|
||||||
|
#include <linux/swab.h> /* for swab16 */
|
||||||
|
|
||||||
extern struct bus_type i2c_bus_type;
|
extern struct bus_type i2c_bus_type;
|
||||||
extern struct device_type i2c_adapter_type;
|
extern struct device_type i2c_adapter_type;
|
||||||
|
@ -88,6 +89,22 @@ extern s32 i2c_smbus_read_word_data(const struct i2c_client *client,
|
||||||
u8 command);
|
u8 command);
|
||||||
extern s32 i2c_smbus_write_word_data(const struct i2c_client *client,
|
extern s32 i2c_smbus_write_word_data(const struct i2c_client *client,
|
||||||
u8 command, u16 value);
|
u8 command, u16 value);
|
||||||
|
|
||||||
|
static inline s32
|
||||||
|
i2c_smbus_read_word_swapped(const struct i2c_client *client, u8 command)
|
||||||
|
{
|
||||||
|
s32 value = i2c_smbus_read_word_data(client, command);
|
||||||
|
|
||||||
|
return (value < 0) ? value : swab16(value);
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline s32
|
||||||
|
i2c_smbus_write_word_swapped(const struct i2c_client *client,
|
||||||
|
u8 command, u16 value)
|
||||||
|
{
|
||||||
|
return i2c_smbus_write_word_data(client, command, swab16(value));
|
||||||
|
}
|
||||||
|
|
||||||
/* Returns the number of read bytes */
|
/* Returns the number of read bytes */
|
||||||
extern s32 i2c_smbus_read_block_data(const struct i2c_client *client,
|
extern s32 i2c_smbus_read_block_data(const struct i2c_client *client,
|
||||||
u8 command, u8 *values);
|
u8 command, u8 *values);
|
||||||
|
|
Loading…
Reference in New Issue