aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/spi/spi-nuc900.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/spi/spi-nuc900.c')
-rw-r--r--drivers/spi/spi-nuc900.c58
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
426err_register: 411err_register:
427 clk_disable(hw->clk); 412 clk_disable(hw->clk);
428 clk_put(hw->clk);
429err_clk:
430 free_irq(hw->irq, hw);
431err_irq:
432 iounmap(hw->regs);
433err_iomap:
434 release_mem_region(hw->res->start, resource_size(hw->res));
435 kfree(hw->ioarea);
436err_pdata: 413err_pdata:
437 spi_master_put(hw->master); 414 spi_master_put(hw->master);
438err_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}