/* SPDX-License-Identifier: GPL-2.0-or-later */

#ifndef SUPERIO_ITE_ENV_CTRL_CHIP_H
#define SUPERIO_ITE_ENV_CTRL_CHIP_H

#define ITE_EC_TMPIN_CNT	3

#if CONFIG(SUPERIO_ITE_ENV_CTRL_5FANS)
#define ITE_EC_FAN_CNT		5
#else
#define ITE_EC_FAN_CNT		3
#endif

#define ITE_EC_FAN_VECTOR_CNT	2 /* A, B */

/* Supported thermal mode on TMPINx */
enum ite_ec_thermal_mode {
	THERMAL_MODE_DISABLED = 0,
	THERMAL_DIODE,
	THERMAL_RESISTOR,
	THERMAL_PECI,
};

struct ite_ec_thermal_config {
	enum ite_ec_thermal_mode mode;
	/* Offset is used for diode sensors and PECI */
	u8 offset;
	/* Limits */
	u8 min;
	u8 max;
};

/* Bit mask for voltage pins VINx */
enum ite_ec_voltage_pin {
	VIN0 = 0x01,
	VIN1 = 0x02,
	VIN2 = 0x04,
	VIN3 = 0x08,
	VIN4 = 0x10,
	VIN5 = 0x20,
	VIN6 = 0x40,
	VIN7 = 0x80,
	VIN_ALL = 0xff
};

enum ite_ec_fan_mode {
	FAN_IGNORE = 0,
	FAN_MODE_ON,
	FAN_MODE_OFF,
	FAN_SMART_SOFTWARE,
	FAN_SMART_AUTOMATIC,
};

struct ite_ec_fan_smartconfig {
	u8 tmpin;	/* select TMPINx (1, 2 or 3)			*/
	u8 tmp_off;	/* turn fan off below (°C)			*/
	u8 tmp_start;	/* turn fan on above (°C)			*/
	u8 tmp_full;	/* 100% duty cycle above (°C)			*/
	u8 tmp_delta;	/* adapt fan speed when temperature changed by
			   at least `tmp_delta`°C			*/
	u8 full_lmt;	/* force fan to full PWM at thermal limit	*/
	u8 smoothing;	/* enable smoothing				*/
	u8 pwm_start;	/* start at this duty cycle (%)			*/
	u8 slope;	/* increase duty cycle by `slope`%/°C		*/
	u8 clsd_loop;	/* tachometer closed-loop mode enable		*/
	u16 rpm_start;	/* start at this RPM (clsd_loop = 1)		*/
};

struct ite_ec_fan_config {
	enum ite_ec_fan_mode mode;
	struct ite_ec_fan_smartconfig smart;
};

/* Special fan control modes that will assist smart control */
struct ite_ec_fan_vector_config {
	u8 tmpin;	/* select TMPINx (1, 2 or 3)			*/
	u8 fanout;	/* select FANx (1, 2 or 3)			*/
	u8 tmp_start;
	u8 tmp_delta;
	u8 tmp_range;	/* restrict the range of the vector function,
			   0x00 to disable				*/
	s8 slope;
};

struct ite_ec_config {
	/*
	 * Enable reading of voltage pins VINx.
	 */
	enum ite_ec_voltage_pin vin_mask;

	/*
	 * Enable temperature sensors in given mode.
	 */
	struct ite_ec_thermal_config tmpin[ITE_EC_TMPIN_CNT];

	/*
	 * Enable a FAN in given mode.
	 */
	struct ite_ec_fan_config fan[ITE_EC_FAN_CNT];

	/*
	 * Enable special FAN vector control.
	 */
	struct ite_ec_fan_vector_config fan_vector[ITE_EC_FAN_VECTOR_CNT];

	bool tmpin_beep;
	bool fan_beep;
	bool vin_beep;

	/*
	 * Enable SMBus for external thermal sensor.
	 */
	bool smbus_en;
	/*
	 * Select 24 MHz clock for external host instead of an
	 * internally generated 32 MHz clock.
	 */
	bool smbus_24mhz;
};

/* Some shorthands for device trees */
#define TMPIN1	ec.tmpin[0]
#define TMPIN2	ec.tmpin[1]
#define TMPIN3	ec.tmpin[2]

#define FAN1	ec.fan[0]
#define FAN2	ec.fan[1]
#define FAN3	ec.fan[2]
#define FAN4	ec.fan[3]
#define FAN5	ec.fan[4]

#define FAN_VECA ec.fan_vector[0]
#define FAN_VECB ec.fan_vector[1]

#endif /* SUPERIO_ITE_ENV_CTRL_CHIP_H */