drivers: Update the PMIC drivers for PM660

Bring in all the required PMIC drivers for SDM660 on 4.19 kernel
and make the required changes to successfully build these drivers.
Snapshot of the new drivers are added from the below commits
and required cleanup has been addressed :

From 4.14 kernel commit: 68b7015e5
qcom-rradc.c, qcom-tadc.c, qpnp-fg-gen3.c, qpnp-smb2.c,
qpnp-misc.c, smb1351-charger.c, qpnp-misc.h

From 4.9 kernel commit: ad779e060
smb-lib.c, smb-lib.h, smb-reg.h, smb138x-charger.c

qpnp-fg-gen3.c - additional changes from 4.9 pulled in.
smb-lib.c - additional changes from 4.14 pulled in.

Change-Id: I1c59dc0f41706fb10de82ff6bd6707758d351fd2
Signed-off-by: Shilpa Suresh <sbsure@codeaurora.org>
This commit is contained in:
Shilpa Suresh 2020-01-17 18:06:05 +05:30 committed by Gerrit - the friendly Code Review server
parent c77acc02d4
commit 955b3c66ca
22 changed files with 23732 additions and 5 deletions

View file

@ -587,6 +587,30 @@ config QCOM_SPMI_ADC5
To compile this driver as a module, choose M here: the module will
be called qcom-spmi-adc5.
config QCOM_TADC
tristate "Qualcomm Technologies, Inc. TADC driver"
depends on MFD_I2C_PMIC
help
Say yes here to support the Qualcomm Technologies, Inc. telemetry ADC.
The TADC provides battery temperature, skin temperature,
die temperature, battery voltage, battery current, input voltage,
input current, and OTG current.
config QCOM_RRADC
tristate "Qualcomm Technologies Inc. PMIC Round robin ADC"
depends on SPMI
select REGMAP_SPMI
help
This is the PMIC Round Robin ADC driver.
The driver supports multiple channels read used for telemetry
and supports clients to read batt_id, batt_therm, PMIC die
temperature, USB_IN and DC_IN voltage and current.
The RRADC is a 10-bit ADC.
To compile this driver as a module, choose M here: the module will
be called qcom-rradc.
config QCOM_SPMI_IADC
tristate "Qualcomm SPMI PMIC current ADC"
depends on SPMI

View file

@ -54,6 +54,8 @@ obj-$(CONFIG_MXS_LRADC_ADC) += mxs-lradc-adc.o
obj-$(CONFIG_NAU7802) += nau7802.o
obj-$(CONFIG_PALMAS_GPADC) += palmas_gpadc.o
obj-$(CONFIG_QCOM_SPMI_ADC5) += qcom-spmi-adc5.o
obj-$(CONFIG_QCOM_TADC) += qcom-tadc.o
obj-$(CONFIG_QCOM_RRADC) += qcom-rradc.o
obj-$(CONFIG_QCOM_SPMI_IADC) += qcom-spmi-iadc.o
obj-$(CONFIG_QCOM_VADC_COMMON) += qcom-vadc-common.o
obj-$(CONFIG_QCOM_SPMI_VADC) += qcom-spmi-vadc.o

1223
drivers/iio/adc/qcom-rradc.c Normal file

File diff suppressed because it is too large Load diff

1315
drivers/iio/adc/qcom-tadc.c Normal file

File diff suppressed because it is too large Load diff

View file

@ -551,6 +551,15 @@ config MEMORY_STATE_TIME
help
Memory time statistics exported to /sys/kernel/memory_state_time
config QPNP_MISC
tristate "QPNP Misc Peripheral"
depends on MFD_SPMI_PMIC
help
Say 'y' here to include support for the QTI QPNP MISC
peripheral. The MISC peripheral holds the USB ID interrupt
and the driver provides an API to check if this interrupt
is available on the current PMIC chip.
config OKL4_USER_VIRQ
tristate "User space accessible OKL4 virtual interrupts"
depends on OKL4_GUEST

View file

@ -63,6 +63,7 @@ obj-$(CONFIG_OCXL) += ocxl/
obj-$(CONFIG_MISC_RTSX) += cardreader/
obj-$(CONFIG_UID_SYS_STATS) += uid_sys_stats.o
obj-$(CONFIG_MEMORY_STATE_TIME) += memory_state_time.o
obj-$(CONFIG_QPNP_MISC) += qpnp-misc.o
obj-$(CONFIG_OKL4_USER_VIRQ) += okl4-virq.o
obj-$(CONFIG_OKL4_RINGBUF) += okl4-ringbuf.o

487
drivers/misc/qpnp-misc.c Normal file
View file

