i2c: Add SCCB support
authorLaurent Pinchart <laurent.pinchart@ideasonboard.com>
Tue, 24 Jul 2012 12:13:59 +0000 (14:13 +0200)
committerJean Delvare <khali@endymion.delvare>
Tue, 24 Jul 2012 12:13:59 +0000 (14:13 +0200)
SCCB is a serial communication bus developed by Omnivision. Its 2-wire
mode is very similar to SMBus byte data transactions, but requires the
controller to ignore the ACK bit and to insert a stop condition after
each message.

Add a device SCCB flag and a message stop flag to be passed to
controller drivers.

[JD: Kill rogue definition in go7007 driver.]

Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
Signed-off-by: Jean Delvare <khali@linux-fr.org>
drivers/i2c/i2c-core.c
drivers/staging/media/go7007/wis-i2c.h
include/linux/i2c.h

index a6ad32bc0a96d633629f5a2a4cd85cdf3420c57d..361978a8485a8fd91f9642fee5434275bfc6de4b 100644 (file)
@@ -2122,7 +2122,7 @@ s32 i2c_smbus_xfer(struct i2c_adapter *adapter, u16 addr, unsigned short flags,
        int try;
        s32 res;
 
-       flags &= I2C_M_TEN | I2C_CLIENT_PEC;
+       flags &= I2C_M_TEN | I2C_CLIENT_PEC | I2C_CLIENT_SCCB;
 
        if (adapter->algo->smbus_xfer) {
                i2c_lock_adapter(adapter);
index 3c2b9be455dfbaae18d3a1c5db63d79c43642ab5..6d09c06c8560ab8a3d2174461c2552210f0247fd 100644 (file)
 #define        I2C_DRIVERID_WIS_TW2804         0xf0f6
 #define        I2C_DRIVERID_S2250              0xf0f7
 
-/* Flag to indicate that the client needs to be accessed with SCCB semantics */
-/* We re-use the I2C_M_TEN value so the flag passes through the masks in the
- * core I2C code.  Major kludge, but the I2C layer ain't exactly flexible. */
-#define        I2C_CLIENT_SCCB                 0x10
-
 /* Definitions for new video decoder commands */
 
 struct video_decoder_resolution {
index ddfa04108baf14ade92a85d3a3f909ca9ab30589..1d0fe4877b1fa0fdd4c9e2c36a4f154874de8cc1 100644 (file)
@@ -425,6 +425,8 @@ void i2c_unlock_adapter(struct i2c_adapter *);
 #define I2C_CLIENT_TEN 0x10            /* we have a ten bit chip address */
                                        /* Must equal I2C_M_TEN below */
 #define I2C_CLIENT_WAKE        0x80            /* for board_info; true iff can wake */
+#define I2C_CLIENT_SCCB        0x9000          /* Use Omnivision SCCB protocol */
+                                       /* Must match I2C_M_STOP|IGNORE_NAK */
 
 /* i2c adapter classes (bitmask) */
 #define I2C_CLASS_HWMON                (1<<0)  /* lm_sensors, ... */
@@ -541,6 +543,7 @@ struct i2c_msg {
        __u16 flags;
 #define I2C_M_TEN              0x0010  /* this is a ten bit chip address */
 #define I2C_M_RD               0x0001  /* read data, from slave to master */
+#define I2C_M_STOP             0x8000  /* if I2C_FUNC_PROTOCOL_MANGLING */
 #define I2C_M_NOSTART          0x4000  /* if I2C_FUNC_NOSTART */
 #define I2C_M_REV_DIR_ADDR     0x2000  /* if I2C_FUNC_PROTOCOL_MANGLING */
 #define I2C_M_IGNORE_NAK       0x1000  /* if I2C_FUNC_PROTOCOL_MANGLING */