summaryrefslogtreecommitdiff
path: root/drivers/spi/spi-tegra.c
diff options
context:
space:
mode:
authorLaxman Dewangan <ldewangan@nvidia.com>2012-07-25 13:52:03 +0530
committerLokesh Pathak <lpathak@nvidia.com>2012-07-30 08:43:31 -0700
commit9bde470e06fc9b2899c70a905a9ad0b3d7b1b218 (patch)
treec4fcf524c8d46eb83d753770bedfd9507a8d2410 /drivers/spi/spi-tegra.c
parenta8fccaec15ed648acd510f05534653fae6b4caa0 (diff)
spi: tegra: create workqueue before register spi master
Create all resource require for spi transfer before registering spi master as the spi communication is possible during the registration. bug 1023003 Change-Id: I1f77385866f358effeffb89c6af53a6a2f1c8738 Signed-off-by: Laxman Dewangan <ldewangan@nvidia.com> Reviewed-on: http://git-master/r/118267
Diffstat (limited to 'drivers/spi/spi-tegra.c')
-rw-r--r--drivers/spi/spi-tegra.c24
1 files changed, 12 insertions, 12 deletions
diff --git a/drivers/spi/spi-tegra.c b/drivers/spi/spi-tegra.c
index cf1b7bf40c62..836b95e2d281 100644
--- a/drivers/spi/spi-tegra.c
+++ b/drivers/spi/spi-tegra.c
@@ -1492,33 +1492,33 @@ skip_dma_alloc:
if (tspi->is_clkon_always)
spi_pm_runtime_get_sync(&pdev->dev);
- master->dev.of_node = pdev->dev.of_node;
- ret = spi_register_master(master);
- if (ret < 0) {
- dev_err(&pdev->dev, "can not register to master err %d\n", ret);
- goto exit_pm_suspend;
- }
-
- /* create the workqueue for the kbc path */
+ /* create the workqueue for the spi transfer */
snprintf(spi_wq_name, sizeof(spi_wq_name), "spi_tegra-%d", pdev->id);
tspi->spi_workqueue = create_singlethread_workqueue(spi_wq_name);
if (!tspi->spi_workqueue) {
dev_err(&pdev->dev, "Failed to create work queue\n");
ret = -ENODEV;
- goto exit_master_unregister;
+ goto exit_fail_wq;
}
INIT_WORK(&tspi->spi_transfer_work, tegra_spi_transfer_work);
+ master->dev.of_node = pdev->dev.of_node;
+ ret = spi_register_master(master);
+ if (ret < 0) {
+ dev_err(&pdev->dev, "can not register to master err %d\n", ret);
+ goto exit_destry_wq;
+ }
+
return ret;
-exit_master_unregister:
- spi_unregister_master(master);
+exit_destry_wq:
+ destroy_workqueue(tspi->spi_workqueue);
+exit_fail_wq:
if (tspi->is_clkon_always)
spi_pm_runtime_put_sync(&pdev->dev);
-exit_pm_suspend:
if (!spi_pm_runtime_status_suspended(&pdev->dev))
tegra_spi_runtime_idle(&pdev->dev);