@ -0,0 +1,487 @@
// SPDX-License-Identifier: GPL-2.0-only
/* Copyright (c) 2013-2014,2016-2017, 2019-2020, The Linux Foundation. All rights reserved.
*/
#define pr_fmt(fmt) "%s: " fmt, __func__
#include <linux/module.h>
#include <linux/err.h>
#include <linux/slab.h>
#include <linux/regmap.h>
#include <linux/of.h>
#include <linux/of_device.h>
#include <linux/notifier.h>
#include <linux/qpnp/qpnp-misc.h>
#define QPNP_MISC_DEV_NAME "qcom,qpnp-misc"
#define REG_DIG_MAJOR_REV 0x01
#define REG_SUBTYPE 0x05
#define REG_PWM_SEL 0x49
#define REG_GP_DRIVER_EN 0x4C
#define PWM_SEL_MAX 0x03
#define GP_DRIVER_EN_BIT BIT(0)
enum twm {
TWM_MODE_1 = 1,
TWM_MODE_2,
TWM_MODE_3,
};
enum twm_attrib {
TWM_ENABLE,
TWM_EXIT,
};
static DEFINE_MUTEX(qpnp_misc_dev_list_mutex);
static LIST_HEAD(qpnp_misc_dev_list);
static RAW_NOTIFIER_HEAD(twm_notifier);
struct qpnp_misc_version {
u8 subtype;
u8 dig_major_rev;
};
/**
* struct qpnp_misc_dev - holds controller device specific information
* @list: Doubly-linked list parameter linking to other
* qpnp_misc devices.
* @mutex: Mutex lock that is used to ensure mutual
* exclusion between probing and accessing misc
* driver information
* @dev: Device pointer to the misc device
* @regmap: Regmap pointer to the misc device
* @version: struct that holds the subtype and dig_major_rev
* of the chip.
*/
struct qpnp_misc_dev {
struct list_head list;
struct mutex mutex;
struct device *dev;
struct regmap *regmap;
struct qpnp_misc_version version;
struct class twm_class;
u8 twm_mode;
u32 base;
u8 pwm_sel;
bool enable_gp_driver;
bool support_twm_config;
bool twm_enable;
};
static const struct of_device_id qpnp_misc_match_table[] = {
{ .compatible = QPNP_MISC_DEV_NAME },
{}
};
enum qpnp_misc_version_name {
INVALID,
PM8941,
PM8226,
PMA8084,
PMDCALIFORNIUM,
};
static struct qpnp_misc_version irq_support_version[] = {
{0x00, 0x00}, /* INVALID */
{0x01, 0x02}, /* PM8941 */
{0x07, 0x00}, /* PM8226 */
{0x09, 0x00}, /* PMA8084 */
{0x16, 0x00}, /* PMDCALIFORNIUM */
};
static int qpnp_write_byte(struct qpnp_misc_dev *mdev, u16 addr, u8 val)
{
int rc;
rc = regmap_write(mdev->regmap, mdev->base + addr, val);
if (rc)
pr_err("regmap write failed rc=%d\n", rc);
return rc;
}
static int qpnp_read_byte(struct qpnp_misc_dev *mdev, u16 addr, u8 *val)
{
unsigned int temp;
int rc;
rc = regmap_read(mdev->regmap, mdev->base + addr, &temp);
if (rc) {
pr_err("regmap read failed rc=%d\n", rc);
return rc;
}
*val = (u8)temp;
return rc;
}
static int get_qpnp_misc_version_name(struct qpnp_misc_dev *dev)
{
int i;
for (i = 1; i < ARRAY_SIZE(irq_support_version); i++)
if (dev->version.subtype == irq_support_version[i].subtype &&
dev->version.dig_major_rev >=
irq_support_version[i].dig_major_rev)
return i;
return INVALID;
}
static bool __misc_irqs_available(struct qpnp_misc_dev *dev)
{
int version_name = get_qpnp_misc_version_name(dev);
if (version_name == INVALID)
return false;
return true;
}
int qpnp_misc_read_reg(struct device_node *node, u16 addr, u8 *val)
{
struct qpnp_misc_dev *mdev = NULL;
struct qpnp_misc_dev *mdev_found = NULL;
int rc;
u8 temp = 0;
if (IS_ERR_OR_NULL(node)) {
pr_err("Invalid device node pointer\n");
return -EINVAL;
}
mutex_lock(&qpnp_misc_dev_list_mutex);
list_for_each_entry(mdev, &qpnp_misc_dev_list, list) {
if (mdev->dev->of_node == node) {
mdev_found = mdev;
break;
}
}
mutex_unlock(&qpnp_misc_dev_list_mutex);
if (!mdev_found) {
/*
* No MISC device was found. This API should only
* be called by drivers which have specified the
* misc phandle in their device tree node.
*/
pr_err("no probed misc device found\n");
return -EPROBE_DEFER;
}
rc = qpnp_read_byte(mdev, addr, &temp);
if (rc < 0) {
dev_err(mdev->dev, "Failed to read addr %x, rc=%d\n", addr, rc);
return rc;
}
*val = temp;
return 0;
}
int qpnp_misc_irqs_available(struct device *consumer_dev)
{
struct device_node *misc_node = NULL;
struct qpnp_misc_dev *mdev = NULL;
struct qpnp_misc_dev *mdev_found = NULL;
if (IS_ERR_OR_NULL(consumer_dev)) {
pr_err("Invalid consumer device pointer\n");
return -EINVAL;
}
misc_node = of_parse_phandle(consumer_dev->of_node, "qcom,misc-ref", 0);
if (!misc_node) {
pr_debug("Could not find qcom,misc-ref property in %s\n",
consumer_dev->of_node->full_name);
return 0;
}
mutex_lock(&qpnp_misc_dev_list_mutex);
list_for_each_entry(mdev, &qpnp_misc_dev_list, list) {
if (mdev->dev->of_node == misc_node) {
mdev_found = mdev;
break;
}
}
mutex_unlock(&qpnp_misc_dev_list_mutex);
if (!mdev_found) {
/*
* No MISC device was found. This API should only
* be called by drivers which have specified the
* misc phandle in their device tree node.
*/
pr_err("no probed misc device found\n");
return -EPROBE_DEFER;
}
return __misc_irqs_available(mdev_found);
}
#define MISC_SPARE_1 0x50
#define MISC_SPARE_2 0x51
#define ENABLE_TWM_MODE 0x80
#define DISABLE_TWM_MODE 0x0
#define TWM_EXIT_BIT BIT(0)
static ssize_t twm_enable_store(struct class *c,
struct class_attribute *attr,
const char *buf, size_t count)
{
struct qpnp_misc_dev *mdev = container_of(c,
struct qpnp_misc_dev, twm_class);
u8 val = 0;
ssize_t rc = 0;
rc = kstrtou8(buf, 10, &val);
if (rc < 0)
return rc;
mdev->twm_enable = val ? true : false;
/* Notify the TWM state */
raw_notifier_call_chain(&twm_notifier,
mdev->twm_enable ? PMIC_TWM_ENABLE : PMIC_TWM_CLEAR, NULL);
return count;
}
static ssize_t twm_enable_show(struct class *c,
struct class_attribute *attr, char *buf)
{
struct qpnp_misc_dev *mdev = container_of(c,
struct qpnp_misc_dev, twm_class);
return scnprintf(buf, PAGE_SIZE, "%d\n", mdev->twm_enable);
}
static CLASS_ATTR_RW(twm_enable);
static ssize_t twm_exit_show(struct class *c,
struct class_attribute *attr, char *buf)
{
struct qpnp_misc_dev *mdev = container_of(c,
struct qpnp_misc_dev, twm_class);
int rc = 0;
u8 val = 0;
rc = qpnp_read_byte(mdev, MISC_SPARE_1, &val);
if (rc < 0) {
pr_err("Failed to read TWM enable (misc_spare_1) rc=%d\n", rc);
return rc;
}
pr_debug("TWM_EXIT (misc_spare_1) register = 0x%02x\n", val);
return scnprintf(buf, PAGE_SIZE, "%d\n", !!(val & TWM_EXIT_BIT));
}
static CLASS_ATTR_RO(twm_exit);
static struct attribute *twm_attrs[] = {
&class_attr_twm_enable.attr,
&class_attr_twm_exit.attr,
NULL,
};
ATTRIBUTE_GROUPS(twm);
int qpnp_misc_twm_notifier_register(struct notifier_block *nb)
{
return raw_notifier_chain_register(&twm_notifier, nb);
}
EXPORT_SYMBOL(qpnp_misc_twm_notifier_register);
int qpnp_misc_twm_notifier_unregister(struct notifier_block *nb)
{
return raw_notifier_chain_unregister(&twm_notifier, nb);
}
EXPORT_SYMBOL(qpnp_misc_twm_notifier_unregister);
static int qpnp_misc_dt_init(struct qpnp_misc_dev *mdev)
{
struct device_node *node = mdev->dev->of_node;
u32 val;
int rc;
if (of_property_read_bool(mdev->dev->of_node,
"qcom,support-twm-config")) {
mdev->support_twm_config = true;
mdev->twm_mode = TWM_MODE_3;
rc = of_property_read_u8(mdev->dev->of_node, "qcom,twm-mode",
&mdev->twm_mode);
if (!rc && (mdev->twm_mode < TWM_MODE_1 ||
mdev->twm_mode > TWM_MODE_3)) {
pr_err("Invalid TWM mode %d\n", mdev->twm_mode);
return -EINVAL;
}
}
rc = of_property_read_u32(node, "reg", &mdev->base);
if (rc < 0 || !mdev->base) {
dev_err(mdev->dev, "Base address not defined or invalid\n");
return -EINVAL;
}
if (!of_property_read_u32(node, "qcom,pwm-sel", &val)) {
if (val > PWM_SEL_MAX) {
dev_err(mdev->dev, "Invalid value for pwm-sel\n");
return -EINVAL;
}
mdev->pwm_sel = (u8)val;
}
mdev->enable_gp_driver = of_property_read_bool(node,
"qcom,enable-gp-driver");
WARN((mdev->pwm_sel > 0 && !mdev->enable_gp_driver),
"Setting PWM source without enabling gp driver\n");
WARN((mdev->pwm_sel == 0 && mdev->enable_gp_driver),
"Enabling gp driver without setting PWM source\n");
return 0;
}
static int qpnp_misc_config(struct qpnp_misc_dev *mdev)
{
int rc, version_name;
version_name = get_qpnp_misc_version_name(mdev);
switch (version_name) {
case PMDCALIFORNIUM:
if (mdev->pwm_sel > 0 && mdev->enable_gp_driver) {
rc = qpnp_write_byte(mdev, REG_PWM_SEL, mdev->pwm_sel);
if (rc < 0) {
dev_err(mdev->dev,
"Failed to write PWM_SEL reg\n");
return rc;
}
rc = qpnp_write_byte(mdev, REG_GP_DRIVER_EN,
GP_DRIVER_EN_BIT);
if (rc < 0) {
dev_err(mdev->dev,
"Failed to write GP_DRIVER_EN reg\n");
return rc;
}
}
break;
default:
break;
}
if (mdev->support_twm_config) {
mdev->twm_class.name = "pmic_twm",
mdev->twm_class.owner = THIS_MODULE,
mdev->twm_class.class_groups = twm_groups;
rc = class_register(&mdev->twm_class);
if (rc < 0) {
pr_err("Failed to register pmic_twm class rc=%d\n", rc);
return rc;
}
}
return 0;
}
static int qpnp_misc_probe(struct platform_device *pdev)
{
struct qpnp_misc_dev *mdev = ERR_PTR(-EINVAL);
int rc;
mdev = devm_kzalloc(&pdev->dev, sizeof(*mdev), GFP_KERNEL);
if (!mdev)
return -ENOMEM;
mdev->dev = &pdev->dev;
dev_set_drvdata(&pdev->dev, mdev);
mdev->regmap = dev_get_regmap(mdev->dev->parent, NULL);
if (!mdev->regmap) {
dev_err(mdev->dev, "Parent regmap is unavailable\n");
return -ENXIO;
}
rc = qpnp_misc_dt_init(mdev);
if (rc < 0) {
dev_err(mdev->dev,
"Error reading device tree properties, rc=%d\n", rc);
return rc;
}
rc = qpnp_read_byte(mdev, REG_SUBTYPE, &mdev->version.subtype);
if (rc < 0) {
dev_err(mdev->dev, "Failed to read subtype, rc=%d\n", rc);
return rc;
}
rc = qpnp_read_byte(mdev, REG_DIG_MAJOR_REV,
&mdev->version.dig_major_rev);
if (rc < 0) {
dev_err(mdev->dev, "Failed to read dig_major_rev, rc=%d\n", rc);
return rc;
}
mutex_lock(&qpnp_misc_dev_list_mutex);
list_add_tail(&mdev->list, &qpnp_misc_dev_list);
mutex_unlock(&qpnp_misc_dev_list_mutex);
rc = qpnp_misc_config(mdev);
if (rc < 0) {
dev_err(mdev->dev,
"Error configuring module registers, rc=%d\n", rc);
return rc;
}
dev_info(mdev->dev, "probe successful\n");
return 0;
}
static void qpnp_misc_shutdown(struct platform_device *pdev)
{
struct qpnp_misc_dev *mdev = dev_get_drvdata(&pdev->dev);
int rc;
if (mdev->support_twm_config) {
rc = qpnp_write_byte(mdev, MISC_SPARE_2,
mdev->twm_enable ? mdev->twm_mode : 0x0);
if (rc < 0)
pr_err("Failed to write MISC_SPARE_2 (twm_mode) val=%d rc=%d\n",
mdev->twm_enable ? mdev->twm_mode : 0x0, rc);
rc = qpnp_write_byte(mdev, MISC_SPARE_1,
mdev->twm_enable ? ENABLE_TWM_MODE : 0x0);
if (rc < 0)
pr_err("Failed to write MISC_SPARE_1 (twm_state) val=%d rc=%d\n",
mdev->twm_enable ? ENABLE_TWM_MODE : 0x0, rc);
pr_debug("PMIC configured for TWM-%s MODE=%d\n",
mdev->twm_enable ? "enabled" : "disabled",
mdev->twm_mode);
}
}
static struct platform_driver qpnp_misc_driver = {
.probe = qpnp_misc_probe,
.shutdown = qpnp_misc_shutdown,
.driver = {
.name = QPNP_MISC_DEV_NAME,
.of_match_table = qpnp_misc_match_table,
},
};
static int __init qpnp_misc_init(void)
{
return platform_driver_register(&qpnp_misc_driver);
}
static void __exit qpnp_misc_exit(void)
{
return platform_driver_unregister(&qpnp_misc_driver);
}
subsys_initcall(qpnp_misc_init);
module_exit(qpnp_misc_exit);
MODULE_DESCRIPTION(QPNP_MISC_DEV_NAME);
MODULE_LICENSE("GPL v2");
MODULE_ALIAS("platform:" QPNP_MISC_DEV_NAME);

