/* Copyright 2017 The Chromium OS Authors. All rights reserved.
 * Use of this source code is governed by a BSD-style license that can be
 * found in the LICENSE file.
 *
 * SILERGY SY21612 buck-boost converter driver.
 */

#ifndef __CROS_EC_SY21612_H
#define __CROS_EC_SY21612_H

#include "gpio.h"

#ifndef SY21612_ADDR
#define SY21612_ADDR		0xe2 /* 7bit address 1110_010 */
#endif

enum sy21612_switching_freq {
	SY21612_FREQ_250KHZ = 0,
	SY21612_FREQ_500KHZ,
	SY21612_FREQ_750KHZ,
	SY21612_FREQ_1MHZ
};

enum sy21612_vbus_volt {
	SY21612_VBUS_5V = 2,
	SY21612_VBUS_7V,
	SY21612_VBUS_9V,
	SY21612_VBUS_12V,
	SY21612_VBUS_15V,
	SY21612_VBUS_20V,
};

enum sy21612_vbus_adj {
	SY21612_VBUS_M2_5 = 0,
	SY21612_VBUS_M1_25,
	SY21612_VBUS_0,
	SY21612_VBUS_1_25,
	SY21612_VBUS_2_5,
	SY21612_VBUS_3_75,
	SY21612_VBUS_5,
};

#define SY21612_CTRL1        0x00
#define SY21612_CTRL1_REG_EN         (1 << 7)
#define SY21612_CTRL1_LOW_BAT_MASK   (7 << 4)
#define SY21612_CTRL1_LOW_BAT_10_2V  (0 << 4)
#define SY21612_CTRL1_LOW_BAT_10_7V  (1 << 4)
#define SY21612_CTRL1_LOW_BAT_11_2V  (2 << 4)
#define SY21612_CTRL1_LOW_BAT_11_7V  (3 << 4)
#define SY21612_CTRL1_LOW_BAT_22_0V  (4 << 4)
#define SY21612_CTRL1_LOW_BAT_22_5V  (5 << 4)
#define SY21612_CTRL1_LOW_BAT_23_0V  (6 << 4)
#define SY21612_CTRL1_LOW_BAT_23_5V  (7 << 4)
#define SY21612_CTRL1_ADC_EN         (1 << 3)
#define SY21612_CTRL1_ADC_AUTO_MODE  (1 << 2)
#define SY21612_CTRL1_VBUS_NDISCHG   (1 << 1)

#define SY21612_CTRL2        0x01
#define SY21612_CTRL2_FREQ_MASK      (3 << 6)
#define SY21612_CTRL2_FREQ_SHIFT     6
#define SY21612_CTRL2_FREQ_250K      (0 << 6)
#define SY21612_CTRL2_FREQ_500K      (1 << 6)
#define SY21612_CTRL2_FREQ_750K      (2 << 6)
#define SY21612_CTRL2_FREQ_1M        (3 << 6)
#define SY21612_CTRL2_VBUS_MASK      (7 << 3)
#define SY21612_CTRL2_VBUS_SHIFT     3
#define SY21612_CTRL2_VBUS_5V        (2 << 3)
#define SY21612_CTRL2_VBUS_7V        (3 << 3)
#define SY21612_CTRL2_VBUS_9V        (4 << 3)
#define SY21612_CTRL2_VBUS_12V       (5 << 3)
#define SY21612_CTRL2_VBUS_15V       (6 << 3)
#define SY21612_CTRL2_VBUS_20V       (7 << 3)
#define SY21612_CTRL2_VBUS_ADJ_MASK  7
#define SY21612_CTRL2_VBUS_ADJ_SHIFT 0
#define SY21612_CTRL2_VBUS_ADJ_M2_5  0
#define SY21612_CTRL2_VBUS_ADJ_M1_25 1
#define SY21612_CTRL2_VBUS_ADJ_0     2
#define SY21612_CTRL2_VBUS_ADJ_1_25  3
#define SY21612_CTRL2_VBUS_ADJ_2_5   4
#define SY21612_CTRL2_VBUS_ADJ_3_75  5
#define SY21612_CTRL2_VBUS_ADJ_5     6

