From: Binbin Zhou zhoubinbin@loongson.cn
[ Upstream commit 27cb8f702eb789f97f7a8bd5a91d76c65a937b2f ]
Add the interrupt enable register offset (inten_offset) so that GPIO interrupts can be enabled normally on more models.
According to the latest interface specifications, the definition of GPIO interrupts in ACPI is similar to that in FDT. The GPIO interrupts are listed one by one according to the GPIO number, and the corresponding interrupt number can be obtained directly through the GPIO number specified by the consumer.
Signed-off-by: Xi Ruoyao xry111@xry111.site Signed-off-by: Binbin Zhou zhoubinbin@loongson.cn Reviewed-by: Huacai Chen chenhuacai@loongson.cn Link: https://lore.kernel.org/r/20250714064542.2276247-1-zhoubinbin@loongson.cn [Bartosz: tweaked the commit message] Signed-off-by: Bartosz Golaszewski bartosz.golaszewski@linaro.org Signed-off-by: Sasha Levin sashal@kernel.org ---
LLM Generated explanations, may be completely bogus:
**Backport Status: YES**
This commit is suitable for backporting to stable kernel trees for the following reasons:
1. **Fixes a bug affecting users**: The commit addresses a functional issue where GPIO interrupts cannot be enabled properly on several Loongson models (ls2k2000, ls3a5000, ls7a, ls7a2000). Looking at the code in `loongson_gpio_to_irq()` (lines 120-136), the function relies on `chip_data->inten_offset` being set to properly enable interrupts. Without this offset, the conditional check at line 167 (`if (lgpio->chip_data->inten_offset)`) prevents the `to_irq` callback from being registered, effectively breaking GPIO interrupt functionality.
2. **Small and contained fix**: The changes are minimal - only adding the missing `inten_offset` values to existing chip data structures. The patch adds 4 lines: - Line 225: `.inten_offset = 0x14,` for ls2k2000_data0 - Line 233: `.inten_offset = 0x30,` for ls2k2000_data1 - Line 249: `.inten_offset = 0x14,` for ls3a5000_data - Line 257: `.inten_offset = 0xb00,` for ls7a_data - Line 266: `.inten_offset = 0xb00,` for ls7a2000_data0 - Line 284: `.inten_offset = 0x14,` for ls3a6000_data
3. **No architectural changes**: This is a simple data fix that adds missing hardware register offsets. It doesn't change any logic, APIs, or introduce new features.
4. **Low regression risk**: The change only affects the specific Loongson models mentioned and only enables functionality that was previously broken. It cannot break existing working configurations since it only adds missing data.
5. **Hardware enablement fix**: This is essentially a hardware enablement bug fix that allows proper interrupt handling on affected Loongson platforms. Without this fix, GPIO interrupts are completely non-functional on these chips.
The commit follows stable tree rules by being a clear bug fix with minimal changes and low risk. The fact that other similar chip data structures already had `inten_offset` defined (like ls2k_data, ls2k0500_data0/1) shows this was an oversight that needed correction.
drivers/gpio/gpio-loongson-64bit.c | 6 ++++++ 1 file changed, 6 insertions(+)
diff --git a/drivers/gpio/gpio-loongson-64bit.c b/drivers/gpio/gpio-loongson-64bit.c index 70a01c5b8ad1..add09971d26a 100644 --- a/drivers/gpio/gpio-loongson-64bit.c +++ b/drivers/gpio/gpio-loongson-64bit.c @@ -222,6 +222,7 @@ static const struct loongson_gpio_chip_data loongson_gpio_ls2k2000_data0 = { .conf_offset = 0x0, .in_offset = 0xc, .out_offset = 0x8, + .inten_offset = 0x14, };
static const struct loongson_gpio_chip_data loongson_gpio_ls2k2000_data1 = { @@ -230,6 +231,7 @@ static const struct loongson_gpio_chip_data loongson_gpio_ls2k2000_data1 = { .conf_offset = 0x0, .in_offset = 0x20, .out_offset = 0x10, + .inten_offset = 0x30, };
static const struct loongson_gpio_chip_data loongson_gpio_ls2k2000_data2 = { @@ -246,6 +248,7 @@ static const struct loongson_gpio_chip_data loongson_gpio_ls3a5000_data = { .conf_offset = 0x0, .in_offset = 0xc, .out_offset = 0x8, + .inten_offset = 0x14, };
static const struct loongson_gpio_chip_data loongson_gpio_ls7a_data = { @@ -254,6 +257,7 @@ static const struct loongson_gpio_chip_data loongson_gpio_ls7a_data = { .conf_offset = 0x800, .in_offset = 0xa00, .out_offset = 0x900, + .inten_offset = 0xb00, };
/* LS7A2000 chipset GPIO */ @@ -263,6 +267,7 @@ static const struct loongson_gpio_chip_data loongson_gpio_ls7a2000_data0 = { .conf_offset = 0x800, .in_offset = 0xa00, .out_offset = 0x900, + .inten_offset = 0xb00, };
/* LS7A2000 ACPI GPIO */ @@ -281,6 +286,7 @@ static const struct loongson_gpio_chip_data loongson_gpio_ls3a6000_data = { .conf_offset = 0x0, .in_offset = 0xc, .out_offset = 0x8, + .inten_offset = 0x14, };
static const struct of_device_id loongson_gpio_of_match[] = {