summaryrefslogtreecommitdiff
path: root/drivers/gpio
diff options
context:
space:
mode:
authorAlban Bedel <alban.bedel@lht.dlh.de>2026-03-11 15:31:18 +0100
committerBartosz Golaszewski <bartosz.golaszewski@oss.qualcomm.com>2026-03-16 10:05:32 +0100
commit84cb463d2f6597c7951da6fb795f12119af8130d (patch)
treea900f62114139c9619e5f1403c090887c31ce723 /drivers/gpio
parent4071437cd2aac6b9d48f160d46cfb35ecbb11136 (diff)
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 <alban.bedel@lht.dlh.de> Link: https://patch.msgid.link/20260311143120.2179347-3-alban.bedel@lht.dlh.de Signed-off-by: Bartosz Golaszewski <bartosz.golaszewski@oss.qualcomm.com>
Diffstat (limited to 'drivers/gpio')
-rw-r--r--drivers/gpio/gpio-kempld.c14
1 files changed, 12 insertions, 2 deletions
diff --git a/drivers/gpio/gpio-kempld.c b/drivers/gpio/gpio-kempld.c
index 532e4000879a..2263de77d40e 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);