On 2017-05-13 15:25, Andy Shevchenko wrote: > On Sat, May 13, 2017 at 10:29 AM, Jan Kiszka <jan.kiszka@xxxxxxxxxxx> wrote: >> This fixes reloading of the driver for the same device: First of all, >> the driver sets drvdata to its own value during probing and does not >> restore the original value on exit. But this won't help anyway as the >> core clears drvdata after the driver left. >> >> Use stable platform_data instead. > >>From the above I didn't clearly get what device you are talking about. > GPIO? "This fixes reloading of the GPIO driver for the same platform device instance as created by the exar UART driver: [...]" Clearer? > > Can you provide step by step what you did and what bug you got? Obviously a NULL pointer: Just rmmod gpio-exar and reload it while there is the same platform device present. > > Regarding below it looks to me a bit hackish. The alternative is a classic platform data structure, then also carrying the properties of patch 7 - which are, BTW, not DT-related, thus shall not form an external interface. Probably another reason to switch everything to some struct exar_gpio_platform_data. Jan > >> static int gpio_exar_probe(struct platform_device *pdev) >> { >> - struct pci_dev *pcidev = platform_get_drvdata(pdev); >> + struct pci_dev *pcidev = *(struct pci_dev **)pdev->dev.platform_data; >> struct exar_gpio_chip *exar_gpio; >> void __iomem *p; >> int index, ret; >> diff --git a/drivers/tty/serial/8250/8250_exar.c b/drivers/tty/serial/8250/8250_exar.c >> index b4fa585156c7..2d056d1eeca3 100644 >> --- a/drivers/tty/serial/8250/8250_exar.c >> +++ b/drivers/tty/serial/8250/8250_exar.c >> @@ -196,8 +196,12 @@ xr17v35x_register_gpio(struct pci_dev *pcidev) >> if (!pdev) >> return NULL; >> >> - platform_set_drvdata(pdev, pcidev); >> - if (platform_device_add(pdev) < 0) { >> + /* >> + * platform_device_add_data kmemdups the data, therefore we can safely >> + * pass a stack reference. >> + */ >> + if (platform_device_add_data(pdev, &pcidev, sizeof(pcidev)) < 0 || >> + platform_device_add(pdev) < 0) { >> platform_device_put(pdev); >> return NULL; >
Attachment:
signature.asc
Description: OpenPGP digital signature