Skip to content

Commit b43f7dd

Browse files
konradybciosre
authored andcommitted
power: supply: qcom_battmgr: Register the power supplies after PDR is up
Currently, a not-yet-entirely-initialized battmgr (e.g. with pd-mapper not having yet started or ADSP not being up etc.) results in a couple of zombie power supply devices hanging around. This is particularly noticeable when trying to suspend the device (even s2idle): the PSY-internal thermal zone is inaccessible and returns -ENODEV, which causes log spam. Register the power supplies only after we received some notification indicating battmgr is ready to take off. Signed-off-by: Konrad Dybcio <konrad.dybcio@linaro.org> Tested-by: Luca Weiss <luca.weiss@fairphone.com> Link: https://lore.kernel.org/r/20231218-topic-battmgr_fixture_attempt-v1-1-6145745f34fe@linaro.org Signed-off-by: Sebastian Reichel <sebastian.reichel@collabora.com>
1 parent 5231002 commit b43f7dd

1 file changed

Lines changed: 60 additions & 49 deletions

File tree

drivers/power/supply/qcom_battmgr.c

Lines changed: 60 additions & 49 deletions
Original file line numberDiff line numberDiff line change
@@ -282,6 +282,7 @@ struct qcom_battmgr_wireless {
282282

283283
struct qcom_battmgr {
284284
struct device *dev;
285+
struct auxiliary_device *adev;
285286
struct pmic_glink_client *client;
286287

287288
enum qcom_battmgr_variant variant;
@@ -1293,11 +1294,69 @@ static void qcom_battmgr_enable_worker(struct work_struct *work)
12931294
dev_err(battmgr->dev, "failed to request power notifications\n");
12941295
}
12951296

1297+
static char *qcom_battmgr_battery[] = { "battery" };
1298+
1299+
static void qcom_battmgr_register_psy(struct qcom_battmgr *battmgr)
1300+
{
1301+
struct power_supply_config psy_cfg_supply = {};
1302+
struct auxiliary_device *adev = battmgr->adev;
1303+
struct power_supply_config psy_cfg = {};
1304+
struct device *dev = &adev->dev;
1305+
1306+
psy_cfg.drv_data = battmgr;
1307+
psy_cfg.of_node = adev->dev.of_node;
1308+
1309+
psy_cfg_supply.drv_data = battmgr;
1310+
psy_cfg_supply.of_node = adev->dev.of_node;
1311+
psy_cfg_supply.supplied_to = qcom_battmgr_battery;
1312+
psy_cfg_supply.num_supplicants = 1;
1313+
1314+
if (battmgr->variant == QCOM_BATTMGR_SC8280XP) {
1315+
battmgr->bat_psy = devm_power_supply_register(dev, &sc8280xp_bat_psy_desc, &psy_cfg);
1316+
if (IS_ERR(battmgr->bat_psy))
1317+
dev_err(dev, "failed to register battery power supply (%ld)\n",
1318+
PTR_ERR(battmgr->bat_psy));
1319+
1320+
battmgr->ac_psy = devm_power_supply_register(dev, &sc8280xp_ac_psy_desc, &psy_cfg_supply);
1321+
if (IS_ERR(battmgr->ac_psy))
1322+
dev_err(dev, "failed to register AC power supply (%ld)\n",
1323+
PTR_ERR(battmgr->ac_psy));
1324+
1325+
battmgr->usb_psy = devm_power_supply_register(dev, &sc8280xp_usb_psy_desc, &psy_cfg_supply);
1326+
if (IS_ERR(battmgr->usb_psy))
1327+
dev_err(dev, "failed to register USB power supply (%ld)\n",
1328+
PTR_ERR(battmgr->usb_psy));
1329+
1330+
battmgr->wls_psy = devm_power_supply_register(dev, &sc8280xp_wls_psy_desc, &psy_cfg_supply);
1331+
if (IS_ERR(battmgr->wls_psy))
1332+
dev_err(dev, "failed to register wireless charing power supply (%ld)\n",
1333+
PTR_ERR(battmgr->wls_psy));
1334+
} else {
1335+
battmgr->bat_psy = devm_power_supply_register(dev, &sm8350_bat_psy_desc, &psy_cfg);
1336+
if (IS_ERR(battmgr->bat_psy))
1337+
dev_err(dev, "failed to register battery power supply (%ld)\n",
1338+
PTR_ERR(battmgr->bat_psy));
1339+
1340+
battmgr->usb_psy = devm_power_supply_register(dev, &sm8350_usb_psy_desc, &psy_cfg_supply);
1341+
if (IS_ERR(battmgr->usb_psy))
1342+
dev_err(dev, "failed to register USB power supply (%ld)\n",
1343+
PTR_ERR(battmgr->usb_psy));
1344+
1345+
battmgr->wls_psy = devm_power_supply_register(dev, &sm8350_wls_psy_desc, &psy_cfg_supply);
1346+
if (IS_ERR(battmgr->wls_psy))
1347+
dev_err(dev, "failed to register wireless charing power supply (%ld)\n",
1348+
PTR_ERR(battmgr->wls_psy));
1349+
}
1350+
}
1351+
12961352
static void qcom_battmgr_pdr_notify(void *priv, int state)
12971353
{
12981354
struct qcom_battmgr *battmgr = priv;
12991355

13001356
if (state == SERVREG_SERVICE_STATE_UP) {
1357+
if (!battmgr->bat_psy)
1358+
qcom_battmgr_register_psy(battmgr);
1359+
13011360
battmgr->service_up = true;
13021361
schedule_work(&battmgr->enable_work);
13031362
} else {
@@ -1312,13 +1371,9 @@ static const struct of_device_id qcom_battmgr_of_variants[] = {
13121371
{}
13131372
};
13141373

1315-
static char *qcom_battmgr_battery[] = { "battery" };
1316-
13171374
static int qcom_battmgr_probe(struct auxiliary_device *adev,
13181375
const struct auxiliary_device_id *id)
13191376
{
1320-
struct power_supply_config psy_cfg_supply = {};
1321-
struct power_supply_config psy_cfg = {};
13221377
const struct of_device_id *match;
13231378
struct qcom_battmgr *battmgr;
13241379
struct device *dev = &adev->dev;
@@ -1328,14 +1383,7 @@ static int qcom_battmgr_probe(struct auxiliary_device *adev,
13281383
return -ENOMEM;
13291384

13301385
battmgr->dev = dev;
1331-
1332-
psy_cfg.drv_data = battmgr;
1333-
psy_cfg.of_node = adev->dev.of_node;
1334-
1335-
psy_cfg_supply.drv_data = battmgr;
1336-
psy_cfg_supply.of_node = adev->dev.of_node;
1337-
psy_cfg_supply.supplied_to = qcom_battmgr_battery;
1338-
psy_cfg_supply.num_supplicants = 1;
1386+
battmgr->adev = adev;
13391387

13401388
INIT_WORK(&battmgr->enable_work, qcom_battmgr_enable_worker);
13411389
mutex_init(&battmgr->lock);
@@ -1347,43 +1395,6 @@ static int qcom_battmgr_probe(struct auxiliary_device *adev,
13471395
else
13481396
battmgr->variant = QCOM_BATTMGR_SM8350;
13491397

1350-
if (battmgr->variant == QCOM_BATTMGR_SC8280XP) {
1351-
battmgr->bat_psy = devm_power_supply_register(dev, &sc8280xp_bat_psy_desc, &psy_cfg);
1352-
if (IS_ERR(battmgr->bat_psy))
1353-
return dev_err_probe(dev, PTR_ERR(battmgr->bat_psy),
1354-
"failed to register battery power supply\n");
1355-
1356-
battmgr->ac_psy = devm_power_supply_register(dev, &sc8280xp_ac_psy_desc, &psy_cfg_supply);
1357-
if (IS_ERR(battmgr->ac_psy))
1358-
return dev_err_probe(dev, PTR_ERR(battmgr->ac_psy),
1359-
"failed to register AC power supply\n");
1360-
1361-
battmgr->usb_psy = devm_power_supply_register(dev, &sc8280xp_usb_psy_desc, &psy_cfg_supply);
1362-
if (IS_ERR(battmgr->usb_psy))
1363-
return dev_err_probe(dev, PTR_ERR(battmgr->usb_psy),
1364-
"failed to register USB power supply\n");
1365-
1366-
battmgr->wls_psy = devm_power_supply_register(dev, &sc8280xp_wls_psy_desc, &psy_cfg_supply);
1367-
if (IS_ERR(battmgr->wls_psy))
1368-
return dev_err_probe(dev, PTR_ERR(battmgr->wls_psy),
1369-
"failed to register wireless charing power supply\n");
1370-
} else {
1371-
battmgr->bat_psy = devm_power_supply_register(dev, &sm8350_bat_psy_desc, &psy_cfg);
1372-
if (IS_ERR(battmgr->bat_psy))
1373-
return dev_err_probe(dev, PTR_ERR(battmgr->bat_psy),
1374-
"failed to register battery power supply\n");
1375-
1376-
battmgr->usb_psy = devm_power_supply_register(dev, &sm8350_usb_psy_desc, &psy_cfg_supply);
1377-
if (IS_ERR(battmgr->usb_psy))
1378-
return dev_err_probe(dev, PTR_ERR(battmgr->usb_psy),
1379-
"failed to register USB power supply\n");
1380-
1381-
battmgr->wls_psy = devm_power_supply_register(dev, &sm8350_wls_psy_desc, &psy_cfg_supply);
1382-
if (IS_ERR(battmgr->wls_psy))
1383-
return dev_err_probe(dev, PTR_ERR(battmgr->wls_psy),
1384-
"failed to register wireless charing power supply\n");
1385-
}
1386-
13871398
battmgr->client = devm_pmic_glink_register_client(dev,
13881399
PMIC_GLINK_OWNER_BATTMGR,
13891400
qcom_battmgr_callback,

0 commit comments

Comments
 (0)