diff options
Diffstat (limited to 'drivers/spi/spi-nuc900.c')
-rw-r--r-- | drivers/spi/spi-nuc900.c | 58 |
1 files changed, 12 insertions, 46 deletions
diff --git a/drivers/spi/spi-nuc900.c b/drivers/spi/spi-nuc900.c index e0c32bc69ee2..bae97ffec4b9 100644 --- a/drivers/spi/spi-nuc900.c +++ b/drivers/spi/spi-nuc900.c | |||
@@ -57,7 +57,6 @@ struct nuc900_spi { | |||
57 | const unsigned char *tx; | 57 | const unsigned char *tx; |
58 | unsigned char *rx; | 58 | unsigned char *rx; |
59 | struct clk *clk; | 59 | struct clk *clk; |
60 | struct resource *ioarea; | ||
61 | struct spi_master *master; | 60 | struct spi_master *master; |
62 | struct spi_device *curdev; | 61 | struct spi_device *curdev; |
63 | struct device *dev; | 62 | struct device *dev; |
@@ -344,8 +343,7 @@ static int nuc900_spi_probe(struct platform_device *pdev) | |||
344 | master = spi_alloc_master(&pdev->dev, sizeof(struct nuc900_spi)); | 343 | master = spi_alloc_master(&pdev->dev, sizeof(struct nuc900_spi)); |
345 | if (master == NULL) { | 344 | if (master == NULL) { |
346 | dev_err(&pdev->dev, "No memory for spi_master\n"); | 345 | dev_err(&pdev->dev, "No memory for spi_master\n"); |
347 | err = -ENOMEM; | 346 | return -ENOMEM; |
348 | goto err_nomem; | ||
349 | } | 347 | } |
350 | 348 | ||
351 | hw = spi_master_get_devdata(master); | 349 | hw = spi_master_get_devdata(master); |
@@ -363,6 +361,8 @@ static int nuc900_spi_probe(struct platform_device *pdev) | |||
363 | init_completion(&hw->done); | 361 | init_completion(&hw->done); |
364 | 362 | ||
365 | master->mode_bits = SPI_CPOL | SPI_CPHA | SPI_CS_HIGH; | 363 | master->mode_bits = SPI_CPOL | SPI_CPHA | SPI_CS_HIGH; |
364 | if (hw->pdata->lsb) | ||
365 | master->mode_bits |= SPI_LSB_FIRST; | ||
366 | master->num_chipselect = hw->pdata->num_cs; | 366 | master->num_chipselect = hw->pdata->num_cs; |
367 | master->bus_num = hw->pdata->bus_num; | 367 | master->bus_num = hw->pdata->bus_num; |
368 | hw->bitbang.master = hw->master; | 368 | hw->bitbang.master = hw->master; |
@@ -370,46 +370,31 @@ static int nuc900_spi_probe(struct platform_device *pdev) | |||
370 | hw->bitbang.txrx_bufs = nuc900_spi_txrx; | 370 | hw->bitbang.txrx_bufs = nuc900_spi_txrx; |
371 | 371 | ||
372 | hw->res = platform_get_resource(pdev, IORESOURCE_MEM, 0); | 372 | hw->res = platform_get_resource(pdev, IORESOURCE_MEM, 0); |
373 | if (hw->res == NULL) { | 373 | hw->regs = devm_ioremap_resource(&pdev->dev, hw->res); |
374 | dev_err(&pdev->dev, "Cannot get IORESOURCE_MEM\n"); | 374 | if (IS_ERR(hw->regs)) { |
375 | err = -ENOENT; | 375 | err = PTR_ERR(hw->regs); |
376 | goto err_pdata; | ||
377 | } | ||
378 | |||
379 | hw->ioarea = request_mem_region(hw->res->start, | ||
380 | resource_size(hw->res), pdev->name); | ||
381 | |||
382 | if (hw->ioarea == NULL) { | ||
383 | dev_err(&pdev->dev, "Cannot reserve region\n"); | ||
384 | err = -ENXIO; | ||
385 | goto err_pdata; | 376 | goto err_pdata; |
386 | } | 377 | } |
387 | 378 | ||
388 | hw->regs = ioremap(hw->res->start, resource_size(hw->res)); | ||
389 | if (hw->regs == NULL) { | ||
390 | dev_err(&pdev->dev, "Cannot map IO\n"); | ||
391 | err = -ENXIO; | ||
392 | goto err_iomap; | ||
393 | } | ||
394 | |||
395 | hw->irq = platform_get_irq(pdev, 0); | 379 | hw->irq = platform_get_irq(pdev, 0); |
396 | if (hw->irq < 0) { | 380 | if (hw->irq < 0) { |
397 | dev_err(&pdev->dev, "No IRQ specified\n"); | 381 | dev_err(&pdev->dev, "No IRQ specified\n"); |
398 | err = -ENOENT; | 382 | err = -ENOENT; |
399 | goto err_irq; | 383 | goto err_pdata; |
400 | } | 384 | } |
401 | 385 | ||
402 | err = request_irq(hw->irq, nuc900_spi_irq, 0, pdev->name, hw); | 386 | err = devm_request_irq(&pdev->dev, hw->irq, nuc900_spi_irq, 0, |
387 | pdev->name, hw); | ||
403 | if (err) { | 388 | if (err) { |
404 | dev_err(&pdev->dev, "Cannot claim IRQ\n"); | 389 | dev_err(&pdev->dev, "Cannot claim IRQ\n"); |
405 | goto err_irq; | 390 | goto err_pdata; |
406 | } | 391 | } |
407 | 392 | ||
408 | hw->clk = clk_get(&pdev->dev, "spi"); | 393 | hw->clk = devm_clk_get(&pdev->dev, "spi"); |
409 | if (IS_ERR(hw->clk)) { | 394 | if (IS_ERR(hw->clk)) { |
410 | dev_err(&pdev->dev, "No clock for device\n"); | 395 | dev_err(&pdev->dev, "No clock for device\n"); |
411 | err = PTR_ERR(hw->clk); | 396 | err = PTR_ERR(hw->clk); |
412 | goto err_clk; | 397 | goto err_pdata; |
413 | } | 398 | } |
414 | 399 | ||
415 | mfp_set_groupg(&pdev->dev, NULL); | 400 | mfp_set_groupg(&pdev->dev, NULL); |
@@ -425,17 +410,8 @@ static int nuc900_spi_probe(struct platform_device *pdev) | |||
425 | 410 | ||
426 | err_register: | 411 | err_register: |
427 | clk_disable(hw->clk); | 412 | clk_disable(hw->clk); |
428 | clk_put(hw->clk); | ||
429 | err_clk: | ||
430 | free_irq(hw->irq, hw); | ||
431 | err_irq: | ||
432 | iounmap(hw->regs); | ||
433 | err_iomap: | ||
434 | release_mem_region(hw->res->start, resource_size(hw->res)); | ||
435 | kfree(hw->ioarea); | ||
436 | err_pdata: | 413 | err_pdata: |
437 | spi_master_put(hw->master); | 414 | spi_master_put(hw->master); |
438 | err_nomem: | ||
439 | return err; | 415 | return err; |
440 | } | 416 | } |
441 | 417 | ||
@@ -443,18 +419,8 @@ static int nuc900_spi_remove(struct platform_device *dev) | |||
443 | { | 419 | { |
444 | struct nuc900_spi *hw = platform_get_drvdata(dev); | 420 | struct nuc900_spi *hw = platform_get_drvdata(dev); |
445 | 421 | ||
446 | free_irq(hw->irq, hw); | ||
447 | |||
448 | spi_bitbang_stop(&hw->bitbang); | 422 | spi_bitbang_stop(&hw->bitbang); |
449 | |||
450 | clk_disable(hw->clk); | 423 | clk_disable(hw->clk); |
451 | clk_put(hw->clk); | ||
452 | |||
453 | iounmap(hw->regs); | ||
454 | |||
455 | release_mem_region(hw->res->start, resource_size(hw->res)); | ||
456 | kfree(hw->ioarea); | ||
457 | |||
458 | spi_master_put(hw->master); | 424 | spi_master_put(hw->master); |
459 | return 0; | 425 | return 0; |
460 | } | 426 | } |