| .. | .. |
|---|
| 1147 | 1147 | pm_runtime_set_autosuspend_delay(&pdev->dev, SPI_AUTOSUSPEND_TIMEOUT); |
|---|
| 1148 | 1148 | pm_runtime_set_active(&pdev->dev); |
|---|
| 1149 | 1149 | pm_runtime_enable(&pdev->dev); |
|---|
| 1150 | + |
|---|
| 1151 | + ret = pm_runtime_get_sync(&pdev->dev); |
|---|
| 1152 | + if (ret < 0) { |
|---|
| 1153 | + dev_err(&pdev->dev, "Failed to pm_runtime_get_sync: %d\n", ret); |
|---|
| 1154 | + goto clk_dis_all; |
|---|
| 1155 | + } |
|---|
| 1156 | + |
|---|
| 1150 | 1157 | /* QSPI controller initializations */ |
|---|
| 1151 | 1158 | zynqmp_qspi_init_hw(xqspi); |
|---|
| 1152 | 1159 | |
|---|
| 1153 | | - pm_runtime_mark_last_busy(&pdev->dev); |
|---|
| 1154 | | - pm_runtime_put_autosuspend(&pdev->dev); |
|---|
| 1155 | 1160 | xqspi->irq = platform_get_irq(pdev, 0); |
|---|
| 1156 | 1161 | if (xqspi->irq <= 0) { |
|---|
| 1157 | 1162 | ret = -ENXIO; |
|---|
| .. | .. |
|---|
| 1178 | 1183 | ctlr->mode_bits = SPI_CPOL | SPI_CPHA | SPI_RX_DUAL | SPI_RX_QUAD | |
|---|
| 1179 | 1184 | SPI_TX_DUAL | SPI_TX_QUAD; |
|---|
| 1180 | 1185 | ctlr->dev.of_node = np; |
|---|
| 1186 | + ctlr->auto_runtime_pm = true; |
|---|
| 1181 | 1187 | |
|---|
| 1182 | 1188 | ret = devm_spi_register_controller(&pdev->dev, ctlr); |
|---|
| 1183 | 1189 | if (ret) { |
|---|
| .. | .. |
|---|
| 1185 | 1191 | goto clk_dis_all; |
|---|
| 1186 | 1192 | } |
|---|
| 1187 | 1193 | |
|---|
| 1194 | + pm_runtime_mark_last_busy(&pdev->dev); |
|---|
| 1195 | + pm_runtime_put_autosuspend(&pdev->dev); |
|---|
| 1196 | + |
|---|
| 1188 | 1197 | return 0; |
|---|
| 1189 | 1198 | |
|---|
| 1190 | 1199 | clk_dis_all: |
|---|
| 1191 | | - pm_runtime_set_suspended(&pdev->dev); |
|---|
| 1192 | 1200 | pm_runtime_disable(&pdev->dev); |
|---|
| 1201 | + pm_runtime_put_noidle(&pdev->dev); |
|---|
| 1202 | + pm_runtime_set_suspended(&pdev->dev); |
|---|
| 1193 | 1203 | clk_disable_unprepare(xqspi->refclk); |
|---|
| 1194 | 1204 | clk_dis_pclk: |
|---|
| 1195 | 1205 | clk_disable_unprepare(xqspi->pclk); |
|---|
| .. | .. |
|---|
| 1213 | 1223 | { |
|---|
| 1214 | 1224 | struct zynqmp_qspi *xqspi = platform_get_drvdata(pdev); |
|---|
| 1215 | 1225 | |
|---|
| 1226 | + pm_runtime_get_sync(&pdev->dev); |
|---|
| 1227 | + |
|---|
| 1216 | 1228 | zynqmp_gqspi_write(xqspi, GQSPI_EN_OFST, 0x0); |
|---|
| 1229 | + |
|---|
| 1230 | + pm_runtime_disable(&pdev->dev); |
|---|
| 1231 | + pm_runtime_put_noidle(&pdev->dev); |
|---|
| 1232 | + pm_runtime_set_suspended(&pdev->dev); |
|---|
| 1217 | 1233 | clk_disable_unprepare(xqspi->refclk); |
|---|
| 1218 | 1234 | clk_disable_unprepare(xqspi->pclk); |
|---|
| 1219 | | - pm_runtime_set_suspended(&pdev->dev); |
|---|
| 1220 | | - pm_runtime_disable(&pdev->dev); |
|---|
| 1221 | 1235 | |
|---|
| 1222 | 1236 | return 0; |
|---|
| 1223 | 1237 | } |
|---|