Skip to content

Commit e9f826b

Browse files
krzkandersson
authored andcommitted
soc: qcom: pmic_glink: simplify locking with guard()
Simplify error handling over locks with guard(). In few places this elimiates error gotos and local variables. Switch to guard() everywhere (except when jumps would go over scoped guard) for consistency, even if it does not bring benefit in such places. Signed-off-by: Krzysztof Kozlowski <krzysztof.kozlowski@linaro.org> Link: https://lore.kernel.org/r/20240822164815.230167-2-krzysztof.kozlowski@linaro.org [bjorn: Rebased ontop of v6.13-rc1] Signed-off-by: Bjorn Andersson <andersson@kernel.org>
1 parent 0124b9b commit e9f826b

File tree

1 file changed

+29
-41
lines changed

1 file changed

+29
-41
lines changed

drivers/soc/qcom/pmic_glink.c

Lines changed: 29 additions & 41 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
* Copyright (c) 2022, Linaro Ltd
55
*/
66
#include <linux/auxiliary_bus.h>
7+
#include <linux/cleanup.h>
78
#include <linux/delay.h>
89
#include <linux/module.h>
910
#include <linux/of.h>
@@ -100,15 +101,13 @@ void pmic_glink_client_register(struct pmic_glink_client *client)
100101
struct pmic_glink *pg = client->pg;
101102
unsigned long flags;
102103

103-
mutex_lock(&pg->state_lock);
104+
guard(mutex)(&pg->state_lock);
104105
spin_lock_irqsave(&pg->client_lock, flags);
105106

106107
list_add(&client->node, &pg->clients);
107108
client->pdr_notify(client->priv, pg->client_state);
108109

109110
spin_unlock_irqrestore(&pg->client_lock, flags);
110-
mutex_unlock(&pg->state_lock);
111-
112111
}
113112
EXPORT_SYMBOL_GPL(pmic_glink_client_register);
114113

@@ -119,26 +118,25 @@ int pmic_glink_send(struct pmic_glink_client *client, void *data, size_t len)
119118
unsigned long start;
120119
int ret;
121120

122-
mutex_lock(&pg->state_lock);
121+
guard(mutex)(&pg->state_lock);
123122
if (!pg->ept) {
124-
ret = -ECONNRESET;
125-
} else {
126-
start = jiffies;
127-
for (;;) {
128-
ret = rpmsg_send(pg->ept, data, len);
129-
if (ret != -EAGAIN)
130-
break;
131-
132-
if (timeout_reached) {
133-
ret = -ETIMEDOUT;
134-
break;
135-
}
136-
137-
usleep_range(1000, 5000);
138-
timeout_reached = time_after(jiffies, start + PMIC_GLINK_SEND_TIMEOUT);
123+
return -ECONNRESET;
124+
}
125+
126+
start = jiffies;
127+
for (;;) {
128+
ret = rpmsg_send(pg->ept, data, len);
129+
if (ret != -EAGAIN)
130+
break;
131+
132+
if (timeout_reached) {
133+
ret = -ETIMEDOUT;
134+
break;
139135
}
136+
137+
usleep_range(1000, 5000);
138+
timeout_reached = time_after(jiffies, start + PMIC_GLINK_SEND_TIMEOUT);
140139
}
141-
mutex_unlock(&pg->state_lock);
142140

143141
return ret;
144142
}
@@ -227,51 +225,42 @@ static void pmic_glink_pdr_callback(int state, char *svc_path, void *priv)
227225
{
228226
struct pmic_glink *pg = priv;
229227

230-
mutex_lock(&pg->state_lock);
228+
guard(mutex)(&pg->state_lock);
231229
pg->pdr_state = state;
232230

233231
pmic_glink_state_notify_clients(pg);
234-
mutex_unlock(&pg->state_lock);
235232
}
236233

237234
static int pmic_glink_rpmsg_probe(struct rpmsg_device *rpdev)
238235
{
239236
struct pmic_glink *pg = __pmic_glink;
240-
int ret = 0;
241237

242-
mutex_lock(&__pmic_glink_lock);
243-
if (!pg) {
244-
ret = dev_err_probe(&rpdev->dev, -ENODEV, "no pmic_glink device to attach to\n");
245-
goto out_unlock;
246-
}
238+
guard(mutex)(&__pmic_glink_lock);
239+
pg = __pmic_glink;
240+
if (!pg)
241+
return dev_err_probe(&rpdev->dev, -ENODEV, "no pmic_glink device to attach to\n");
247242

248243
dev_set_drvdata(&rpdev->dev, pg);
249244

250-
mutex_lock(&pg->state_lock);
245+
guard(mutex)(&pg->state_lock);
251246
pg->ept = rpdev->ept;
252247
pmic_glink_state_notify_clients(pg);
253-
mutex_unlock(&pg->state_lock);
254248

255-
out_unlock:
256-
mutex_unlock(&__pmic_glink_lock);
257-
return ret;
249+
return 0;
258250
}
259251

260252
static void pmic_glink_rpmsg_remove(struct rpmsg_device *rpdev)
261253
{
262254
struct pmic_glink *pg;
263255

264-
mutex_lock(&__pmic_glink_lock);
256+
guard(mutex)(&__pmic_glink_lock);
265257
pg = __pmic_glink;
266258
if (!pg)
267-
goto out_unlock;
259+
return;
268260

269-
mutex_lock(&pg->state_lock);
261+
guard(mutex)(&pg->state_lock);
270262
pg->ept = NULL;
271263
pmic_glink_state_notify_clients(pg);
272-
mutex_unlock(&pg->state_lock);
273-
out_unlock:
274-
mutex_unlock(&__pmic_glink_lock);
275264
}
276265

277266
static const struct rpmsg_device_id pmic_glink_rpmsg_id_match[] = {
@@ -378,9 +367,8 @@ static void pmic_glink_remove(struct platform_device *pdev)
378367
if (pg->client_mask & BIT(PMIC_GLINK_CLIENT_UCSI))
379368
pmic_glink_del_aux_device(pg, &pg->ucsi_aux);
380369

381-
mutex_lock(&__pmic_glink_lock);
370+
guard(mutex)(&__pmic_glink_lock);
382371
__pmic_glink = NULL;
383-
mutex_unlock(&__pmic_glink_lock);
384372
}
385373

386374
static const unsigned long pmic_glink_sc8280xp_client_mask = BIT(PMIC_GLINK_CLIENT_BATT) |

0 commit comments

Comments
 (0)