View file

@ -2,6 +2,19 @@
menu "Qualcomm Technologies, Inc. Charger and Fuel Gauge support"
config QPNP_SMB2
tristate "SMB2 Battery Charger"
depends on MFD_SPMI_PMIC
help
Say Y to enables support for the SMB2 charging peripheral.
The QPNP SMB2 charger driver supports the charger peripheral
present in the PMICOBALT chip.
The power supply framework is used to communicate battery and
usb properties to userspace and other driver consumers such
as fuel gauge, USB, and USB-PD.
VBUS and VCONN regulators are registered for supporting OTG,
and powered Type-C cables respectively.
config QPNP_SMB5
tristate "SMB5 Battery Charger"
depends on MFD_SPMI_PMIC
@ -27,6 +40,17 @@ config QPNP_SMBLITE
as fuel gauge and USB.
VBUS regulator is registered for supporting OTG.
config SMB138X_CHARGER
tristate "SMB138X Battery Charger"
depends on MFD_I2C_PMIC
help
Say Y to include support for SMB138X Battery Charger.
SMB1380 is a dual phase 6A battery charger, and SMB1381 is a single
phase 5A battery charger.
The driver supports charger enable/disable.
The driver reports the charger status via the power supply framework.
A charger status change triggers an IRQ via the device STAT pin.
config SMB1390_CHARGE_PUMP_PSY
tristate "SMB1390 power supply framework based driver"
depends on MFD_I2C_PMIC
@ -39,6 +63,16 @@ config SMB1390_CHARGE_PUMP_PSY
Technologies, Inc.s family of standalone chargers to enable a high
current, low profile Li+ battery charging system.
config SMB1351_USB_CHARGER
tristate "smb1351 usb charger (with VBUS detection)"
depends on I2C
help
Say Y to enable support for the SMB1351 switching mode based charger.
The driver supports charging control (enable/disable) and
charge-current limiting. It also provides USB VBUS detection and
notification support. The driver controls SMB1351 via I2C and
supports device-tree interface.
config SMB1355_SLAVE_CHARGER
tristate "SMB1355 Slave Battery Charger"
depends on MFD_I2C_PMIC
@ -58,6 +92,15 @@ config QPNP_QNOVO5
the hardware module. It also allows userspace code to read diagnostics
of voltage and current measured during certain phases of the pulses.
config QPNP_FG_GEN3
tristate "QPNP GEN3 fuel gauge driver"
depends on MFD_SPMI_PMIC
help
Say Y here to enable the GEN3 Fuel Gauge driver. This adds support
for battery fuel gauging and state of charge of battery connected to
the fuel gauge. The state of charge is reported through a BMS power
supply property and also sends uevents when the capacity is updated.
config QPNP_FG_GEN4
tristate "QPNP GEN4 fuel gauge driver"
depends on MFD_SPMI_PMIC

