diff options
author | Julien Boibessot <julien.boibessot@free.fr> | 2008-12-01 16:13:55 -0500 |
---|---|---|
committer | Linus Torvalds <torvalds@linux-foundation.org> | 2008-12-01 22:55:24 -0500 |
commit | 6a010b56e9bd2fdb32efd153e1a08305949b6b53 (patch) | |
tree | e4caf907a10b497f0040255a8b3ece28c0dc2b27 /drivers/spi/spi_imx.c | |
parent | 7ef9964e6d1b911b78709f144000aacadd0ebc21 (diff) |
spi: fix spi_imx probe oopsing
Corrects spi_imx driver oops during initialization/probing: can't use
drv_data before it's allocated.
Signed-off-by: Julien Boibessot <julien.boibessot@armadeus.com>
Acked-by: Sascha Hauer <s.hauer@pengutronix.de>
Signed-off-by: David Brownell <dbrownell@users.sourceforge.net>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
Diffstat (limited to 'drivers/spi/spi_imx.c')
-rw-r--r-- | drivers/spi/spi_imx.c | 25 |
1 files changed, 13 insertions, 12 deletions
diff --git a/drivers/spi/spi_imx.c b/drivers/spi/spi_imx.c index 0b4db0ce78d6..269a55ec52ef 100644 --- a/drivers/spi/spi_imx.c +++ b/drivers/spi/spi_imx.c | |||
@@ -1456,7 +1456,7 @@ static int __init spi_imx_probe(struct platform_device *pdev) | |||
1456 | struct device *dev = &pdev->dev; | 1456 | struct device *dev = &pdev->dev; |
1457 | struct spi_imx_master *platform_info; | 1457 | struct spi_imx_master *platform_info; |
1458 | struct spi_master *master; | 1458 | struct spi_master *master; |
1459 | struct driver_data *drv_data = NULL; | 1459 | struct driver_data *drv_data; |
1460 | struct resource *res; | 1460 | struct resource *res; |
1461 | int irq, status = 0; | 1461 | int irq, status = 0; |
1462 | 1462 | ||
@@ -1467,14 +1467,6 @@ static int __init spi_imx_probe(struct platform_device *pdev) | |||
1467 | goto err_no_pdata; | 1467 | goto err_no_pdata; |
1468 | } | 1468 | } |
1469 | 1469 | ||
1470 | drv_data->clk = clk_get(&pdev->dev, "perclk2"); | ||
1471 | if (IS_ERR(drv_data->clk)) { | ||
1472 | dev_err(&pdev->dev, "probe - cannot get get\n"); | ||
1473 | status = PTR_ERR(drv_data->clk); | ||
1474 | goto err_no_clk; | ||
1475 | } | ||
1476 | clk_enable(drv_data->clk); | ||
1477 | |||
1478 | /* Allocate master with space for drv_data */ | 1470 | /* Allocate master with space for drv_data */ |
1479 | master = spi_alloc_master(dev, sizeof(struct driver_data)); | 1471 | master = spi_alloc_master(dev, sizeof(struct driver_data)); |
1480 | if (!master) { | 1472 | if (!master) { |
@@ -1495,6 +1487,14 @@ static int __init spi_imx_probe(struct platform_device *pdev) | |||
1495 | 1487 | ||
1496 | drv_data->dummy_dma_buf = SPI_DUMMY_u32; | 1488 | drv_data->dummy_dma_buf = SPI_DUMMY_u32; |
1497 | 1489 | ||
1490 | drv_data->clk = clk_get(&pdev->dev, "perclk2"); | ||
1491 | if (IS_ERR(drv_data->clk)) { | ||
1492 | dev_err(&pdev->dev, "probe - cannot get clock\n"); | ||
1493 | status = PTR_ERR(drv_data->clk); | ||
1494 | goto err_no_clk; | ||
1495 | } | ||
1496 | clk_enable(drv_data->clk); | ||
1497 | |||
1498 | /* Find and map resources */ | 1498 | /* Find and map resources */ |
1499 | res = platform_get_resource(pdev, IORESOURCE_MEM, 0); | 1499 | res = platform_get_resource(pdev, IORESOURCE_MEM, 0); |
1500 | if (!res) { | 1500 | if (!res) { |
@@ -1630,12 +1630,13 @@ err_no_iomap: | |||
1630 | kfree(drv_data->ioarea); | 1630 | kfree(drv_data->ioarea); |
1631 | 1631 | ||
1632 | err_no_iores: | 1632 | err_no_iores: |
1633 | spi_master_put(master); | ||
1634 | |||
1635 | err_no_pdata: | ||
1636 | clk_disable(drv_data->clk); | 1633 | clk_disable(drv_data->clk); |
1637 | clk_put(drv_data->clk); | 1634 | clk_put(drv_data->clk); |
1635 | |||
1638 | err_no_clk: | 1636 | err_no_clk: |
1637 | spi_master_put(master); | ||
1638 | |||
1639 | err_no_pdata: | ||
1639 | err_no_mem: | 1640 | err_no_mem: |
1640 | return status; | 1641 | return status; |
1641 | } | 1642 | } |