| From 8c9f57ca885a9d7f3d77664b9285bd2284ecd0f8 Mon Sep 17 00:00:00 2001 |
| From: Sasha Levin <sashal@kernel.org> |
| Date: Fri, 12 Jul 2019 11:24:09 +0200 |
| Subject: mic: avoid statically declaring a 'struct device'. |
| |
| From: Arnd Bergmann <arnd@arndb.de> |
| |
| [ Upstream commit bc83f79bd2119230888fb8574639d5a51b38f903 ] |
| |
| Generally, declaring a platform device as a static variable is |
| a bad idea and can cause all kinds of problems, in particular |
| with the DMA configuration and lifetime rules. |
| |
| A specific problem we hit here is from a bug in clang that warns |
| about certain (otherwise valid) macros when used in static variables: |
| |
| drivers/misc/mic/card/mic_x100.c:285:27: warning: shift count >= width of type [-Wshift-count-overflow] |
| static u64 mic_dma_mask = DMA_BIT_MASK(64); |
| ^~~~~~~~~~~~~~~~ |
| include/linux/dma-mapping.h:141:54: note: expanded from macro 'DMA_BIT_MASK' |
| #define DMA_BIT_MASK(n) (((n) == 64) ? ~0ULL : ((1ULL<<(n))-1)) |
| ^ ~~~ |
| |
| A slightly better way here is to create the platform device dynamically |
| and set the dma mask in the probe function. |
| This avoids the warning and some other problems, but is still not ideal |
| because the device creation should really be separated from the driver, |
| and the fact that the device has no parent means we have to force |
| the dma mask rather than having it set up from the bus that the device |
| is actually on. |
| |
| Fixes: dd8d8d44df64 ("misc: mic: MIC card driver specific changes to enable SCIF") |
| Signed-off-by: Arnd Bergmann <arnd@arndb.de> |
| Link: https://lore.kernel.org/r/20190712092426.872625-1-arnd@arndb.de |
| Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| Signed-off-by: Sasha Levin <sashal@kernel.org> |
| --- |
| drivers/misc/mic/card/mic_x100.c | 28 ++++++++++++---------------- |
| 1 file changed, 12 insertions(+), 16 deletions(-) |
| |
| diff --git a/drivers/misc/mic/card/mic_x100.c b/drivers/misc/mic/card/mic_x100.c |
| index b9f0710ffa6b0..4007adc666f37 100644 |
| --- a/drivers/misc/mic/card/mic_x100.c |
| +++ b/drivers/misc/mic/card/mic_x100.c |
| @@ -249,6 +249,9 @@ static int __init mic_probe(struct platform_device *pdev) |
| mdrv->dev = &pdev->dev; |
| snprintf(mdrv->name, sizeof(mic_driver_name), mic_driver_name); |
| |
| + /* FIXME: use dma_set_mask_and_coherent() and check result */ |
| + dma_coerce_mask_and_coherent(&pdev->dev, DMA_BIT_MASK(64)); |
| + |
| mdev->mmio.pa = MIC_X100_MMIO_BASE; |
| mdev->mmio.len = MIC_X100_MMIO_LEN; |
| mdev->mmio.va = devm_ioremap(&pdev->dev, MIC_X100_MMIO_BASE, |
| @@ -294,18 +297,6 @@ static void mic_platform_shutdown(struct platform_device *pdev) |
| mic_remove(pdev); |
| } |
| |
| -static u64 mic_dma_mask = DMA_BIT_MASK(64); |
| - |
| -static struct platform_device mic_platform_dev = { |
| - .name = mic_driver_name, |
| - .id = 0, |
| - .num_resources = 0, |
| - .dev = { |
| - .dma_mask = &mic_dma_mask, |
| - .coherent_dma_mask = DMA_BIT_MASK(64), |
| - }, |
| -}; |
| - |
| static struct platform_driver __refdata mic_platform_driver = { |
| .probe = mic_probe, |
| .remove = mic_remove, |
| @@ -315,6 +306,8 @@ static struct platform_driver __refdata mic_platform_driver = { |
| }, |
| }; |
| |
| +static struct platform_device *mic_platform_dev; |
| + |
| static int __init mic_init(void) |
| { |
| int ret; |
| @@ -328,9 +321,12 @@ static int __init mic_init(void) |
| |
| request_module("mic_x100_dma"); |
| mic_init_card_debugfs(); |
| - ret = platform_device_register(&mic_platform_dev); |
| + |
| + mic_platform_dev = platform_device_register_simple(mic_driver_name, |
| + 0, NULL, 0); |
| + ret = PTR_ERR_OR_ZERO(mic_platform_dev); |
| if (ret) { |
| - pr_err("platform_device_register ret %d\n", ret); |
| + pr_err("platform_device_register_full ret %d\n", ret); |
| goto cleanup_debugfs; |
| } |
| ret = platform_driver_register(&mic_platform_driver); |
| @@ -341,7 +337,7 @@ static int __init mic_init(void) |
| return ret; |
| |
| device_unregister: |
| - platform_device_unregister(&mic_platform_dev); |
| + platform_device_unregister(mic_platform_dev); |
| cleanup_debugfs: |
| mic_exit_card_debugfs(); |
| done: |
| @@ -351,7 +347,7 @@ done: |
| static void __exit mic_exit(void) |
| { |
| platform_driver_unregister(&mic_platform_driver); |
| - platform_device_unregister(&mic_platform_dev); |
| + platform_device_unregister(mic_platform_dev); |
| mic_exit_card_debugfs(); |
| } |
| |
| -- |
| 2.20.1 |
| |