Merge "Adding parrot support in mosys"
diff --git a/core/command/i2c.c b/core/command/i2c.c
index e609f70..17ab7c8 100644
--- a/core/command/i2c.c
+++ b/core/command/i2c.c
@@ -69,8 +69,10 @@
 
 	/* read in block of 256 bytes */
 	memset(i2c_data, 0, sizeof(i2c_data));
-	length = intf->op->i2c->read_reg(intf, bus, address,
-					 start, length, i2c_data);
+	/* FIXME: historically we have only worried about SMBus devices here
+	   (e.g. SPDs), but this does not seem like a great general solution */
+	length = intf->op->i2c->smbus_read_reg(intf, bus, address,
+					       start, length, i2c_data);
 
 	if (length < 0) {
 		lprintf(LOG_ERR, "Failed to read from I2C (not present?)\n");
diff --git a/drivers/cypress/cypress_apa.c b/drivers/cypress/cypress_apa.c
index eee8f87..dd9bf44 100644
--- a/drivers/cypress/cypress_apa.c
+++ b/drivers/cypress/cypress_apa.c
@@ -133,12 +133,14 @@
 	uint8_t major, minor;
 	size_t max_len = 8;
 
-	if (intf->op->i2c->read_reg(intf, bus, addr,
-	                            CYAPA_REG_FIRMWARE_MAJOR, 1, &major) != 1)
+	if (intf->op->i2c->smbus_read_reg(intf, bus, addr,
+					  CYAPA_REG_FIRMWARE_MAJOR,
+					  1, &major) != 1)
 		return -1;
 
-	if (intf->op->i2c->read_reg(intf, bus, addr,
-	                            CYAPA_REG_FIRMWARE_MINOR, 1, &minor) != 1)
+	if (intf->op->i2c->smbus_read_reg(intf, bus, addr,
+					  CYAPA_REG_FIRMWARE_MINOR,
+					  1, &minor) != 1)
 		return -1;
 
 	*buf = mosys_zalloc(max_len);
@@ -152,12 +154,14 @@
 	uint8_t major, minor;
 	size_t max_len = 8;
 
-	if (intf->op->i2c->read_reg(intf, bus, addr,
-	                            CYAPA_REG_HARDWARE_MAJOR, 1, &major) != 1)
+	if (intf->op->i2c->smbus_read_reg(intf, bus, addr,
+					  CYAPA_REG_HARDWARE_MAJOR,
+					  1, &major) != 1)
 		return -1;
 
-	if (intf->op->i2c->read_reg(intf, bus, addr,
-	                            CYAPA_REG_HARDWARE_MINOR, 1, &minor) != 1)
+	if (intf->op->i2c->smbus_read_reg(intf, bus, addr,
+					  CYAPA_REG_HARDWARE_MINOR,
+					  1, &minor) != 1)
 		return -1;
 
 	*buf = mosys_zalloc(max_len);
@@ -172,9 +176,9 @@
 
 	*buf = mosys_zalloc(CYAPA_REG_PRODUCT_ID_LEN + 1);
 	for (i = 0; i < CYAPA_REG_PRODUCT_ID_LEN; i++) {
-		if (intf->op->i2c->read_reg(intf, bus, addr,
-		                            CYAPA_REG_PRODUCT_ID + i,
-					    1, *buf + i) != 1)
+		if (intf->op->i2c->smbus_read_reg(intf, bus, addr,
+						  CYAPA_REG_PRODUCT_ID + i,
+						  1, *buf + i) != 1)
 		return -1;
 	}
 
diff --git a/include/intf/i2c.h b/include/intf/i2c.h
index 87dc9b6..2f804dc 100644
--- a/include/intf/i2c.h
+++ b/include/intf/i2c.h
@@ -49,7 +49,7 @@
 	const char *dev_root;
 
 	/*
-	 * setup  -  prepare interface
+	 * setup - prepare interface
 	 *
 	 * @intf:       platform interface
 	 *
@@ -59,14 +59,33 @@
 	int (*setup)(struct platform_intf *intf);
 
 	/*
-	 * destroy  -  teardown interface
+	 * destroy - teardown interface
 	 *
 	 * @intf:       platform interface
 	 */
 	void (*destroy)(struct platform_intf *intf);
 
+
 	/*
-	 * read  -  Read bytes from I2C device
+	 * i2c_transfer - Single or combined transfer using I2C_RDWR ioctl
+	 *
+	 * @intf:	platform interface
+	 * @bus:        I2C bus/adapter
+	 * @address:    I2C slave address
+	 * @outdata:	buffer containing output data
+	 * @outsize:	number of bytes to send
+	 * @indata:	buffer to store input data
+	 * @insize:	number of bytes expected to be received
+	 *
+	 * returns 0 to indicate success
+	 * returns <0 to indicate failure
+	 */
+	 int (*i2c_transfer)(struct platform_intf *intf, int bus, int address,
+			     const void *outdata, int outsize,
+			     const void *indata, int insize);
+
+	/*
+	 * smbus_read_reg - Read from a register addressable SMBus device
 	 *
 	 * @intf:       platform interface
 	 * @bus:        I2C bus/adapter
@@ -76,80 +95,79 @@
 	 * @data:       data buffer
 	 *
 	 * returns number of bytes read
-	 * returns <0 to indicate error
-	 */
-	int (*read_reg)(struct platform_intf *intf,
-			int bus, int address, int reg,
-			int length, void *data);
-
-	/*
-	 * write  -  Write bytes to I2C device
-	 *
-	 * @intf:       platform interface
-	 * @bus:        I2C bus/adapter
-	 * @address:    I2C slave address
-	 * @reg:        I2C register offset
-	 * @length:     number of bytes to read (1-255)
-	 * @data:       data buffer
-	 *
-	 * returns number of bytes written
-	 * returns <0 to indicate error
-	 */
-	int (*write_reg)(struct platform_intf *intf,
-			 int bus, int address, int reg,
-			 int length, const void *data);
-
-	/*
-	 * read16 -  Read bytes from I2C device using 16-bit address
-	 *
-	 * @intf:       platform interface
-	 * @bus:        I2C bus/adapter
-	 * @address:    I2C slave address
-	 * @reg:        I2C register offset (16-bit)
-	 * @length:     number of bytes to read (1-255)
-	 * @data:       data buffer
-	 *
-	 * returns number of bytes read
-	 * returns <0 to indicate error
-	 */
-	int (*read16)(struct platform_intf *intf,
-		      int bus, int address, int reg,
-		      int length, void *data);
-
-	/*
-	 * write16 -  Write bytes to I2C device using 16-bit address
-	 *
-	 * @intf:       platform interface
-	 * @bus:        I2C bus/adapter
-	 * @address:    I2C slave address
-	 * @reg:        I2C register offset (16-bit)
-	 * @length:     number of bytes to read (1-255)
-	 * @data:       data buffer
-	 *
-	 * returns number of bytes written
-	 * returns <0 to indicate error
-	 */
-	int (*write16)(struct platform_intf *intf,
-		       int bus, int address, int reg,
-		       int length, const void *data);
-
-	/*
-	 * read_raw  -  read byte(s) from device without register addressing
-	 *
-	 * @intf:       platform interface
-	 * @bus:        I2C bus/adapter
-	 * @address:    I2C slave address
-	 * @length:	number of bytes to read (1-256)
-	 * @data:       data buffer
-	 *
-	 * returns number of bytes read
 	 * returns <0 to indicate failure
 	 */
-	int (*read_raw)(struct platform_intf *intf,
-			int bus, int address, int length, void *data);
+	int (*smbus_read_reg)(struct platform_intf *intf,
+			      int bus, int address, int reg,
+			      int length, void *data);
 
 	/*
-	 * write_raw  -  write byte(s) to device without register addressing
+	 * smbus_write_reg - Write bytes to SMBus slave address
+	 *
+	 * @intf:       platform interface
+	 * @bus:        I2C bus/adapter
+	 * @address:    I2C slave address
+	 * @reg:        I2C register offset
+	 * @length:     number of bytes to read (1-255)
+	 * @data:       data buffer
+	 *
+	 * returns number of bytes written
+	 * returns <0 to indicate error
+	 */
+	int (*smbus_write_reg)(struct platform_intf *intf,
+			      int bus, int address, int reg,
+			      int length, const void *data);
+
+	/*
+	 * smbus_read16_dev - Read SMBus device using 16-bit register offset
+	 *
+	 * @intf:       platform interface
+	 * @bus:        I2C bus/adapter
+	 * @address:    I2C slave address
+	 * @reg:        I2C register offset (16-bit)
+	 * @length:     number of bytes to read (1-255)
+	 * @data:       data buffer
+	 *
+	 * returns number of bytes read
+	 * returns <0 to indicate failure
+	 */
+	int (*smbus_read16)(struct platform_intf *intf,
+			    int bus, int address, int reg,
+			    int length, void *data);
+
+
+	/*
+	 * smbus_write16_buf - Write to SMBus device using 16-bit offset
+	 *
+	 * @handle:     I2C device handle
+	 * @reg:        I2C register offset (16-bit)
+	 * @dp:         data buffer
+	 * @len:        number of bytes to write (1-32)
+	 *
+	 * returns number of bytes written
+	 * returns <0 to indicate error
+	 */
+	int (*smbus_write16)(struct platform_intf *intf,
+			     int bus, int address, int reg,
+			     int length, const void *data);
+
+	/*
+	 * smbus_read_raw  -  bytewise SMBus read without register addressing
+	 *
+	 * @intf:       platform interface
+	 * @bus:        I2C bus/adapter
+	 * @address:    I2C slave address
+	 * @length:	number of bytes to read
+	 * @data:       data buffer
+	 *
+	 * returns number of bytes read
+	 * returns <0 to indicate failure
+	 */
+	int (*smbus_read_raw)(struct platform_intf *intf,
+			      int bus, int address, int length, void *data);
+
+	/*
+	 * smbus_write_raw  -  write to device without register addressing
 	 *
 	 * @intf:       platform interface
 	 * @bus:        I2C bus/adapter
@@ -160,35 +178,35 @@
 	 * returns number of bytes written
 	 * returns <0 to indicate failure
 	 */
-	int (*write_raw)(struct platform_intf *intf,
-			 int bus, int address, int length, void *data);
+	int (*smbus_write_raw)(struct platform_intf *intf,
+			       int bus, int address, int length, void *data);
 
 	/*
-	 * find_driver  -  Find I2C driver
+	 * find_driver - Determine if driver is loaded
 	 *
-	 * @intf:	platform interface
-	 * @name:	i2c driver name
+	 * @intf:	Platform interface
+	 * @module: 	The name of the module to search for
 	 *
-	 * returns 0 if the module is not found
-	 * returns 1 if the module is found
+	 * returns 0 if the module is not found or if /proc/modules does not exist
+	 * returns > 0 if the module is found
 	 */
 	int (*find_driver)(struct platform_intf *intf,
 			   const char *name);
 
 	/*
-	 * find_dir  -  Find I2C directory for device
+	 * find_sysfs_dir  -  Find sysfs directory for device
 	 *
 	 * @intf:	platform interface
 	 * @name:	i2c driver name
 	 *
 	 * returns the head of a linked list of matching devices
-	 * returns NULL if no device found
+	 * returns NULL if no device found or error
 	 */
-	struct ll_node *(*find_dir)(struct platform_intf *intf,
-				    const char *name);
+	struct ll_node *(*find_sysfs_dir)(struct platform_intf *intf,
+					  const char *name);
 
 	/*
-	 * match_bus  -  Look for bus name
+	 * i2c_match_bus_name  -  Look for bus name
 	 *
 	 * @intf:	platform interface
 	 * @name:	bus name
diff --git a/include/intf/linux-i2c-dev.h b/include/intf/linux-i2c-dev.h
index 8204852..45971a5 100644
--- a/include/intf/linux-i2c-dev.h
+++ b/include/intf/linux-i2c-dev.h
@@ -36,17 +36,16 @@
  */
 struct i2c_msg {
 	__u16 addr;	/* slave address			*/
-	unsigned short flags;		
+	__u16 flags;
 #define I2C_M_TEN	0x10	/* we have a ten bit chip address	*/
 #define I2C_M_RD	0x01
 #define I2C_M_NOSTART	0x4000
 #define I2C_M_REV_DIR_ADDR	0x2000
 #define I2C_M_IGNORE_NAK	0x1000
 #define I2C_M_NO_RD_ACK		0x0800
-	short len;		/* msg length				*/
-	char *buf;		/* pointer to msg data			*/
-	int err;
-	short done;
+#define I2C_M_RECV_LEN		0x0400  /* length will be first received byte */
+	__u16 len;		/* msg length				*/
+	__u8 *buf;		/* pointer to msg data			*/
 };
 
 /* To determine what functionality is present */
@@ -189,9 +188,10 @@
 /* This is the structure as used in the I2C_RDWR ioctl call */
 struct i2c_rdwr_ioctl_data {
 	struct i2c_msg *msgs;	/* pointers to i2c_msgs */
-	int nmsgs;		/* number of i2c_msgs */
+	__u32 nmsgs;		/* number of i2c_msgs */
 };
 
+#define I2C_RDRW_IOCTL_MAX_MSGS		42
 
 static inline __s32 i2c_smbus_access(int file, char read_write, __u8 command, 
                                      int size, union i2c_smbus_data *data)
diff --git a/intf/i2c.c b/intf/i2c.c
index 7afd648..456675a 100644
--- a/intf/i2c.c
+++ b/intf/i2c.c
@@ -38,6 +38,7 @@
 #include <inttypes.h>
 #include <string.h>
 #include <dirent.h>
+#include <sys/ioctl.h>
 
 #include "mosys/alloc.h"
 #include "mosys/globals.h"
@@ -155,21 +156,66 @@
 	free((char *)intf->op->i2c->dev_root);
 }
 
