Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit cbef52ce authored by qctecmdr's avatar qctecmdr Committed by Gerrit - the friendly Code Review server
Browse files

Merge "power: smb358: Add support to make SMB358 driver GKI complaint"

parents f9bd900b f01d7a5d
Loading
Loading
Loading
Loading
+61 −20
Original line number Diff line number Diff line
// SPDX-License-Identifier: GPL-2.0-only
/*
 * Copyright (c) 2016-2020 The Linux Foundation. All rights reserved.
 * Copyright (c) 2016-2021 The Linux Foundation. All rights reserved.
 */
#define pr_fmt(fmt) "SMB358 %s: " fmt, __func__
#include <linux/i2c.h>
@@ -22,7 +22,7 @@
#include <linux/iio/iio.h>
#include <linux/iio/consumer.h>
#include <dt-bindings/iio/qcom,spmi-vadc.h>
#include <linux/extcon.h>
#include <linux/extcon-provider.h>

#define _SMB358_MASK(BITS, POS) \
	((unsigned char)(((1 << (BITS)) - 1) << (POS)))
@@ -914,7 +914,7 @@ static int smb358_hw_init(struct smb358_charger *chip)
static enum power_supply_property smb358_battery_properties[] = {
	POWER_SUPPLY_PROP_STATUS,
	POWER_SUPPLY_PROP_PRESENT,
	POWER_SUPPLY_PROP_CHARGING_ENABLED,
	POWER_SUPPLY_PROP_INPUT_CURRENT_LIMIT,
	POWER_SUPPLY_PROP_CHARGE_TYPE,
	POWER_SUPPLY_PROP_CAPACITY,
	POWER_SUPPLY_PROP_HEALTH,
@@ -990,7 +990,7 @@ static int smb358_get_prop_charge_type(struct smb358_charger *chip)
	if (reg == STATUS_C_FAST_CHARGING)
		return POWER_SUPPLY_CHARGE_TYPE_FAST;
	else if (reg == STATUS_C_TAPER_CHARGING)
		return POWER_SUPPLY_CHARGE_TYPE_TAPER;
		return POWER_SUPPLY_CHARGE_TYPE_ADAPTIVE;
	else if (reg == STATUS_C_PRE_CHARGING)
		return POWER_SUPPLY_CHARGE_TYPE_TRICKLE;
	else
@@ -1147,7 +1147,7 @@ smb358_batt_property_is_writeable(struct power_supply *psy,
					enum power_supply_property psp)
{
	switch (psp) {
	case POWER_SUPPLY_PROP_CHARGING_ENABLED:
	case POWER_SUPPLY_PROP_INPUT_CURRENT_LIMIT:
	case POWER_SUPPLY_PROP_CAPACITY:
		return 1;
	default:
@@ -1210,7 +1210,7 @@ static int smb358_battery_set_property(struct power_supply *psy,
			return -EINVAL;
		}
		break;
	case POWER_SUPPLY_PROP_CHARGING_ENABLED:
	case POWER_SUPPLY_PROP_INPUT_CURRENT_LIMIT:
		smb358_charging_disable(chip, USER, !val->intval);
		smb358_path_suspend(chip, USER, !val->intval);
		break;
@@ -1241,7 +1241,7 @@ static int smb358_battery_get_property(struct power_supply *psy,
	case POWER_SUPPLY_PROP_CAPACITY:
		val->intval = smb358_get_prop_batt_capacity(chip);
		break;
	case POWER_SUPPLY_PROP_CHARGING_ENABLED:
	case POWER_SUPPLY_PROP_INPUT_CURRENT_LIMIT:
		val->intval = !(chip->charging_disabled_status & USER);
		break;
	case POWER_SUPPLY_PROP_CHARGE_TYPE:
@@ -1285,6 +1285,21 @@ static void smb358_set_cable_id(struct smb358_charger *chip,
	chip->cable_id = id;
}

static void smb358_update_desc_type(struct smb358_charger *chip)
{
	switch (chip->charger_type) {
	case POWER_SUPPLY_TYPE_USB_CDP:
	case POWER_SUPPLY_TYPE_USB_DCP:
	case POWER_SUPPLY_TYPE_USB:
	case POWER_SUPPLY_TYPE_USB_ACA:
		chip->usb_psy_d.type = chip->charger_type;
		break;
	default:
		chip->usb_psy_d.type = POWER_SUPPLY_TYPE_USB;
		break;
	}
}

static int apsd_complete(struct smb358_charger *chip, u8 status)
{
	int rc = 0;
@@ -1360,6 +1375,7 @@ static int apsd_complete(struct smb358_charger *chip, u8 status)
		dev_dbg(chip->dev, "Failed to set USB current rc=%d\n", rc);

	smb358_set_cable_id(chip, id, true);
	smb358_update_desc_type(chip);

	return 0;
}
@@ -2264,15 +2280,44 @@ static char *smb358_usb_supplicants[] = {
	"bms",
};

static enum power_supply_usb_type smb358_usb_psy_supported_types[] = {
	POWER_SUPPLY_USB_TYPE_UNKNOWN,
	POWER_SUPPLY_USB_TYPE_SDP,
	POWER_SUPPLY_USB_TYPE_CDP,
	POWER_SUPPLY_USB_TYPE_DCP,
	POWER_SUPPLY_USB_TYPE_ACA,
};

static enum power_supply_property smb358_usb_properties[] = {
	POWER_SUPPLY_PROP_PRESENT,
	POWER_SUPPLY_PROP_ONLINE,
	POWER_SUPPLY_PROP_CURRENT_MAX,
	POWER_SUPPLY_PROP_SDP_CURRENT_MAX,
	POWER_SUPPLY_PROP_TYPE,
	POWER_SUPPLY_PROP_REAL_TYPE,
	POWER_SUPPLY_PROP_INPUT_CURRENT_LIMIT,
	POWER_SUPPLY_PROP_USB_TYPE,
};

static void smb358_get_usb_type(struct smb358_charger *chip,
					union power_supply_propval *val)
{
	switch (chip->charger_type) {
	case POWER_SUPPLY_TYPE_USB_CDP:
		val->intval = POWER_SUPPLY_USB_TYPE_CDP;
		break;
	case POWER_SUPPLY_TYPE_USB_DCP:
		val->intval = POWER_SUPPLY_USB_TYPE_DCP;
		break;
	case POWER_SUPPLY_TYPE_USB:
		val->intval = POWER_SUPPLY_USB_TYPE_SDP;
		break;
	case POWER_SUPPLY_TYPE_USB_ACA:
		val->intval = POWER_SUPPLY_USB_TYPE_ACA;
		break;
	default:
		val->intval = POWER_SUPPLY_USB_TYPE_UNKNOWN;
		break;
	}
}

static int smb358_usb_get_property(struct power_supply *psy,
				enum power_supply_property psp,
				union power_supply_propval *val)
@@ -2281,7 +2326,7 @@ static int smb358_usb_get_property(struct power_supply *psy,

	switch (psp) {
	case POWER_SUPPLY_PROP_CURRENT_MAX:
	case POWER_SUPPLY_PROP_SDP_CURRENT_MAX:
	case POWER_SUPPLY_PROP_INPUT_CURRENT_LIMIT:
		val->intval = chip->usb_psy_ma * 1000;
		break;
	case POWER_SUPPLY_PROP_PRESENT:
@@ -2290,14 +2335,8 @@ static int smb358_usb_get_property(struct power_supply *psy,
	case POWER_SUPPLY_PROP_ONLINE:
		val->intval = chip->chg_present && !chip->usb_suspended;
		break;
	case POWER_SUPPLY_PROP_TYPE:
		val->intval = chip->charger_type;
		break;
	case POWER_SUPPLY_PROP_REAL_TYPE:
		if (chip->charger_type == POWER_SUPPLY_TYPE_UNKNOWN)
			val->intval = POWER_SUPPLY_TYPE_USB;
		else
			val->intval = chip->charger_type;
	case POWER_SUPPLY_PROP_USB_TYPE:
		smb358_get_usb_type(chip, val);
		break;
	default:
		return -EINVAL;
@@ -2313,7 +2352,7 @@ static int smb358_usb_set_property(struct power_supply *psy,

	switch (psp) {
	case POWER_SUPPLY_PROP_CURRENT_MAX:
	case POWER_SUPPLY_PROP_SDP_CURRENT_MAX:
	case POWER_SUPPLY_PROP_INPUT_CURRENT_LIMIT:
		chip->usb_psy_ma = val->intval / 1000;
		smb358_enable_volatile_writes(chip);
		smb358_set_usb_chg_current(chip, chip->usb_psy_ma);
@@ -2414,6 +2453,8 @@ static int smb358_charger_probe(struct i2c_client *client,
	chip->usb_psy_d.get_property = smb358_usb_get_property;
	chip->usb_psy_d.set_property = smb358_usb_set_property;
	chip->usb_psy_d.properties = smb358_usb_properties;
	chip->usb_psy_d.usb_types  = smb358_usb_psy_supported_types,
	chip->usb_psy_d.num_usb_types = ARRAY_SIZE(smb358_usb_psy_supported_types);
	chip->usb_psy_d.num_properties = ARRAY_SIZE(smb358_usb_properties);
	chip->usb_psy_d.property_is_writeable = smb358_usb_is_writeable;