View file

@ -3,6 +3,10 @@
obj-$(CONFIG_QPNP_SMB5) += step-chg-jeita.o battery.o qpnp-smb5.o smb5-lib.o pmic-voter.o storm-watch.o schgm-flash.o
obj-$(CONFIG_SMB1390_CHARGE_PUMP_PSY) += smb1390-charger-psy.o pmic-voter.o
obj-$(CONFIG_SMB1355_SLAVE_CHARGER) += smb1355-charger.o pmic-voter.o
obj-$(CONFIG_SMB1351_USB_CHARGER) += smb1351-charger.o pmic-voter.o battery.o
obj-$(CONFIG_QPNP_SMB2) += step-chg-jeita.o battery.o qpnp-smb2.o smb-lib.o pmic-voter.o storm-watch.o
obj-$(CONFIG_SMB138X_CHARGER) += step-chg-jeita.o smb138x-charger.o smb-lib.o pmic-voter.o storm-watch.o battery.o
obj-$(CONFIG_QPNP_FG_GEN3) += qpnp-fg-gen3.o fg-memif.o fg-util.o
obj-$(CONFIG_QPNP_QNOVO5) += qpnp-qnovo5.o battery.o pmic-voter.o
obj-$(CONFIG_QPNP_FG_GEN4) += qpnp-fg-gen4.o fg-memif.o fg-util.o fg-alg.o pmic-voter.o
obj-$(CONFIG_QPNP_QG) += qpnp-qg.o pmic-voter.o qg-util.o qg-soc.o qg-sdam.o qg-battery-profile.o qg-profile-lib.o fg-alg.o

View file