-/*
- * i2c_read_reg  -  Read bytes from a register addressable I2C device
- *
- * @intf:       platform interface
- * @bus:        I2C bus/adapter
- * @address:    I2C slave address
- * @reg:        I2C register offset
- * @length:     number of bytes to read (1-255)
- * @data:       data buffer
- *
- * returns number of bytes read
- * returns <0 to indicate failure
- */
-static int i2c_read_reg(struct platform_intf *intf,
-                        int bus, int address, int reg, int length, void *data)
+static int i2c_transfer(struct platform_intf *intf, int bus, int address,
+			const void *outdata, int outsize,
+			const void *indata, int insize)
+{
+	int ret = -1;
+	struct i2c_rdwr_ioctl_data data;
+	struct i2c_msg *msg = NULL;
+	int handle, fd;
+
+	/* open connection to i2c slave */
+	handle = i2c_open_dev(intf, bus, address);
+	if (handle < 0)
+		return -1;
+	fd = i2c_handles[handle].fd;
+
+	data.nmsgs = 0;
+
+	if (outsize) {
+		msg = mosys_realloc(msg, sizeof(*msg) * (data.nmsgs + 1));
+		msg[data.nmsgs].addr = address;
+		msg[data.nmsgs].flags = 0;
+		msg[data.nmsgs].len = outsize;
+		msg[data.nmsgs].buf = (char *)outdata;
+		data.nmsgs++;
+	}
+
+	if (insize) {
+		msg = mosys_realloc(msg, sizeof(*msg) * (data.nmsgs + 1));
+		msg[data.nmsgs].addr = address;
+		msg[data.nmsgs].flags = I2C_M_RD;
+		msg[data.nmsgs].len = insize;
+		msg[data.nmsgs].buf = (char *)indata;
+		data.nmsgs++;
+	}
+
+	data.msgs = msg;
+	/* send command to EC and read answer */
+#if defined (__linux__)
+	/* ioctl returns negative errno, else the number of messages executed */
+	ret = ioctl(fd, I2C_RDWR, &data);
+#else
+	ret = -ENOSYS;
+#endif
+
+	if (ret < 0) {
+		lperror(LOG_ERR, "i2c transfer failed");
+		ret = -1;
+	} else if (ret != data.nmsgs) {
+		lprintf(LOG_ERR, "ioctl executed wrong number of messages\n");
+		ret = -1;
+	} else {
+		ret = 0;
+	}
+
+	free(msg);
+	return ret;
+}
+
+static int smbus_read_reg(struct platform_intf *intf, int bus,
+			  int address, int reg, int length, void *data)
 {
 	int handle, fd, i;
 	int32_t result;
@@ -234,25 +280,13 @@
 }
 
 /*
- * i2c_read16_dev  -  Read bytes from I2C device using 16-bit register offset
- *
- * @intf:       platform interface
- * @bus:        I2C bus/adapter
- * @address:    I2C slave address
- * @reg:        I2C register offset (16-bit)
- * @length:     number of bytes to read (1-255)
- * @data:       data buffer
- *
- * returns number of bytes read
- * returns <0 to indicate failure
- *
  * We can't actually use i2c_smbus_read_block_data() because the driver
  * doesn't know how to do the 2-byte address write. So we do the best we can
  * by performing the address write once, then calling i2c_smbus_read_byte()
  * repeatedly to keep the overhead to a minimum.
  */
