/* SPDX-License-Identifier: GPL-2.0 */
/*
 * Copyright (c) 2019 MediaTek Inc.
 */

#ifndef __MTK_PE_INTF_H
#define __MTK_PE_INTF_H

#include "mtk_charger_algorithm_class.h"

#define TA_AC_12V_INPUT_CURRENT 3200000
#define TA_AC_9V_INPUT_CURRENT	3200000
#define TA_AC_7V_INPUT_CURRENT	3200000
#define PE_ICHG_LEAVE_THRESHOLD 1000000 /* uA */
#define TA_START_BATTERY_SOC	0
#define TA_STOP_BATTERY_SOC	85
#define PE_V_CHARGER_MIN 4600000 /* 4.6 V */
#define DISABLE_VBAT_THRESHOLD -1

#define PE_INPUT_CURRENT		3200000
#define PE_CHARGING_CURRENT	3000000


/*dual charger */
#define PE_SLAVE_MIVR_DIFF 100000

#define ECABLEOUT	1	/* cable out */
#define EHAL		2	/* hal operation error */

#define PE_ERROR_LEVEL	1
#define PE_INFO_LEVEL	2
#define PE_DEBUG_LEVEL	3

extern int pe_get_debug_level(void);
#define pe_err(fmt, args...)					\
do {								\
	if (pe_get_debug_level() >= PE_ERROR_LEVEL) {	\
		pr_notice(fmt, ##args);				\
	}							\
} while (0)

#define pe_info(fmt, args...)					\
do {								\
	if (pe_get_debug_level() >= PE_INFO_LEVEL) { \
		pr_notice(fmt, ##args);				\
	}							\
} while (0)

#define pe_dbg(fmt, args...)					\
do {								\
	if (pe_get_debug_level() >= PE_DEBUG_LEVEL) {	\
		pr_notice(fmt, ##args);				\
	}							\
} while (0)


enum pe_state_enum {
	PE_HW_UNINIT = 0,
	PE_HW_FAIL,
	PE_HW_READY,
	PE_TA_NOT_SUPPORT,
	PE_RUN,
	PE_DONE
};

struct mtk_pe {
	struct platform_device *pdev;
	struct chg_alg_device *alg;
	struct mutex access_lock;
	struct mutex cable_out_lock;
	struct wakeup_source *suspend_lock;
	int state;
	struct power_supply *bat_psy;

	int ta_vchr_org; /* uA */
	bool to_tune_ta_vchr;
	bool is_cable_out_occur; /* Plug out happened while detecting PE+ */

	int pe_ichg_level_threshold;	/* ma */
	int ta_start_battery_soc;
	int ta_stop_battery_soc;
	int min_charger_voltage;

	int ta_ac_12v_input_current;
	int ta_ac_9v_input_current;
	int ta_ac_7v_input_current;
	int ta_ac_charger_current;

	bool ta_12v_support;
	bool ta_9v_support;

	int vbat_threshold; /* For checking Ready */
	int ref_vbat; /* Vbat with cable in */
	int cv;
	int input_current_limit;
	int charging_current_limit;
	int input_current;
	int charging_current;

/* dual charger */
	int pe_slave_mivr_diff;

};

extern int pe_hal_init_hardware(struct chg_alg_device *alg);
extern int pe_hal_get_vbus(struct chg_alg_device *alg);
extern int pe_hal_get_ibat(struct chg_alg_device *alg);
extern int pe_hal_get_charging_current(struct chg_alg_device *alg,
	enum chg_idx chgidx, u32 *ua);
extern int pe_hal_enable_vbus_ovp(struct chg_alg_device *alg,
	bool enable);
extern int pe_hal_enable_charging(struct chg_alg_device *alg,
	bool enable);
extern int pe_hal_set_mivr(struct chg_alg_device *alg,
	enum chg_idx chgidx, int uV);
extern int pe_hal_get_uisoc(struct chg_alg_device *alg);
extern int pe_hal_get_charger_type(struct chg_alg_device *alg);
extern int pe_hal_send_ta_current_pattern(struct chg_alg_device *alg,
					  bool increase);
extern int pe_hal_get_charger_cnt(struct chg_alg_device *alg);
extern bool pe_hal_is_chip_enable(struct chg_alg_device *alg,
	enum chg_idx chgidx);
extern int pe_hal_enable_chip(struct chg_alg_device *alg,
	enum chg_idx chgidx, bool en);
extern int pe_hal_reset_ta(struct chg_alg_device *alg,
	enum chg_idx chgidx);
extern int pe_hal_set_cv(struct chg_alg_device *alg,
	enum chg_idx chgidx, u32 uv);
extern int pe_hal_set_charging_current(struct chg_alg_device *alg,
	enum chg_idx chgidx, u32 ua);
extern int pe_hal_set_input_current(struct chg_alg_device *alg,
	enum chg_idx chgidx, u32 ua);
extern int pe_hal_get_log_level(struct chg_alg_device *alg);
#endif /* __MTK_PE_INTF_H */
