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> 1688364387SHung-ying Tyan 1788364387SHung-ying Tyan /* Which interface is the device on? */ 1888364387SHung-ying Tyan enum cros_ec_interface_t { 1988364387SHung-ying Tyan CROS_EC_IF_NONE, 2088364387SHung-ying Tyan CROS_EC_IF_SPI, 2188364387SHung-ying Tyan CROS_EC_IF_I2C, 2288364387SHung-ying Tyan CROS_EC_IF_LPC, /* Intel Low Pin Count interface */ 2388364387SHung-ying Tyan }; 2488364387SHung-ying Tyan 2588364387SHung-ying Tyan /* Our configuration information */ 2688364387SHung-ying Tyan struct cros_ec_dev { 2788364387SHung-ying Tyan enum cros_ec_interface_t interface; 2888364387SHung-ying Tyan struct spi_slave *spi; /* Our SPI slave, if using SPI */ 2988364387SHung-ying Tyan int node; /* Our node */ 3088364387SHung-ying Tyan int parent_node; /* Our parent node (interface) */ 3188364387SHung-ying Tyan unsigned int cs; /* Our chip select */ 3288364387SHung-ying Tyan unsigned int addr; /* Device address (for I2C) */ 3388364387SHung-ying Tyan unsigned int bus_num; /* Bus number (for I2C) */ 3488364387SHung-ying Tyan unsigned int max_frequency; /* Maximum interface frequency */ 3588364387SHung-ying Tyan struct fdt_gpio_state ec_int; /* GPIO used as EC interrupt line */ 36*e8c12662SRandall Spangler int protocol_version; /* Protocol version to use */ 3788364387SHung-ying Tyan int optimise_flash_write; /* Don't write erased flash blocks */ 3888364387SHung-ying Tyan 3988364387SHung-ying Tyan /* 4088364387SHung-ying Tyan * These two buffers will always be dword-aligned and include enough 4188364387SHung-ying Tyan * space for up to 7 word-alignment bytes also, so we can ensure that 4288364387SHung-ying Tyan * the body of the message is always dword-aligned (64-bit). 4388364387SHung-ying Tyan * 4488364387SHung-ying Tyan * We use this alignment to keep ARM and x86 happy. Probably word 4588364387SHung-ying Tyan * alignment would be OK, there might be a small performance advantage 4688364387SHung-ying Tyan * to using dword. 4788364387SHung-ying Tyan */ 4888364387SHung-ying Tyan uint8_t din[ALIGN(MSG_BYTES + sizeof(int64_t), sizeof(int64_t))] 4988364387SHung-ying Tyan __aligned(sizeof(int64_t)); 5088364387SHung-ying Tyan uint8_t dout[ALIGN(MSG_BYTES + sizeof(int64_t), sizeof(int64_t))] 5188364387SHung-ying Tyan __aligned(sizeof(int64_t)); 5288364387SHung-ying Tyan }; 5388364387SHung-ying Tyan 5488364387SHung-ying Tyan /* 5588364387SHung-ying Tyan * Hard-code the number of columns we happen to know we have right now. It 5688364387SHung-ying Tyan * would be more correct to call cros_ec_info() at startup and determine the 5788364387SHung-ying Tyan * actual number of keyboard cols from there. 5888364387SHung-ying Tyan */ 5988364387SHung-ying Tyan #define CROS_EC_KEYSCAN_COLS 13 6088364387SHung-ying Tyan 6188364387SHung-ying Tyan /* Information returned by a key scan */ 6288364387SHung-ying Tyan struct mbkp_keyscan { 6388364387SHung-ying Tyan uint8_t data[CROS_EC_KEYSCAN_COLS]; 6488364387SHung-ying Tyan }; 6588364387SHung-ying Tyan 66d7f25f35SSimon Glass /* Holds information about the Chrome EC */ 67d7f25f35SSimon Glass struct fdt_cros_ec { 68d7f25f35SSimon Glass struct fmap_entry flash; /* Address and size of EC flash */ 69d7f25f35SSimon Glass /* 70d7f25f35SSimon Glass * Byte value of erased flash, or -1 if not known. It is normally 71d7f25f35SSimon Glass * 0xff but some flash devices use 0 (e.g. STM32Lxxx) 72d7f25f35SSimon Glass */ 73d7f25f35SSimon Glass int flash_erase_value; 74d7f25f35SSimon Glass struct fmap_entry region[EC_FLASH_REGION_COUNT]; 75d7f25f35SSimon Glass }; 76d7f25f35SSimon Glass 7788364387SHung-ying Tyan /** 7888364387SHung-ying Tyan * Read the ID of the CROS-EC device 7988364387SHung-ying Tyan * 8088364387SHung-ying Tyan * The ID is a string identifying the CROS-EC device. 8188364387SHung-ying Tyan * 8288364387SHung-ying Tyan * @param dev CROS-EC device 8388364387SHung-ying Tyan * @param id Place to put the ID 8488364387SHung-ying Tyan * @param maxlen Maximum length of the ID field 8588364387SHung-ying Tyan * @return 0 if ok, -1 on error 8688364387SHung-ying Tyan */ 8788364387SHung-ying Tyan int cros_ec_read_id(struct cros_ec_dev *dev, char *id, int maxlen); 8888364387SHung-ying Tyan 8988364387SHung-ying Tyan /** 9088364387SHung-ying Tyan * Read a keyboard scan from the CROS-EC device 9188364387SHung-ying Tyan * 9288364387SHung-ying Tyan * Send a message requesting a keyboard scan and return the result 9388364387SHung-ying Tyan * 9488364387SHung-ying Tyan * @param dev CROS-EC device 9588364387SHung-ying Tyan * @param scan Place to put the scan results 9688364387SHung-ying Tyan * @return 0 if ok, -1 on error 9788364387SHung-ying Tyan */ 9888364387SHung-ying Tyan int cros_ec_scan_keyboard(struct cros_ec_dev *dev, struct mbkp_keyscan *scan); 9988364387SHung-ying Tyan 10088364387SHung-ying Tyan /** 10188364387SHung-ying Tyan * Read which image is currently running on the CROS-EC device. 10288364387SHung-ying Tyan * 10388364387SHung-ying Tyan * @param dev CROS-EC device 10488364387SHung-ying Tyan * @param image Destination for image identifier 10588364387SHung-ying Tyan * @return 0 if ok, <0 on error 10688364387SHung-ying Tyan */ 10788364387SHung-ying Tyan int cros_ec_read_current_image(struct cros_ec_dev *dev, 10888364387SHung-ying Tyan enum ec_current_image *image); 10988364387SHung-ying Tyan 11088364387SHung-ying Tyan /** 11188364387SHung-ying Tyan * Read the hash of the CROS-EC device firmware. 11288364387SHung-ying Tyan * 11388364387SHung-ying Tyan * @param dev CROS-EC device 11488364387SHung-ying Tyan * @param hash Destination for hash information 11588364387SHung-ying Tyan * @return 0 if ok, <0 on error 11688364387SHung-ying Tyan */ 11788364387SHung-ying Tyan int cros_ec_read_hash(struct cros_ec_dev *dev, 11888364387SHung-ying Tyan struct ec_response_vboot_hash *hash); 11988364387SHung-ying Tyan 12088364387SHung-ying Tyan /** 12188364387SHung-ying Tyan * Send a reboot command to the CROS-EC device. 12288364387SHung-ying Tyan * 12388364387SHung-ying Tyan * Note that some reboot commands (such as EC_REBOOT_COLD) also reboot the AP. 12488364387SHung-ying Tyan * 12588364387SHung-ying Tyan * @param dev CROS-EC device 12688364387SHung-ying Tyan * @param cmd Reboot command 12788364387SHung-ying Tyan * @param flags Flags for reboot command (EC_REBOOT_FLAG_*) 12888364387SHung-ying Tyan * @return 0 if ok, <0 on error 12988364387SHung-ying Tyan */ 13088364387SHung-ying Tyan int cros_ec_reboot(struct cros_ec_dev *dev, enum ec_reboot_cmd cmd, 13188364387SHung-ying Tyan uint8_t flags); 13288364387SHung-ying Tyan 13388364387SHung-ying Tyan /** 13488364387SHung-ying Tyan * Check if the CROS-EC device has an interrupt pending. 13588364387SHung-ying Tyan * 13688364387SHung-ying Tyan * Read the status of the external interrupt connected to the CROS-EC device. 13788364387SHung-ying Tyan * If no external interrupt is configured, this always returns 1. 13888364387SHung-ying Tyan * 13988364387SHung-ying Tyan * @param dev CROS-EC device 14088364387SHung-ying Tyan * @return 0 if no interrupt is pending 14188364387SHung-ying Tyan */ 14288364387SHung-ying Tyan int cros_ec_interrupt_pending(struct cros_ec_dev *dev); 14388364387SHung-ying Tyan 14488364387SHung-ying Tyan enum { 14588364387SHung-ying Tyan CROS_EC_OK, 14688364387SHung-ying Tyan CROS_EC_ERR = 1, 14788364387SHung-ying Tyan CROS_EC_ERR_FDT_DECODE, 14888364387SHung-ying Tyan CROS_EC_ERR_CHECK_VERSION, 14988364387SHung-ying Tyan CROS_EC_ERR_READ_ID, 15088364387SHung-ying Tyan CROS_EC_ERR_DEV_INIT, 15188364387SHung-ying Tyan }; 15288364387SHung-ying Tyan 15388364387SHung-ying Tyan /** 154836bb6e8SSimon Glass * Initialise the Chromium OS EC driver 15588364387SHung-ying Tyan * 15688364387SHung-ying Tyan * @param blob Device tree blob containing setup information 15788364387SHung-ying Tyan * @param cros_ecp Returns pointer to the cros_ec device, or NULL if none 15888364387SHung-ying Tyan * @return 0 if we got an cros_ec device and all is well (or no cros_ec is 15988364387SHung-ying Tyan * expected), -ve if we should have an cros_ec device but failed to find 16088364387SHung-ying Tyan * one, or init failed (-CROS_EC_ERR_...). 16188364387SHung-ying Tyan */ 16288364387SHung-ying Tyan int cros_ec_init(const void *blob, struct cros_ec_dev **cros_ecp); 16388364387SHung-ying Tyan 16488364387SHung-ying Tyan /** 16588364387SHung-ying Tyan * Read information about the keyboard matrix 16688364387SHung-ying Tyan * 16788364387SHung-ying Tyan * @param dev CROS-EC device 16888364387SHung-ying Tyan * @param info Place to put the info structure 16988364387SHung-ying Tyan */ 17088364387SHung-ying Tyan int cros_ec_info(struct cros_ec_dev *dev, 171836bb6e8SSimon Glass struct ec_response_mkbp_info *info); 17288364387SHung-ying Tyan 17388364387SHung-ying Tyan /** 17488364387SHung-ying Tyan * Read the host event flags 17588364387SHung-ying Tyan * 17688364387SHung-ying Tyan * @param dev CROS-EC device 17788364387SHung-ying Tyan * @param events_ptr Destination for event flags. Not changed on error. 17888364387SHung-ying Tyan * @return 0 if ok, <0 on error 17988364387SHung-ying Tyan */ 18088364387SHung-ying Tyan int cros_ec_get_host_events(struct cros_ec_dev *dev, uint32_t *events_ptr); 18188364387SHung-ying Tyan 18288364387SHung-ying Tyan /** 18388364387SHung-ying Tyan * Clear the specified host event flags 18488364387SHung-ying Tyan * 18588364387SHung-ying Tyan * @param dev CROS-EC device 18688364387SHung-ying Tyan * @param events Event flags to clear 18788364387SHung-ying Tyan * @return 0 if ok, <0 on error 18888364387SHung-ying Tyan */ 18988364387SHung-ying Tyan int cros_ec_clear_host_events(struct cros_ec_dev *dev, uint32_t events); 19088364387SHung-ying Tyan 19188364387SHung-ying Tyan /** 19288364387SHung-ying Tyan * Get/set flash protection 19388364387SHung-ying Tyan * 19488364387SHung-ying Tyan * @param dev CROS-EC device 19588364387SHung-ying Tyan * @param set_mask Mask of flags to set; if 0, just retrieves existing 19688364387SHung-ying Tyan * protection state without changing it. 19788364387SHung-ying Tyan * @param set_flags New flag values; only bits in set_mask are applied; 19888364387SHung-ying Tyan * ignored if set_mask=0. 19988364387SHung-ying Tyan * @param prot Destination for updated protection state from EC. 20088364387SHung-ying Tyan * @return 0 if ok, <0 on error 20188364387SHung-ying Tyan */ 20288364387SHung-ying Tyan int cros_ec_flash_protect(struct cros_ec_dev *dev, 20388364387SHung-ying Tyan uint32_t set_mask, uint32_t set_flags, 20488364387SHung-ying Tyan struct ec_response_flash_protect *resp); 20588364387SHung-ying Tyan 20688364387SHung-ying Tyan 20788364387SHung-ying Tyan /** 20888364387SHung-ying Tyan * Run internal tests on the cros_ec interface. 20988364387SHung-ying Tyan * 21088364387SHung-ying Tyan * @param dev CROS-EC device 21188364387SHung-ying Tyan * @return 0 if ok, <0 if the test failed 21288364387SHung-ying Tyan */ 21388364387SHung-ying Tyan int cros_ec_test(struct cros_ec_dev *dev); 21488364387SHung-ying Tyan 21588364387SHung-ying Tyan /** 21688364387SHung-ying Tyan * Update the EC RW copy. 21788364387SHung-ying Tyan * 21888364387SHung-ying Tyan * @param dev CROS-EC device 21988364387SHung-ying Tyan * @param image the content to write 22088364387SHung-ying Tyan * @param imafge_size content length 22188364387SHung-ying Tyan * @return 0 if ok, <0 if the test failed 22288364387SHung-ying Tyan */ 22388364387SHung-ying Tyan int cros_ec_flash_update_rw(struct cros_ec_dev *dev, 22488364387SHung-ying Tyan const uint8_t *image, int image_size); 22588364387SHung-ying Tyan 22688364387SHung-ying Tyan /** 22788364387SHung-ying Tyan * Return a pointer to the board's CROS-EC device 22888364387SHung-ying Tyan * 22988364387SHung-ying Tyan * This should be implemented by board files. 23088364387SHung-ying Tyan * 23188364387SHung-ying Tyan * @return pointer to CROS-EC device, or NULL if none is available 23288364387SHung-ying Tyan */ 23388364387SHung-ying Tyan struct cros_ec_dev *board_get_cros_ec_dev(void); 23488364387SHung-ying Tyan 23588364387SHung-ying Tyan 23688364387SHung-ying Tyan /* Internal interfaces */ 23788364387SHung-ying Tyan int cros_ec_i2c_init(struct cros_ec_dev *dev, const void *blob); 23888364387SHung-ying Tyan int cros_ec_spi_init(struct cros_ec_dev *dev, const void *blob); 23988364387SHung-ying Tyan int cros_ec_lpc_init(struct cros_ec_dev *dev, const void *blob); 24088364387SHung-ying Tyan 24188364387SHung-ying Tyan /** 24288364387SHung-ying Tyan * Read information from the fdt for the i2c cros_ec interface 24388364387SHung-ying Tyan * 24488364387SHung-ying Tyan * @param dev CROS-EC device 24588364387SHung-ying Tyan * @param blob Device tree blob 24688364387SHung-ying Tyan * @return 0 if ok, -1 if we failed to read all required information 24788364387SHung-ying Tyan */ 24888364387SHung-ying Tyan int cros_ec_i2c_decode_fdt(struct cros_ec_dev *dev, const void *blob); 24988364387SHung-ying Tyan 25088364387SHung-ying Tyan /** 25188364387SHung-ying Tyan * Read information from the fdt for the spi cros_ec interface 25288364387SHung-ying Tyan * 25388364387SHung-ying Tyan * @param dev CROS-EC device 25488364387SHung-ying Tyan * @param blob Device tree blob 25588364387SHung-ying Tyan * @return 0 if ok, -1 if we failed to read all required information 25688364387SHung-ying Tyan */ 25788364387SHung-ying Tyan int cros_ec_spi_decode_fdt(struct cros_ec_dev *dev, const void *blob); 25888364387SHung-ying Tyan 25988364387SHung-ying Tyan /** 26088364387SHung-ying Tyan * Check whether the LPC interface supports new-style commands. 26188364387SHung-ying Tyan * 26288364387SHung-ying Tyan * LPC has its own way of doing this, which involves checking LPC values 263*e8c12662SRandall Spangler * visible to the host. Do this, and update dev->protocol_version accordingly. 26488364387SHung-ying Tyan * 26588364387SHung-ying Tyan * @param dev CROS-EC device to check 26688364387SHung-ying Tyan */ 26788364387SHung-ying Tyan int cros_ec_lpc_check_version(struct cros_ec_dev *dev); 26888364387SHung-ying Tyan 26988364387SHung-ying Tyan /** 27088364387SHung-ying Tyan * Send a command to an I2C CROS-EC device and return the reply. 27188364387SHung-ying Tyan * 27288364387SHung-ying Tyan * This rather complicated function deals with sending both old-style and 27388364387SHung-ying Tyan * new-style commands. The old ones have just a command byte and arguments. 27488364387SHung-ying Tyan * The new ones have version, command, arg-len, [args], chksum so are 3 bytes 27588364387SHung-ying Tyan * longer. 27688364387SHung-ying Tyan * 27788364387SHung-ying Tyan * The device's internal input/output buffers are used. 27888364387SHung-ying Tyan * 27988364387SHung-ying Tyan * @param dev CROS-EC device 28088364387SHung-ying Tyan * @param cmd Command to send (EC_CMD_...) 28188364387SHung-ying Tyan * @param cmd_version Version of command to send (EC_VER_...) 28288364387SHung-ying Tyan * @param dout Output data (may be NULL If dout_len=0) 28388364387SHung-ying Tyan * @param dout_len Size of output data in bytes 28488364387SHung-ying Tyan * @param dinp Returns pointer to response data 28588364387SHung-ying Tyan * @param din_len Maximum size of response in bytes 28688364387SHung-ying Tyan * @return number of bytes in response, or -1 on error 28788364387SHung-ying Tyan */ 28888364387SHung-ying Tyan int cros_ec_i2c_command(struct cros_ec_dev *dev, uint8_t cmd, int cmd_version, 28988364387SHung-ying Tyan const uint8_t *dout, int dout_len, 29088364387SHung-ying Tyan uint8_t **dinp, int din_len); 29188364387SHung-ying Tyan 29288364387SHung-ying Tyan /** 29388364387SHung-ying Tyan * Send a command to a LPC CROS-EC device and return the reply. 29488364387SHung-ying Tyan * 29588364387SHung-ying Tyan * The device's internal input/output buffers are used. 29688364387SHung-ying Tyan * 29788364387SHung-ying Tyan * @param dev CROS-EC device 29888364387SHung-ying Tyan * @param cmd Command to send (EC_CMD_...) 29988364387SHung-ying Tyan * @param cmd_version Version of command to send (EC_VER_...) 30088364387SHung-ying Tyan * @param dout Output data (may be NULL If dout_len=0) 30188364387SHung-ying Tyan * @param dout_len Size of output data in bytes 30288364387SHung-ying Tyan * @param dinp Returns pointer to response data 30388364387SHung-ying Tyan * @param din_len Maximum size of response in bytes 30488364387SHung-ying Tyan * @return number of bytes in response, or -1 on error 30588364387SHung-ying Tyan */ 30688364387SHung-ying Tyan int cros_ec_lpc_command(struct cros_ec_dev *dev, uint8_t cmd, int cmd_version, 30788364387SHung-ying Tyan const uint8_t *dout, int dout_len, 30888364387SHung-ying Tyan uint8_t **dinp, int din_len); 30988364387SHung-ying Tyan 31088364387SHung-ying Tyan int cros_ec_spi_command(struct cros_ec_dev *dev, uint8_t cmd, int cmd_version, 31188364387SHung-ying Tyan const uint8_t *dout, int dout_len, 31288364387SHung-ying Tyan uint8_t **dinp, int din_len); 31388364387SHung-ying Tyan 31488364387SHung-ying Tyan /** 31588364387SHung-ying Tyan * Dump a block of data for a command. 31688364387SHung-ying Tyan * 31788364387SHung-ying Tyan * @param name Name for data (e.g. 'in', 'out') 31888364387SHung-ying Tyan * @param cmd Command number associated with data, or -1 for none 31988364387SHung-ying Tyan * @param data Data block to dump 32088364387SHung-ying Tyan * @param len Length of data block to dump 32188364387SHung-ying Tyan */ 32288364387SHung-ying Tyan void cros_ec_dump_data(const char *name, int cmd, const uint8_t *data, int len); 32388364387SHung-ying Tyan 32488364387SHung-ying Tyan /** 32588364387SHung-ying Tyan * Calculate a simple 8-bit checksum of a data block 32688364387SHung-ying Tyan * 32788364387SHung-ying Tyan * @param data Data block to checksum 32888364387SHung-ying Tyan * @param size Size of data block in bytes 32988364387SHung-ying Tyan * @return checksum value (0 to 255) 33088364387SHung-ying Tyan */ 33188364387SHung-ying Tyan int cros_ec_calc_checksum(const uint8_t *data, int size); 33288364387SHung-ying Tyan 33388364387SHung-ying Tyan /** 33488364387SHung-ying Tyan * Decode a flash region parameter 33588364387SHung-ying Tyan * 33688364387SHung-ying Tyan * @param argc Number of params remaining 33788364387SHung-ying Tyan * @param argv List of remaining parameters 33888364387SHung-ying Tyan * @return flash region (EC_FLASH_REGION_...) or -1 on error 33988364387SHung-ying Tyan */ 34088364387SHung-ying Tyan int cros_ec_decode_region(int argc, char * const argv[]); 34188364387SHung-ying Tyan 34288364387SHung-ying Tyan int cros_ec_flash_erase(struct cros_ec_dev *dev, uint32_t offset, 34388364387SHung-ying Tyan uint32_t size); 34488364387SHung-ying Tyan 34588364387SHung-ying Tyan /** 34688364387SHung-ying Tyan * Read data from the flash 34788364387SHung-ying Tyan * 34888364387SHung-ying Tyan * Read an arbitrary amount of data from the EC flash, by repeatedly reading 34988364387SHung-ying Tyan * small blocks. 35088364387SHung-ying Tyan * 35188364387SHung-ying Tyan * The offset starts at 0. You can obtain the region information from 35288364387SHung-ying Tyan * cros_ec_flash_offset() to find out where to read for a particular region. 35388364387SHung-ying Tyan * 35488364387SHung-ying Tyan * @param dev CROS-EC device 35588364387SHung-ying Tyan * @param data Pointer to data buffer to read into 35688364387SHung-ying Tyan * @param offset Offset within flash to read from 35788364387SHung-ying Tyan * @param size Number of bytes to read 35888364387SHung-ying Tyan * @return 0 if ok, -1 on error 35988364387SHung-ying Tyan */ 36088364387SHung-ying Tyan int cros_ec_flash_read(struct cros_ec_dev *dev, uint8_t *data, uint32_t offset, 36188364387SHung-ying Tyan uint32_t size); 36288364387SHung-ying Tyan 36388364387SHung-ying Tyan /** 36488364387SHung-ying Tyan * Write data to the flash 36588364387SHung-ying Tyan * 36688364387SHung-ying Tyan * Write an arbitrary amount of data to the EC flash, by repeatedly writing 36788364387SHung-ying Tyan * small blocks. 36888364387SHung-ying Tyan * 36988364387SHung-ying Tyan * The offset starts at 0. You can obtain the region information from 37088364387SHung-ying Tyan * cros_ec_flash_offset() to find out where to write for a particular region. 37188364387SHung-ying Tyan * 37288364387SHung-ying Tyan * Attempting to write to the region where the EC is currently running from 37388364387SHung-ying Tyan * will result in an error. 37488364387SHung-ying Tyan * 37588364387SHung-ying Tyan * @param dev CROS-EC device 37688364387SHung-ying Tyan * @param data Pointer to data buffer to write 37788364387SHung-ying Tyan * @param offset Offset within flash to write to. 37888364387SHung-ying Tyan * @param size Number of bytes to write 37988364387SHung-ying Tyan * @return 0 if ok, -1 on error 38088364387SHung-ying Tyan */ 38188364387SHung-ying Tyan int cros_ec_flash_write(struct cros_ec_dev *dev, const uint8_t *data, 38288364387SHung-ying Tyan uint32_t offset, uint32_t size); 38388364387SHung-ying Tyan 38488364387SHung-ying Tyan /** 38588364387SHung-ying Tyan * Obtain position and size of a flash region 38688364387SHung-ying Tyan * 38788364387SHung-ying Tyan * @param dev CROS-EC device 38888364387SHung-ying Tyan * @param region Flash region to query 38988364387SHung-ying Tyan * @param offset Returns offset of flash region in EC flash 39088364387SHung-ying Tyan * @param size Returns size of flash region 39188364387SHung-ying Tyan * @return 0 if ok, -1 on error 39288364387SHung-ying Tyan */ 39388364387SHung-ying Tyan int cros_ec_flash_offset(struct cros_ec_dev *dev, enum ec_flash_region region, 39488364387SHung-ying Tyan uint32_t *offset, uint32_t *size); 39588364387SHung-ying Tyan 39688364387SHung-ying Tyan /** 39788364387SHung-ying Tyan * Read/write VbNvContext from/to a CROS-EC device. 39888364387SHung-ying Tyan * 39988364387SHung-ying Tyan * @param dev CROS-EC device 40088364387SHung-ying Tyan * @param block Buffer of VbNvContext to be read/write 40188364387SHung-ying Tyan * @return 0 if ok, -1 on error 40288364387SHung-ying Tyan */ 40388364387SHung-ying Tyan int cros_ec_read_vbnvcontext(struct cros_ec_dev *dev, uint8_t *block); 40488364387SHung-ying Tyan int cros_ec_write_vbnvcontext(struct cros_ec_dev *dev, const uint8_t *block); 40588364387SHung-ying Tyan 40688364387SHung-ying Tyan /** 40788364387SHung-ying Tyan * Read the version information for the EC images 40888364387SHung-ying Tyan * 40988364387SHung-ying Tyan * @param dev CROS-EC device 41088364387SHung-ying Tyan * @param versionp This is set to point to the version information 41188364387SHung-ying Tyan * @return 0 if ok, -1 on error 41288364387SHung-ying Tyan */ 41388364387SHung-ying Tyan int cros_ec_read_version(struct cros_ec_dev *dev, 41488364387SHung-ying Tyan struct ec_response_get_version **versionp); 41588364387SHung-ying Tyan 41688364387SHung-ying Tyan /** 41788364387SHung-ying Tyan * Read the build information for the EC 41888364387SHung-ying Tyan * 41988364387SHung-ying Tyan * @param dev CROS-EC device 42088364387SHung-ying Tyan * @param versionp This is set to point to the build string 42188364387SHung-ying Tyan * @return 0 if ok, -1 on error 42288364387SHung-ying Tyan */ 42388364387SHung-ying Tyan int cros_ec_read_build_info(struct cros_ec_dev *dev, char **strp); 42488364387SHung-ying Tyan 42588364387SHung-ying Tyan /** 42688364387SHung-ying Tyan * Switch on/off a LDO / FET. 42788364387SHung-ying Tyan * 42888364387SHung-ying Tyan * @param dev CROS-EC device 42988364387SHung-ying Tyan * @param index index of the LDO/FET to switch 43088364387SHung-ying Tyan * @param state new state of the LDO/FET : EC_LDO_STATE_ON|OFF 43188364387SHung-ying Tyan * @return 0 if ok, -1 on error 43288364387SHung-ying Tyan */ 43388364387SHung-ying Tyan int cros_ec_set_ldo(struct cros_ec_dev *dev, uint8_t index, uint8_t state); 43488364387SHung-ying Tyan 43588364387SHung-ying Tyan /** 43688364387SHung-ying Tyan * Read back a LDO / FET current state. 43788364387SHung-ying Tyan * 43888364387SHung-ying Tyan * @param dev CROS-EC device 43988364387SHung-ying Tyan * @param index index of the LDO/FET to switch 44088364387SHung-ying Tyan * @param state current state of the LDO/FET : EC_LDO_STATE_ON|OFF 44188364387SHung-ying Tyan * @return 0 if ok, -1 on error 44288364387SHung-ying Tyan */ 44388364387SHung-ying Tyan int cros_ec_get_ldo(struct cros_ec_dev *dev, uint8_t index, uint8_t *state); 44441364f0fSVadim Bendebury 44541364f0fSVadim Bendebury /** 44641364f0fSVadim Bendebury * Initialize the Chrome OS EC at board initialization time. 44741364f0fSVadim Bendebury * 44841364f0fSVadim Bendebury * @return 0 if ok, -ve on error 44941364f0fSVadim Bendebury */ 45041364f0fSVadim Bendebury int cros_ec_board_init(void); 45141364f0fSVadim Bendebury 45241364f0fSVadim Bendebury /** 45341364f0fSVadim Bendebury * Get access to the error reported when cros_ec_board_init() was called 45441364f0fSVadim Bendebury * 45541364f0fSVadim Bendebury * This permits delayed reporting of the EC error if it failed during 45641364f0fSVadim Bendebury * early init. 45741364f0fSVadim Bendebury * 45841364f0fSVadim Bendebury * @return error (0 if there was no error, -ve if there was an error) 45941364f0fSVadim Bendebury */ 46041364f0fSVadim Bendebury int cros_ec_get_error(void); 46141364f0fSVadim Bendebury 462d7f25f35SSimon Glass /** 463d7f25f35SSimon Glass * Returns information from the FDT about the Chrome EC flash 464d7f25f35SSimon Glass * 465d7f25f35SSimon Glass * @param blob FDT blob to use 466d7f25f35SSimon Glass * @param config Structure to use to return information 467d7f25f35SSimon Glass */ 468d7f25f35SSimon Glass int cros_ec_decode_ec_flash(const void *blob, struct fdt_cros_ec *config); 469d7f25f35SSimon Glass 47088364387SHung-ying Tyan #endif 471