]> git.karo-electronics.de Git - karo-tx-linux.git/blobdiff - drivers/mfd/cros_ec_spi.c
Merge tag 'backlight-for-linus-3.17' of git://git.kernel.org/pub/scm/linux/kernel...
[karo-tx-linux.git] / drivers / mfd / cros_ec_spi.c
index 8c1c7cc373f8fe3456ca4a14bfbb72df676c5461..588c700af39c17882fb4c8b5af9131d195427c5e 100644 (file)
@@ -73,7 +73,7 @@
  *     if no record
  * @end_of_msg_delay: used to set the delay_usecs on the spi_transfer that
  *      is sent when we want to turn off CS at the end of a transaction.
- * @lock: mutex to ensure only one user of cros_ec_command_spi_xfer at a time
+ * @lock: mutex to ensure only one user of cros_ec_cmd_xfer_spi at a time
  */
 struct cros_ec_spi {
        struct spi_device *spi;
@@ -210,13 +210,13 @@ static int cros_ec_spi_receive_response(struct cros_ec_device *ec_dev,
 }
 
 /**
- * cros_ec_command_spi_xfer - Transfer a message over SPI and receive the reply
+ * cros_ec_cmd_xfer_spi - Transfer a message over SPI and receive the reply
  *
  * @ec_dev: ChromeOS EC device
  * @ec_msg: Message to transfer
  */
-static int cros_ec_command_spi_xfer(struct cros_ec_device *ec_dev,
-                                   struct cros_ec_msg *ec_msg)
+static int cros_ec_cmd_xfer_spi(struct cros_ec_device *ec_dev,
+                               struct cros_ec_command *ec_msg)
 {
        struct cros_ec_spi *ec_spi = ec_dev->priv;
        struct spi_transfer trans;
@@ -258,23 +258,19 @@ static int cros_ec_command_spi_xfer(struct cros_ec_device *ec_dev,
        /* Get the response */
        if (!ret) {
                ret = cros_ec_spi_receive_response(ec_dev,
-                               ec_msg->in_len + EC_MSG_TX_PROTO_BYTES);
+                               ec_msg->insize + EC_MSG_TX_PROTO_BYTES);
        } else {
                dev_err(ec_dev->dev, "spi transfer failed: %d\n", ret);
        }
 
-       /* turn off CS */
+       /*
+        * Turn off CS, possibly adding a delay to ensure the rising edge
+        * doesn't come too soon after the end of the data.
+        */
        spi_message_init(&msg);
-
-       if (ec_spi->end_of_msg_delay) {
-               /*
-                * Add delay for last transaction, to ensure the rising edge
-                * doesn't come too soon after the end of the data.
-                */
-               memset(&trans, 0, sizeof(trans));
-               trans.delay_usecs = ec_spi->end_of_msg_delay;
-               spi_message_add_tail(&trans, &msg);
-       }
+       memset(&trans, 0, sizeof(trans));
+       trans.delay_usecs = ec_spi->end_of_msg_delay;
+       spi_message_add_tail(&trans, &msg);
 
        final_ret = spi_sync(ec_spi->spi, &msg);
        ec_spi->last_transfer_ns = ktime_get_ns();
@@ -285,20 +281,19 @@ static int cros_ec_command_spi_xfer(struct cros_ec_device *ec_dev,
                goto exit;
        }
 
-       /* check response error code */
        ptr = ec_dev->din;
-       if (ptr[0]) {
-               dev_warn(ec_dev->dev, "command 0x%02x returned an error %d\n",
-                        ec_msg->cmd, ptr[0]);
-               debug_packet(ec_dev->dev, "in_err", ptr, len);
-               ret = -EINVAL;
+
+       /* check response error code */
+       ec_msg->result = ptr[0];
+       ret = cros_ec_check_result(ec_dev, ec_msg);
+       if (ret)
                goto exit;
-       }
+
        len = ptr[1];
        sum = ptr[0] + ptr[1];
-       if (len > ec_msg->in_len) {
+       if (len > ec_msg->insize) {
                dev_err(ec_dev->dev, "packet too long (%d bytes, expected %d)",
-                       len, ec_msg->in_len);
+                       len, ec_msg->insize);
                ret = -ENOSPC;
                goto exit;
        }
@@ -306,8 +301,8 @@ static int cros_ec_command_spi_xfer(struct cros_ec_device *ec_dev,
        /* copy response packet payload and compute checksum */
        for (i = 0; i < len; i++) {
                sum += ptr[i + 2];
-               if (ec_msg->in_len)
-                       ec_msg->in_buf[i] = ptr[i + 2];
+               if (ec_msg->insize)
+                       ec_msg->indata[i] = ptr[i + 2];
        }
        sum &= 0xff;
 
@@ -321,7 +316,7 @@ static int cros_ec_command_spi_xfer(struct cros_ec_device *ec_dev,
                goto exit;
        }
 
-       ret = 0;
+       ret = len;
 exit:
        mutex_unlock(&ec_spi->lock);
        return ret;
@@ -364,11 +359,10 @@ static int cros_ec_spi_probe(struct spi_device *spi)
        cros_ec_spi_dt_probe(ec_spi, dev);
 
        spi_set_drvdata(spi, ec_dev);
-       ec_dev->name = "SPI";
        ec_dev->dev = dev;
        ec_dev->priv = ec_spi;
        ec_dev->irq = spi->irq;
-       ec_dev->command_xfer = cros_ec_command_spi_xfer;
+       ec_dev->cmd_xfer = cros_ec_cmd_xfer_spi;
        ec_dev->ec_name = ec_spi->spi->modalias;
        ec_dev->phys_name = dev_name(&ec_spi->spi->dev);
        ec_dev->parent = &ec_spi->spi->dev;
@@ -381,6 +375,8 @@ static int cros_ec_spi_probe(struct spi_device *spi)
                return err;
        }
 
+       device_init_wakeup(&spi->dev, true);
+
        return 0;
 }