|
@@ -40,6 +40,38 @@ static int wait_for_sync(struct cros_ec_dev *dev)
|
|
|
return 0;
|
|
|
}
|
|
|
|
|
|
+int cros_ec_lpc_packet(struct udevice *udev, int out_bytes, int in_bytes)
|
|
|
+{
|
|
|
+ struct cros_ec_dev *dev = dev_get_uclass_priv(udev);
|
|
|
+ uint8_t *d;
|
|
|
+ int i;
|
|
|
+
|
|
|
+ if (out_bytes > EC_LPC_HOST_PACKET_SIZE)
|
|
|
+ return log_msg_ret("Cannot send that many bytes\n", -E2BIG);
|
|
|
+
|
|
|
+ if (in_bytes > EC_LPC_HOST_PACKET_SIZE)
|
|
|
+ return log_msg_ret("Cannot receive that many bytes\n", -E2BIG);
|
|
|
+
|
|
|
+ if (wait_for_sync(dev))
|
|
|
+ return log_msg_ret("Timeout waiting ready\n", -ETIMEDOUT);
|
|
|
+
|
|
|
+ /* Write data */
|
|
|
+ for (i = 0, d = (uint8_t *)dev->dout; i < out_bytes; i++, d++)
|
|
|
+ outb(*d, EC_LPC_ADDR_HOST_PACKET + i);
|
|
|
+
|
|
|
+ /* Start the command */
|
|
|
+ outb(EC_COMMAND_PROTOCOL_3, EC_LPC_ADDR_HOST_CMD);
|
|
|
+
|
|
|
+ if (wait_for_sync(dev))
|
|
|
+ return log_msg_ret("Timeout waiting ready\n", -ETIMEDOUT);
|
|
|
+
|
|
|
+ /* Read back args */
|
|
|
+ for (i = 0, d = dev->din; i < in_bytes; i++, d++)
|
|
|
+ *d = inb(EC_LPC_ADDR_HOST_PACKET + i);
|
|
|
+
|
|
|
+ return in_bytes;
|
|
|
+}
|
|
|
+
|
|
|
int cros_ec_lpc_command(struct udevice *udev, uint8_t cmd, int cmd_version,
|
|
|
const uint8_t *dout, int dout_len,
|
|
|
uint8_t **dinp, int din_len)
|
|
@@ -200,6 +232,7 @@ static int cros_ec_probe(struct udevice *dev)
|
|
|
}
|
|
|
|
|
|
static struct dm_cros_ec_ops cros_ec_ops = {
|
|
|
+ .packet = cros_ec_lpc_packet,
|
|
|
.command = cros_ec_lpc_command,
|
|
|
.check_version = cros_ec_lpc_check_version,
|
|
|
};
|