@ -6,6 +6,7 @@
#ifndef __FG_CORE_H__
#define __FG_CORE_H__
#include <linux/alarmtimer.h>
#include <linux/atomic.h>
#include <linux/bitops.h>
#include <linux/debugfs.h>
@ -16,9 +17,11 @@
#include <linux/kernel.h>
#include <linux/module.h>
#include <linux/mutex.h>
#include <linux/alarmtimer.h>
#include <linux/power_supply.h>
#include <linux/regmap.h>
#include <linux/slab.h>
#include <linux/spinlock.h>
#include <linux/string_helpers.h>
#include <linux/types.h>
#include <linux/uaccess.h>
@ -57,6 +60,7 @@
#define PROFILE_LOAD "fg_profile_load"
#define TTF_PRIMING "fg_ttf_priming"
#define ESR_CALIB "fg_esr_calib"
#define FG_ESR_VOTER "fg_esr_voter"
/* Delta BSOC irq votable reasons */
#define DELTA_BSOC_IRQ_VOTER "fg_delta_bsoc_irq"
@ -108,6 +112,11 @@ enum fg_debug_flag {
FG_FVSS = BIT(9), /* Show FVSS */
};
enum awake_reasons {
FG_SW_ESR_WAKE = BIT(0),
FG_STATUS_NOTIFY_WAKE = BIT(1),
};
/* SRAM access */
enum sram_access_flags {
FG_IMA_DEFAULT = 0,
@ -203,6 +212,7 @@ enum fg_sram_param_id {
FG_SRAM_DELTA_MSOC_THR,
FG_SRAM_DELTA_BSOC_THR,
FG_SRAM_RECHARGE_SOC_THR,
FG_SRAM_SYNC_SLEEP_THR,
FG_SRAM_RECHARGE_VBATT_THR,
FG_SRAM_KI_COEFF_LOW_DISCHG,
FG_SRAM_KI_COEFF_MED_DISCHG,
@ -293,6 +303,12 @@ enum slope_limit_status {
SLOPE_LIMIT_NUM_COEFFS,
};
enum esr_filter_status {
ROOM_TEMP = 1,
LOW_TEMP,
RELAX_TEMP,
};
enum esr_timer_config {
TIMER_RETRY = 0,
TIMER_MAX,
@ -323,7 +339,7 @@ struct fg_cyc_ctr_data {
bool started[BUCKET_COUNT];
u16 count[BUCKET_COUNT];
u8 last_soc[BUCKET_COUNT];
int id;
char counter[BUCKET_COUNT * 8];
struct mutex lock;
};
@ -428,15 +444,21 @@ struct fg_dev {
int *debug_mask;
struct fg_batt_props bp;
struct notifier_block nb;
struct alarm esr_sw_timer;
struct notifier_block twm_nb;
struct mutex bus_lock;
struct mutex sram_rw_lock;
struct mutex charge_full_lock;
struct mutex qnovo_esr_ctrl_lock;
spinlock_t suspend_lock;
spinlock_t awake_lock;
u32 batt_soc_base;
u32 batt_info_base;
u32 mem_if_base;
u32 rradc_base;
u32 wa_flags;
u32 esr_wakeup_ms;
u32 awake_status;
int batt_id_ohms;
int charge_status;
int prev_charge_status;
@ -450,6 +472,8 @@ struct fg_dev {
int delta_soc;
int last_msoc;
int last_recharge_volt_mv;
int delta_temp_irq_count;
enum esr_filter_status esr_flt_sts;
bool profile_available;
enum prof_load_status profile_load_status;
bool battery_missing;
@ -458,14 +482,21 @@ struct fg_dev {
bool recharge_soc_adjusted;
bool soc_reporting_ready;
bool use_ima_single_mode;
bool usb_present;
bool twm_state;
bool use_dma;
bool qnovo_enable;
enum fg_version version;
bool suspended;
struct completion soc_update;
struct completion soc_ready;
struct delayed_work profile_load_work;
struct work_struct status_change_work;
struct work_struct esr_sw_work;
struct delayed_work sram_dump_work;
struct work_struct esr_filter_work;
struct alarm esr_filter_alarm;
ktime_t last_delta_temp_time;
};
/* Debugfs data structures are below */
@ -574,4 +605,6 @@ extern int fg_circ_buf_avg(struct fg_circ_buf *buf, int *avg);
extern int fg_circ_buf_median(struct fg_circ_buf *buf, int *median);
extern int fg_lerp(const struct fg_pt *pts, size_t tablesize, s32 input,
s32 *output);
void fg_stay_awake(struct fg_dev *fg, int awake_reason);
void fg_relax(struct fg_dev *fg, int awake_reason);
#endif

View file

@ -1,6 +1,6 @@
/* SPDX-License-Identifier: GPL-2.0 */
/*
* Copyright (c) 2016-2018, The Linux Foundation. All rights reserved.
* Copyright (c) 2016-2018, 2020, The Linux Foundation. All rights reserved.
*/
#ifndef __FG_REG_H__
@ -46,6 +46,7 @@
#define BATT_SOC_SLEEP_SHUTDOWN_STS(chip) (chip->batt_soc_base + 0x08)
#define BATT_SOC_FG_MONOTONIC_SOC(chip) (chip->batt_soc_base + 0x09)
#define BATT_SOC_FG_MONOTONIC_SOC_CP(chip) (chip->batt_soc_base + 0x0A)
#define BATT_SOC_RST_CTRL0(chip) (chip->batt_soc_base + 0xBA)
#define BATT_SOC_INT_RT_STS(chip) (chip->batt_soc_base + 0x10)
#define SOC_READY_BIT BIT(1)
@ -60,6 +61,10 @@
#define BATT_SOC_STS_CLR(chip) (chip->batt_soc_base + 0x4A)
#define BATT_SOC_LOW_PWR_CFG(chip) (chip->batt_soc_base + 0x52)
#define BATT_SOC_LOW_PWR_STS(chip) (chip->batt_soc_base + 0x56)
/* BATT_SOC_RST_CTRL0 */
#define BCL_RST_BIT BIT(2)
#define MEM_RST_BIT BIT(1)
#define ALG_RST_BIT BIT(0)
/* FG_BATT_INFO register definitions */
#define BATT_INFO_BATT_TEMP_STS(chip) (chip->batt_info_base + 0x06)

View file

@ -1,6 +1,6 @@
// SPDX-License-Identifier: GPL-2.0-only
/*
* Copyright (c) 2016-2019 The Linux Foundation. All rights reserved.
* Copyright (c) 2016-2020, The Linux Foundation. All rights reserved.
*/
#include <linux/of.h>
@ -715,7 +715,7 @@ static inline bool is_sec_access(struct fg_dev *fg, int addr)
if (fg->version != GEN3_FG)
return false;
return ((addr & 0x00FF) > 0xD0);
return ((addr & 0x00FF) > 0xB8);
}
int fg_write(struct fg_dev *fg, int addr, u8 *val, int len)
@ -1683,3 +1683,28 @@ int fg_debugfs_create(struct fg_dev *fg)
debugfs_remove_recursive(fg->dfs_root);
return -ENOMEM;
}
void fg_stay_awake(struct fg_dev *fg, int awake_reason)
{
spin_lock(&fg->awake_lock);
if (!fg->awake_status)
pm_stay_awake(fg->dev);
fg->awake_status |= awake_reason;
spin_unlock(&fg->awake_lock);
}
void fg_relax(struct fg_dev *fg, int awake_reason)
{
spin_lock(&fg->awake_lock);
fg->awake_status &= ~awake_reason;
if (!fg->awake_status)
pm_relax(fg->dev);
spin_unlock(&fg->awake_lock);
}

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

View file

@ -0,0 +1,553 @@
/* SPDX-License-Identifier: GPL-2.0-only */
/* Copyright (c) 2016-2018, 2020, The Linux Foundation. All rights reserved.
*/
#ifndef __SMB2_CHARGER_H
#define __SMB2_CHARGER_H
#include <linux/types.h>
#include <linux/interrupt.h>
#include <linux/irqreturn.h>
#include <linux/regulator/driver.h>
#include <linux/regulator/consumer.h>
#include <linux/extcon-provider.h>
#include "storm-watch.h"
#include "battery.h"
enum print_reason {
PR_INTERRUPT = BIT(0),
PR_REGISTER = BIT(1),
PR_MISC = BIT(2),
PR_PARALLEL = BIT(3),
PR_OTG = BIT(4),
};
#define DEFAULT_VOTER "DEFAULT_VOTER"
#define USER_VOTER "USER_VOTER"
#define PD_VOTER "PD_VOTER"
#define DCP_VOTER "DCP_VOTER"
#define QC_VOTER "QC_VOTER"
#define PL_USBIN_USBIN_VOTER "PL_USBIN_USBIN_VOTER"
#define USB_PSY_VOTER "USB_PSY_VOTER"
#define PL_TAPER_WORK_RUNNING_VOTER "PL_TAPER_WORK_RUNNING_VOTER"
#define PL_QNOVO_VOTER "PL_QNOVO_VOTER"
#define USBIN_V_VOTER "USBIN_V_VOTER"
#define CHG_STATE_VOTER "CHG_STATE_VOTER"
#define TYPEC_SRC_VOTER "TYPEC_SRC_VOTER"
#define TAPER_END_VOTER "TAPER_END_VOTER"
#define THERMAL_DAEMON_VOTER "THERMAL_DAEMON_VOTER"
#define CC_DETACHED_VOTER "CC_DETACHED_VOTER"
#define HVDCP_TIMEOUT_VOTER "HVDCP_TIMEOUT_VOTER"
#define PD_DISALLOWED_INDIRECT_VOTER "PD_DISALLOWED_INDIRECT_VOTER"
#define PD_HARD_RESET_VOTER "PD_HARD_RESET_VOTER"
#define VBUS_CC_SHORT_VOTER "VBUS_CC_SHORT_VOTER"
#define PD_INACTIVE_VOTER "PD_INACTIVE_VOTER"
#define BOOST_BACK_VOTER "BOOST_BACK_VOTER"
#define USBIN_USBIN_BOOST_VOTER "USBIN_USBIN_BOOST_VOTER"
#define HVDCP_INDIRECT_VOTER "HVDCP_INDIRECT_VOTER"
#define MICRO_USB_VOTER "MICRO_USB_VOTER"
#define DEBUG_BOARD_VOTER "DEBUG_BOARD_VOTER"
#define PD_SUSPEND_SUPPORTED_VOTER "PD_SUSPEND_SUPPORTED_VOTER"
#define PL_DELAY_VOTER "PL_DELAY_VOTER"
#define CTM_VOTER "CTM_VOTER"
#define SW_QC3_VOTER "SW_QC3_VOTER"
#define AICL_RERUN_VOTER "AICL_RERUN_VOTER"
#define LEGACY_UNKNOWN_VOTER "LEGACY_UNKNOWN_VOTER"
#define CC2_WA_VOTER "CC2_WA_VOTER"
#define QNOVO_VOTER "QNOVO_VOTER"
#define BATT_PROFILE_VOTER "BATT_PROFILE_VOTER"
#define OTG_DELAY_VOTER "OTG_DELAY_VOTER"
#define USBIN_I_VOTER "USBIN_I_VOTER"
#define WEAK_CHARGER_VOTER "WEAK_CHARGER_VOTER"
#define OTG_VOTER "OTG_VOTER"
#define PL_FCC_LOW_VOTER "PL_FCC_LOW_VOTER"
#define WBC_VOTER "WBC_VOTER"
#define MOISTURE_VOTER "MOISTURE_VOTER"
#define HVDCP2_ICL_VOTER "HVDCP2_ICL_VOTER"
#define OV_VOTER "OV_VOTER"
#define FG_ESR_VOTER "FG_ESR_VOTER"
#define FCC_STEPPER_VOTER "FCC_STEPPER_VOTER"
#define PD_NOT_SUPPORTED_VOTER "PD_NOT_SUPPORTED_VOTER"
#define VCONN_MAX_ATTEMPTS 3
#define OTG_MAX_ATTEMPTS 3
#define BOOST_BACK_STORM_COUNT 3
#define WEAK_CHG_STORM_COUNT 8
enum smb_mode {
PARALLEL_MASTER = 0,
PARALLEL_SLAVE,
NUM_MODES,
};
enum {
QC_CHARGER_DETECTION_WA_BIT = BIT(0),
BOOST_BACK_WA = BIT(1),
TYPEC_CC2_REMOVAL_WA_BIT = BIT(2),
QC_AUTH_INTERRUPT_WA_BIT = BIT(3),
OTG_WA = BIT(4),
OV_IRQ_WA_BIT = BIT(5),
TYPEC_PBS_WA_BIT = BIT(6),
};
enum smb_irq_index {
CHG_ERROR_IRQ = 0,
CHG_STATE_CHANGE_IRQ,
STEP_CHG_STATE_CHANGE_IRQ,
STEP_CHG_SOC_UPDATE_FAIL_IRQ,
STEP_CHG_SOC_UPDATE_REQ_IRQ,
OTG_FAIL_IRQ,
OTG_OVERCURRENT_IRQ,
OTG_OC_DIS_SW_STS_IRQ,
TESTMODE_CHANGE_DET_IRQ,
BATT_TEMP_IRQ,
BATT_OCP_IRQ,
BATT_OV_IRQ,
BATT_LOW_IRQ,
BATT_THERM_ID_MISS_IRQ,
BATT_TERM_MISS_IRQ,
USBIN_COLLAPSE_IRQ,
USBIN_LT_3P6V_IRQ,
USBIN_UV_IRQ,
USBIN_OV_IRQ,
USBIN_PLUGIN_IRQ,
USBIN_SRC_CHANGE_IRQ,
USBIN_ICL_CHANGE_IRQ,
TYPE_C_CHANGE_IRQ,
DCIN_COLLAPSE_IRQ,
DCIN_LT_3P6V_IRQ,
DCIN_UV_IRQ,
DCIN_OV_IRQ,
DCIN_PLUGIN_IRQ,
DIV2_EN_DG_IRQ,
DCIN_ICL_CHANGE_IRQ,
WDOG_SNARL_IRQ,
WDOG_BARK_IRQ,
AICL_FAIL_IRQ,
AICL_DONE_IRQ,
HIGH_DUTY_CYCLE_IRQ,
INPUT_CURRENT_LIMIT_IRQ,
TEMPERATURE_CHANGE_IRQ,
SWITCH_POWER_OK_IRQ,
SMB_IRQ_MAX,
};
enum try_sink_exit_mode {
ATTACHED_SRC = 0,
ATTACHED_SINK,
UNATTACHED_SINK,
};
struct smb_irq_info {
const char *name;
const irq_handler_t handler;
const bool wake;
const struct storm_watch storm_data;
struct smb_irq_data *irq_data;
int irq;
};
static const unsigned int smblib_extcon_cable[] = {
EXTCON_USB,
EXTCON_USB_HOST,
EXTCON_NONE,
};
/* EXTCON_USB and EXTCON_USB_HOST are mutually exclusive */
static const u32 smblib_extcon_exclusive[] = {0x3, 0};
struct smb_regulator {
struct regulator_dev *rdev;
struct regulator_desc rdesc;
};
struct smb_irq_data {
void *parent_data;
const char *name;
struct storm_watch storm_data;
};
struct smb_chg_param {
const char *name;
u16 reg;
int min_u;
int max_u;
int step_u;
int (*get_proc)(struct smb_chg_param *param,
u8 val_raw);
int (*set_proc)(struct smb_chg_param *param,
int val_u,
u8 *val_raw);
};
struct smb_chg_freq {
unsigned int freq_5V;
unsigned int freq_6V_8V;
unsigned int freq_9V;
unsigned int freq_12V;
unsigned int freq_removal;
unsigned int freq_below_otg_threshold;
unsigned int freq_above_otg_threshold;
};
struct smb_params {
struct smb_chg_param fcc;
struct smb_chg_param fv;
struct smb_chg_param usb_icl;
struct smb_chg_param icl_stat;
struct smb_chg_param otg_cl;
struct smb_chg_param dc_icl;
struct smb_chg_param dc_icl_pt_lv;
struct smb_chg_param dc_icl_pt_hv;
struct smb_chg_param dc_icl_div2_lv;
struct smb_chg_param dc_icl_div2_mid_lv;
struct smb_chg_param dc_icl_div2_mid_hv;
struct smb_chg_param dc_icl_div2_hv;
struct smb_chg_param jeita_cc_comp;
struct smb_chg_param freq_buck;
struct smb_chg_param freq_boost;
};
struct parallel_params {
struct power_supply *psy;
};
struct smb_iio {
struct iio_channel *temp_chan;
struct iio_channel *temp_max_chan;
struct iio_channel *usbin_i_chan;
struct iio_channel *usbin_v_chan;
struct iio_channel *batt_i_chan;
struct iio_channel *connector_temp_chan;
struct iio_channel *connector_temp_thr1_chan;
struct iio_channel *connector_temp_thr2_chan;
struct iio_channel *connector_temp_thr3_chan;
};
struct reg_info {
u16 reg;
u8 mask;
u8 val;
u8 bak;
const char *desc;
};
struct smb_charger {
struct device *dev;
char *name;
struct regmap *regmap;
struct smb_irq_info *irq_info;
struct smb_params param;
struct smb_iio iio;
int *debug_mask;
int *try_sink_enabled;
int *audio_headset_drp_wait_ms;
enum smb_mode mode;
struct smb_chg_freq chg_freq;
struct charger_param chg_param;
int otg_delay_ms;
int *weak_chg_icl_ua;
/* locks */
struct mutex lock;
struct mutex write_lock;
struct mutex ps_change_lock;
struct mutex otg_oc_lock;
struct mutex vconn_oc_lock;
/* power supplies */
struct power_supply *batt_psy;
struct power_supply *usb_psy;
struct power_supply *dc_psy;
struct power_supply *bms_psy;
struct power_supply_desc usb_psy_desc;
struct power_supply *usb_main_psy;
struct power_supply *usb_port_psy;
enum power_supply_type real_charger_type;
/* notifiers */
struct notifier_block nb;
/* parallel charging */
struct parallel_params pl;
/* regulators */
struct smb_regulator *vbus_vreg;
struct smb_regulator *vconn_vreg;
struct regulator *dpdm_reg;
/* votables */
struct votable *dc_suspend_votable;
struct votable *fcc_votable;
struct votable *fv_votable;
struct votable *usb_icl_votable;
struct votable *dc_icl_votable;
struct votable *pd_disallowed_votable_indirect;
struct votable *pd_allowed_votable;
struct votable *awake_votable;
struct votable *pl_disable_votable;
struct votable *chg_disable_votable;
struct votable *pl_enable_votable_indirect;
struct votable *hvdcp_disable_votable_indirect;
struct votable *hvdcp_enable_votable;
struct votable *apsd_disable_votable;
struct votable *hvdcp_hw_inov_dis_votable;
struct votable *usb_irq_enable_votable;
struct votable *typec_irq_disable_votable;
struct votable *disable_power_role_switch;
/* work */
struct work_struct bms_update_work;
struct work_struct pl_update_work;
struct work_struct rdstd_cc2_detach_work;
struct delayed_work hvdcp_detect_work;
struct delayed_work ps_change_timeout_work;
struct delayed_work clear_hdc_work;
struct work_struct otg_oc_work;
struct work_struct vconn_oc_work;
struct delayed_work otg_ss_done_work;
struct delayed_work icl_change_work;
struct delayed_work pl_enable_work;
struct work_struct legacy_detection_work;
struct delayed_work uusb_otg_work;
struct delayed_work bb_removal_work;
/* cached status */
int voltage_min_uv;
int voltage_max_uv;
int pd_active;
bool system_suspend_supported;
int boost_threshold_ua;
int system_temp_level;
int thermal_levels;
int *thermal_mitigation;
int dcp_icl_ua;
int fake_capacity;
int fake_batt_status;
bool step_chg_enabled;
bool sw_jeita_enabled;
bool is_hdc;
bool chg_done;
bool connector_type;
bool otg_en;
bool vconn_en;
bool suspend_input_on_debug_batt;
int otg_attempts;
int vconn_attempts;
int default_icl_ua;
int otg_cl_ua;
bool uusb_apsd_rerun_done;
bool pd_hard_reset;
bool typec_present;
u8 typec_status[5];
bool typec_legacy_valid;
int fake_input_current_limited;
bool pr_swap_in_progress;
int typec_mode;
int usb_icl_change_irq_enabled;
u32 jeita_status;
u8 float_cfg;
bool use_extcon;
bool otg_present;
bool is_audio_adapter;
bool disable_stat_sw_override;
bool in_chg_lock;
bool fcc_stepper_enable;
bool ufp_only_mode;
/* workaround flag */
u32 wa_flags;
bool cc2_detach_wa_active;
bool typec_en_dis_active;
bool try_sink_active;
int boost_current_ua;
int temp_speed_reading_count;
int qc2_max_pulses;
bool non_compliant_chg_detected;
bool fake_usb_insertion;
bool reddragon_ipc_wa;
/* extcon for VBUS / ID notification to USB for uUSB */
struct extcon_dev *extcon;
/* battery profile */
int batt_profile_fcc_ua;
int batt_profile_fv_uv;
/* qnovo */
int usb_icl_delta_ua;
int pulse_cnt;
int die_health;
};
int smblib_read(struct smb_charger *chg, u16 addr, u8 *val);
int smblib_masked_write(struct smb_charger *chg, u16 addr, u8 mask, u8 val);
int smblib_write(struct smb_charger *chg, u16 addr, u8 val);
int smblib_get_charge_param(struct smb_charger *chg,
struct smb_chg_param *param, int *val_u);
int smblib_get_usb_suspend(struct smb_charger *chg, int *suspend);
int smblib_enable_charging(struct smb_charger *chg, bool enable);
int smblib_set_charge_param(struct smb_charger *chg,
struct smb_chg_param *param, int val_u);
int smblib_set_usb_suspend(struct smb_charger *chg, bool suspend);
int smblib_set_dc_suspend(struct smb_charger *chg, bool suspend);
int smblib_mapping_soc_from_field_value(struct smb_chg_param *param,
int val_u, u8 *val_raw);
int smblib_mapping_cc_delta_to_field_value(struct smb_chg_param *param,
u8 val_raw);
int smblib_mapping_cc_delta_from_field_value(struct smb_chg_param *param,
int val_u, u8 *val_raw);
int smblib_set_chg_freq(struct smb_chg_param *param,
int val_u, u8 *val_raw);
int smblib_vbus_regulator_enable(struct regulator_dev *rdev);
int smblib_vbus_regulator_disable(struct regulator_dev *rdev);
int smblib_vbus_regulator_is_enabled(struct regulator_dev *rdev);
int smblib_vconn_regulator_enable(struct regulator_dev *rdev);
int smblib_vconn_regulator_disable(struct regulator_dev *rdev);
int smblib_vconn_regulator_is_enabled(struct regulator_dev *rdev);
irqreturn_t smblib_handle_debug(int irq, void *data);
irqreturn_t smblib_handle_otg_overcurrent(int irq, void *data);
irqreturn_t smblib_handle_chg_state_change(int irq, void *data);
irqreturn_t smblib_handle_batt_temp_changed(int irq, void *data);
irqreturn_t smblib_handle_batt_psy_changed(int irq, void *data);
irqreturn_t smblib_handle_usb_psy_changed(int irq, void *data);
irqreturn_t smblib_handle_usbin_uv(int irq, void *data);
irqreturn_t smblib_handle_usb_plugin(int irq, void *data);
irqreturn_t smblib_handle_usb_source_change(int irq, void *data);
irqreturn_t smblib_handle_icl_change(int irq, void *data);
irqreturn_t smblib_handle_usb_typec_change(int irq, void *data);
irqreturn_t smblib_handle_dc_plugin(int irq, void *data);
irqreturn_t smblib_handle_high_duty_cycle(int irq, void *data);
irqreturn_t smblib_handle_switcher_power_ok(int irq, void *data);
irqreturn_t smblib_handle_wdog_bark(int irq, void *data);
int smblib_get_prop_input_suspend(struct smb_charger *chg,
union power_supply_propval *val);
int smblib_get_prop_batt_present(struct smb_charger *chg,
union power_supply_propval *val);
int smblib_get_prop_batt_capacity(struct smb_charger *chg,
union power_supply_propval *val);
int smblib_get_prop_batt_status(struct smb_charger *chg,
union power_supply_propval *val);
int smblib_get_prop_batt_charge_type(struct smb_charger *chg,
union power_supply_propval *val);
int smblib_get_prop_batt_charge_done(struct smb_charger *chg,
union power_supply_propval *val);
int smblib_get_prop_batt_health(struct smb_charger *chg,
union power_supply_propval *val);
int smblib_get_prop_system_temp_level(struct smb_charger *chg,
union power_supply_propval *val);
int smblib_get_prop_system_temp_level_max(struct smb_charger *chg,
union power_supply_propval *val);
int smblib_get_prop_input_current_limited(struct smb_charger *chg,
union power_supply_propval *val);
int smblib_set_prop_input_suspend(struct smb_charger *chg,
const union power_supply_propval *val);
int smblib_set_prop_batt_capacity(struct smb_charger *chg,
const union power_supply_propval *val);
int smblib_set_prop_batt_status(struct smb_charger *chg,
const union power_supply_propval *val);
int smblib_set_prop_system_temp_level(struct smb_charger *chg,
const union power_supply_propval *val);
int smblib_set_prop_input_current_limited(struct smb_charger *chg,
const union power_supply_propval *val);
int smblib_get_prop_dc_present(struct smb_charger *chg,
union power_supply_propval *val);
int smblib_get_prop_dc_online(struct smb_charger *chg,
union power_supply_propval *val);
int smblib_get_prop_dc_current_max(struct smb_charger *chg,
union power_supply_propval *val);
int smblib_set_prop_dc_current_max(struct smb_charger *chg,
const union power_supply_propval *val);
int smblib_get_prop_usb_present(struct smb_charger *chg,
union power_supply_propval *val);
int smblib_get_prop_usb_online(struct smb_charger *chg,
union power_supply_propval *val);
int smblib_get_prop_usb_suspend(struct smb_charger *chg,
union power_supply_propval *val);
int smblib_get_prop_usb_voltage_max(struct smb_charger *chg,
union power_supply_propval *val);
int smblib_get_prop_usb_voltage_max_design(struct smb_charger *chg,
union power_supply_propval *val);
int smblib_get_prop_usb_voltage_now(struct smb_charger *chg,
union power_supply_propval *val);
int smblib_get_prop_usb_current_now(struct smb_charger *chg,
union power_supply_propval *val);
int smblib_get_prop_typec_cc_orientation(struct smb_charger *chg,
union power_supply_propval *val);
int smblib_get_prop_typec_power_role(struct smb_charger *chg,
union power_supply_propval *val);
int smblib_get_prop_pd_allowed(struct smb_charger *chg,
union power_supply_propval *val);
int smblib_get_prop_input_current_settled(struct smb_charger *chg,
union power_supply_propval *val);
int smblib_get_prop_input_voltage_settled(struct smb_charger *chg,
union power_supply_propval *val);
int smblib_get_prop_pd_in_hard_reset(struct smb_charger *chg,
union power_supply_propval *val);
int smblib_get_pe_start(struct smb_charger *chg,
union power_supply_propval *val);
int smblib_get_prop_charger_temp(struct smb_charger *chg,
union power_supply_propval *val);
int smblib_get_prop_charger_temp_max(struct smb_charger *chg,
union power_supply_propval *val);
int smblib_get_prop_die_health(struct smb_charger *chg,
union power_supply_propval *val);
int smblib_get_prop_charge_qnovo_enable(struct smb_charger *chg,
union power_supply_propval *val);
int smblib_set_prop_pd_current_max(struct smb_charger *chg,
const union power_supply_propval *val);
int smblib_set_prop_sdp_current_max(struct smb_charger *chg,
const union power_supply_propval *val);
int smblib_set_prop_pd_voltage_max(struct smb_charger *chg,
const union power_supply_propval *val);
int smblib_set_prop_pd_voltage_min(struct smb_charger *chg,
const union power_supply_propval *val);
int smblib_set_prop_boost_current(struct smb_charger *chg,
const union power_supply_propval *val);
int smblib_set_prop_typec_power_role(struct smb_charger *chg,
const union power_supply_propval *val);
int smblib_set_prop_pd_active(struct smb_charger *chg,
const union power_supply_propval *val);
int smblib_set_prop_pd_in_hard_reset(struct smb_charger *chg,
const union power_supply_propval *val);
int smblib_get_prop_slave_current_now(struct smb_charger *chg,
union power_supply_propval *val);
int smblib_set_prop_ship_mode(struct smb_charger *chg,
const union power_supply_propval *val);
int smblib_set_prop_charge_qnovo_enable(struct smb_charger *chg,
const union power_supply_propval *val);
void smblib_suspend_on_debug_battery(struct smb_charger *chg);
int smblib_rerun_apsd_if_required(struct smb_charger *chg);
int smblib_get_prop_fcc_delta(struct smb_charger *chg,
union power_supply_propval *val);
int smblib_icl_override(struct smb_charger *chg, bool override);
int smblib_dp_dm(struct smb_charger *chg, int val);
int smblib_disable_hw_jeita(struct smb_charger *chg, bool disable);
int smblib_rerun_aicl(struct smb_charger *chg);
int smblib_set_icl_current(struct smb_charger *chg, int icl_ua);
int smblib_get_icl_current(struct smb_charger *chg, int *icl_ua);
int smblib_get_charge_current(struct smb_charger *chg, int *total_current_ua);
int smblib_get_prop_pr_swap_in_progress(struct smb_charger *chg,
union power_supply_propval *val);
int smblib_get_prop_from_bms(struct smb_charger *chg,
enum power_supply_property psp,
union power_supply_propval *val);
int smblib_set_prop_pr_swap_in_progress(struct smb_charger *chg,
const union power_supply_propval *val);
int smblib_stat_sw_override_cfg(struct smb_charger *chg, bool override);
void smblib_usb_typec_change(struct smb_charger *chg);
int smblib_toggle_stat(struct smb_charger *chg, int reset);
int smblib_force_ufp(struct smb_charger *chg);
int smblib_init(struct smb_charger *chg);
int smblib_deinit(struct smb_charger *chg);
#endif /* __SMB2_CHARGER_H */

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

View file

@ -3,7 +3,7 @@
* Copyright (c) 2015, Sony Mobile Communications, AB.
*/
/*
* Copyright (c) 2018-2019, The Linux Foundation. All rights reserved.
* Copyright (c) 2018-2020, The Linux Foundation. All rights reserved.
*/
#define pr_fmt(fmt) "WLED: %s: " fmt, __func__
@ -2370,6 +2370,7 @@ static const struct of_device_id wled_match_table[] = {
{ .compatible = "qcom,pmi8998-spmi-wled", .data = &version_table[0] },
{ .compatible = "qcom,pm8150l-spmi-wled", .data = &version_table[2] },
{ .compatible = "qcom,pm6150l-spmi-wled", .data = &version_table[2] },
{ .compatible = "qcom,pm660l-spmi-wled", .data = &version_table[1] },
{ },
};

View file

@ -398,6 +398,7 @@ enum power_supply_type {
POWER_SUPPLY_TYPE_BMS, /* Battery Monitor System */
POWER_SUPPLY_TYPE_PARALLEL, /* Parallel Path */
POWER_SUPPLY_TYPE_MAIN, /* Main Path */
POWER_SUPPLY_TYPE_WIPOWER, /* Wipower */
POWER_SUPPLY_TYPE_UFP, /* Type-C UFP */
POWER_SUPPLY_TYPE_DFP, /* Type-C DFP */
POWER_SUPPLY_TYPE_CHARGE_PUMP, /* Charge Pump */

View file

@ -0,0 +1,80 @@
/* SPDX-License-Identifier: GPL-2.0-only */
/* Copyright (c) 2013-2014, 2017, 2019-2020, The Linux Foundation. All rights reserved.
*/
#ifndef __QPNP_MISC_H
#define __QPNP_MISC_H
#include <linux/errno.h>
enum twm_state {
PMIC_TWM_CLEAR,
PMIC_TWM_ENABLE,
};
#ifdef CONFIG_QPNP_MISC
/**
* qpnp_misc_irqs_available - check if IRQs are available
*
* @consumer_dev: device struct
*
* This function returns true if the MISC interrupts are available
* based on a check in the MISC peripheral revision registers.
*
* Any consumer of this function needs to reference a MISC device phandle
* using the "qcom,misc-ref" property in their device tree node.
*/
int qpnp_misc_irqs_available(struct device *consumer_dev);
/**
* qpnp_misc_read_reg - read register from misc device
*
* @node: device node pointer
* @address: address offset in misc peripheral to be read
* @val: data read from register
*
* This function returns zero if reading the MISC register succeeds.
*
*/
int qpnp_misc_read_reg(struct device_node *node, u16 addr, u8 *val);
/**
* qpnp_misc_twm_notifier_register - register to the twm mode notifier
*
* @nb: pointer to the client's notifier handle
*
* This function returns 0 if the client is successfully added to the
* notifer list.
*/
int qpnp_misc_twm_notifier_register(struct notifier_block *nb);
/**
* qpnp_misc_twm_notifier_unregister - unregister to the twm mode notifier
*
* @nb: pointer to the client's notifier handle
*
* This function returns 0 if the client is successfully removed from the
* notifer list.
*/
int qpnp_misc_twm_notifier_unregister(struct notifier_block *nb);
#else
static inline int qpnp_misc_irqs_available(struct device *consumer_dev)
{
return 0;
}
static inline int qpnp_misc_read_reg(struct device_node *node, u16 addr,
u8 *val)
{
return 0;
}
static inline int qpnp_misc_twm_notifier_register(struct notifier_block *nb)
{
return 0;
}
static inline int qpnp_misc_twm_notifier_unregister(struct notifier_block *nb)
{
return 0;
}
#endif
#endif