-static int i2c_read16_dev(struct platform_intf *intf,
-                          int bus, int address, int reg, int length, void *data)
+static int smbus_read16_dev(struct platform_intf *intf, int bus,
+			    int address, int reg, int length, void *data)
 {
 	uint8_t hi, lo;
 	int fd, handle, i;
@@ -297,20 +331,8 @@
 	return i;
 }
 
-/*
- * i2c_read_raw  -  read byte(s) from device without register addressing
- *
- * @intf:       platform interface
- * @bus:        I2C bus/adapter
- * @address:    I2C slave address
- * @length:	number of bytes to read
- * @data:       data buffer
- *
- * returns number of bytes read
- * returns <0 to indicate failure
- */
-static int i2c_read_raw(struct platform_intf *intf,
-                        int bus, int address, int length, void *data)
+static int smbus_read_raw(struct platform_intf *intf,
+			  int bus, int address, int length, void *data)
 {
 	int result, count;
 	int fd, handle;
@@ -342,22 +364,8 @@
 	return count;
 }
 
-/*
- * i2c_write_reg  -  Write bytes to I2C slave address
- *
- * @intf:       platform interface
- * @bus:        I2C bus/adapter
- * @address:    I2C slave address
- * @reg:        I2C register offset
- * @length:     number of bytes to read (1-255)
- * @data:       data buffer
- *
- * returns number of bytes written
- * returns <0 to indicate error
- */
-static int i2c_write_reg(struct platform_intf *intf,
-                         int bus,
-                         int address, int reg, int length, const void *data)
+static int smbus_write_reg(struct platform_intf *intf, int bus,
+			   int address, int reg, int length, const void *data)
 {
 	int handle, fd, i;
 	int32_t result;
@@ -394,22 +402,12 @@
 }
 
 /*
- * i2c_write16_buf  -  Write a buffer to I2C slave address using 16-bit offset
- *
- * @handle:     I2C device handle
- * @reg:        I2C register offset (16-bit)
- * @dp:         data buffer
- * @len:        number of bytes to write (1-32)
- *
- * returns number of bytes written
- * returns <0 to indicate error
- *
  * The LSByte of the 16-bit register offset is sent as the first byte of
  * the transfer buffer. Note the driver won't let us transfer more than
  * 32 bytes, and since we're using one data byte as the low byte of the
  * offset address, we have to perform the write in 31-byte chunks. Ugh.
  */
