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