188364387SHung-ying Tyan /* 288364387SHung-ying Tyan * Chromium OS cros_ec driver 388364387SHung-ying Tyan * 488364387SHung-ying Tyan * Copyright (c) 2012 The Chromium OS Authors. 588364387SHung-ying Tyan * 61a459660SWolfgang Denk * SPDX-License-Identifier: GPL-2.0+ 788364387SHung-ying Tyan */ 888364387SHung-ying Tyan 988364387SHung-ying Tyan #ifndef _CROS_EC_H 1088364387SHung-ying Tyan #define _CROS_EC_H 1188364387SHung-ying Tyan 1288364387SHung-ying Tyan #include <linux/compiler.h> 1388364387SHung-ying Tyan #include <ec_commands.h> 1488364387SHung-ying Tyan #include <cros_ec_message.h> 1532f8a19fSSimon Glass #include <asm/gpio.h> 16b7e0d73bSSimon Glass #include <dm/of_extra.h> 1788364387SHung-ying Tyan 1888364387SHung-ying Tyan /* Our configuration information */ 1988364387SHung-ying Tyan struct cros_ec_dev { 2084d6cbd3SSimon Glass struct udevice *dev; /* Transport device */ 2132f8a19fSSimon Glass struct gpio_desc ec_int; /* GPIO used as EC interrupt line */ 22e8c12662SRandall Spangler int protocol_version; /* Protocol version to use */ 2388364387SHung-ying Tyan int optimise_flash_write; /* Don't write erased flash blocks */ 2488364387SHung-ying Tyan 2588364387SHung-ying Tyan /* 2688364387SHung-ying Tyan * These two buffers will always be dword-aligned and include enough 2788364387SHung-ying Tyan * space for up to 7 word-alignment bytes also, so we can ensure that 2888364387SHung-ying Tyan * the body of the message is always dword-aligned (64-bit). 2988364387SHung-ying Tyan * 3088364387SHung-ying Tyan * We use this alignment to keep ARM and x86 happy. Probably word 3188364387SHung-ying Tyan * alignment would be OK, there might be a small performance advantage 3288364387SHung-ying Tyan * to using dword. 3388364387SHung-ying Tyan */ 3488364387SHung-ying Tyan uint8_t din[ALIGN(MSG_BYTES + sizeof(int64_t), sizeof(int64_t))] 3588364387SHung-ying Tyan __aligned(sizeof(int64_t)); 3688364387SHung-ying Tyan uint8_t dout[ALIGN(MSG_BYTES + sizeof(int64_t), sizeof(int64_t))] 3788364387SHung-ying Tyan __aligned(sizeof(int64_t)); 3888364387SHung-ying Tyan }; 3988364387SHung-ying Tyan 4088364387SHung-ying Tyan /* 4188364387SHung-ying Tyan * Hard-code the number of columns we happen to know we have right now. It 4288364387SHung-ying Tyan * would be more correct to call cros_ec_info() at startup and determine the 4388364387SHung-ying Tyan * actual number of keyboard cols from there. 4488364387SHung-ying Tyan */ 4588364387SHung-ying Tyan #define CROS_EC_KEYSCAN_COLS 13 4688364387SHung-ying Tyan 4788364387SHung-ying Tyan /* Information returned by a key scan */ 4888364387SHung-ying Tyan struct mbkp_keyscan { 4988364387SHung-ying Tyan uint8_t data[CROS_EC_KEYSCAN_COLS]; 5088364387SHung-ying Tyan }; 5188364387SHung-ying Tyan 52d7f25f35SSimon Glass /* Holds information about the Chrome EC */ 53d7f25f35SSimon Glass struct fdt_cros_ec { 54d7f25f35SSimon Glass struct fmap_entry flash; /* Address and size of EC flash */ 55d7f25f35SSimon Glass /* 56d7f25f35SSimon Glass * Byte value of erased flash, or -1 if not known. It is normally 57d7f25f35SSimon Glass * 0xff but some flash devices use 0 (e.g. STM32Lxxx) 58d7f25f35SSimon Glass */ 59d7f25f35SSimon Glass int flash_erase_value; 60d7f25f35SSimon Glass struct fmap_entry region[EC_FLASH_REGION_COUNT]; 61d7f25f35SSimon Glass }; 62d7f25f35SSimon Glass 6388364387SHung-ying Tyan /** 6488364387SHung-ying Tyan * Read the ID of the CROS-EC device 6588364387SHung-ying Tyan * 6688364387SHung-ying Tyan * The ID is a string identifying the CROS-EC device. 6788364387SHung-ying Tyan * 6888364387SHung-ying Tyan * @param dev CROS-EC device 6988364387SHung-ying Tyan * @param id Place to put the ID 7088364387SHung-ying Tyan * @param maxlen Maximum length of the ID field 7188364387SHung-ying Tyan * @return 0 if ok, -1 on error 7288364387SHung-ying Tyan */ 7388364387SHung-ying Tyan int cros_ec_read_id(struct cros_ec_dev *dev, char *id, int maxlen); 7488364387SHung-ying Tyan 7588364387SHung-ying Tyan /** 7688364387SHung-ying Tyan * Read a keyboard scan from the CROS-EC device 7788364387SHung-ying Tyan * 7888364387SHung-ying Tyan * Send a message requesting a keyboard scan and return the result 7988364387SHung-ying Tyan * 8088364387SHung-ying Tyan * @param dev CROS-EC device 8188364387SHung-ying Tyan * @param scan Place to put the scan results 8288364387SHung-ying Tyan * @return 0 if ok, -1 on error 8388364387SHung-ying Tyan */ 84745009c4SSimon Glass int cros_ec_scan_keyboard(struct udevice *dev, struct mbkp_keyscan *scan); 8588364387SHung-ying Tyan 8688364387SHung-ying Tyan /** 8788364387SHung-ying Tyan * Read which image is currently running on the CROS-EC device. 8888364387SHung-ying Tyan * 8988364387SHung-ying Tyan * @param dev CROS-EC device 9088364387SHung-ying Tyan * @param image Destination for image identifier 9188364387SHung-ying Tyan * @return 0 if ok, <0 on error 9288364387SHung-ying Tyan */ 9388364387SHung-ying Tyan int cros_ec_read_current_image(struct cros_ec_dev *dev, 9488364387SHung-ying Tyan enum ec_current_image *image); 9588364387SHung-ying Tyan 9688364387SHung-ying Tyan /** 9788364387SHung-ying Tyan * Read the hash of the CROS-EC device firmware. 9888364387SHung-ying Tyan * 9988364387SHung-ying Tyan * @param dev CROS-EC device 10088364387SHung-ying Tyan * @param hash Destination for hash information 10188364387SHung-ying Tyan * @return 0 if ok, <0 on error 10288364387SHung-ying Tyan */ 10388364387SHung-ying Tyan int cros_ec_read_hash(struct cros_ec_dev *dev, 10488364387SHung-ying Tyan struct ec_response_vboot_hash *hash); 10588364387SHung-ying Tyan 10688364387SHung-ying Tyan /** 10788364387SHung-ying Tyan * Send a reboot command to the CROS-EC device. 10888364387SHung-ying Tyan * 10988364387SHung-ying Tyan * Note that some reboot commands (such as EC_REBOOT_COLD) also reboot the AP. 11088364387SHung-ying Tyan * 11188364387SHung-ying Tyan * @param dev CROS-EC device 11288364387SHung-ying Tyan * @param cmd Reboot command 11388364387SHung-ying Tyan * @param flags Flags for reboot command (EC_REBOOT_FLAG_*) 11488364387SHung-ying Tyan * @return 0 if ok, <0 on error 11588364387SHung-ying Tyan */ 11688364387SHung-ying Tyan int cros_ec_reboot(struct cros_ec_dev *dev, enum ec_reboot_cmd cmd, 11788364387SHung-ying Tyan uint8_t flags); 11888364387SHung-ying Tyan 11988364387SHung-ying Tyan /** 12088364387SHung-ying Tyan * Check if the CROS-EC device has an interrupt pending. 12188364387SHung-ying Tyan * 12288364387SHung-ying Tyan * Read the status of the external interrupt connected to the CROS-EC device. 12388364387SHung-ying Tyan * If no external interrupt is configured, this always returns 1. 12488364387SHung-ying Tyan * 12588364387SHung-ying Tyan * @param dev CROS-EC device 12688364387SHung-ying Tyan * @return 0 if no interrupt is pending 12788364387SHung-ying Tyan */ 128745009c4SSimon Glass int cros_ec_interrupt_pending(struct udevice *dev); 12988364387SHung-ying Tyan 13088364387SHung-ying Tyan enum { 13188364387SHung-ying Tyan CROS_EC_OK, 13288364387SHung-ying Tyan CROS_EC_ERR = 1, 13388364387SHung-ying Tyan CROS_EC_ERR_FDT_DECODE, 13488364387SHung-ying Tyan CROS_EC_ERR_CHECK_VERSION, 13588364387SHung-ying Tyan CROS_EC_ERR_READ_ID, 13688364387SHung-ying Tyan CROS_EC_ERR_DEV_INIT, 13788364387SHung-ying Tyan }; 13888364387SHung-ying Tyan 13988364387SHung-ying Tyan /** 140836bb6e8SSimon Glass * Initialise the Chromium OS EC driver 14188364387SHung-ying Tyan * 14288364387SHung-ying Tyan * @param blob Device tree blob containing setup information 14388364387SHung-ying Tyan * @param cros_ecp Returns pointer to the cros_ec device, or NULL if none 14488364387SHung-ying Tyan * @return 0 if we got an cros_ec device and all is well (or no cros_ec is 14588364387SHung-ying Tyan * expected), -ve if we should have an cros_ec device but failed to find 14688364387SHung-ying Tyan * one, or init failed (-CROS_EC_ERR_...). 14788364387SHung-ying Tyan */ 14888364387SHung-ying Tyan int cros_ec_init(const void *blob, struct cros_ec_dev **cros_ecp); 14988364387SHung-ying Tyan 15088364387SHung-ying Tyan /** 15188364387SHung-ying Tyan * Read information about the keyboard matrix 15288364387SHung-ying Tyan * 15388364387SHung-ying Tyan * @param dev CROS-EC device 15488364387SHung-ying Tyan * @param info Place to put the info structure 15588364387SHung-ying Tyan */ 15688364387SHung-ying Tyan int cros_ec_info(struct cros_ec_dev *dev, 157836bb6e8SSimon Glass struct ec_response_mkbp_info *info); 15888364387SHung-ying Tyan 15988364387SHung-ying Tyan /** 16088364387SHung-ying Tyan * Read the host event flags 16188364387SHung-ying Tyan * 16288364387SHung-ying Tyan * @param dev CROS-EC device 16388364387SHung-ying Tyan * @param events_ptr Destination for event flags. Not changed on error. 16488364387SHung-ying Tyan * @return 0 if ok, <0 on error 16588364387SHung-ying Tyan */ 16688364387SHung-ying Tyan int cros_ec_get_host_events(struct cros_ec_dev *dev, uint32_t *events_ptr); 16788364387SHung-ying Tyan 16888364387SHung-ying Tyan /** 16988364387SHung-ying Tyan * Clear the specified host event flags 17088364387SHung-ying Tyan * 17188364387SHung-ying Tyan * @param dev CROS-EC device 17288364387SHung-ying Tyan * @param events Event flags to clear 17388364387SHung-ying Tyan * @return 0 if ok, <0 on error 17488364387SHung-ying Tyan */ 17588364387SHung-ying Tyan int cros_ec_clear_host_events(struct cros_ec_dev *dev, uint32_t events); 17688364387SHung-ying Tyan 17788364387SHung-ying Tyan /** 17888364387SHung-ying Tyan * Get/set flash protection 17988364387SHung-ying Tyan * 18088364387SHung-ying Tyan * @param dev CROS-EC device 18188364387SHung-ying Tyan * @param set_mask Mask of flags to set; if 0, just retrieves existing 18288364387SHung-ying Tyan * protection state without changing it. 18388364387SHung-ying Tyan * @param set_flags New flag values; only bits in set_mask are applied; 18488364387SHung-ying Tyan * ignored if set_mask=0. 18588364387SHung-ying Tyan * @param prot Destination for updated protection state from EC. 18688364387SHung-ying Tyan * @return 0 if ok, <0 on error 18788364387SHung-ying Tyan */ 18888364387SHung-ying Tyan int cros_ec_flash_protect(struct cros_ec_dev *dev, 18988364387SHung-ying Tyan uint32_t set_mask, uint32_t set_flags, 19088364387SHung-ying Tyan struct ec_response_flash_protect *resp); 19188364387SHung-ying Tyan 19288364387SHung-ying Tyan 19388364387SHung-ying Tyan /** 19488364387SHung-ying Tyan * Run internal tests on the cros_ec interface. 19588364387SHung-ying Tyan * 19688364387SHung-ying Tyan * @param dev CROS-EC device 19788364387SHung-ying Tyan * @return 0 if ok, <0 if the test failed 19888364387SHung-ying Tyan */ 19988364387SHung-ying Tyan int cros_ec_test(struct cros_ec_dev *dev); 20088364387SHung-ying Tyan 20188364387SHung-ying Tyan /** 20288364387SHung-ying Tyan * Update the EC RW copy. 20388364387SHung-ying Tyan * 20488364387SHung-ying Tyan * @param dev CROS-EC device 20588364387SHung-ying Tyan * @param image the content to write 20688364387SHung-ying Tyan * @param imafge_size content length 20788364387SHung-ying Tyan * @return 0 if ok, <0 if the test failed 20888364387SHung-ying Tyan */ 20988364387SHung-ying Tyan int cros_ec_flash_update_rw(struct cros_ec_dev *dev, 21088364387SHung-ying Tyan const uint8_t *image, int image_size); 21188364387SHung-ying Tyan 21288364387SHung-ying Tyan /** 21388364387SHung-ying Tyan * Return a pointer to the board's CROS-EC device 21488364387SHung-ying Tyan * 21588364387SHung-ying Tyan * This should be implemented by board files. 21688364387SHung-ying Tyan * 21788364387SHung-ying Tyan * @return pointer to CROS-EC device, or NULL if none is available 21888364387SHung-ying Tyan */ 21988364387SHung-ying Tyan struct cros_ec_dev *board_get_cros_ec_dev(void); 22088364387SHung-ying Tyan 22184d6cbd3SSimon Glass struct dm_cros_ec_ops { 22284d6cbd3SSimon Glass int (*check_version)(struct udevice *dev); 22384d6cbd3SSimon Glass int (*command)(struct udevice *dev, uint8_t cmd, int cmd_version, 22484d6cbd3SSimon Glass const uint8_t *dout, int dout_len, 22584d6cbd3SSimon Glass uint8_t **dinp, int din_len); 22684d6cbd3SSimon Glass int (*packet)(struct udevice *dev, int out_bytes, int in_bytes); 22784d6cbd3SSimon Glass }; 22884d6cbd3SSimon Glass 22984d6cbd3SSimon Glass #define dm_cros_ec_get_ops(dev) \ 23084d6cbd3SSimon Glass ((struct dm_cros_ec_ops *)(dev)->driver->ops) 23184d6cbd3SSimon Glass 23284d6cbd3SSimon Glass int cros_ec_register(struct udevice *dev); 23384d6cbd3SSimon Glass 234a6070283SRandall Spangler /** 23588364387SHung-ying Tyan * Dump a block of data for a command. 23688364387SHung-ying Tyan * 23788364387SHung-ying Tyan * @param name Name for data (e.g. 'in', 'out') 23888364387SHung-ying Tyan * @param cmd Command number associated with data, or -1 for none 23988364387SHung-ying Tyan * @param data Data block to dump 24088364387SHung-ying Tyan * @param len Length of data block to dump 24188364387SHung-ying Tyan */ 24288364387SHung-ying Tyan void cros_ec_dump_data(const char *name, int cmd, const uint8_t *data, int len); 24388364387SHung-ying Tyan 24488364387SHung-ying Tyan /** 24588364387SHung-ying Tyan * Calculate a simple 8-bit checksum of a data block 24688364387SHung-ying Tyan * 24788364387SHung-ying Tyan * @param data Data block to checksum 24888364387SHung-ying Tyan * @param size Size of data block in bytes 24988364387SHung-ying Tyan * @return checksum value (0 to 255) 25088364387SHung-ying Tyan */ 25188364387SHung-ying Tyan int cros_ec_calc_checksum(const uint8_t *data, int size); 25288364387SHung-ying Tyan 25388364387SHung-ying Tyan int cros_ec_flash_erase(struct cros_ec_dev *dev, uint32_t offset, 25488364387SHung-ying Tyan uint32_t size); 25588364387SHung-ying Tyan 25688364387SHung-ying Tyan /** 25788364387SHung-ying Tyan * Read data from the flash 25888364387SHung-ying Tyan * 25988364387SHung-ying Tyan * Read an arbitrary amount of data from the EC flash, by repeatedly reading 26088364387SHung-ying Tyan * small blocks. 26188364387SHung-ying Tyan * 26288364387SHung-ying Tyan * The offset starts at 0. You can obtain the region information from 26388364387SHung-ying Tyan * cros_ec_flash_offset() to find out where to read for a particular region. 26488364387SHung-ying Tyan * 26588364387SHung-ying Tyan * @param dev CROS-EC device 26688364387SHung-ying Tyan * @param data Pointer to data buffer to read into 26788364387SHung-ying Tyan * @param offset Offset within flash to read from 26888364387SHung-ying Tyan * @param size Number of bytes to read 26988364387SHung-ying Tyan * @return 0 if ok, -1 on error 27088364387SHung-ying Tyan */ 27188364387SHung-ying Tyan int cros_ec_flash_read(struct cros_ec_dev *dev, uint8_t *data, uint32_t offset, 27288364387SHung-ying Tyan uint32_t size); 27388364387SHung-ying Tyan 27488364387SHung-ying Tyan /** 275bfeba017SMoritz Fischer * Read back flash parameters 276bfeba017SMoritz Fischer * 277bfeba017SMoritz Fischer * This function reads back parameters of the flash as reported by the EC 278bfeba017SMoritz Fischer * 279bfeba017SMoritz Fischer * @param dev Pointer to device 280bfeba017SMoritz Fischer * @param info Pointer to output flash info struct 281bfeba017SMoritz Fischer */ 282bfeba017SMoritz Fischer int cros_ec_read_flashinfo(struct cros_ec_dev *dev, 283bfeba017SMoritz Fischer struct ec_response_flash_info *info); 284bfeba017SMoritz Fischer 285bfeba017SMoritz Fischer /** 28688364387SHung-ying Tyan * Write data to the flash 28788364387SHung-ying Tyan * 28888364387SHung-ying Tyan * Write an arbitrary amount of data to the EC flash, by repeatedly writing 28988364387SHung-ying Tyan * small blocks. 29088364387SHung-ying Tyan * 29188364387SHung-ying Tyan * The offset starts at 0. You can obtain the region information from 29288364387SHung-ying Tyan * cros_ec_flash_offset() to find out where to write for a particular region. 29388364387SHung-ying Tyan * 29488364387SHung-ying Tyan * Attempting to write to the region where the EC is currently running from 29588364387SHung-ying Tyan * will result in an error. 29688364387SHung-ying Tyan * 29788364387SHung-ying Tyan * @param dev CROS-EC device 29888364387SHung-ying Tyan * @param data Pointer to data buffer to write 29988364387SHung-ying Tyan * @param offset Offset within flash to write to. 30088364387SHung-ying Tyan * @param size Number of bytes to write 30188364387SHung-ying Tyan * @return 0 if ok, -1 on error 30288364387SHung-ying Tyan */ 30388364387SHung-ying Tyan int cros_ec_flash_write(struct cros_ec_dev *dev, const uint8_t *data, 30488364387SHung-ying Tyan uint32_t offset, uint32_t size); 30588364387SHung-ying Tyan 30688364387SHung-ying Tyan /** 30788364387SHung-ying Tyan * Obtain position and size of a flash region 30888364387SHung-ying Tyan * 30988364387SHung-ying Tyan * @param dev CROS-EC device 31088364387SHung-ying Tyan * @param region Flash region to query 31188364387SHung-ying Tyan * @param offset Returns offset of flash region in EC flash 31288364387SHung-ying Tyan * @param size Returns size of flash region 31388364387SHung-ying Tyan * @return 0 if ok, -1 on error 31488364387SHung-ying Tyan */ 31588364387SHung-ying Tyan int cros_ec_flash_offset(struct cros_ec_dev *dev, enum ec_flash_region region, 31688364387SHung-ying Tyan uint32_t *offset, uint32_t *size); 31788364387SHung-ying Tyan 31888364387SHung-ying Tyan /** 31988364387SHung-ying Tyan * Read/write VbNvContext from/to a CROS-EC device. 32088364387SHung-ying Tyan * 32188364387SHung-ying Tyan * @param dev CROS-EC device 32288364387SHung-ying Tyan * @param block Buffer of VbNvContext to be read/write 32388364387SHung-ying Tyan * @return 0 if ok, -1 on error 32488364387SHung-ying Tyan */ 32588364387SHung-ying Tyan int cros_ec_read_vbnvcontext(struct cros_ec_dev *dev, uint8_t *block); 32688364387SHung-ying Tyan int cros_ec_write_vbnvcontext(struct cros_ec_dev *dev, const uint8_t *block); 32788364387SHung-ying Tyan 32888364387SHung-ying Tyan /** 32988364387SHung-ying Tyan * Read the version information for the EC images 33088364387SHung-ying Tyan * 33188364387SHung-ying Tyan * @param dev CROS-EC device 33288364387SHung-ying Tyan * @param versionp This is set to point to the version information 33388364387SHung-ying Tyan * @return 0 if ok, -1 on error 33488364387SHung-ying Tyan */ 33588364387SHung-ying Tyan int cros_ec_read_version(struct cros_ec_dev *dev, 33688364387SHung-ying Tyan struct ec_response_get_version **versionp); 33788364387SHung-ying Tyan 33888364387SHung-ying Tyan /** 33988364387SHung-ying Tyan * Read the build information for the EC 34088364387SHung-ying Tyan * 34188364387SHung-ying Tyan * @param dev CROS-EC device 34288364387SHung-ying Tyan * @param versionp This is set to point to the build string 34388364387SHung-ying Tyan * @return 0 if ok, -1 on error 34488364387SHung-ying Tyan */ 34588364387SHung-ying Tyan int cros_ec_read_build_info(struct cros_ec_dev *dev, char **strp); 34688364387SHung-ying Tyan 34788364387SHung-ying Tyan /** 34888364387SHung-ying Tyan * Switch on/off a LDO / FET. 34988364387SHung-ying Tyan * 35088364387SHung-ying Tyan * @param dev CROS-EC device 35188364387SHung-ying Tyan * @param index index of the LDO/FET to switch 35288364387SHung-ying Tyan * @param state new state of the LDO/FET : EC_LDO_STATE_ON|OFF 35388364387SHung-ying Tyan * @return 0 if ok, -1 on error 35488364387SHung-ying Tyan */ 355f48eaf01SSimon Glass int cros_ec_set_ldo(struct udevice *dev, uint8_t index, uint8_t state); 35688364387SHung-ying Tyan 35788364387SHung-ying Tyan /** 35888364387SHung-ying Tyan * Read back a LDO / FET current state. 35988364387SHung-ying Tyan * 36088364387SHung-ying Tyan * @param dev CROS-EC device 36188364387SHung-ying Tyan * @param index index of the LDO/FET to switch 36288364387SHung-ying Tyan * @param state current state of the LDO/FET : EC_LDO_STATE_ON|OFF 36388364387SHung-ying Tyan * @return 0 if ok, -1 on error 36488364387SHung-ying Tyan */ 365f48eaf01SSimon Glass int cros_ec_get_ldo(struct udevice *dev, uint8_t index, uint8_t *state); 36641364f0fSVadim Bendebury 36741364f0fSVadim Bendebury /** 36841364f0fSVadim Bendebury * Get access to the error reported when cros_ec_board_init() was called 36941364f0fSVadim Bendebury * 37041364f0fSVadim Bendebury * This permits delayed reporting of the EC error if it failed during 37141364f0fSVadim Bendebury * early init. 37241364f0fSVadim Bendebury * 37341364f0fSVadim Bendebury * @return error (0 if there was no error, -ve if there was an error) 37441364f0fSVadim Bendebury */ 37541364f0fSVadim Bendebury int cros_ec_get_error(void); 37641364f0fSVadim Bendebury 377d7f25f35SSimon Glass /** 378d7f25f35SSimon Glass * Returns information from the FDT about the Chrome EC flash 379d7f25f35SSimon Glass * 380*2ec9d171SSimon Glass * @param dev Device to read from 381d7f25f35SSimon Glass * @param config Structure to use to return information 382d7f25f35SSimon Glass */ 383*2ec9d171SSimon Glass int cros_ec_decode_ec_flash(struct udevice *dev, struct fdt_cros_ec *config); 384d7f25f35SSimon Glass 385df93d90aSSimon Glass /** 386df93d90aSSimon Glass * Check the current keyboard state, in case recovery mode is requested. 387df93d90aSSimon Glass * This function is for sandbox only. 388df93d90aSSimon Glass * 389df93d90aSSimon Glass * @param ec CROS-EC device 390df93d90aSSimon Glass */ 391df93d90aSSimon Glass void cros_ec_check_keyboard(struct cros_ec_dev *dev); 392df93d90aSSimon Glass 393cc456bd7SSimon Glass struct i2c_msg; 394cc456bd7SSimon Glass /* 395cc456bd7SSimon Glass * Tunnel an I2C transfer to the EC 396cc456bd7SSimon Glass * 397cc456bd7SSimon Glass * @param dev CROS-EC device 3986d1a718fSMoritz Fischer * @param port The remote port on EC to use 399cc456bd7SSimon Glass * @param msg List of messages to transfer 400cc456bd7SSimon Glass * @param nmsgs Number of messages to transfer 401cc456bd7SSimon Glass */ 4026d1a718fSMoritz Fischer int cros_ec_i2c_tunnel(struct udevice *dev, int port, struct i2c_msg *msg, 4036d1a718fSMoritz Fischer int nmsgs); 404cc456bd7SSimon Glass 40588364387SHung-ying Tyan #endif 406