Skip to content

Commit 1c97fe3

Browse files
committed
Merge tag 'qcom-drivers-for-6.10-2' of https://git.kernel.org/pub/scm/linux/kernel/git/qcom/linux into soc/drivers
A few more Qualcomm driver updates for v6.10 This fixes a sleep-while-atomic issue in pmic_glink, stemming from the fact that the GLINK callback comes from interrupt context. It fixes the Bluetooth address in the example of qcom,wcnss, and it enables UEFI variables on SC8180X devices (Primus and Flex 5G). * tag 'qcom-drivers-for-6.10-2' of https://git.kernel.org/pub/scm/linux/kernel/git/qcom/linux: firmware: qcom: uefisecapp: Allow on sc8180x Primus and Flex 5G soc: qcom: pmic_glink: Make client-lock non-sleeping dt-bindings: soc: qcom,wcnss: fix bluetooth address example Link: https://lore.kernel.org/r/[email protected] Signed-off-by: Arnd Bergmann <[email protected]>
2 parents a3116c8 + 4b34d4c commit 1c97fe3

File tree

3 files changed

+19
-12
lines changed

3 files changed

+19
-12
lines changed

Documentation/devicetree/bindings/soc/qcom/qcom,wcnss.yaml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -116,8 +116,8 @@ examples:
116116
117117
bluetooth {
118118
compatible = "qcom,wcnss-bt";
119-
/* BD address 00:11:22:33:44:55 */
120-
local-bd-address = [ 55 44 33 22 11 00 ];
119+
/* Updated by boot firmware (little-endian order) */
120+
local-bd-address = [ 00 00 00 00 00 00 ];
121121
};
122122
123123
wifi {

drivers/firmware/qcom/qcom_scm.c

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1671,7 +1671,9 @@ EXPORT_SYMBOL_GPL(qcom_scm_qseecom_app_send);
16711671
+ any potential issues with this, only allow validated machines for now.
16721672
*/
16731673
static const struct of_device_id qcom_scm_qseecom_allowlist[] __maybe_unused = {
1674+
{ .compatible = "lenovo,flex-5g" },
16741675
{ .compatible = "lenovo,thinkpad-x13s", },
1676+
{ .compatible = "qcom,sc8180x-primus" },
16751677
{ }
16761678
};
16771679

drivers/soc/qcom/pmic_glink.c

Lines changed: 15 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111
#include <linux/slab.h>
1212
#include <linux/soc/qcom/pdr.h>
1313
#include <linux/soc/qcom/pmic_glink.h>
14+
#include <linux/spinlock.h>
1415

1516
enum {
1617
PMIC_GLINK_CLIENT_BATT = 0,
@@ -36,7 +37,7 @@ struct pmic_glink {
3637
unsigned int pdr_state;
3738

3839
/* serializing clients list updates */
39-
struct mutex client_lock;
40+
spinlock_t client_lock;
4041
struct list_head clients;
4142
};
4243

@@ -58,10 +59,11 @@ static void _devm_pmic_glink_release_client(struct device *dev, void *res)
5859
{
5960
struct pmic_glink_client *client = (struct pmic_glink_client *)res;
6061
struct pmic_glink *pg = client->pg;
62+
unsigned long flags;
6163

62-
mutex_lock(&pg->client_lock);
64+
spin_lock_irqsave(&pg->client_lock, flags);
6365
list_del(&client->node);
64-
mutex_unlock(&pg->client_lock);
66+
spin_unlock_irqrestore(&pg->client_lock, flags);
6567
}
6668

6769
struct pmic_glink_client *devm_pmic_glink_register_client(struct device *dev,
@@ -72,6 +74,7 @@ struct pmic_glink_client *devm_pmic_glink_register_client(struct device *dev,
7274
{
7375
struct pmic_glink_client *client;
7476
struct pmic_glink *pg = dev_get_drvdata(dev->parent);
77+
unsigned long flags;
7578

7679
client = devres_alloc(_devm_pmic_glink_release_client, sizeof(*client), GFP_KERNEL);
7780
if (!client)
@@ -84,12 +87,12 @@ struct pmic_glink_client *devm_pmic_glink_register_client(struct device *dev,
8487
client->priv = priv;
8588

8689
mutex_lock(&pg->state_lock);
87-
mutex_lock(&pg->client_lock);
90+
spin_lock_irqsave(&pg->client_lock, flags);
8891

8992
list_add(&client->node, &pg->clients);
9093
client->pdr_notify(client->priv, pg->client_state);
9194

92-
mutex_unlock(&pg->client_lock);
95+
spin_unlock_irqrestore(&pg->client_lock, flags);
9396
mutex_unlock(&pg->state_lock);
9497

9598
devres_add(dev, client);
@@ -112,6 +115,7 @@ static int pmic_glink_rpmsg_callback(struct rpmsg_device *rpdev, void *data,
112115
struct pmic_glink_client *client;
113116
struct pmic_glink_hdr *hdr;
114117
struct pmic_glink *pg = dev_get_drvdata(&rpdev->dev);
118+
unsigned long flags;
115119

116120
if (len < sizeof(*hdr)) {
117121
dev_warn(pg->dev, "ignoring truncated message\n");
@@ -120,12 +124,12 @@ static int pmic_glink_rpmsg_callback(struct rpmsg_device *rpdev, void *data,
120124

121125
hdr = data;
122126

123-
mutex_lock(&pg->client_lock);
127+
spin_lock_irqsave(&pg->client_lock, flags);
124128
list_for_each_entry(client, &pg->clients, node) {
125129
if (client->id == le32_to_cpu(hdr->owner))
126130
client->cb(data, len, client->priv);
127131
}
128-
mutex_unlock(&pg->client_lock);
132+
spin_unlock_irqrestore(&pg->client_lock, flags);
129133

130134
return 0;
131135
}
@@ -165,6 +169,7 @@ static void pmic_glink_state_notify_clients(struct pmic_glink *pg)
165169
{
166170
struct pmic_glink_client *client;
167171
unsigned int new_state = pg->client_state;
172+
unsigned long flags;
168173

169174
if (pg->client_state != SERVREG_SERVICE_STATE_UP) {
170175
if (pg->pdr_state == SERVREG_SERVICE_STATE_UP && pg->ept)
@@ -175,10 +180,10 @@ static void pmic_glink_state_notify_clients(struct pmic_glink *pg)
175180
}
176181

177182
if (new_state != pg->client_state) {
178-
mutex_lock(&pg->client_lock);
183+
spin_lock_irqsave(&pg->client_lock, flags);
179184
list_for_each_entry(client, &pg->clients, node)
180185
client->pdr_notify(client->priv, new_state);
181-
mutex_unlock(&pg->client_lock);
186+
spin_unlock_irqrestore(&pg->client_lock, flags);
182187
pg->client_state = new_state;
183188
}
184189
}
@@ -265,7 +270,7 @@ static int pmic_glink_probe(struct platform_device *pdev)
265270
pg->dev = &pdev->dev;
266271

267272
INIT_LIST_HEAD(&pg->clients);
268-
mutex_init(&pg->client_lock);
273+
spin_lock_init(&pg->client_lock);
269274
mutex_init(&pg->state_lock);
270275

271276
match_data = (unsigned long *)of_device_get_match_data(&pdev->dev);

0 commit comments

Comments
 (0)