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>
This commit is contained in:
parent
94cb0e7980
commit
20d897e45c
1 changed files with 19 additions and 13 deletions
|
@ -545,12 +545,15 @@ static int dcdbas_probe(struct platform_device *dev)
|
|||
host_control_action = HC_ACTION_NONE;
|
||||
host_control_smi_type = HC_SMITYPE_NONE;
|
||||
|
||||
dcdbas_pdev = dev;
|
||||
|
||||
/*
|
||||
* BIOS SMI calls require buffer addresses be in 32-bit address space.
|
||||
* This is done by setting the DMA mask below.
|
||||
*/
|
||||
dcdbas_pdev->dev.coherent_dma_mask = DMA_BIT_MASK(32);
|
||||
dcdbas_pdev->dev.dma_mask = &dcdbas_pdev->dev.coherent_dma_mask;
|
||||
error = dma_set_coherent_mask(&dcdbas_pdev->dev, DMA_BIT_MASK(32));
|
||||
if (error)
|
||||
return error;
|
||||
|
||||
error = sysfs_create_group(&dev->dev.kobj, &dcdbas_attr_group);
|
||||
if (error)
|
||||
|
@ -581,6 +584,14 @@ static struct platform_driver dcdbas_driver = {
|
|||
.remove = dcdbas_remove,
|
||||
};
|
||||
|
||||
static const struct platform_device_info dcdbas_dev_info __initdata = {
|
||||
.name = DRIVER_NAME,
|
||||
.id = -1,
|
||||
.dma_mask = DMA_BIT_MASK(32),
|
||||
};
|
||||
|
||||
static struct platform_device *dcdbas_pdev_reg;
|
||||
|
||||
/**
|
||||
* dcdbas_init: initialize driver
|
||||
*/
|
||||
|
@ -592,20 +603,14 @@ static int __init dcdbas_init(void)
|
|||
if (error)
|
||||
return error;
|
||||
|
||||
dcdbas_pdev = platform_device_alloc(DRIVER_NAME, -1);
|
||||
if (!dcdbas_pdev) {
|
||||
error = -ENOMEM;
|
||||
dcdbas_pdev_reg = platform_device_register_full(&dcdbas_dev_info);
|
||||
if (IS_ERR(dcdbas_pdev_reg)) {
|
||||
error = PTR_ERR(dcdbas_pdev_reg);
|
||||
goto err_unregister_driver;
|
||||
}
|
||||
|
||||
error = platform_device_add(dcdbas_pdev);
|
||||
if (error)
|
||||
goto err_free_device;
|
||||
|
||||
return 0;
|
||||
|
||||
err_free_device:
|
||||
platform_device_put(dcdbas_pdev);
|
||||
err_unregister_driver:
|
||||
platform_driver_unregister(&dcdbas_driver);
|
||||
return error;
|
||||
|
@ -628,8 +633,9 @@ static void __exit dcdbas_exit(void)
|
|||
* all sysfs attributes belonging to this module have been
|
||||
* released.
|
||||
*/
|
||||
smi_data_buf_free();
|
||||
platform_device_unregister(dcdbas_pdev);
|
||||
if (dcdbas_pdev)
|
||||
smi_data_buf_free();
|
||||
platform_device_unregister(dcdbas_pdev_reg);
|
||||
platform_driver_unregister(&dcdbas_driver);
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in a new issue