mirror of
https://github.com/raspberrypi/linux.git
synced 2025-12-06 10:00:17 +00:00
spi: Try to get ACPI GPIO IRQ earlier
Since commitd24cfee7f6("spi: Fix acpi deferred irq probe"), the acpi_dev_gpio_irq_get() call gets delayed till spi_probe() is called on the SPI device. If there is no driver for the SPI device then the move to spi_probe() results in acpi_dev_gpio_irq_get() never getting called. This may cause problems by leaving the GPIO pin floating because this call is responsible for setting up the GPIO pin direction and/or bias according to the values from the ACPI tables. Re-add the removed acpi_dev_gpio_irq_get() in acpi_register_spi_device() to ensure the GPIO pin is always correctly setup, while keeping the acpi_dev_gpio_irq_get() call added to spi_probe() to deal with -EPROBE_DEFER returns caused by the GPIO controller not having a driver yet. Link: https://bbs.archlinux.org/viewtopic.php?id=302348 Fixes:d24cfee7f6("spi: Fix acpi deferred irq probe") Cc: stable@vger.kernel.org Signed-off-by: Hans de Goede <hansg@kernel.org> Link: https://patch.msgid.link/20251102190921.30068-1-hansg@kernel.org Signed-off-by: Mark Brown <broonie@kernel.org>
This commit is contained in:
committed by
Mark Brown
parent
6146a0f1df
commit
3cd2018e15
@@ -2851,6 +2851,16 @@ static acpi_status acpi_register_spi_device(struct spi_controller *ctlr,
|
|||||||
acpi_set_modalias(adev, acpi_device_hid(adev), spi->modalias,
|
acpi_set_modalias(adev, acpi_device_hid(adev), spi->modalias,
|
||||||
sizeof(spi->modalias));
|
sizeof(spi->modalias));
|
||||||
|
|
||||||
|
/*
|
||||||
|
* This gets re-tried in spi_probe() for -EPROBE_DEFER handling in case
|
||||||
|
* the GPIO controller does not have a driver yet. This needs to be done
|
||||||
|
* here too, because this call sets the GPIO direction and/or bias.
|
||||||
|
* Setting these needs to be done even if there is no driver, in which
|
||||||
|
* case spi_probe() will never get called.
|
||||||
|
*/
|
||||||
|
if (spi->irq < 0)
|
||||||
|
spi->irq = acpi_dev_gpio_irq_get(adev, 0);
|
||||||
|
|
||||||
acpi_device_set_enumerated(adev);
|
acpi_device_set_enumerated(adev);
|
||||||
|
|
||||||
adev->power.flags.ignore_parent = true;
|
adev->power.flags.ignore_parent = true;
|
||||||
|
|||||||
Reference in New Issue
Block a user