From: Alban Bedel Date: Wed, 11 Mar 2026 14:31:18 +0000 (+0100) Subject: gpio: kempld: Add support for PLD version >= 2.8 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=84cb463d2f6597c7951da6fb795f12119af8130d;p=thirdparty%2Fkernel%2Flinux.git gpio: kempld: Add support for PLD version >= 2.8 Starting with version 2.8 there is a dedicated register to configure the output level. Read the PLD version in the probe and select the correct register to use for the set operations. Signed-off-by: Alban Bedel Link: https://patch.msgid.link/20260311143120.2179347-3-alban.bedel@lht.dlh.de Signed-off-by: Bartosz Golaszewski --- diff --git a/drivers/gpio/gpio-kempld.c b/drivers/gpio/gpio-kempld.c index 532e4000879ab..2263de77d40e9 100644 --- a/drivers/gpio/gpio-kempld.c +++ b/drivers/gpio/gpio-kempld.c @@ -25,6 +25,7 @@ struct kempld_gpio_data { struct gpio_chip chip; struct kempld_device_data *pld; + u8 out_lvl_reg; }; /* @@ -71,7 +72,7 @@ static int kempld_gpio_set(struct gpio_chip *chip, unsigned int offset, struct kempld_device_data *pld = gpio->pld; kempld_get_mutex(pld); - kempld_gpio_bitop(pld, KEMPLD_GPIO_LVL, offset, value); + kempld_gpio_bitop(pld, gpio->out_lvl_reg, offset, value); kempld_release_mutex(pld); return 0; @@ -96,7 +97,7 @@ static int kempld_gpio_direction_output(struct gpio_chip *chip, unsigned offset, struct kempld_device_data *pld = gpio->pld; kempld_get_mutex(pld); - kempld_gpio_bitop(pld, KEMPLD_GPIO_LVL, offset, value); + kempld_gpio_bitop(pld, gpio->out_lvl_reg, offset, value); kempld_gpio_bitop(pld, KEMPLD_GPIO_DIR, offset, 1); kempld_release_mutex(pld); @@ -153,6 +154,15 @@ static int kempld_gpio_probe(struct platform_device *pdev) if (!gpio) return -ENOMEM; + /* Starting with version 2.8 there is a dedicated register for the + * output state, earlier versions share the register used to read + * the line level. + */ + if (pld->info.spec_major > 2 || pld->info.spec_minor >= 8) + gpio->out_lvl_reg = KEMPLD_GPIO_OUT_LVL; + else + gpio->out_lvl_reg = KEMPLD_GPIO_LVL; + gpio->pld = pld; platform_set_drvdata(pdev, gpio);