aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMark Brown <broonie@linaro.org>2014-05-01 13:47:52 -0400
committerMark Brown <broonie@linaro.org>2014-05-03 12:58:19 -0400
commitc3676d5ceff213cba35af5ee5f320d2e8dc48cdf (patch)
treed126ddf1fbde696d5f412cafcfcb9b17723e320f
parent2de440f59ca9615c92820d165d5e59756e54026b (diff)
spi: core: Don't destroy master queue if we fail to create it
If we fail to create the master queue for some reason we should not attempt to clean it up since attempting to stop a kthread that was not created will hang and it's just generally bad practice. Unfortunately at present we call spi_destroy_queue() even in cases where the creation fails. Fix this by fixing the error handling in spi_master_initialize_queue() so that we only flag the master as queued or destroy the queue if creation succeeded. The change to the flag is done since the general master cleanup uses this to destroy the queue. Reported-by: Ricardo Ribalda Delgado <ricardo.ribalda@gmail.com> Signed-off-by: Mark Brown <broonie@linaro.org> Acked-by: Geert Uytterhoeven <geert@linux-m68k.org>
-rw-r--r--drivers/spi/spi.c4
1 files changed, 2 insertions, 2 deletions
diff --git a/drivers/spi/spi.c b/drivers/spi/spi.c
index 6046dcd7487e..939edf473235 100644
--- a/drivers/spi/spi.c
+++ b/drivers/spi/spi.c
@@ -1172,7 +1172,6 @@ static int spi_master_initialize_queue(struct spi_master *master)
1172{ 1172{
1173 int ret; 1173 int ret;
1174 1174
1175 master->queued = true;
1176 master->transfer = spi_queued_transfer; 1175 master->transfer = spi_queued_transfer;
1177 if (!master->transfer_one_message) 1176 if (!master->transfer_one_message)
1178 master->transfer_one_message = spi_transfer_one_message; 1177 master->transfer_one_message = spi_transfer_one_message;
@@ -1183,6 +1182,7 @@ static int spi_master_initialize_queue(struct spi_master *master)
1183 dev_err(&master->dev, "problem initializing queue\n"); 1182 dev_err(&master->dev, "problem initializing queue\n");
1184 goto err_init_queue; 1183 goto err_init_queue;
1185 } 1184 }
1185 master->queued = true;
1186 ret = spi_start_queue(master); 1186 ret = spi_start_queue(master);
1187 if (ret) { 1187 if (ret) {
1188 dev_err(&master->dev, "problem starting queue\n"); 1188 dev_err(&master->dev, "problem starting queue\n");
@@ -1192,8 +1192,8 @@ static int spi_master_initialize_queue(struct spi_master *master)
1192 return 0; 1192 return 0;
1193 1193
1194err_start_queue: 1194err_start_queue:
1195err_init_queue:
1196 spi_destroy_queue(master); 1195 spi_destroy_queue(master);
1196err_init_queue:
1197 return ret; 1197 return ret;
1198} 1198}
1199 1199