-static int i2c_write16_buf(int handle, int reg, const uint8_t *dp, int len)
+static int smbus_write16_buf(int handle, int reg, const uint8_t *dp, int len)
 {
 	uint8_t buf[32];
 	int32_t result;
@@ -450,23 +448,9 @@
 	return result;
 }
 
-/*
- * i2c_write16_dev  -  Write bytes to I2C slave address using 16-bit reg offset
- *
- * @intf:       platform interface
- * @bus:        I2C bus/adapter
- * @address:    I2C slave address
- * @reg:        I2C register offset (16-bit)
- * @length:     number of bytes to read (1-255)
- * @data:       data buffer
- *
- * returns number of bytes written
- * returns <0 to indicate error
- *
- */
-static int i2c_write16_dev(struct platform_intf *intf,
-                           int bus, int address, int reg,
-                           int length, const void *data)
+static int smbus_write16_dev(struct platform_intf *intf,
+			     int bus, int address, int reg,
+			     int length, const void *data)
 {
 	int handle, written = 0;
 	const uint8_t *data_ptr = (uint8_t *)data;
@@ -479,12 +463,12 @@
 
 	if (length == 0) {
 		/* useful for setting internal address counters in devices */
-		written = i2c_write16_buf(handle, reg, NULL, 0);
+		written = smbus_write16_buf(handle, reg, NULL, 0);
 	}
 
 	while (length) {
 		buf_len = __min(length, 31);
-		count = i2c_write16_buf(handle, reg, data_ptr, buf_len);
+		count = smbus_write16_buf(handle, reg, data_ptr, buf_len);
 		if (count != buf_len)
 			return written;
 		length -= count;
@@ -496,7 +480,7 @@
 			return written;
 
 		buf_len = 1;
-		count = i2c_write16_buf(handle, reg, data_ptr, buf_len);
+		count = smbus_write16_buf(handle, reg, data_ptr, buf_len);
 		if (count != buf_len)
 			return written;
 		length -= buf_len;
@@ -507,19 +491,8 @@
 	return written;
 }
 
-/*
- * i2c_write_raw  -  write byte(s) to device without register addressing
- *
- * @intf:       platform interface
- * @bus:        I2C bus/adapter
- * @address:    I2C slave address
- * @data:       data buffer
- *
- * returns number of bytes written
- * returns <0 to indicate failure
- */
-static int i2c_write_raw(struct platform_intf *intf,
-                         int bus, int address, int length, void *data)
+static int smbus_write_raw(struct platform_intf *intf,
+			   int bus, int address, int length, void *data)
 {
 	int handle, fd, count;
 	int32_t result;
@@ -549,16 +522,6 @@
 	return count;
 }
 
-/*
- * i2c_find_driver - Determine if i2c driver is loaded by scanning
- * /proc/modules.
- *
- * @intf:	Platform interface
- * @module: 	The name of the module to search for
- *
- * returns 0 if the module is not found or if /proc/modules does not exist
- * returns > 0 if the module is found
- */
 static int i2c_find_driver(struct platform_intf *intf, const char *module)
 {
 	char *path;
@@ -584,16 +547,6 @@
 	return ret;
 }
 
-/*
- * i2c_match_bus_name  -  Look for bus name
- *
- * @intf:	platform interface
- * @name:	bus name
- * @bus:	bus number
- *
- * returns 1 if bus name does match
- * returns 0 if bus name does not match
- */
 static int i2c_match_bus_name(struct platform_intf *intf,
                               int bus, const char *name)
 {
@@ -625,15 +578,9 @@
  * i2c_find_dir - Find a /sys directory or directories for a device's
  * description as printed in the /sys/bus/i2c/devices/<bus-addr>/name file.
  * All matching descriptions are inserted into a linked list.
- *
- * @intf:	Platform interface
- * @name: 	The device name to search for, eg "eeprom"
- *
- * returns the head of a linked list of matching devices if found.
- * returns NULL if no device found or if an error has occured.
  */
-static struct ll_node *i2c_find_dir(struct platform_intf *intf,
-                                    const char *name)
+static struct ll_node *i2c_find_sysfs_dir(struct platform_intf *intf,
+					  const char *name)
 {
 	char *path;
 	char s[32];
@@ -699,15 +646,16 @@
 
 /* I2C operations based on Linux /dev interface */
 struct i2c_intf i2c_dev_intf = {
-	.setup  	= i2c_setup_dev,
-	.destroy	= i2c_close_dev,
-	.read_reg	= i2c_read_reg,
-	.write_reg	= i2c_write_reg,
-	.read16		= i2c_read16_dev,
-	.write16	= i2c_write16_dev,
-	.read_raw	= i2c_read_raw,
-	.write_raw	= i2c_write_raw,
-	.find_driver	= i2c_find_driver,
-	.find_dir	= i2c_find_dir,
-	.match_bus	= i2c_match_bus_name,
+	.setup  		= i2c_setup_dev,
+	.destroy		= i2c_close_dev,
+	.i2c_transfer		= i2c_transfer,
+	.smbus_read_reg		= smbus_read_reg,
+	.smbus_write_reg	= smbus_write_reg,
+	.smbus_read16		= smbus_read16_dev,
+	.smbus_write16		= smbus_write16_dev,
+	.smbus_read_raw		= smbus_read_raw,
+	.smbus_write_raw	= smbus_write_raw,
+	.find_driver		= i2c_find_driver,
+	.find_sysfs_dir		= i2c_find_sysfs_dir,
+	.match_bus		= i2c_match_bus_name,
 };
diff --git a/lib/spd/spd.c b/lib/spd/spd.c
index 217231e..4cda4c8 100644
--- a/lib/spd/spd.c
+++ b/lib/spd/spd.c
@@ -74,11 +74,11 @@
 
 	switch (rw) {
 	case SPD_READ:
-		return intf->op->i2c->read_reg(intf, bus, address,
-					       reg, length, data);
+		return intf->op->i2c->smbus_read_reg(intf, bus, address,
+					             reg, length, data);
 	case SPD_WRITE:
-		return intf->op->i2c->write_reg(intf, bus, address,
-						reg, length, data);
+		return intf->op->i2c->smbus_write_reg(intf, bus, address,
+						      reg, length, data);
 	}
 
 	return -1;
diff --git a/platform/experimental/kaen/ec.c b/platform/experimental/kaen/ec.c
index 48320dd..7b32c51 100644
--- a/platform/experimental/kaen/ec.c
+++ b/platform/experimental/kaen/ec.c
@@ -56,7 +56,7 @@
 	if (version)
 		return version;
 
-	if (intf->op->i2c->read_reg(intf, 2, 0x1b, 0xf1, 2, buf) != 2) {
+	if (intf->op->i2c->smbus_read_reg(intf, 2, 0x1b, 0xf1, 2, buf) != 2) {
 		lprintf(LOG_ERR, "%s: failed to read EC firmware "
 		        "version\n", __func__);
 		return NULL;