From f01d7a5ddf0e35463fd3e4827f6ab36655936575 Mon Sep 17 00:00:00 2001 From: Kavya Nunna Date: Wed, 6 Jan 2021 13:18:29 +0530 Subject: [PATCH] power: smb358: Add support to make SMB358 driver GKI complaint Replace existing non standard power supply properties with standard power supply properties to make the smb358 driver GKI complaint. Change-Id: I878f0e910a8819e55befef5914be13190e1ce6c0 Signed-off-by: Kavya Nunna --- drivers/power/supply/qcom/smb358-charger.c | 81 ++++++++++++++++------ 1 file changed, 61 insertions(+), 20 deletions(-) diff --git a/drivers/power/supply/qcom/smb358-charger.c b/drivers/power/supply/qcom/smb358-charger.c index 6d0547055713..f88cea149de6 100644 --- a/drivers/power/supply/qcom/smb358-charger.c +++ b/drivers/power/supply/qcom/smb358-charger.c @@ -1,6 +1,6 @@ // 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 @@ -22,7 +22,7 @@ #include #include #include -#include +#include #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;