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