Merge branch 'i2c/for-next' of git://git.kernel.org/pub/scm/linux/kernel/git/wsa...
[sfrench/cifs-2.6.git] / drivers / i2c / busses / i2c-cros-ec-tunnel.c
index 05e033c981151277b62628510f31814ec46ce1ee..875c22ae54004d4aba33c4a72c4bc398d47ac0a8 100644 (file)
@@ -16,6 +16,8 @@
 #include <linux/platform_device.h>
 #include <linux/slab.h>
 
+#define I2C_MAX_RETRIES 3
+
 /**
  * struct ec_i2c_device - Driver data for I2C tunnel
  *
@@ -94,7 +96,7 @@ static int ec_i2c_construct_message(u8 *buf, const struct i2c_msg i2c_msgs[],
                msg->addr_flags = i2c_msg->addr;
 
                if (i2c_msg->flags & I2C_M_TEN)
-                       msg->addr_flags |= EC_I2C_FLAG_10BIT;
+                       return -EINVAL;
 
                if (i2c_msg->flags & I2C_M_RD) {
                        msg->addr_flags |= EC_I2C_FLAG_READ;
@@ -218,7 +220,9 @@ static int ec_i2c_xfer(struct i2c_adapter *adap, struct i2c_msg i2c_msgs[],
                }
        }
 
-       ec_i2c_construct_message(request, i2c_msgs, num, bus_num);
+       result = ec_i2c_construct_message(request, i2c_msgs, num, bus_num);
+       if (result)
+               goto exit;
 
        msg.version = 0;
        msg.command = EC_CMD_I2C_PASSTHRU;
@@ -227,7 +231,7 @@ static int ec_i2c_xfer(struct i2c_adapter *adap, struct i2c_msg i2c_msgs[],
        msg.indata = response;
        msg.insize = response_len;
 
-       result = bus->ec->cmd_xfer(bus->ec, &msg);
+       result = cros_ec_cmd_xfer(bus->ec, &msg);
        if (result < 0)
                goto exit;
 
@@ -290,6 +294,7 @@ static int ec_i2c_probe(struct platform_device *pdev)
        bus->adap.algo_data = bus;
        bus->adap.dev.parent = &pdev->dev;
        bus->adap.dev.of_node = np;
+       bus->adap.retries = I2C_MAX_RETRIES;
 
        err = i2c_add_adapter(&bus->adap);
        if (err) {
@@ -310,11 +315,20 @@ static int ec_i2c_remove(struct platform_device *dev)
        return 0;
 }
 
+#ifdef CONFIG_OF
+static const struct of_device_id cros_ec_i2c_of_match[] = {
+       { .compatible = "google,cros-ec-i2c-tunnel" },
+       {},
+};
+MODULE_DEVICE_TABLE(of, cros_ec_i2c_of_match);
+#endif
+
 static struct platform_driver ec_i2c_tunnel_driver = {
        .probe = ec_i2c_probe,
        .remove = ec_i2c_remove,
        .driver = {
                .name = "cros-ec-i2c-tunnel",
+               .of_match_table = of_match_ptr(cros_ec_i2c_of_match),
        },
 };