aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/spi/spi-xilinx.c
diff options
context:
space:
mode:
authorMark Brown <broonie@linaro.org>2013-07-03 07:05:42 -0400
committerMark Brown <broonie@linaro.org>2013-07-15 06:45:52 -0400
commitd81c0bbbf84086568b559bee59e4a93aba4a6e0f (patch)
tree989cb1340f03b5430af07ae1bea37703100c42ae /drivers/spi/spi-xilinx.c
parentc40537d008ab1b4fe2f12641cca1462de10a95f7 (diff)
spi/xilinx: Remove remains of of_platform device registration
In the past there used to be a separate platform device type for device tree systems so the probe and removal functions were split into generic and bus sections. Since this is no longer the case simplify the code (and remove some unprototyped exports) by factoring everything into the bus probe() and remove(). Signed-off-by: Mark Brown <broonie@linaro.org>
Diffstat (limited to 'drivers/spi/spi-xilinx.c')
-rw-r--r--drivers/spi/spi-xilinx.c145
1 files changed, 63 insertions, 82 deletions
diff --git a/drivers/spi/spi-xilinx.c b/drivers/spi/spi-xilinx.c
index ad48710b2859..038e59a8bf0a 100644
--- a/drivers/spi/spi-xilinx.c
+++ b/drivers/spi/spi-xilinx.c
@@ -340,17 +340,51 @@ static const struct of_device_id xilinx_spi_of_match[] = {
340}; 340};
341MODULE_DEVICE_TABLE(of, xilinx_spi_of_match); 341MODULE_DEVICE_TABLE(of, xilinx_spi_of_match);
342 342
343struct spi_master *xilinx_spi_init(struct device *dev, struct resource *mem, 343static int xilinx_spi_probe(struct platform_device *dev)
344 u32 irq, s16 bus_num, int num_cs, int bits_per_word)
345{ 344{
346 struct spi_master *master;
347 struct xilinx_spi *xspi; 345 struct xilinx_spi *xspi;
348 int ret; 346 struct xspi_platform_data *pdata;
347 struct resource *r;
348 int ret, irq, num_cs = 0, bits_per_word = 8;
349 struct spi_master *master;
349 u32 tmp; 350 u32 tmp;
351 u8 i;
352
353 pdata = dev->dev.platform_data;
354 if (pdata) {
355 num_cs = pdata->num_chipselect;
356 bits_per_word = pdata->bits_per_word;
357 }
358
359#ifdef CONFIG_OF
360 if (dev->dev.of_node) {
361 const __be32 *prop;
362 int len;
363
364 /* number of slave select bits is required */
365 prop = of_get_property(dev->dev.of_node, "xlnx,num-ss-bits",
366 &len);
367 if (prop && len >= sizeof(*prop))
368 num_cs = __be32_to_cpup(prop);
369 }
370#endif
350 371
351 master = spi_alloc_master(dev, sizeof(struct xilinx_spi)); 372 if (!num_cs) {
373 dev_err(&dev->dev, "Missing slave select configuration data\n");
374 return -EINVAL;
375 }
376
377 r = platform_get_resource(dev, IORESOURCE_MEM, 0);
378 if (!r)
379 return -ENODEV;
380
381 irq = platform_get_irq(dev, 0);
382 if (irq < 0)
383 return -ENXIO;
384
385 master = spi_alloc_master(&dev->dev, sizeof(struct xilinx_spi));
352 if (!master) 386 if (!master)
353 return NULL; 387 return -ENODEV;
354 388
355 /* the spi->mode bits understood by this driver: */ 389 /* the spi->mode bits understood by this driver: */
356 master->mode_bits = SPI_CPOL | SPI_CPHA; 390 master->mode_bits = SPI_CPOL | SPI_CPHA;
@@ -362,17 +396,17 @@ struct spi_master *xilinx_spi_init(struct device *dev, struct resource *mem,
362 xspi->bitbang.txrx_bufs = xilinx_spi_txrx_bufs; 396 xspi->bitbang.txrx_bufs = xilinx_spi_txrx_bufs;
363 init_completion(&xspi->done); 397 init_completion(&xspi->done);
364 398
365 xspi->regs = devm_ioremap_resource(dev, mem); 399 xspi->regs = devm_ioremap_resource(&dev->dev, r);
366 if (IS_ERR(xspi->regs)) { 400 if (IS_ERR(xspi->regs)) {
367 ret = PTR_ERR(xspi->regs); 401 ret = PTR_ERR(xspi->regs);
368 goto put_master; 402 goto put_master;
369 } 403 }
370 404
371 master->bus_num = bus_num; 405 master->bus_num = dev->dev.id;
372 master->num_chipselect = num_cs; 406 master->num_chipselect = num_cs;
373 master->dev.of_node = dev->of_node; 407 master->dev.of_node = dev->dev.of_node;
374 408
375 xspi->mem = *mem; 409 xspi->mem = *r;
376 xspi->irq = irq; 410 xspi->irq = irq;
377 411
378 /* 412 /*
@@ -403,8 +437,10 @@ struct spi_master *xilinx_spi_init(struct device *dev, struct resource *mem,
403 } else if (xspi->bits_per_word == 32) { 437 } else if (xspi->bits_per_word == 32) {
404 xspi->tx_fn = xspi_tx32; 438 xspi->tx_fn = xspi_tx32;
405 xspi->rx_fn = xspi_rx32; 439 xspi->rx_fn = xspi_rx32;
406 } else 440 } else {
441 ret = -EINVAL;
407 goto put_master; 442 goto put_master;
443 }
408 444
409 445
410 /* SPI controller initializations */ 446 /* SPI controller initializations */
@@ -417,93 +453,38 @@ struct spi_master *xilinx_spi_init(struct device *dev, struct resource *mem,
417 453
418 ret = spi_bitbang_start(&xspi->bitbang); 454 ret = spi_bitbang_start(&xspi->bitbang);
419 if (ret) { 455 if (ret) {
420 dev_err(dev, "spi_bitbang_start FAILED\n"); 456 dev_err(&dev->dev, "spi_bitbang_start FAILED\n");
421 goto free_irq; 457 goto free_irq;
422 } 458 }
423 459
424 dev_info(dev, "at 0x%08llX mapped to 0x%p, irq=%d\n", 460 dev_info(&dev->dev, "at 0x%08llX mapped to 0x%p, irq=%d\n",
425 (unsigned long long)mem->start, xspi->regs, xspi->irq); 461 (unsigned long long)r->start, xspi->regs, xspi->irq);
426 return master; 462
463 if (pdata) {
464 for (i = 0; i < pdata->num_devices; i++)
465 spi_new_device(master, pdata->devices + i);
466 }
467
468 platform_set_drvdata(dev, master);
469 return 0;
427 470
428free_irq: 471free_irq:
429 free_irq(xspi->irq, xspi); 472 free_irq(xspi->irq, xspi);
430put_master: 473put_master:
431 spi_master_put(master); 474 spi_master_put(master);
432 return NULL; 475
476 return ret;
433} 477}
434EXPORT_SYMBOL(xilinx_spi_init);
435 478
436void xilinx_spi_deinit(struct spi_master *master) 479static int xilinx_spi_remove(struct platform_device *dev)
437{ 480{
438 struct xilinx_spi *xspi; 481 struct spi_master *master = platform_get_drvdata(dev);
439 482 struct xilinx_spi *xspi = spi_master_get_devdata(master);
440 xspi = spi_master_get_devdata(master);
441 483
442 spi_bitbang_stop(&xspi->bitbang); 484 spi_bitbang_stop(&xspi->bitbang);
443 free_irq(xspi->irq, xspi); 485 free_irq(xspi->irq, xspi);
444 486
445 spi_master_put(xspi->bitbang.master); 487 spi_master_put(xspi->bitbang.master);
446}
447EXPORT_SYMBOL(xilinx_spi_deinit);
448
449static int xilinx_spi_probe(struct platform_device *dev)
450{
451 struct xspi_platform_data *pdata;
452 struct resource *r;
453 int irq, num_cs = 0, bits_per_word = 8;
454 struct spi_master *master;
455 u8 i;
456
457 pdata = dev->dev.platform_data;
458 if (pdata) {
459 num_cs = pdata->num_chipselect;
460 bits_per_word = pdata->bits_per_word;
461 }
462
463#ifdef CONFIG_OF
464 if (dev->dev.of_node) {
465 const __be32 *prop;
466 int len;
467
468 /* number of slave select bits is required */
469 prop = of_get_property(dev->dev.of_node, "xlnx,num-ss-bits",
470 &len);
471 if (prop && len >= sizeof(*prop))
472 num_cs = __be32_to_cpup(prop);
473 }
474#endif
475
476 if (!num_cs) {
477 dev_err(&dev->dev, "Missing slave select configuration data\n");
478 return -EINVAL;
479 }
480
481
482 r = platform_get_resource(dev, IORESOURCE_MEM, 0);
483 if (!r)
484 return -ENODEV;
485
486 irq = platform_get_irq(dev, 0);
487 if (irq < 0)
488 return -ENXIO;
489
490 master = xilinx_spi_init(&dev->dev, r, irq, dev->id, num_cs,
491 bits_per_word);
492 if (!master)
493 return -ENODEV;
494
495 if (pdata) {
496 for (i = 0; i < pdata->num_devices; i++)
497 spi_new_device(master, pdata->devices + i);
498 }
499
500 platform_set_drvdata(dev, master);
501 return 0;
502}
503
504static int xilinx_spi_remove(struct platform_device *dev)
505{
506 xilinx_spi_deinit(platform_get_drvdata(dev));
507 488
508 return 0; 489 return 0;
509} 490}