Source
1056
1056
ret = -ENODEV;
1057
1057
goto exit_free_master;
1058
1058
}
1059
1059
tspi->phys = r->start;
1060
1060
tspi->base = devm_ioremap_resource(&pdev->dev, r);
1061
1061
if (IS_ERR(tspi->base)) {
1062
1062
ret = PTR_ERR(tspi->base);
1063
1063
goto exit_free_master;
1064
1064
}
1065
1065
1066
+
/* disabled clock may cause interrupt storm upon request */
1067
+
tspi->clk = devm_clk_get(&pdev->dev, NULL);
1068
+
if (IS_ERR(tspi->clk)) {
1069
+
ret = PTR_ERR(tspi->clk);
1070
+
dev_err(&pdev->dev, "Can not get clock %d\n", ret);
1071
+
goto exit_free_master;
1072
+
}
1073
+
ret = clk_prepare(tspi->clk);
1074
+
if (ret < 0) {
1075
+
dev_err(&pdev->dev, "Clock prepare failed %d\n", ret);
1076
+
goto exit_free_master;
1077
+
}
1078
+
ret = clk_enable(tspi->clk);
1079
+
if (ret < 0) {
1080
+
dev_err(&pdev->dev, "Clock enable failed %d\n", ret);
1081
+
goto exit_free_master;
1082
+
}
1083
+
1066
1084
spi_irq = platform_get_irq(pdev, 0);
1067
1085
tspi->irq = spi_irq;
1068
1086
ret = request_threaded_irq(tspi->irq, tegra_slink_isr,
1069
1087
tegra_slink_isr_thread, IRQF_ONESHOT,
1070
1088
dev_name(&pdev->dev), tspi);
1071
1089
if (ret < 0) {
1072
1090
dev_err(&pdev->dev, "Failed to register ISR for IRQ %d\n",
1073
1091
tspi->irq);
1074
-
goto exit_free_master;
1075
-
}
1076
-
1077
-
tspi->clk = devm_clk_get(&pdev->dev, NULL);
1078
-
if (IS_ERR(tspi->clk)) {
1079
-
dev_err(&pdev->dev, "can not get clock\n");
1080
-
ret = PTR_ERR(tspi->clk);
1081
-
goto exit_free_irq;
1092
+
goto exit_clk_disable;
1082
1093
}
1083
1094
1084
1095
tspi->rst = devm_reset_control_get_exclusive(&pdev->dev, "spi");
1085
1096
if (IS_ERR(tspi->rst)) {
1086
1097
dev_err(&pdev->dev, "can not get reset\n");
1087
1098
ret = PTR_ERR(tspi->rst);
1088
1099
goto exit_free_irq;
1089
1100
}
1090
1101
1091
1102
tspi->max_buf_size = SLINK_FIFO_DEPTH << 2;
1131
1142
1132
1143
exit_pm_disable:
1133
1144
pm_runtime_disable(&pdev->dev);
1134
1145
if (!pm_runtime_status_suspended(&pdev->dev))
1135
1146
tegra_slink_runtime_suspend(&pdev->dev);
1136
1147
tegra_slink_deinit_dma_param(tspi, false);
1137
1148
exit_rx_dma_free:
1138
1149
tegra_slink_deinit_dma_param(tspi, true);
1139
1150
exit_free_irq:
1140
1151
free_irq(spi_irq, tspi);
1152
+
exit_clk_disable:
1153
+
clk_disable(tspi->clk);
1141
1154
exit_free_master:
1142
1155
spi_master_put(master);
1143
1156
return ret;
1144
1157
}
1145
1158
1146
1159
static int tegra_slink_remove(struct platform_device *pdev)
1147
1160
{
1148
1161
struct spi_master *master = platform_get_drvdata(pdev);
1149
1162
struct tegra_slink_data *tspi = spi_master_get_devdata(master);
1150
1163
1151
1164
free_irq(tspi->irq, tspi);
1152
1165
1166
+
clk_disable(tspi->clk);
1167
+
1153
1168
if (tspi->tx_dma_chan)
1154
1169
tegra_slink_deinit_dma_param(tspi, false);
1155
1170
1156
1171
if (tspi->rx_dma_chan)
1157
1172
tegra_slink_deinit_dma_param(tspi, true);
1158
1173
1159
1174
pm_runtime_disable(&pdev->dev);
1160
1175
if (!pm_runtime_status_suspended(&pdev->dev))
1161
1176
tegra_slink_runtime_suspend(&pdev->dev);
1162
1177