// SPDX-License-Identifier: GPL-2.0 /* * Mailbox interface for Wilco Embedded Controller * * Copyright 2018 Google LLC * * The Wilco EC is similar to a typical ChromeOS embedded controller. * It uses the same MEC based low-level communication and a similar * protocol, but with some important differences. The EC firmware does * not support the same mailbox commands so it is not registered as a * cros_ec device type. * * Most messages follow a standard format, but there are some exceptions * and an interface is provided to do direct/raw transactions that do not * make assumptions about byte placement. */ #include <linux/delay.h> #include <linux/device.h> #include <linux/io.h> #include <linux/platform_data/wilco-ec.h> #include <linux/platform_device.h> #include "../cros_ec_lpc_mec.h" /* Version of mailbox interface */ #define EC_MAILBOX_VERSION … /* Command to start mailbox transaction */ #define EC_MAILBOX_START_COMMAND … /* Version of EC protocol */ #define EC_MAILBOX_PROTO_VERSION … /* Number of header bytes to be counted as data bytes */ #define EC_MAILBOX_DATA_EXTRA … /* Maximum timeout */ #define EC_MAILBOX_TIMEOUT … /* EC response flags */ #define EC_CMDR_DATA … #define EC_CMDR_PENDING … #define EC_CMDR_BUSY … #define EC_CMDR_CMD … /** * wilco_ec_response_timed_out() - Wait for EC response. * @ec: EC device. * * Return: true if EC timed out, false if EC did not time out. */ static bool wilco_ec_response_timed_out(struct wilco_ec_device *ec) { … } /** * wilco_ec_checksum() - Compute 8-bit checksum over data range. * @data: Data to checksum. * @size: Number of bytes to checksum. * * Return: 8-bit checksum of provided data. */ static u8 wilco_ec_checksum(const void *data, size_t size) { … } /** * wilco_ec_prepare() - Prepare the request structure for the EC. * @msg: EC message with request information. * @rq: EC request structure to fill. */ static void wilco_ec_prepare(struct wilco_ec_message *msg, struct wilco_ec_request *rq) { … } /** * wilco_ec_transfer() - Perform actual data transfer. * @ec: EC device. * @msg: EC message data for request and response. * @rq: Filled in request structure * * Context: ec->mailbox_lock should be held while using this function. * Return: number of bytes received or negative error code on failure. */ static int wilco_ec_transfer(struct wilco_ec_device *ec, struct wilco_ec_message *msg, struct wilco_ec_request *rq) { … } /** * wilco_ec_mailbox() - Send EC request and receive EC response. * @ec: EC device. * @msg: EC message data for request and response. * * On entry msg->type, msg->request_size, and msg->request_data should all be * filled in. If desired, msg->flags can be set. * * If a response is expected, msg->response_size should be set, and * msg->response_data should point to a buffer with enough space. On exit * msg->response_data will be filled. * * Return: number of bytes received or negative error code on failure. */ int wilco_ec_mailbox(struct wilco_ec_device *ec, struct wilco_ec_message *msg) { … } EXPORT_SYMBOL_GPL(…);