On 10/30/18, Alan Cooper <alcooperx@xxxxxxxxx> wrote: >> On 10/24/18 3:11 AM, Arnd Bergmann wrote: >> >> On Wed, Oct 17, 2018 at 11:30 PM Al Cooper <alcooperx@xxxxxxxxx> wrote: >> >> Add support for Broadcom STB SoC's to the ohci platform driver. >> >> Signed-off-by: Al Cooper <alcooperx@xxxxxxxxx> >> --- >> drivers/usb/host/ohci-platform.c | 35 >> +++++++++++++++++++++++++++++------ >> include/linux/usb/ohci_pdriver.h | 1 + >> 2 files changed, 30 insertions(+), 6 deletions(-) >> >> diff --git a/drivers/usb/host/ohci-platform.c > b/drivers/usb/host/ohci-platform.c >> index 65a1c3fdc88c..363d6fa676a5 100644 >> --- a/drivers/usb/host/ohci-platform.c >> +++ b/drivers/usb/host/ohci-platform.c >> @@ -22,6 +22,7 @@ >> #include <linux/module.h> >> #include <linux/err.h> >> #include <linux/of.h> >> +#include <linux/of_device.h> >> #include <linux/platform_device.h> >> #include <linux/pm_runtime.h> >> #include <linux/reset.h> >> @@ -99,12 +100,24 @@ static int ohci_platform_probe(struct > platform_device *dev) >> if (usb_disabled()) >> return -ENODEV; >> >> - /* >> - * Use reasonable defaults so platforms don't have to provide > these >> - * with DT probing on ARM. >> - */ >> - if (!pdata) >> - pdata = &ohci_platform_defaults; >> + if (!pdata) { >> + const struct usb_ohci_pdata *match_pdata; >> + >> + match_pdata = of_device_get_match_data(&dev->dev); >> + if (match_pdata) { >> + pdata = devm_kzalloc(&dev->dev, sizeof(*pdata), >> + GFP_KERNEL); >> + if (!pdata) >> + return -ENOMEM; >> + *pdata = *match_pdata; >> >> It looks like you copy the const pdata to get a non-const version. >> Have you tried >> propagating the 'const' modifier so that users can rely on that here? > > The problem is that the const pdata from of_device_get_match() needs to be > saved in device->platform_data which is not a const pointer (and can't be > changed). How can I propagate the "const" to solve the problem? Ah, I see your problem, and unfortunately don't have an easy answer. You could split up the structure between a constant part and a non-constant part, and have the latter be what gets put into the platform_data, but that wouldn't really be much nicer than what you have here. You could use devm_kmemdup() to save a few lines to simplify your code without any other changes maybe, but it doesn't solve the fact that the mismatch between platform_data being non-const and of_match_data being const is a bit ugly. Arnd