/*
 * This file is part of the flashrom project.
 *
 * Copyright 2013 Google Inc.
 *
 * This program is free software; you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation; either version 2 of the License, or
 * (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 */

#ifndef __CROS_EC_H_
#define __CROS_EC_H_

/* FIXME: We should be able to forward declare enum ec_current_image here
 * instead of including cros_ec_ec_commands.h */
#include "cros_ec_commands.h"
#include "programmer.h"

struct cros_ec_priv {
	int detected;
	enum ec_current_image current_image;
	struct ec_response_flash_region_info *region;
	int (*ec_command)(int command, int ver, const void *indata, int insize,
			  void *outdata, int outsize);

	/*
	 * Latest kernel supports handling of several ECs in the system.
	 * To use that feature, the proper device file should be used:
	 * The format is /dev/cros_XX, where XX is the type of device:
	 * - ec: the main EC
	 * - pd: the Power Delivery EC
	 * - sh: the Sensor Hub EC.
	 */
	const char* dev;

	/*
	 * Some CrOS ECs support page write mode for their flash memory. This
	 * represents the ideal size of a data payload to write to flash.
	 */
	unsigned int ideal_write_size;

	/*
	 * Allow block size to be overwritten in case the EC is incorrect.
	 */
	unsigned int erase_block_size;

	/*
	 * Allow max response size to be overwritten in case the EC is incorrect.
	 */
	unsigned int max_response_size;
};

extern struct cros_ec_priv *cros_ec_priv;

int cros_ec_probe_size(struct flashctx *flash);
int cros_ec_block_erase(struct flashctx *flash,
                    unsigned int blockaddr, unsigned int len);
int cros_ec_read(struct flashctx *flash, uint8_t *readarr,
             unsigned int blockaddr, unsigned int readcnt);
int cros_ec_write(struct flashctx *flash, const uint8_t *buf, unsigned int addr,
                    unsigned int nbytes);

#endif	/* __CROS_EC_H_ */
