hc
2024-02-20 102a0743326a03cd1a1202ceda21e175b7d3575c
kernel/drivers/spi/spi-qup.c
....@@ -1030,23 +1030,8 @@
10301030 return -ENXIO;
10311031 }
10321032
1033
- ret = clk_prepare_enable(cclk);
1034
- if (ret) {
1035
- dev_err(dev, "cannot enable core clock\n");
1036
- return ret;
1037
- }
1038
-
1039
- ret = clk_prepare_enable(iclk);
1040
- if (ret) {
1041
- clk_disable_unprepare(cclk);
1042
- dev_err(dev, "cannot enable iface clock\n");
1043
- return ret;
1044
- }
1045
-
10461033 master = spi_alloc_master(dev, sizeof(struct spi_qup));
10471034 if (!master) {
1048
- clk_disable_unprepare(cclk);
1049
- clk_disable_unprepare(iclk);
10501035 dev_err(dev, "cannot allocate master\n");
10511036 return -ENOMEM;
10521037 }
....@@ -1092,6 +1077,19 @@
10921077 spin_lock_init(&controller->lock);
10931078 init_completion(&controller->done);
10941079
1080
+ ret = clk_prepare_enable(cclk);
1081
+ if (ret) {
1082
+ dev_err(dev, "cannot enable core clock\n");
1083
+ goto error_dma;
1084
+ }
1085
+
1086
+ ret = clk_prepare_enable(iclk);
1087
+ if (ret) {
1088
+ clk_disable_unprepare(cclk);
1089
+ dev_err(dev, "cannot enable iface clock\n");
1090
+ goto error_dma;
1091
+ }
1092
+
10951093 iomode = readl_relaxed(base + QUP_IO_M_MODES);
10961094
10971095 size = QUP_IO_M_OUTPUT_BLOCK_SIZE(iomode);
....@@ -1121,7 +1119,7 @@
11211119 ret = spi_qup_set_state(controller, QUP_STATE_RESET);
11221120 if (ret) {
11231121 dev_err(dev, "cannot set RESET state\n");
1124
- goto error_dma;
1122
+ goto error_clk;
11251123 }
11261124
11271125 writel_relaxed(0, base + QUP_OPERATIONAL);
....@@ -1145,7 +1143,7 @@
11451143 ret = devm_request_irq(dev, irq, spi_qup_qup_irq,
11461144 IRQF_TRIGGER_HIGH, pdev->name, controller);
11471145 if (ret)
1148
- goto error_dma;
1146
+ goto error_clk;
11491147
11501148 pm_runtime_set_autosuspend_delay(dev, MSEC_PER_SEC);
11511149 pm_runtime_use_autosuspend(dev);
....@@ -1160,11 +1158,12 @@
11601158
11611159 disable_pm:
11621160 pm_runtime_disable(&pdev->dev);
1161
+error_clk:
1162
+ clk_disable_unprepare(cclk);
1163
+ clk_disable_unprepare(iclk);
11631164 error_dma:
11641165 spi_qup_release_dma(master);
11651166 error:
1166
- clk_disable_unprepare(cclk);
1167
- clk_disable_unprepare(iclk);
11681167 spi_master_put(master);
11691168 return ret;
11701169 }
....@@ -1276,18 +1275,22 @@
12761275 struct spi_qup *controller = spi_master_get_devdata(master);
12771276 int ret;
12781277
1279
- ret = pm_runtime_resume_and_get(&pdev->dev);
1280
- if (ret < 0)
1281
- return ret;
1278
+ ret = pm_runtime_get_sync(&pdev->dev);
12821279
1283
- ret = spi_qup_set_state(controller, QUP_STATE_RESET);
1284
- if (ret)
1285
- return ret;
1280
+ if (ret >= 0) {
1281
+ ret = spi_qup_set_state(controller, QUP_STATE_RESET);
1282
+ if (ret)
1283
+ dev_warn(&pdev->dev, "failed to reset controller (%pe)\n",
1284
+ ERR_PTR(ret));
1285
+
1286
+ clk_disable_unprepare(controller->cclk);
1287
+ clk_disable_unprepare(controller->iclk);
1288
+ } else {
1289
+ dev_warn(&pdev->dev, "failed to resume, skip hw disable (%pe)\n",
1290
+ ERR_PTR(ret));
1291
+ }
12861292
12871293 spi_qup_release_dma(master);
1288
-
1289
- clk_disable_unprepare(controller->cclk);
1290
- clk_disable_unprepare(controller->iclk);
12911294
12921295 pm_runtime_put_noidle(&pdev->dev);
12931296 pm_runtime_disable(&pdev->dev);