Skip to content

Commit f79ee78

Browse files
robclarklumag
authored andcommitted
soc: qcom: pmic_glink: Fix boot when QRTR=m
We need to bail out before adding/removing devices if we are going to -EPROBE_DEFER. Otherwise boot can get stuck in a probe deferral loop due to a long-standing issue in driver core (see commit fbc35b4 ("Add documentation on meaning of -EPROBE_DEFER")). Deregistering the altmode child device can potentially also trigger bugs in the DRM bridge implementation, which does not expect bridges to go away. [DB: slightly fixed commit message by adding the word 'commit'] Suggested-by: Dmitry Baryshkov <dmitry.baryshkov@linaro.org> Signed-off-by: Rob Clark <robdclark@chromium.org> Link: https://lore.kernel.org/r/20231213210644.8702-1-robdclark@gmail.com [ johan: rebase on 6.8-rc4, amend commit message and mention DRM ] Fixes: 58ef4ec ("soc: qcom: pmic_glink: Introduce base PMIC GLINK driver") Cc: <stable@vger.kernel.org> # 6.3 Cc: Bjorn Andersson <andersson@kernel.org> Signed-off-by: Johan Hovold <johan+linaro@kernel.org> Reviewed-by: Bjorn Andersson <andersson@kernel.org> Reviewed-by: Dmitry Baryshkov <dmitry.baryshkov@linaro.org> Reviewed-by: Neil Armstrong <neil.armstrong@linaro.org> Signed-off-by: Dmitry Baryshkov <dmitry.baryshkov@linaro.org> Link: https://patchwork.freedesktop.org/patch/msgid/20240217150228.5788-5-johan+linaro@kernel.org
1 parent b979f2d commit f79ee78

File tree

1 file changed

+11
-10
lines changed

1 file changed

+11
-10
lines changed

drivers/soc/qcom/pmic_glink.c

Lines changed: 11 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -265,10 +265,17 @@ static int pmic_glink_probe(struct platform_device *pdev)
265265

266266
pg->client_mask = *match_data;
267267

268+
pg->pdr = pdr_handle_alloc(pmic_glink_pdr_callback, pg);
269+
if (IS_ERR(pg->pdr)) {
270+
ret = dev_err_probe(&pdev->dev, PTR_ERR(pg->pdr),
271+
"failed to initialize pdr\n");
272+
return ret;
273+
}
274+
268275
if (pg->client_mask & BIT(PMIC_GLINK_CLIENT_UCSI)) {
269276
ret = pmic_glink_add_aux_device(pg, &pg->ucsi_aux, "ucsi");
270277
if (ret)
271-
return ret;
278+
goto out_release_pdr_handle;
272279
}
273280
if (pg->client_mask & BIT(PMIC_GLINK_CLIENT_ALTMODE)) {
274281
ret = pmic_glink_add_aux_device(pg, &pg->altmode_aux, "altmode");
@@ -281,17 +288,11 @@ static int pmic_glink_probe(struct platform_device *pdev)
281288
goto out_release_altmode_aux;
282289
}
283290

284-
pg->pdr = pdr_handle_alloc(pmic_glink_pdr_callback, pg);
285-
if (IS_ERR(pg->pdr)) {
286-
ret = dev_err_probe(&pdev->dev, PTR_ERR(pg->pdr), "failed to initialize pdr\n");
287-
goto out_release_aux_devices;
288-
}
289-
290291
service = pdr_add_lookup(pg->pdr, "tms/servreg", "msm/adsp/charger_pd");
291292
if (IS_ERR(service)) {
292293
ret = dev_err_probe(&pdev->dev, PTR_ERR(service),
293294
"failed adding pdr lookup for charger_pd\n");
294-
goto out_release_pdr_handle;
295+
goto out_release_aux_devices;
295296
}
296297

297298
mutex_lock(&__pmic_glink_lock);
@@ -300,8 +301,6 @@ static int pmic_glink_probe(struct platform_device *pdev)
300301

301302
return 0;
302303

303-
out_release_pdr_handle:
304-
pdr_handle_release(pg->pdr);
305304
out_release_aux_devices:
306305
if (pg->client_mask & BIT(PMIC_GLINK_CLIENT_BATT))
307306
pmic_glink_del_aux_device(pg, &pg->ps_aux);
@@ -311,6 +310,8 @@ static int pmic_glink_probe(struct platform_device *pdev)
311310
out_release_ucsi_aux:
312311
if (pg->client_mask & BIT(PMIC_GLINK_CLIENT_UCSI))
313312
pmic_glink_del_aux_device(pg, &pg->ucsi_aux);
313+
out_release_pdr_handle:
314+
pdr_handle_release(pg->pdr);
314315

315316
return ret;
316317
}

0 commit comments

Comments
 (0)