linux/include/linux/platform_data/cros_ec_proto.h
<<
>>
Prefs
   1/* SPDX-License-Identifier: GPL-2.0 */
   2/*
   3 * ChromeOS Embedded Controller protocol interface.
   4 *
   5 * Copyright (C) 2012 Google, Inc
   6 */
   7
   8#ifndef __LINUX_CROS_EC_PROTO_H
   9#define __LINUX_CROS_EC_PROTO_H
  10
  11#include <linux/device.h>
  12#include <linux/mutex.h>
  13#include <linux/notifier.h>
  14
  15#include <linux/platform_data/cros_ec_commands.h>
  16
  17#define CROS_EC_DEV_NAME        "cros_ec"
  18#define CROS_EC_DEV_FP_NAME     "cros_fp"
  19#define CROS_EC_DEV_ISH_NAME    "cros_ish"
  20#define CROS_EC_DEV_PD_NAME     "cros_pd"
  21#define CROS_EC_DEV_SCP_NAME    "cros_scp"
  22#define CROS_EC_DEV_TP_NAME     "cros_tp"
  23
  24/*
  25 * The EC is unresponsive for a time after a reboot command.  Add a
  26 * simple delay to make sure that the bus stays locked.
  27 */
  28#define EC_REBOOT_DELAY_MS              50
  29
  30/*
  31 * Max bus-specific overhead incurred by request/responses.
  32 * I2C requires 1 additional byte for requests.
  33 * I2C requires 2 additional bytes for responses.
  34 * SPI requires up to 32 additional bytes for responses.
  35 */
  36#define EC_PROTO_VERSION_UNKNOWN        0
  37#define EC_MAX_REQUEST_OVERHEAD         1
  38#define EC_MAX_RESPONSE_OVERHEAD        32
  39
  40/*
  41 * Command interface between EC and AP, for LPC, I2C and SPI interfaces.
  42 */
  43enum {
  44        EC_MSG_TX_HEADER_BYTES  = 3,
  45        EC_MSG_TX_TRAILER_BYTES = 1,
  46        EC_MSG_TX_PROTO_BYTES   = EC_MSG_TX_HEADER_BYTES +
  47                                  EC_MSG_TX_TRAILER_BYTES,
  48        EC_MSG_RX_PROTO_BYTES   = 3,
  49
  50        /* Max length of messages for proto 2*/
  51        EC_PROTO2_MSG_BYTES     = EC_PROTO2_MAX_PARAM_SIZE +
  52                                  EC_MSG_TX_PROTO_BYTES,
  53
  54        EC_MAX_MSG_BYTES        = 64 * 1024,
  55};
  56
  57/**
  58 * struct cros_ec_command - Information about a ChromeOS EC command.
  59 * @version: Command version number (often 0).
  60 * @command: Command to send (EC_CMD_...).
  61 * @outsize: Outgoing length in bytes.
  62 * @insize: Max number of bytes to accept from the EC.
  63 * @result: EC's response to the command (separate from communication failure).
  64 * @data: Where to put the incoming data from EC and outgoing data to EC.
  65 */
  66struct cros_ec_command {
  67        uint32_t version;
  68        uint32_t command;
  69        uint32_t outsize;
  70        uint32_t insize;
  71        uint32_t result;
  72        uint8_t data[0];
  73};
  74
  75/**
  76 * struct cros_ec_device - Information about a ChromeOS EC device.
  77 * @phys_name: Name of physical comms layer (e.g. 'i2c-4').
  78 * @dev: Device pointer for physical comms device
  79 * @was_wake_device: True if this device was set to wake the system from
  80 *                   sleep at the last suspend.
  81 * @cros_class: The class structure for this device.
  82 * @cmd_readmem: Direct read of the EC memory-mapped region, if supported.
  83 *     @offset: Is within EC_LPC_ADDR_MEMMAP region.
  84 *     @bytes: Number of bytes to read. zero means "read a string" (including
  85 *             the trailing '\0'). At most only EC_MEMMAP_SIZE bytes can be
  86 *             read. Caller must ensure that the buffer is large enough for the
  87 *             result when reading a string.
  88 * @max_request: Max size of message requested.
  89 * @max_response: Max size of message response.
  90 * @max_passthru: Max sice of passthru message.
  91 * @proto_version: The protocol version used for this device.
  92 * @priv: Private data.
  93 * @irq: Interrupt to use.
  94 * @id: Device id.
  95 * @din: Input buffer (for data from EC). This buffer will always be
  96 *       dword-aligned and include enough space for up to 7 word-alignment
  97 *       bytes also, so we can ensure that the body of the message is always
  98 *       dword-aligned (64-bit). We use this alignment to keep ARM and x86
  99 *       happy. Probably word alignment would be OK, there might be a small
 100 *       performance advantage to using dword.
 101 * @dout: Output buffer (for data to EC). This buffer will always be
 102 *        dword-aligned and include enough space for up to 7 word-alignment
 103 *        bytes also, so we can ensure that the body of the message is always
 104 *        dword-aligned (64-bit). We use this alignment to keep ARM and x86
 105 *        happy. Probably word alignment would be OK, there might be a small
 106 *        performance advantage to using dword.
 107 * @din_size: Size of din buffer to allocate (zero to use static din).
 108 * @dout_size: Size of dout buffer to allocate (zero to use static dout).
 109 * @wake_enabled: True if this device can wake the system from sleep.
 110 * @suspended: True if this device had been suspended.
 111 * @cmd_xfer: Send command to EC and get response.
 112 *            Returns the number of bytes received if the communication
 113 *            succeeded, but that doesn't mean the EC was happy with the
 114 *            command. The caller should check msg.result for the EC's result
 115 *            code.
 116 * @pkt_xfer: Send packet to EC and get response.
 117 * @lock: One transaction at a time.
 118 * @mkbp_event_supported: True if this EC supports the MKBP event protocol.
 119 * @host_sleep_v1: True if this EC supports the sleep v1 command.
 120 * @event_notifier: Interrupt event notifier for transport devices.
 121 * @event_data: Raw payload transferred with the MKBP event.
 122 * @event_size: Size in bytes of the event data.
 123 * @host_event_wake_mask: Mask of host events that cause wake from suspend.
 124 * @ec: The platform_device used by the mfd driver to interface with the
 125 *      main EC.
 126 * @pd: The platform_device used by the mfd driver to interface with the
 127 *      PD behind an EC.
 128 */
 129struct cros_ec_device {
 130        /* These are used by other drivers that want to talk to the EC */
 131        const char *phys_name;
 132        struct device *dev;
 133        bool was_wake_device;
 134        struct class *cros_class;
 135        int (*cmd_readmem)(struct cros_ec_device *ec, unsigned int offset,
 136                           unsigned int bytes, void *dest);
 137
 138        /* These are used to implement the platform-specific interface */
 139        u16 max_request;
 140        u16 max_response;
 141        u16 max_passthru;
 142        u16 proto_version;
 143        void *priv;
 144        int irq;
 145        u8 *din;
 146        u8 *dout;
 147        int din_size;
 148        int dout_size;
 149        bool wake_enabled;
 150        bool suspended;
 151        int (*cmd_xfer)(struct cros_ec_device *ec,
 152                        struct cros_ec_command *msg);
 153        int (*pkt_xfer)(struct cros_ec_device *ec,
 154                        struct cros_ec_command *msg);
 155        struct mutex lock;
 156        bool mkbp_event_supported;
 157        bool host_sleep_v1;
 158        struct blocking_notifier_head event_notifier;
 159
 160        struct ec_response_get_next_event_v1 event_data;
 161        int event_size;
 162        u32 host_event_wake_mask;
 163        u32 last_resume_result;
 164
 165        /* The platform devices used by the mfd driver */
 166        struct platform_device *ec;
 167        struct platform_device *pd;
 168};
 169
 170/**
 171 * struct cros_ec_sensor_platform - ChromeOS EC sensor platform information.
 172 * @sensor_num: Id of the sensor, as reported by the EC.
 173 */
 174struct cros_ec_sensor_platform {
 175        u8 sensor_num;
 176};
 177
 178/**
 179 * struct cros_ec_platform - ChromeOS EC platform information.
 180 * @ec_name: Name of EC device (e.g. 'cros-ec', 'cros-pd', ...)
 181 *           used in /dev/ and sysfs.
 182 * @cmd_offset: Offset to apply for each command. Set when
 183 *              registering a device behind another one.
 184 */
 185struct cros_ec_platform {
 186        const char *ec_name;
 187        u16 cmd_offset;
 188};
 189
 190/**
 191 * cros_ec_suspend() - Handle a suspend operation for the ChromeOS EC device.
 192 * @ec_dev: Device to suspend.
 193 *
 194 * This can be called by drivers to handle a suspend event.
 195 *
 196 * Return: 0 on success or negative error code.
 197 */
 198int cros_ec_suspend(struct cros_ec_device *ec_dev);
 199
 200/**
 201 * cros_ec_resume() - Handle a resume operation for the ChromeOS EC device.
 202 * @ec_dev: Device to resume.
 203 *
 204 * This can be called by drivers to handle a resume event.
 205 *
 206 * Return: 0 on success or negative error code.
 207 */
 208int cros_ec_resume(struct cros_ec_device *ec_dev);
 209
 210/**
 211 * cros_ec_prepare_tx() - Prepare an outgoing message in the output buffer.
 212 * @ec_dev: Device to register.
 213 * @msg: Message to write.
 214 *
 215 * This is intended to be used by all ChromeOS EC drivers, but at present
 216 * only SPI uses it. Once LPC uses the same protocol it can start using it.
 217 * I2C could use it now, with a refactor of the existing code.
 218 *
 219 * Return: 0 on success or negative error code.
 220 */
 221int cros_ec_prepare_tx(struct cros_ec_device *ec_dev,
 222                       struct cros_ec_command *msg);
 223
 224/**
 225 * cros_ec_check_result() - Check ec_msg->result.
 226 * @ec_dev: EC device.
 227 * @msg: Message to check.
 228 *
 229 * This is used by ChromeOS EC drivers to check the ec_msg->result for
 230 * errors and to warn about them.
 231 *
 232 * Return: 0 on success or negative error code.
 233 */
 234int cros_ec_check_result(struct cros_ec_device *ec_dev,
 235                         struct cros_ec_command *msg);
 236
 237/**
 238 * cros_ec_cmd_xfer() - Send a command to the ChromeOS EC.
 239 * @ec_dev: EC device.
 240 * @msg: Message to write.
 241 *
 242 * Call this to send a command to the ChromeOS EC.  This should be used
 243 * instead of calling the EC's cmd_xfer() callback directly.
 244 *
 245 * Return: 0 on success or negative error code.
 246 */
 247int cros_ec_cmd_xfer(struct cros_ec_device *ec_dev,
 248                     struct cros_ec_command *msg);
 249
 250/**
 251 * cros_ec_cmd_xfer_status() - Send a command to the ChromeOS EC.
 252 * @ec_dev: EC device.
 253 * @msg: Message to write.
 254 *
 255 * This function is identical to cros_ec_cmd_xfer, except it returns success
 256 * status only if both the command was transmitted successfully and the EC
 257 * replied with success status. It's not necessary to check msg->result when
 258 * using this function.
 259 *
 260 * Return: The number of bytes transferred on success or negative error code.
 261 */
 262int cros_ec_cmd_xfer_status(struct cros_ec_device *ec_dev,
 263                            struct cros_ec_command *msg);
 264
 265/**
 266 * cros_ec_register() - Register a new ChromeOS EC, using the provided info.
 267 * @ec_dev: Device to register.
 268 *
 269 * Before calling this, allocate a pointer to a new device and then fill
 270 * in all the fields up to the --private-- marker.
 271 *
 272 * Return: 0 on success or negative error code.
 273 */
 274int cros_ec_register(struct cros_ec_device *ec_dev);
 275
 276/**
 277 * cros_ec_unregister() - Remove a ChromeOS EC.
 278 * @ec_dev: Device to unregister.
 279 *
 280 * Call this to deregister a ChromeOS EC, then clean up any private data.
 281 *
 282 * Return: 0 on success or negative error code.
 283 */
 284int cros_ec_unregister(struct cros_ec_device *ec_dev);
 285
 286/**
 287 * cros_ec_query_all() -  Query the protocol version supported by the
 288 *         ChromeOS EC.
 289 * @ec_dev: Device to register.
 290 *
 291 * Return: 0 on success or negative error code.
 292 */
 293int cros_ec_query_all(struct cros_ec_device *ec_dev);
 294
 295/**
 296 * cros_ec_get_next_event() - Fetch next event from the ChromeOS EC.
 297 * @ec_dev: Device to fetch event from.
 298 * @wake_event: Pointer to a bool set to true upon return if the event might be
 299 *              treated as a wake event. Ignored if null.
 300 *
 301 * Return: negative error code on errors; 0 for no data; or else number of
 302 * bytes received (i.e., an event was retrieved successfully). Event types are
 303 * written out to @ec_dev->event_data.event_type on success.
 304 */
 305int cros_ec_get_next_event(struct cros_ec_device *ec_dev, bool *wake_event);
 306
 307/**
 308 * cros_ec_get_host_event() - Return a mask of event set by the ChromeOS EC.
 309 * @ec_dev: Device to fetch event from.
 310 *
 311 * When MKBP is supported, when the EC raises an interrupt, we collect the
 312 * events raised and call the functions in the ec notifier. This function
 313 * is a helper to know which events are raised.
 314 *
 315 * Return: 0 on error or non-zero bitmask of one or more EC_HOST_EVENT_*.
 316 */
 317u32 cros_ec_get_host_event(struct cros_ec_device *ec_dev);
 318
 319#endif /* __LINUX_CROS_EC_PROTO_H */
 320