aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/firmware
diff options
context:
space:
mode:
authorRussell King <rmk+kernel@arm.linux.org.uk>2013-06-27 09:14:43 -0400
committerRussell King <rmk+kernel@arm.linux.org.uk>2013-10-31 10:49:16 -0400
commit20d897e45c7d84c31c89d37839ab4453d000a004 (patch)
tree983062b977d965a29bab4e6862e1002622184791 /drivers/firmware
parent94cb0e7980e27b0a303074568de76080de06a693 (diff)
DMA-API: dcdbas: update DMA mask handing
dcdbas was explicitly initializing DMA masks thusly: dcdbas_pdev->dev.coherent_dma_mask = DMA_BIT_MASK(32); dcdbas_pdev->dev.dma_mask = &dcdbas_pdev->dev.coherent_dma_mask; which bypasses the architecture check. Moreover, it is creating the dcdbas_pdev device itself, and using the platform_device_register_full() avoids some of this explicit initialization. Convert the driver to use platform_device_register_full(), and as it makes use of coherent DMA, also call dma_set_coherent_mask() to ensure that the architecture gets to check the mask. Tested-by: Fengguang Wu <fengguang.wu@intel.com> Signed-off-by: Russell King <rmk+kernel@arm.linux.org.uk>
Diffstat (limited to 'drivers/firmware')
-rw-r--r--drivers/firmware/dcdbas.c32
1 files changed, 19 insertions, 13 deletions
diff --git a/drivers/firmware/dcdbas.c b/drivers/firmware/dcdbas.c
index ff080ee20197..1b5e8e46226d 100644
--- a/drivers/firmware/dcdbas.c
+++ b/drivers/firmware/dcdbas.c
@@ -545,12 +545,15 @@ static int dcdbas_probe(struct platform_device *dev)
545 host_control_action = HC_ACTION_NONE; 545 host_control_action = HC_ACTION_NONE;
546 host_control_smi_type = HC_SMITYPE_NONE; 546 host_control_smi_type = HC_SMITYPE_NONE;
547 547
548 dcdbas_pdev = dev;
549
548 /* 550 /*
549 * BIOS SMI calls require buffer addresses be in 32-bit address space. 551 * BIOS SMI calls require buffer addresses be in 32-bit address space.
550 * This is done by setting the DMA mask below. 552 * This is done by setting the DMA mask below.
551 */ 553 */
552 dcdbas_pdev->dev.coherent_dma_mask = DMA_BIT_MASK(32); 554 error = dma_set_coherent_mask(&dcdbas_pdev->dev, DMA_BIT_MASK(32));
553 dcdbas_pdev->dev.dma_mask = &dcdbas_pdev->dev.coherent_dma_mask; 555 if (error)
556 return error;
554 557
555 error = sysfs_create_group(&dev->dev.kobj, &dcdbas_attr_group); 558 error = sysfs_create_group(&dev->dev.kobj, &dcdbas_attr_group);
556 if (error) 559 if (error)
@@ -581,6 +584,14 @@ static struct platform_driver dcdbas_driver = {
581 .remove = dcdbas_remove, 584 .remove = dcdbas_remove,
582}; 585};
583 586
587static const struct platform_device_info dcdbas_dev_info __initdata = {
588 .name = DRIVER_NAME,
589 .id = -1,
590 .dma_mask = DMA_BIT_MASK(32),
591};
592
593static struct platform_device *dcdbas_pdev_reg;
594
584/** 595/**
585 * dcdbas_init: initialize driver 596 * dcdbas_init: initialize driver
586 */ 597 */
@@ -592,20 +603,14 @@ static int __init dcdbas_init(void)
592 if (error) 603 if (error)
593 return error; 604 return error;
594 605
595 dcdbas_pdev = platform_device_alloc(DRIVER_NAME, -1); 606 dcdbas_pdev_reg = platform_device_register_full(&dcdbas_dev_info);
596 if (!dcdbas_pdev) { 607 if (IS_ERR(dcdbas_pdev_reg)) {
597 error = -ENOMEM; 608 error = PTR_ERR(dcdbas_pdev_reg);
598 goto err_unregister_driver; 609 goto err_unregister_driver;
599 } 610 }
600 611
601 error = platform_device_add(dcdbas_pdev);
602 if (error)
603 goto err_free_device;
604
605 return 0; 612 return 0;
606 613
607 err_free_device:
608 platform_device_put(dcdbas_pdev);
609 err_unregister_driver: 614 err_unregister_driver:
610 platform_driver_unregister(&dcdbas_driver); 615 platform_driver_unregister(&dcdbas_driver);
611 return error; 616 return error;
@@ -628,8 +633,9 @@ static void __exit dcdbas_exit(void)
628 * all sysfs attributes belonging to this module have been 633 * all sysfs attributes belonging to this module have been
629 * released. 634 * released.
630 */ 635 */
631 smi_data_buf_free(); 636 if (dcdbas_pdev)
632 platform_device_unregister(dcdbas_pdev); 637 smi_data_buf_free();
638 platform_device_unregister(dcdbas_pdev_reg);
633 platform_driver_unregister(&dcdbas_driver); 639 platform_driver_unregister(&dcdbas_driver);
634} 640}
635 641