Re: [PATCH 2/8] gpio: exar: Fix passing in of parent PCI device

From: Jan Kiszka
Date: Sun May 14 2017 - 04:11:57 EST


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