#define SY21612_PROT1        0x02
#define SY21612_PROT1_I_THRESH_MASK   (7 << 5)
#define SY21612_PROT1_I_THRESH_18MV   (0 << 5)
#define SY21612_PROT1_I_THRESH_22MV   (1 << 5)
#define SY21612_PROT1_I_THRESH_27MV   (2 << 5)
#define SY21612_PROT1_I_THRESH_31MV   (3 << 5)
#define SY21612_PROT1_I_THRESH_36MV   (4 << 5)
#define SY21612_PROT1_I_THRESH_45MV   (5 << 5)
#define SY21612_PROT1_I_THRESH_54MV   (6 << 5)
#define SY21612_PROT1_I_THRESH_64MV   (7 << 5)
#define SY21612_PROT1_OVP_THRESH_MASK (3 << 3)
#define SY21612_PROT1_OVP_THRESH_110  (0 << 3)
#define SY21612_PROT1_OVP_THRESH_115  (1 << 3)
#define SY21612_PROT1_OVP_THRESH_120  (2 << 3)
#define SY21612_PROT1_OVP_THRESH_125  (3 << 3)
#define SY21612_PROT1_UVP_THRESH_MASK (3 << 1)
#define SY21612_PROT1_UVP_THRESH_50   (0 << 1)
#define SY21612_PROT1_UVP_THRESH_60   (1 << 1)
#define SY21612_PROT1_UVP_THRESH_70   (2 << 1)
#define SY21612_PROT1_UVP_THRESH_80   (3 << 1)

#define SY21612_PROT2        0x03
#define SY21612_PROT2_I_LIMIT_MASK    (3 << 6)
#define SY21612_PROT2_I_LIMIT_6A      (0 << 6)
#define SY21612_PROT2_I_LIMIT_8A      (2 << 6)
#define SY21612_PROT2_I_LIMIT_10A     (3 << 6)
#define SY21612_PROT2_OCP_AUTORECOVER (1 << 5)
#define SY21612_PROT2_UVP_AUTORECOVER (1 << 4)
#define SY21612_PROT2_OTP_AUTORECOVER (1 << 3)
#define SY21612_PROT2_SINK_MODE       (1 << 2)

#define SY21612_STATE        0x04
#define SY21612_STATE_POWER_GOOD      (1 << 7)
#define SY21612_STATE_VBAT_LT_VBUS    (1 << 6)
#define SY21612_STATE_VBAT_LOW        (1 << 5)

#define SY21612_INT          0x05
#define SY21612_INT_ADC_READY         (1 << 7)
#define SY21612_INT_VBUS_OCP          (1 << 6)
#define SY21612_INT_INDUCTOR_OCP      (1 << 5)
#define SY21612_INT_UVP               (1 << 4)
#define SY21612_INT_OTP               (1 << 3)

/* Battery voltage range: 0 ~ 25V */
#define SY21612_VBAT_VOLT    0x06

/* VBUS voltage range: 0 ~ 25V */
#define SY21612_VBUS_VOLT    0x07

/* Output current sense voltage range 0 ~ 67mV */
#define SY21612_VBUS_CURRENT 0x08

/* Enable or disable the regulator */
int sy21612_enable_regulator(int enable);
/* Enable internal adc */
int sy21612_enable_adc(int enable);
/* Set ADC mode to single or auto */
int sy21612_set_adc_mode(int auto_mode);
/* Enable VBUS auto discharge when regulator is disabled */
int sy21612_set_vbus_discharge(int auto_discharge);
/* Set buck-boost switching frequency */
int sy21612_set_switching_freq(enum sy21612_switching_freq freq);
/* Set VBUS output voltage */
int sy21612_set_vbus_volt(enum sy21612_vbus_volt volt);
/* Adjust VBUS output voltage */
int sy21612_set_vbus_adj(enum sy21612_vbus_adj adj);
/* Set bidirection mode */
int sy21612_set_sink_mode(int sink_mode);
/* Get power good status */
int sy21612_is_power_good(void);
/* Read and clear interrupt flags */
int sy21612_read_clear_int(void);
/* Get VBUS voltage in mV */
int sy21612_get_vbat_voltage(void);
/* Get VBUS voltage in mV */
int sy21612_get_vbus_voltage(void);
/* Get VBUS current in mA */
int sy21612_get_vbus_current(void);
/* Interrupt handler */
void sy21612_int(enum gpio_signal signal);

#endif /* __CROS_EC_SY21612_H */
