[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Message-ID: <4a38292e-3340-dfb4-8a61-114fccf42958@web.de>
Date: Sun, 14 May 2017 10:11:13 +0200
From: Jan Kiszka <jan.kiszka@....de>
To: Andy Shevchenko <andy.shevchenko@...il.com>,
Jan Kiszka <jan.kiszka@...mens.com>
Cc: Greg Kroah-Hartman <gregkh@...uxfoundation.org>,
Linus Walleij <linus.walleij@...aro.org>,
Alexandre Courbot <gnurou@...il.com>,
Linux Kernel Mailing List <linux-kernel@...r.kernel.org>,
"linux-serial@...r.kernel.org" <linux-serial@...r.kernel.org>,
"linux-gpio@...r.kernel.org" <linux-gpio@...r.kernel.org>,
Sudip Mukherjee <sudip.mukherjee@...ethink.co.uk>,
Sascha Weisenberger <sascha.weisenberger@...mens.com>
Subject: Re: [PATCH 2/8] gpio: exar: Fix passing in of parent PCI device
On 2017-05-13 15:25, Andy Shevchenko wrote:
> On Sat, May 13, 2017 at 10:29 AM, Jan Kiszka <jan.kiszka@...mens.com> 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;
>
Download attachment "signature.asc" of type "application/pgp-signature" (182 bytes)
Powered by blists - more mailing lists