From ec2657eb96c23b8679deeec54b56ad0c7131718f Mon Sep 17 00:00:00 2001 From: Subbaraman Narayanamurthy Date: Thu, 23 Jul 2020 20:02:45 -0700 Subject: [PATCH] power: supply: qti_battery_charger: update USB power supply type runtime Currently, USB power supply type is set to POWER_SUPPLY_TYPE_USB in power supply descriptor. power_supply_show_property() would show POWER_SUPPLY_PROP_TYPE based on psy->desc->type. Userspace process like healthd would read POWER_SUPPLY_PROP_TYPE to print the adapter type in logs (e.g. "chg=u" for SDP, "chg=a" for DCP). Hence update usb_psy_desc type runtime to show the USB power supply type accordingly. This is useful for testing. Change-Id: Icd88098f97beba053105d826614b4182f3716144 Signed-off-by: Subbaraman Narayanamurthy --- drivers/power/supply/qti_battery_charger.c | 53 +++++++++++++++++++++- 1 file changed, 52 insertions(+), 1 deletion(-) diff --git a/drivers/power/supply/qti_battery_charger.c b/drivers/power/supply/qti_battery_charger.c index 6917808719ca..e32940879993 100644 --- a/drivers/power/supply/qti_battery_charger.c +++ b/drivers/power/supply/qti_battery_charger.c @@ -224,6 +224,7 @@ struct battery_chg_dev { int num_thermal_levels; atomic_t state; struct work_struct subsys_up_work; + struct work_struct usb_type_work; int fake_soc; bool block_tx; bool ship_mode_en; @@ -620,6 +621,54 @@ static void handle_message(struct battery_chg_dev *bcdev, void *data, complete(&bcdev->ack); } +static struct power_supply_desc usb_psy_desc; + +static void battery_chg_update_usb_type_work(struct work_struct *work) +{ + struct battery_chg_dev *bcdev = container_of(work, + struct battery_chg_dev, usb_type_work); + struct psy_state *pst = &bcdev->psy_list[PSY_TYPE_USB]; + int rc; + + rc = read_property_id(bcdev, pst, USB_ADAP_TYPE); + if (rc < 0) { + pr_err("Failed to read USB_ADAP_TYPE rc=%d\n", rc); + return; + } + + pr_debug("usb_adap_type: %u\n", pst->prop[USB_ADAP_TYPE]); + + switch (pst->prop[USB_ADAP_TYPE]) { + case POWER_SUPPLY_USB_TYPE_SDP: + usb_psy_desc.type = POWER_SUPPLY_TYPE_USB; + break; + case POWER_SUPPLY_USB_TYPE_DCP: + case POWER_SUPPLY_USB_TYPE_APPLE_BRICK_ID: + case QTI_POWER_SUPPLY_USB_TYPE_HVDCP: + case QTI_POWER_SUPPLY_USB_TYPE_HVDCP_3: + case QTI_POWER_SUPPLY_USB_TYPE_HVDCP_3P5: + usb_psy_desc.type = POWER_SUPPLY_TYPE_USB_DCP; + break; + case POWER_SUPPLY_USB_TYPE_CDP: + usb_psy_desc.type = POWER_SUPPLY_TYPE_USB_CDP; + break; + case POWER_SUPPLY_USB_TYPE_ACA: + usb_psy_desc.type = POWER_SUPPLY_TYPE_USB_ACA; + break; + case POWER_SUPPLY_USB_TYPE_C: + usb_psy_desc.type = POWER_SUPPLY_TYPE_USB_TYPE_C; + break; + case POWER_SUPPLY_USB_TYPE_PD: + case POWER_SUPPLY_USB_TYPE_PD_DRP: + case POWER_SUPPLY_USB_TYPE_PD_PPS: + usb_psy_desc.type = POWER_SUPPLY_TYPE_USB_PD; + break; + default: + usb_psy_desc.type = POWER_SUPPLY_TYPE_USB; + break; + } +} + static void handle_notification(struct battery_chg_dev *bcdev, void *data, size_t len) { @@ -640,6 +689,7 @@ static void handle_notification(struct battery_chg_dev *bcdev, void *data, break; case BC_USB_STATUS_GET: pst = &bcdev->psy_list[PSY_TYPE_USB]; + schedule_work(&bcdev->usb_type_work); break; case BC_WLS_STATUS_GET: pst = &bcdev->psy_list[PSY_TYPE_WLS]; @@ -871,7 +921,7 @@ static enum power_supply_usb_type usb_psy_supported_types[] = { POWER_SUPPLY_USB_TYPE_APPLE_BRICK_ID, }; -static const struct power_supply_desc usb_psy_desc = { +static struct power_supply_desc usb_psy_desc = { .name = "usb", .type = POWER_SUPPLY_TYPE_USB, .properties = usb_props, @@ -1753,6 +1803,7 @@ static int battery_chg_probe(struct platform_device *pdev) init_completion(&bcdev->fw_buf_ack); init_completion(&bcdev->fw_update_ack); INIT_WORK(&bcdev->subsys_up_work, battery_chg_subsys_up_work); + INIT_WORK(&bcdev->usb_type_work, battery_chg_update_usb_type_work); atomic_set(&bcdev->state, PMIC_GLINK_STATE_UP); bcdev->dev = dev;