// SPDX-License-Identifier: GPL-2.0
// BQ2515X Battery Charger Driver
// Copyright (C) 2020 Texas Instruments Incorporated - https://www.ti.com/
#include <linux/err.h>
#include <linux/i2c.h>
#include <linux/init.h>
#include <linux/kernel.h>
#include <linux/module.h>
#include <linux/gpio/consumer.h>
#include <linux/power_supply.h>
#include <linux/regmap.h>
#include <linux/types.h>
#define BQ2515X_MANUFACTURER "Texas Instruments"
#define BQ2515X_STAT0 0x00
#define BQ2515X_STAT1 0x01
#define BQ2515X_STAT2 0x02
#define BQ2515X_FLAG0 0x03
#define BQ2515X_FLAG1 0x04
#define BQ2515X_FLAG2 0x05
#define BQ2515X_FLAG3 0x06
#define BQ2515X_MASK0 0x07
#define BQ2515X_MASK1 0x08
#define BQ2515X_MASK2 0x09
#define BQ2515X_MASK3 0x0a
#define BQ2515X_VBAT_CTRL 0x12
#define BQ2515X_ICHG_CTRL 0x13
#define BQ2515X_PCHRGCTRL 0x14
#define BQ2515X_TERMCTRL 0x15
#define BQ2515X_BUVLO 0x16
#define BQ2515X_CHARGERCTRL0 0x17
#define BQ2515X_CHARGERCTRL1 0x18
#define BQ2515X_ILIMCTRL 0x19
#define BQ2515X_LDOCTRL 0x1d
#define BQ2515X_MRCTRL 0x30
#define BQ2515X_ICCTRL0 0x35
#define BQ2515X_ICCTRL1 0x36
#define BQ2515X_ICCTRL2 0x37
#define BQ2515X_ADCCTRL0 0x40
#define BQ2515X_ADCCTRL1 0x41
#define BQ2515X_ADC_VBAT_M 0x42
#define BQ2515X_ADC_VBAT_L 0x43
#define BQ2515X_ADC_TS_M 0x44
#define BQ2515X_ADC_TS_L 0x45
#define BQ2515X_ADC_ICHG_M 0x46
#define BQ2515X_ADC_ICHG_L 0x47
#define BQ2515X_ADC_ADCIN_M 0x48
#define BQ2515X_ADC_ADCIN_L 0x49
#define BQ2515X_ADC_VIN_M 0x4a
#define BQ2515X_ADC_VIN_L 0x4b
#define BQ2515X_ADC_PMID_M 0x4c
#define BQ2515X_ADC_PMID_L 0x4d
#define BQ2515X_ADC_IIN_M 0x4e
#define BQ2515X_ADC_IIN_L 0x4f
#define BQ2515X_ADC_COMP1_M 0x52
#define BQ2515X_ADC_COMP1_L 0X53
#define BQ2515X_ADC_COMP2_M 0X54
#define BQ2515X_ADC_COMP2_L 0x55
#define BQ2515X_ADC_COMP3_M 0x56
#define BQ2515X_ADC_COMP3_L 0x57
#define BQ2515X_ADC_READ_EN 0x58
#define BQ2515X_TS_FASTCHGCTRL 0x61
#define BQ2515X_TS_COLD 0x62
#define BQ2515X_TS_COOL 0x63
#define BQ2515X_TS_WARM 0x64
#define BQ2515X_TS_HOT 0x65
#define BQ2515X_DEVICE_ID 0x6f
#define BQ2515X_DEFAULT_ICHG_UA 10000
#define BQ25150_DEFAULT_ILIM_UA 100000
#define BQ25155_DEFAULT_ILIM_UA 500000
#define BQ2515X_DEFAULT_VBAT_REG_UV 4200000
#define BQ2515X_DEFAULT_IPRECHARGE_UA 2500
#define BQ2515X_DIVISOR 65536
#define BQ2515X_VBAT_BASE_VOLT 3600000
#define BQ2515X_VBAT_REG_MAX 4600000
#define BQ2515X_VBAT_REG_MIN 3600000
#define BQ2515X_VBAT_STEP_UV 10000
#define BQ2515X_UV_FACTOR 1000000
#define BQ2515X_VBAT_MULTIPLIER 6
#define BQ2515X_ICHG_DIVISOR 52429
#define BQ2515X_ICHG_CURR_STEP_THRESH_UA 318750
#define BQ2515X_ICHG_MIN_UA 0
#define BQ2515X_ICHG_MAX_UA 500000
#define BQ2515X_ICHG_RNG_1B0_UA 1250
#define BQ2515X_ICHG_RNG_1B1_UA 2500
#define BQ2515X_VLOWV_SEL_1B0_UV 3000000
#define BQ2515X_VLOWV_SEL_1B1_UV 2800000
#define BQ2515X_PRECHRG_ICHRG_RNGE_1875_UA 18750
#define BQ2515X_PRECHRG_ICHRG_RNGE_3750_UA 37500
#define BQ2515X_TWAKE2_MIN_US 1700000
#define BQ2515X_TWAKE2_MAX_US 2300000
#define BQ2515X_ILIM_150MA 0x2
#define BQ2515X_ILIM_MASK 0x7
#define BQ2515X_ILIM_MIN 50000
#define BQ2515X_ILIM_MAX 600000
#define BQ2515X_HEALTH_MASK 0xf
#define BQ2515X_ICHGRNG_MASK 0x80
#define BQ2515X_STAT0_MASK 0x0f
#define BQ2515X_STAT1_MASK 0x1f
#define BQ2515X_PRECHARGE_MASK 0x1f
#define BQ2515X_TS_HOT_STAT BIT(0)
#define BQ2515X_TS_WARM_STAT BIT(1)
#define BQ2515X_TS_COOL_STAT BIT(2)
#define BQ2515X_TS_COLD_STAT BIT(3)
#define BQ2515X_SAFETY_TIMER_EXP BIT(5)
#define BQ2515X_EN_VBAT_READ BIT(3)
#define BQ2515X_EN_ICHG_READ BIT(5)
#define BQ2515X_VIN_GOOD BIT(0)
#define BQ2515X_CHRG_DONE BIT(5)
#define BQ2515X_CV_CHRG_MODE BIT(6)
#define BQ2515X_VIN_OVP_FAULT_STAT BIT(7)
#define BQ2515X_WATCHDOG_DISABLE BIT(4)
#define BQ2515X_ICHARGE_RANGE BIT(7)
#define BQ2515X_VLOWV_SEL BIT(5)
#define BQ2515X_CHARGER_DISABLE BIT(0)
#define BQ2515X_HWRESET_14S_WD BIT(1)
static const int bq2515x_ilim_lvl_values[] = {
50000, 100000, 150000, 200000, 300000, 400000, 500000, 600000
};
/**
* struct bq2515x_init_data -
* @ilim: input current limit
* @ichg: fast charge current
* @vbatreg: battery regulation voltage
* @iprechg: precharge current
*/
struct bq2515x_init_data {
int ilim;
int ichg;
int vbatreg;
int iprechg;
};
enum bq2515x_id {
BQ25150,
BQ25155,
};
/**
* struct bq2515x_device -
* @mains: mains properties
* @battery: battery properties
* @regmap: register map structure
* @dev: device structure
*
* @reset_gpio: manual reset (MR) pin
* @powerdown_gpio: low power mode pin
* @ac_detect_gpio: power good (PG) pin
* @ce_gpio: charge enable (CE) pin
*
* @model_name: string value describing device model
* @device_id: value of device_id
* @mains_online: boolean value indicating power supply online
*
* @init_data: charger initialization data structure
*/
struct bq2515x_device {
struct power_supply *mains;
struct power_supply *battery;
struct regmap *regmap;
struct device *dev;
struct gpio_desc *reset_gpio;
struct gpio_desc *powerdown_gpio;
struct gpio_desc *ac_detect_gpio;
struct gpio_desc *ce_gpio;
char model_name[I2C_NAME_SIZE];
int device_id;
bool mains_online;
struct bq2515x_init_data init_data;
};
static const struct reg_default bq25150_reg_defaults[] = {
{BQ2515X_FLAG0, 0x0},
{BQ2515X_FLAG1, 0x0},
{BQ2515X_FLAG2, 0x0},
{BQ2515X_FLAG3, 0x0},
{BQ2515X_MASK0, 0x0},
{BQ2515X_MASK1, 0x0},
{BQ2515X_MASK2, 0x71},
{BQ2515X_MASK3, 0x0},
{BQ2515X_VBAT_CTRL, 0x3C},
{BQ2515X_ICHG_CTRL, 0x8},
{BQ2515X_PCHRGCTRL, 0x2},
{BQ2515X_TERMCTRL, 0x14},
{BQ2515X_BUVLO, 0x0},
{BQ2515X_CHARGERCTRL0, 0x82},
{BQ2515X_CHARGERCTRL1, 0x42},
{BQ2515X_ILIMCTRL, 0x1},
{BQ2515X_LDOCTRL, 0xB0},
{BQ2515X_MRCTRL, 0x2A},
{BQ2515X_ICCTRL0, 0x10},
{BQ2515X_ICCTRL1, 0x0},
{BQ2515X_ICCTRL2