]> git.karo-electronics.de Git - karo-tx-linux.git/blobdiff - drivers/mfd/cros_ec_spi.c
mfd: cros_ec: cleanup: remove unused fields from struct cros_ec_device
[karo-tx-linux.git] / drivers / mfd / cros_ec_spi.c
index 0b8d32829166403f1812dab5c063c050122c040e..6e929b5f3bd34e91fa97d50f978daeeb8a03750c 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;
@@ -261,23 +261,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);
        ktime_get_ts(&ts);
@@ -292,17 +288,23 @@ static int cros_ec_command_spi_xfer(struct cros_ec_device *ec_dev,
        /* check response error code */
        ptr = ec_dev->din;
        if (ptr[0]) {
+               if (ptr[0] == EC_RES_IN_PROGRESS) {
+                       dev_dbg(ec_dev->dev, "command 0x%02x in progress\n",
+                               ec_msg->command);
+                       ret = -EAGAIN;
+                       goto exit;
+               }
                dev_warn(ec_dev->dev, "command 0x%02x returned an error %d\n",
-                        ec_msg->cmd, ptr[0]);
+                        ec_msg->command, ptr[0]);
                debug_packet(ec_dev->dev, "in_err", ptr, len);
                ret = -EINVAL;
                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;
        }
@@ -310,8 +312,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;
 
@@ -368,11 +370,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;
@@ -385,6 +386,8 @@ static int cros_ec_spi_probe(struct spi_device *spi)
                return err;
        }
 
+       device_init_wakeup(&spi->dev, true);
+
        return 0;
 }