xref: /rk3399_rockchip-uboot/include/cros_ec.h (revision 88364387c60dc72549ccf7f2d595cbf847ab4e17)
1*88364387SHung-ying Tyan /*
2*88364387SHung-ying Tyan  * Chromium OS cros_ec driver
3*88364387SHung-ying Tyan  *
4*88364387SHung-ying Tyan  * Copyright (c) 2012 The Chromium OS Authors.
5*88364387SHung-ying Tyan  * See file CREDITS for list of people who contributed to this
6*88364387SHung-ying Tyan  * project.
7*88364387SHung-ying Tyan  *
8*88364387SHung-ying Tyan  * This program is free software; you can redistribute it and/or
9*88364387SHung-ying Tyan  * modify it under the terms of the GNU General Public License as
10*88364387SHung-ying Tyan  * published by the Free Software Foundation; either version 2 of
11*88364387SHung-ying Tyan  * the License, or (at your option) any later version.
12*88364387SHung-ying Tyan  *
13*88364387SHung-ying Tyan  * This program is distributed in the hope that it will be useful,
14*88364387SHung-ying Tyan  * but WITHOUT ANY WARRANTY; without even the implied warranty of
15*88364387SHung-ying Tyan  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16*88364387SHung-ying Tyan  * GNU General Public License for more details.
17*88364387SHung-ying Tyan  *
18*88364387SHung-ying Tyan  * You should have received a copy of the GNU General Public License
19*88364387SHung-ying Tyan  * along with this program; if not, write to the Free Software
20*88364387SHung-ying Tyan  * Foundation, Inc., 59 Temple Place, Suite 330, Boston,
21*88364387SHung-ying Tyan  * MA 02111-1307 USA
22*88364387SHung-ying Tyan  */
23*88364387SHung-ying Tyan 
24*88364387SHung-ying Tyan #ifndef _CROS_EC_H
25*88364387SHung-ying Tyan #define _CROS_EC_H
26*88364387SHung-ying Tyan 
27*88364387SHung-ying Tyan #include <linux/compiler.h>
28*88364387SHung-ying Tyan #include <ec_commands.h>
29*88364387SHung-ying Tyan #include <fdtdec.h>
30*88364387SHung-ying Tyan #include <cros_ec_message.h>
31*88364387SHung-ying Tyan 
32*88364387SHung-ying Tyan /* Which interface is the device on? */
33*88364387SHung-ying Tyan enum cros_ec_interface_t {
34*88364387SHung-ying Tyan 	CROS_EC_IF_NONE,
35*88364387SHung-ying Tyan 	CROS_EC_IF_SPI,
36*88364387SHung-ying Tyan 	CROS_EC_IF_I2C,
37*88364387SHung-ying Tyan 	CROS_EC_IF_LPC,	/* Intel Low Pin Count interface */
38*88364387SHung-ying Tyan };
39*88364387SHung-ying Tyan 
40*88364387SHung-ying Tyan /* Our configuration information */
41*88364387SHung-ying Tyan struct cros_ec_dev {
42*88364387SHung-ying Tyan 	enum cros_ec_interface_t interface;
43*88364387SHung-ying Tyan 	struct spi_slave *spi;		/* Our SPI slave, if using SPI */
44*88364387SHung-ying Tyan 	int node;                       /* Our node */
45*88364387SHung-ying Tyan 	int parent_node;		/* Our parent node (interface) */
46*88364387SHung-ying Tyan 	unsigned int cs;		/* Our chip select */
47*88364387SHung-ying Tyan 	unsigned int addr;		/* Device address (for I2C) */
48*88364387SHung-ying Tyan 	unsigned int bus_num;		/* Bus number (for I2C) */
49*88364387SHung-ying Tyan 	unsigned int max_frequency;	/* Maximum interface frequency */
50*88364387SHung-ying Tyan 	struct fdt_gpio_state ec_int;	/* GPIO used as EC interrupt line */
51*88364387SHung-ying Tyan 	int cmd_version_is_supported;   /* Device supports command versions */
52*88364387SHung-ying Tyan 	int optimise_flash_write;	/* Don't write erased flash blocks */
53*88364387SHung-ying Tyan 
54*88364387SHung-ying Tyan 	/*
55*88364387SHung-ying Tyan 	 * These two buffers will always be dword-aligned and include enough
56*88364387SHung-ying Tyan 	 * space for up to 7 word-alignment bytes also, so we can ensure that
57*88364387SHung-ying Tyan 	 * the body of the message is always dword-aligned (64-bit).
58*88364387SHung-ying Tyan 	 *
59*88364387SHung-ying Tyan 	 * We use this alignment to keep ARM and x86 happy. Probably word
60*88364387SHung-ying Tyan 	 * alignment would be OK, there might be a small performance advantage
61*88364387SHung-ying Tyan 	 * to using dword.
62*88364387SHung-ying Tyan 	 */
63*88364387SHung-ying Tyan 	uint8_t din[ALIGN(MSG_BYTES + sizeof(int64_t), sizeof(int64_t))]
64*88364387SHung-ying Tyan 		__aligned(sizeof(int64_t));
65*88364387SHung-ying Tyan 	uint8_t dout[ALIGN(MSG_BYTES + sizeof(int64_t), sizeof(int64_t))]
66*88364387SHung-ying Tyan 		__aligned(sizeof(int64_t));
67*88364387SHung-ying Tyan };
68*88364387SHung-ying Tyan 
69*88364387SHung-ying Tyan /*
70*88364387SHung-ying Tyan  * Hard-code the number of columns we happen to know we have right now.  It
71*88364387SHung-ying Tyan  * would be more correct to call cros_ec_info() at startup and determine the
72*88364387SHung-ying Tyan  * actual number of keyboard cols from there.
73*88364387SHung-ying Tyan  */
74*88364387SHung-ying Tyan #define CROS_EC_KEYSCAN_COLS 13
75*88364387SHung-ying Tyan 
76*88364387SHung-ying Tyan /* Information returned by a key scan */
77*88364387SHung-ying Tyan struct mbkp_keyscan {
78*88364387SHung-ying Tyan 	uint8_t data[CROS_EC_KEYSCAN_COLS];
79*88364387SHung-ying Tyan };
80*88364387SHung-ying Tyan 
81*88364387SHung-ying Tyan /**
82*88364387SHung-ying Tyan  * Read the ID of the CROS-EC device
83*88364387SHung-ying Tyan  *
84*88364387SHung-ying Tyan  * The ID is a string identifying the CROS-EC device.
85*88364387SHung-ying Tyan  *
86*88364387SHung-ying Tyan  * @param dev		CROS-EC device
87*88364387SHung-ying Tyan  * @param id		Place to put the ID
88*88364387SHung-ying Tyan  * @param maxlen	Maximum length of the ID field
89*88364387SHung-ying Tyan  * @return 0 if ok, -1 on error
90*88364387SHung-ying Tyan  */
91*88364387SHung-ying Tyan int cros_ec_read_id(struct cros_ec_dev *dev, char *id, int maxlen);
92*88364387SHung-ying Tyan 
93*88364387SHung-ying Tyan /**
94*88364387SHung-ying Tyan  * Read a keyboard scan from the CROS-EC device
95*88364387SHung-ying Tyan  *
96*88364387SHung-ying Tyan  * Send a message requesting a keyboard scan and return the result
97*88364387SHung-ying Tyan  *
98*88364387SHung-ying Tyan  * @param dev		CROS-EC device
99*88364387SHung-ying Tyan  * @param scan		Place to put the scan results
100*88364387SHung-ying Tyan  * @return 0 if ok, -1 on error
101*88364387SHung-ying Tyan  */
102*88364387SHung-ying Tyan int cros_ec_scan_keyboard(struct cros_ec_dev *dev, struct mbkp_keyscan *scan);
103*88364387SHung-ying Tyan 
104*88364387SHung-ying Tyan /**
105*88364387SHung-ying Tyan  * Read which image is currently running on the CROS-EC device.
106*88364387SHung-ying Tyan  *
107*88364387SHung-ying Tyan  * @param dev		CROS-EC device
108*88364387SHung-ying Tyan  * @param image		Destination for image identifier
109*88364387SHung-ying Tyan  * @return 0 if ok, <0 on error
110*88364387SHung-ying Tyan  */
111*88364387SHung-ying Tyan int cros_ec_read_current_image(struct cros_ec_dev *dev,
112*88364387SHung-ying Tyan 		enum ec_current_image *image);
113*88364387SHung-ying Tyan 
114*88364387SHung-ying Tyan /**
115*88364387SHung-ying Tyan  * Read the hash of the CROS-EC device firmware.
116*88364387SHung-ying Tyan  *
117*88364387SHung-ying Tyan  * @param dev		CROS-EC device
118*88364387SHung-ying Tyan  * @param hash		Destination for hash information
119*88364387SHung-ying Tyan  * @return 0 if ok, <0 on error
120*88364387SHung-ying Tyan  */
121*88364387SHung-ying Tyan int cros_ec_read_hash(struct cros_ec_dev *dev,
122*88364387SHung-ying Tyan 		struct ec_response_vboot_hash *hash);
123*88364387SHung-ying Tyan 
124*88364387SHung-ying Tyan /**
125*88364387SHung-ying Tyan  * Send a reboot command to the CROS-EC device.
126*88364387SHung-ying Tyan  *
127*88364387SHung-ying Tyan  * Note that some reboot commands (such as EC_REBOOT_COLD) also reboot the AP.
128*88364387SHung-ying Tyan  *
129*88364387SHung-ying Tyan  * @param dev		CROS-EC device
130*88364387SHung-ying Tyan  * @param cmd		Reboot command
131*88364387SHung-ying Tyan  * @param flags         Flags for reboot command (EC_REBOOT_FLAG_*)
132*88364387SHung-ying Tyan  * @return 0 if ok, <0 on error
133*88364387SHung-ying Tyan  */
134*88364387SHung-ying Tyan int cros_ec_reboot(struct cros_ec_dev *dev, enum ec_reboot_cmd cmd,
135*88364387SHung-ying Tyan 		uint8_t flags);
136*88364387SHung-ying Tyan 
137*88364387SHung-ying Tyan /**
138*88364387SHung-ying Tyan  * Check if the CROS-EC device has an interrupt pending.
139*88364387SHung-ying Tyan  *
140*88364387SHung-ying Tyan  * Read the status of the external interrupt connected to the CROS-EC device.
141*88364387SHung-ying Tyan  * If no external interrupt is configured, this always returns 1.
142*88364387SHung-ying Tyan  *
143*88364387SHung-ying Tyan  * @param dev		CROS-EC device
144*88364387SHung-ying Tyan  * @return 0 if no interrupt is pending
145*88364387SHung-ying Tyan  */
146*88364387SHung-ying Tyan int cros_ec_interrupt_pending(struct cros_ec_dev *dev);
147*88364387SHung-ying Tyan 
148*88364387SHung-ying Tyan enum {
149*88364387SHung-ying Tyan 	CROS_EC_OK,
150*88364387SHung-ying Tyan 	CROS_EC_ERR = 1,
151*88364387SHung-ying Tyan 	CROS_EC_ERR_FDT_DECODE,
152*88364387SHung-ying Tyan 	CROS_EC_ERR_CHECK_VERSION,
153*88364387SHung-ying Tyan 	CROS_EC_ERR_READ_ID,
154*88364387SHung-ying Tyan 	CROS_EC_ERR_DEV_INIT,
155*88364387SHung-ying Tyan };
156*88364387SHung-ying Tyan 
157*88364387SHung-ying Tyan /**
158*88364387SHung-ying Tyan  * Set up the Chromium OS matrix keyboard protocol
159*88364387SHung-ying Tyan  *
160*88364387SHung-ying Tyan  * @param blob		Device tree blob containing setup information
161*88364387SHung-ying Tyan  * @param cros_ecp        Returns pointer to the cros_ec device, or NULL if none
162*88364387SHung-ying Tyan  * @return 0 if we got an cros_ec device and all is well (or no cros_ec is
163*88364387SHung-ying Tyan  *	expected), -ve if we should have an cros_ec device but failed to find
164*88364387SHung-ying Tyan  *	one, or init failed (-CROS_EC_ERR_...).
165*88364387SHung-ying Tyan  */
166*88364387SHung-ying Tyan int cros_ec_init(const void *blob, struct cros_ec_dev **cros_ecp);
167*88364387SHung-ying Tyan 
168*88364387SHung-ying Tyan /**
169*88364387SHung-ying Tyan  * Read information about the keyboard matrix
170*88364387SHung-ying Tyan  *
171*88364387SHung-ying Tyan  * @param dev		CROS-EC device
172*88364387SHung-ying Tyan  * @param info		Place to put the info structure
173*88364387SHung-ying Tyan  */
174*88364387SHung-ying Tyan int cros_ec_info(struct cros_ec_dev *dev,
175*88364387SHung-ying Tyan 		struct ec_response_cros_ec_info *info);
176*88364387SHung-ying Tyan 
177*88364387SHung-ying Tyan /**
178*88364387SHung-ying Tyan  * Read the host event flags
179*88364387SHung-ying Tyan  *
180*88364387SHung-ying Tyan  * @param dev		CROS-EC device
181*88364387SHung-ying Tyan  * @param events_ptr	Destination for event flags.  Not changed on error.
182*88364387SHung-ying Tyan  * @return 0 if ok, <0 on error
183*88364387SHung-ying Tyan  */
184*88364387SHung-ying Tyan int cros_ec_get_host_events(struct cros_ec_dev *dev, uint32_t *events_ptr);
185*88364387SHung-ying Tyan 
186*88364387SHung-ying Tyan /**
187*88364387SHung-ying Tyan  * Clear the specified host event flags
188*88364387SHung-ying Tyan  *
189*88364387SHung-ying Tyan  * @param dev		CROS-EC device
190*88364387SHung-ying Tyan  * @param events	Event flags to clear
191*88364387SHung-ying Tyan  * @return 0 if ok, <0 on error
192*88364387SHung-ying Tyan  */
193*88364387SHung-ying Tyan int cros_ec_clear_host_events(struct cros_ec_dev *dev, uint32_t events);
194*88364387SHung-ying Tyan 
195*88364387SHung-ying Tyan /**
196*88364387SHung-ying Tyan  * Get/set flash protection
197*88364387SHung-ying Tyan  *
198*88364387SHung-ying Tyan  * @param dev		CROS-EC device
199*88364387SHung-ying Tyan  * @param set_mask	Mask of flags to set; if 0, just retrieves existing
200*88364387SHung-ying Tyan  *                      protection state without changing it.
201*88364387SHung-ying Tyan  * @param set_flags	New flag values; only bits in set_mask are applied;
202*88364387SHung-ying Tyan  *                      ignored if set_mask=0.
203*88364387SHung-ying Tyan  * @param prot          Destination for updated protection state from EC.
204*88364387SHung-ying Tyan  * @return 0 if ok, <0 on error
205*88364387SHung-ying Tyan  */
206*88364387SHung-ying Tyan int cros_ec_flash_protect(struct cros_ec_dev *dev,
207*88364387SHung-ying Tyan 		       uint32_t set_mask, uint32_t set_flags,
208*88364387SHung-ying Tyan 		       struct ec_response_flash_protect *resp);
209*88364387SHung-ying Tyan 
210*88364387SHung-ying Tyan 
211*88364387SHung-ying Tyan /**
212*88364387SHung-ying Tyan  * Run internal tests on the cros_ec interface.
213*88364387SHung-ying Tyan  *
214*88364387SHung-ying Tyan  * @param dev		CROS-EC device
215*88364387SHung-ying Tyan  * @return 0 if ok, <0 if the test failed
216*88364387SHung-ying Tyan  */
217*88364387SHung-ying Tyan int cros_ec_test(struct cros_ec_dev *dev);
218*88364387SHung-ying Tyan 
219*88364387SHung-ying Tyan /**
220*88364387SHung-ying Tyan  * Update the EC RW copy.
221*88364387SHung-ying Tyan  *
222*88364387SHung-ying Tyan  * @param dev		CROS-EC device
223*88364387SHung-ying Tyan  * @param image		the content to write
224*88364387SHung-ying Tyan  * @param imafge_size	content length
225*88364387SHung-ying Tyan  * @return 0 if ok, <0 if the test failed
226*88364387SHung-ying Tyan  */
227*88364387SHung-ying Tyan int cros_ec_flash_update_rw(struct cros_ec_dev *dev,
228*88364387SHung-ying Tyan 			 const uint8_t  *image, int image_size);
229*88364387SHung-ying Tyan 
230*88364387SHung-ying Tyan /**
231*88364387SHung-ying Tyan  * Return a pointer to the board's CROS-EC device
232*88364387SHung-ying Tyan  *
233*88364387SHung-ying Tyan  * This should be implemented by board files.
234*88364387SHung-ying Tyan  *
235*88364387SHung-ying Tyan  * @return pointer to CROS-EC device, or NULL if none is available
236*88364387SHung-ying Tyan  */
237*88364387SHung-ying Tyan struct cros_ec_dev *board_get_cros_ec_dev(void);
238*88364387SHung-ying Tyan 
239*88364387SHung-ying Tyan 
240*88364387SHung-ying Tyan /* Internal interfaces */
241*88364387SHung-ying Tyan int cros_ec_i2c_init(struct cros_ec_dev *dev, const void *blob);
242*88364387SHung-ying Tyan int cros_ec_spi_init(struct cros_ec_dev *dev, const void *blob);
243*88364387SHung-ying Tyan int cros_ec_lpc_init(struct cros_ec_dev *dev, const void *blob);
244*88364387SHung-ying Tyan 
245*88364387SHung-ying Tyan /**
246*88364387SHung-ying Tyan  * Read information from the fdt for the i2c cros_ec interface
247*88364387SHung-ying Tyan  *
248*88364387SHung-ying Tyan  * @param dev		CROS-EC device
249*88364387SHung-ying Tyan  * @param blob		Device tree blob
250*88364387SHung-ying Tyan  * @return 0 if ok, -1 if we failed to read all required information
251*88364387SHung-ying Tyan  */
252*88364387SHung-ying Tyan int cros_ec_i2c_decode_fdt(struct cros_ec_dev *dev, const void *blob);
253*88364387SHung-ying Tyan 
254*88364387SHung-ying Tyan /**
255*88364387SHung-ying Tyan  * Read information from the fdt for the spi cros_ec interface
256*88364387SHung-ying Tyan  *
257*88364387SHung-ying Tyan  * @param dev		CROS-EC device
258*88364387SHung-ying Tyan  * @param blob		Device tree blob
259*88364387SHung-ying Tyan  * @return 0 if ok, -1 if we failed to read all required information
260*88364387SHung-ying Tyan  */
261*88364387SHung-ying Tyan int cros_ec_spi_decode_fdt(struct cros_ec_dev *dev, const void *blob);
262*88364387SHung-ying Tyan 
263*88364387SHung-ying Tyan /**
264*88364387SHung-ying Tyan  * Check whether the LPC interface supports new-style commands.
265*88364387SHung-ying Tyan  *
266*88364387SHung-ying Tyan  * LPC has its own way of doing this, which involves checking LPC values
267*88364387SHung-ying Tyan  * visible to the host. Do this, and update dev->cmd_version_is_supported
268*88364387SHung-ying Tyan  * accordingly.
269*88364387SHung-ying Tyan  *
270*88364387SHung-ying Tyan  * @param dev		CROS-EC device to check
271*88364387SHung-ying Tyan  */
272*88364387SHung-ying Tyan int cros_ec_lpc_check_version(struct cros_ec_dev *dev);
273*88364387SHung-ying Tyan 
274*88364387SHung-ying Tyan /**
275*88364387SHung-ying Tyan  * Send a command to an I2C CROS-EC device and return the reply.
276*88364387SHung-ying Tyan  *
277*88364387SHung-ying Tyan  * This rather complicated function deals with sending both old-style and
278*88364387SHung-ying Tyan  * new-style commands. The old ones have just a command byte and arguments.
279*88364387SHung-ying Tyan  * The new ones have version, command, arg-len, [args], chksum so are 3 bytes
280*88364387SHung-ying Tyan  * longer.
281*88364387SHung-ying Tyan  *
282*88364387SHung-ying Tyan  * The device's internal input/output buffers are used.
283*88364387SHung-ying Tyan  *
284*88364387SHung-ying Tyan  * @param dev		CROS-EC device
285*88364387SHung-ying Tyan  * @param cmd		Command to send (EC_CMD_...)
286*88364387SHung-ying Tyan  * @param cmd_version	Version of command to send (EC_VER_...)
287*88364387SHung-ying Tyan  * @param dout          Output data (may be NULL If dout_len=0)
288*88364387SHung-ying Tyan  * @param dout_len      Size of output data in bytes
289*88364387SHung-ying Tyan  * @param dinp          Returns pointer to response data
290*88364387SHung-ying Tyan  * @param din_len       Maximum size of response in bytes
291*88364387SHung-ying Tyan  * @return number of bytes in response, or -1 on error
292*88364387SHung-ying Tyan  */
293*88364387SHung-ying Tyan int cros_ec_i2c_command(struct cros_ec_dev *dev, uint8_t cmd, int cmd_version,
294*88364387SHung-ying Tyan 		     const uint8_t *dout, int dout_len,
295*88364387SHung-ying Tyan 		     uint8_t **dinp, int din_len);
296*88364387SHung-ying Tyan 
297*88364387SHung-ying Tyan /**
298*88364387SHung-ying Tyan  * Send a command to a LPC CROS-EC device and return the reply.
299*88364387SHung-ying Tyan  *
300*88364387SHung-ying Tyan  * The device's internal input/output buffers are used.
301*88364387SHung-ying Tyan  *
302*88364387SHung-ying Tyan  * @param dev		CROS-EC device
303*88364387SHung-ying Tyan  * @param cmd		Command to send (EC_CMD_...)
304*88364387SHung-ying Tyan  * @param cmd_version	Version of command to send (EC_VER_...)
305*88364387SHung-ying Tyan  * @param dout          Output data (may be NULL If dout_len=0)
306*88364387SHung-ying Tyan  * @param dout_len      Size of output data in bytes
307*88364387SHung-ying Tyan  * @param dinp          Returns pointer to response data
308*88364387SHung-ying Tyan  * @param din_len       Maximum size of response in bytes
309*88364387SHung-ying Tyan  * @return number of bytes in response, or -1 on error
310*88364387SHung-ying Tyan  */
311*88364387SHung-ying Tyan int cros_ec_lpc_command(struct cros_ec_dev *dev, uint8_t cmd, int cmd_version,
312*88364387SHung-ying Tyan 		     const uint8_t *dout, int dout_len,
313*88364387SHung-ying Tyan 		     uint8_t **dinp, int din_len);
314*88364387SHung-ying Tyan 
315*88364387SHung-ying Tyan int cros_ec_spi_command(struct cros_ec_dev *dev, uint8_t cmd, int cmd_version,
316*88364387SHung-ying Tyan 		     const uint8_t *dout, int dout_len,
317*88364387SHung-ying Tyan 		     uint8_t **dinp, int din_len);
318*88364387SHung-ying Tyan 
319*88364387SHung-ying Tyan /**
320*88364387SHung-ying Tyan  * Dump a block of data for a command.
321*88364387SHung-ying Tyan  *
322*88364387SHung-ying Tyan  * @param name	Name for data (e.g. 'in', 'out')
323*88364387SHung-ying Tyan  * @param cmd	Command number associated with data, or -1 for none
324*88364387SHung-ying Tyan  * @param data	Data block to dump
325*88364387SHung-ying Tyan  * @param len	Length of data block to dump
326*88364387SHung-ying Tyan  */
327*88364387SHung-ying Tyan void cros_ec_dump_data(const char *name, int cmd, const uint8_t *data, int len);
328*88364387SHung-ying Tyan 
329*88364387SHung-ying Tyan /**
330*88364387SHung-ying Tyan  * Calculate a simple 8-bit checksum of a data block
331*88364387SHung-ying Tyan  *
332*88364387SHung-ying Tyan  * @param data	Data block to checksum
333*88364387SHung-ying Tyan  * @param size	Size of data block in bytes
334*88364387SHung-ying Tyan  * @return checksum value (0 to 255)
335*88364387SHung-ying Tyan  */
336*88364387SHung-ying Tyan int cros_ec_calc_checksum(const uint8_t *data, int size);
337*88364387SHung-ying Tyan 
338*88364387SHung-ying Tyan /**
339*88364387SHung-ying Tyan  * Decode a flash region parameter
340*88364387SHung-ying Tyan  *
341*88364387SHung-ying Tyan  * @param argc	Number of params remaining
342*88364387SHung-ying Tyan  * @param argv	List of remaining parameters
343*88364387SHung-ying Tyan  * @return flash region (EC_FLASH_REGION_...) or -1 on error
344*88364387SHung-ying Tyan  */
345*88364387SHung-ying Tyan int cros_ec_decode_region(int argc, char * const argv[]);
346*88364387SHung-ying Tyan 
347*88364387SHung-ying Tyan int cros_ec_flash_erase(struct cros_ec_dev *dev, uint32_t offset,
348*88364387SHung-ying Tyan 		uint32_t size);
349*88364387SHung-ying Tyan 
350*88364387SHung-ying Tyan /**
351*88364387SHung-ying Tyan  * Read data from the flash
352*88364387SHung-ying Tyan  *
353*88364387SHung-ying Tyan  * Read an arbitrary amount of data from the EC flash, by repeatedly reading
354*88364387SHung-ying Tyan  * small blocks.
355*88364387SHung-ying Tyan  *
356*88364387SHung-ying Tyan  * The offset starts at 0. You can obtain the region information from
357*88364387SHung-ying Tyan  * cros_ec_flash_offset() to find out where to read for a particular region.
358*88364387SHung-ying Tyan  *
359*88364387SHung-ying Tyan  * @param dev		CROS-EC device
360*88364387SHung-ying Tyan  * @param data		Pointer to data buffer to read into
361*88364387SHung-ying Tyan  * @param offset	Offset within flash to read from
362*88364387SHung-ying Tyan  * @param size		Number of bytes to read
363*88364387SHung-ying Tyan  * @return 0 if ok, -1 on error
364*88364387SHung-ying Tyan  */
365*88364387SHung-ying Tyan int cros_ec_flash_read(struct cros_ec_dev *dev, uint8_t *data, uint32_t offset,
366*88364387SHung-ying Tyan 		    uint32_t size);
367*88364387SHung-ying Tyan 
368*88364387SHung-ying Tyan /**
369*88364387SHung-ying Tyan  * Write data to the flash
370*88364387SHung-ying Tyan  *
371*88364387SHung-ying Tyan  * Write an arbitrary amount of data to the EC flash, by repeatedly writing
372*88364387SHung-ying Tyan  * small blocks.
373*88364387SHung-ying Tyan  *
374*88364387SHung-ying Tyan  * The offset starts at 0. You can obtain the region information from
375*88364387SHung-ying Tyan  * cros_ec_flash_offset() to find out where to write for a particular region.
376*88364387SHung-ying Tyan  *
377*88364387SHung-ying Tyan  * Attempting to write to the region where the EC is currently running from
378*88364387SHung-ying Tyan  * will result in an error.
379*88364387SHung-ying Tyan  *
380*88364387SHung-ying Tyan  * @param dev		CROS-EC device
381*88364387SHung-ying Tyan  * @param data		Pointer to data buffer to write
382*88364387SHung-ying Tyan  * @param offset	Offset within flash to write to.
383*88364387SHung-ying Tyan  * @param size		Number of bytes to write
384*88364387SHung-ying Tyan  * @return 0 if ok, -1 on error
385*88364387SHung-ying Tyan  */
386*88364387SHung-ying Tyan int cros_ec_flash_write(struct cros_ec_dev *dev, const uint8_t *data,
387*88364387SHung-ying Tyan 		     uint32_t offset, uint32_t size);
388*88364387SHung-ying Tyan 
389*88364387SHung-ying Tyan /**
390*88364387SHung-ying Tyan  * Obtain position and size of a flash region
391*88364387SHung-ying Tyan  *
392*88364387SHung-ying Tyan  * @param dev		CROS-EC device
393*88364387SHung-ying Tyan  * @param region	Flash region to query
394*88364387SHung-ying Tyan  * @param offset	Returns offset of flash region in EC flash
395*88364387SHung-ying Tyan  * @param size		Returns size of flash region
396*88364387SHung-ying Tyan  * @return 0 if ok, -1 on error
397*88364387SHung-ying Tyan  */
398*88364387SHung-ying Tyan int cros_ec_flash_offset(struct cros_ec_dev *dev, enum ec_flash_region region,
399*88364387SHung-ying Tyan 		      uint32_t *offset, uint32_t *size);
400*88364387SHung-ying Tyan 
401*88364387SHung-ying Tyan /**
402*88364387SHung-ying Tyan  * Read/write VbNvContext from/to a CROS-EC device.
403*88364387SHung-ying Tyan  *
404*88364387SHung-ying Tyan  * @param dev		CROS-EC device
405*88364387SHung-ying Tyan  * @param block		Buffer of VbNvContext to be read/write
406*88364387SHung-ying Tyan  * @return 0 if ok, -1 on error
407*88364387SHung-ying Tyan  */
408*88364387SHung-ying Tyan int cros_ec_read_vbnvcontext(struct cros_ec_dev *dev, uint8_t *block);
409*88364387SHung-ying Tyan int cros_ec_write_vbnvcontext(struct cros_ec_dev *dev, const uint8_t *block);
410*88364387SHung-ying Tyan 
411*88364387SHung-ying Tyan /**
412*88364387SHung-ying Tyan  * Read the version information for the EC images
413*88364387SHung-ying Tyan  *
414*88364387SHung-ying Tyan  * @param dev		CROS-EC device
415*88364387SHung-ying Tyan  * @param versionp	This is set to point to the version information
416*88364387SHung-ying Tyan  * @return 0 if ok, -1 on error
417*88364387SHung-ying Tyan  */
418*88364387SHung-ying Tyan int cros_ec_read_version(struct cros_ec_dev *dev,
419*88364387SHung-ying Tyan 		       struct ec_response_get_version **versionp);
420*88364387SHung-ying Tyan 
421*88364387SHung-ying Tyan /**
422*88364387SHung-ying Tyan  * Read the build information for the EC
423*88364387SHung-ying Tyan  *
424*88364387SHung-ying Tyan  * @param dev		CROS-EC device
425*88364387SHung-ying Tyan  * @param versionp	This is set to point to the build string
426*88364387SHung-ying Tyan  * @return 0 if ok, -1 on error
427*88364387SHung-ying Tyan  */
428*88364387SHung-ying Tyan int cros_ec_read_build_info(struct cros_ec_dev *dev, char **strp);
429*88364387SHung-ying Tyan 
430*88364387SHung-ying Tyan /**
431*88364387SHung-ying Tyan  * Switch on/off a LDO / FET.
432*88364387SHung-ying Tyan  *
433*88364387SHung-ying Tyan  * @param dev		CROS-EC device
434*88364387SHung-ying Tyan  * @param index		index of the LDO/FET to switch
435*88364387SHung-ying Tyan  * @param state		new state of the LDO/FET : EC_LDO_STATE_ON|OFF
436*88364387SHung-ying Tyan  * @return 0 if ok, -1 on error
437*88364387SHung-ying Tyan  */
438*88364387SHung-ying Tyan int cros_ec_set_ldo(struct cros_ec_dev *dev, uint8_t index, uint8_t state);
439*88364387SHung-ying Tyan 
440*88364387SHung-ying Tyan /**
441*88364387SHung-ying Tyan  * Read back a LDO / FET current state.
442*88364387SHung-ying Tyan  *
443*88364387SHung-ying Tyan  * @param dev		CROS-EC device
444*88364387SHung-ying Tyan  * @param index		index of the LDO/FET to switch
445*88364387SHung-ying Tyan  * @param state		current state of the LDO/FET : EC_LDO_STATE_ON|OFF
446*88364387SHung-ying Tyan  * @return 0 if ok, -1 on error
447*88364387SHung-ying Tyan  */
448*88364387SHung-ying Tyan int cros_ec_get_ldo(struct cros_ec_dev *dev, uint8_t index, uint8_t *state);
449*88364387SHung-ying Tyan #endif
450