hc
2024-02-20 102a0743326a03cd1a1202ceda21e175b7d3575c
kernel/drivers/usb/chipidea/core.c
....@@ -966,8 +966,15 @@
966966 strlen(ci->roles[role]->name)))
967967 break;
968968
969
- if (role == CI_ROLE_END || role == ci->role)
969
+ if (role == CI_ROLE_END)
970970 return -EINVAL;
971
+
972
+ mutex_lock(&ci->mutex);
973
+
974
+ if (role == ci->role) {
975
+ mutex_unlock(&ci->mutex);
976
+ return n;
977
+ }
971978
972979 pm_runtime_get_sync(dev);
973980 disable_irq(ci->irq);
....@@ -977,6 +984,7 @@
977984 ci_handle_vbus_change(ci);
978985 enable_irq(ci->irq);
979986 pm_runtime_put_sync(dev);
987
+ mutex_unlock(&ci->mutex);
980988
981989 return (ret == 0) ? n : ret;
982990 }
....@@ -1012,6 +1020,7 @@
10121020 return -ENOMEM;
10131021
10141022 spin_lock_init(&ci->lock);
1023
+ mutex_init(&ci->mutex);
10151024 ci->dev = dev;
10161025 ci->platdata = dev_get_platdata(dev);
10171026 ci->imx28_write_fix = !!(ci->platdata->flags &
....@@ -1081,7 +1090,7 @@
10811090 ret = ci_usb_phy_init(ci);
10821091 if (ret) {
10831092 dev_err(dev, "unable to init phy: %d\n", ret);
1084
- return ret;
1093
+ goto ulpi_exit;
10851094 }
10861095
10871096 ci->hw_bank.phys = res->start;