diff options
author | Russell King <rmk+kernel@arm.linux.org.uk> | 2013-06-27 09:14:43 -0400 |
---|---|---|
committer | Russell King <rmk+kernel@arm.linux.org.uk> | 2013-10-31 10:49:16 -0400 |
commit | 20d897e45c7d84c31c89d37839ab4453d000a004 (patch) | |
tree | 983062b977d965a29bab4e6862e1002622184791 /drivers/firmware | |
parent | 94cb0e7980e27b0a303074568de76080de06a693 (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.c | 32 |
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 | ||
587 | static 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 | |||
593 | static 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 | ||