linux-omap.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [PATCH v5 0/2] Add TI TPS65214 PMIC GPIO Support
@ 2025-07-02 16:49 Shree Ramamoorthy
  2025-07-02 16:49 ` [PATCH v5 1/2] gpio: tps65219: Update _IDX & _OFFSET macro prefix Shree Ramamoorthy
  2025-07-02 16:49 ` [PATCH v5 2/2] gpio: tps65219: Add support for TI TPS65214 PMIC Shree Ramamoorthy
  0 siblings, 2 replies; 9+ messages in thread
From: Shree Ramamoorthy @ 2025-07-02 16:49 UTC (permalink / raw)
  To: aaro.koskinen, andreas, khilman, rogerq, tony, linus.walleij,
	brgl, linux-omap, linux-kernel, linux-gpio
  Cc: m-leonard, praneeth, jcormier

The related MFD series was integrated in mainline during 6.15 cycle [0].

TPS65214 is a Power Management Integrated Circuit (PMIC) that has 
significant register map overlap with TPS65219. The series introduces
TPS65214 and restructures the existing driver to support multiple devices.

TPS65215's GPIO specs are the same as TPS65219, so the "tps65219-gpio"
compatible string is assigned to two devices in the TPS65219 MFD driver.
No additional support is required in the GPIO driver for TPS65215.

- TPS65214 has 1 GPIO & 1 GPO, whereas TPS65219/TPS65215 both have 1 GPIO &
  2 GPOs.
- TPS65214' GPIO direction can be changed with register GENERAL_CONFIG and 
  bit GPIO_CONFIG during device operation.
- TPS65219's MULTI_DEVICE_ENABLE bit in register MFP_1_CFG maps to
  TPS65214's GPIO_VSEL_CONFIG bit.

TPS65214 Datasheet: https://www.ti.com/lit/gpn/TPS65214
TPS65214 TRM: https://www.ti.com/lit/pdf/slvud30
TPS65215 TRM: https://www.ti.com/lit/pdf/slvucw5/

Signed-off-by: Shree Ramamoorthy <s-ramamoorthy@ti.com>
Tested-by: Jonathan Cormier <jcormier@criticallink.com>
---
Change Log:
v4 -> v5:
- Consolidate from 3 to 2 patches
- Add specific TPS65215 info to Patch 1 comments + commit message
- Remove chip_data struct
- Add separate dev-specific template_chip structs
- Add dev-specific change_direction functions + assignment in probe
- Add PMIC GPIO mapping explanation in comments for future users
- Add TPS65214 GPIO0 direction mask macro
- Rename _GPIO0_OFFSET in patch 1, in addition to _IDX macro
- Update cover letter + add TPS65214 datasheet link
v3 -> v4:
- Update cover letter
- Rebase for 6.16 cycle
v2 -> v3:
- Correct gpio_chip.ngpio line to use .offset field
- Remove unnecessary newlines
v1 -> v2:
- have any PMIC lists be in alpha-numeric order: TPS65215, then TPS65219
- remove comma after terminator
- Add driver prefix to chip_data struct
---
[0]: https://lore.kernel.org/all/173928615760.2233464.12306998726512431222.b4-ty@kernel.org/

Shree Ramamoorthy (2):
  gpio: tps65219: Update _IDX & _OFFSET macro prefix
  gpio: tps65219: Add support for TI TPS65214 PMIC

 drivers/gpio/gpio-tps65219.c | 116 ++++++++++++++++++++++++++++++-----
 1 file changed, 102 insertions(+), 14 deletions(-)

-- 
2.43.0


^ permalink raw reply	[flat|nested] 9+ messages in thread

* [PATCH v5 1/2] gpio: tps65219: Update _IDX & _OFFSET macro prefix
  2025-07-02 16:49 [PATCH v5 0/2] Add TI TPS65214 PMIC GPIO Support Shree Ramamoorthy
@ 2025-07-02 16:49 ` Shree Ramamoorthy
  2025-07-03  9:51   ` Bartosz Golaszewski
  2025-07-03 13:36   ` Jon Cormier
  2025-07-02 16:49 ` [PATCH v5 2/2] gpio: tps65219: Add support for TI TPS65214 PMIC Shree Ramamoorthy
  1 sibling, 2 replies; 9+ messages in thread
From: Shree Ramamoorthy @ 2025-07-02 16:49 UTC (permalink / raw)
  To: aaro.koskinen, andreas, khilman, rogerq, tony, linus.walleij,
	brgl, linux-omap, linux-kernel, linux-gpio
  Cc: m-leonard, praneeth, jcormier

TPS65215 and TPS65219 are overlapping PMIC devices. While their regulator
features differe, the GPIO features are the same. In the TPS65219 MFD
driver, the 2 PMICs share the same "tps65219-gpio" compatible string to
limit support for TPS65215 in this GPIO driver to comments.

The TPS6521X_GPIO0_IDX and TPS6521X_GPIO0_OFFSET macro name prefixes are
updated to indicate these macros apply to both PMICs.

Signed-off-by: Shree Ramamoorthy <s-ramamoorthy@ti.com>
Reviewed-by: Roger Quadros <rogerq@kernel.org>
Acked-by: Linus Walleij <linus.walleij@linaro.org>
---
 drivers/gpio/gpio-tps65219.c | 27 +++++++++++++++++----------
 1 file changed, 17 insertions(+), 10 deletions(-)

diff --git a/drivers/gpio/gpio-tps65219.c b/drivers/gpio/gpio-tps65219.c
index 526640c39a11..3c762103babc 100644
--- a/drivers/gpio/gpio-tps65219.c
+++ b/drivers/gpio/gpio-tps65219.c
@@ -1,8 +1,8 @@
 // SPDX-License-Identifier: GPL-2.0
 /*
- * GPIO driver for TI TPS65219 PMICs
+ * GPIO driver for TI TPS65215/TPS65219 PMICs
  *
- * Copyright (C) 2022 Texas Instruments Incorporated - http://www.ti.com/
+ * Copyright (C) 2025 Texas Instruments Incorporated - http://www.ti.com/
  */
 
 #include <linux/bits.h>
@@ -13,8 +13,15 @@
 #include <linux/regmap.h>
 
 #define TPS65219_GPIO0_DIR_MASK		BIT(3)
-#define TPS65219_GPIO0_OFFSET		2
-#define TPS65219_GPIO0_IDX		0
+#define TPS6521X_GPIO0_OFFSET		2
+#define TPS6521X_GPIO0_IDX		0
+
+/*
+ * TPS65215 & TPS65219 GPIO mapping
+ * Linux gpio offset 0 -> GPIO (pin16) -> bit_offset 2
+ * Linux gpio offset 1 -> GPO1 (pin8 ) -> bit_offset 0
+ * Linux gpio offset 2 -> GPO2 (pin17) -> bit_offset 1
+ */
 
 struct tps65219_gpio {
 	struct gpio_chip gpio_chip;
@@ -26,7 +33,7 @@ static int tps65219_gpio_get_direction(struct gpio_chip *gc, unsigned int offset
 	struct tps65219_gpio *gpio = gpiochip_get_data(gc);
 	int ret, val;
 
-	if (offset != TPS65219_GPIO0_IDX)
+	if (offset != TPS6521X_GPIO0_IDX)
 		return GPIO_LINE_DIRECTION_OUT;
 
 	ret = regmap_read(gpio->tps->regmap, TPS65219_REG_MFP_1_CONFIG, &val);
@@ -42,7 +49,7 @@ static int tps65219_gpio_get(struct gpio_chip *gc, unsigned int offset)
 	struct device *dev = gpio->tps->dev;
 	int ret, val;
 
-	if (offset != TPS65219_GPIO0_IDX) {
+	if (offset != TPS6521X_GPIO0_IDX) {
 		dev_err(dev, "GPIO%d is output only, cannot get\n", offset);
 		return -ENOTSUPP;
 	}
@@ -71,7 +78,7 @@ static void tps65219_gpio_set(struct gpio_chip *gc, unsigned int offset, int val
 	struct device *dev = gpio->tps->dev;
 	int v, mask, bit;
 
-	bit = (offset == TPS65219_GPIO0_IDX) ? TPS65219_GPIO0_OFFSET : offset - 1;
+	bit = (offset == TPS6521X_GPIO0_IDX) ? TPS6521X_GPIO0_OFFSET : offset - 1;
 
 	mask = BIT(bit);
 	v = value ? mask : 0;
@@ -117,7 +124,7 @@ static int tps65219_gpio_direction_input(struct gpio_chip *gc, unsigned int offs
 	struct tps65219_gpio *gpio = gpiochip_get_data(gc);
 	struct device *dev = gpio->tps->dev;
 
-	if (offset != TPS65219_GPIO0_IDX) {
+	if (offset != TPS6521X_GPIO0_IDX) {
 		dev_err(dev, "GPIO%d is output only, cannot change to input\n", offset);
 		return -ENOTSUPP;
 	}
@@ -131,7 +138,7 @@ static int tps65219_gpio_direction_input(struct gpio_chip *gc, unsigned int offs
 static int tps65219_gpio_direction_output(struct gpio_chip *gc, unsigned int offset, int value)
 {
 	tps65219_gpio_set(gc, offset, value);
-	if (offset != TPS65219_GPIO0_IDX)
+	if (offset != TPS6521X_GPIO0_IDX)
 		return 0;
 
 	if (tps65219_gpio_get_direction(gc, offset) == GPIO_LINE_DIRECTION_OUT)
@@ -179,5 +186,5 @@ module_platform_driver(tps65219_gpio_driver);
 
 MODULE_ALIAS("platform:tps65219-gpio");
 MODULE_AUTHOR("Jonathan Cormier <jcormier@criticallink.com>");
-MODULE_DESCRIPTION("TPS65219 GPIO driver");
+MODULE_DESCRIPTION("TPS65215/TPS65219 GPIO driver");
 MODULE_LICENSE("GPL");
-- 
2.43.0


^ permalink raw reply related	[flat|nested] 9+ messages in thread

* [PATCH v5 2/2] gpio: tps65219: Add support for TI TPS65214 PMIC
  2025-07-02 16:49 [PATCH v5 0/2] Add TI TPS65214 PMIC GPIO Support Shree Ramamoorthy
  2025-07-02 16:49 ` [PATCH v5 1/2] gpio: tps65219: Update _IDX & _OFFSET macro prefix Shree Ramamoorthy
@ 2025-07-02 16:49 ` Shree Ramamoorthy
  2025-07-03  9:54   ` Bartosz Golaszewski
  2025-07-03 13:39   ` Jon Cormier
  1 sibling, 2 replies; 9+ messages in thread
From: Shree Ramamoorthy @ 2025-07-02 16:49 UTC (permalink / raw)
  To: aaro.koskinen, andreas, khilman, rogerq, tony, linus.walleij,
	brgl, linux-omap, linux-kernel, linux-gpio
  Cc: m-leonard, praneeth, jcormier

Add support for the TI TPS65214 PMIC with the addition of an id_table,
separate TPS65214 template_chip, and device-specific _change_direction
functions.

- Use platform_get_device_id() to assign dev-specific information.
- Use different change_direction() functions since TPS65214's GPIO
  configuration bits are changeable during device operation through bit
  GPIO_CONFIG in GENERAL_CONFIG register.
- Remove MODULE_ALIAS since it is now generated by MODULE_DEVICE_TABLE.

Signed-off-by: Shree Ramamoorthy <s-ramamoorthy@ti.com>
---
 drivers/gpio/gpio-tps65219.c | 93 +++++++++++++++++++++++++++++++++---
 1 file changed, 87 insertions(+), 6 deletions(-)

diff --git a/drivers/gpio/gpio-tps65219.c b/drivers/gpio/gpio-tps65219.c
index 3c762103babc..7a62d490ad0a 100644
--- a/drivers/gpio/gpio-tps65219.c
+++ b/drivers/gpio/gpio-tps65219.c
@@ -1,6 +1,6 @@
 // SPDX-License-Identifier: GPL-2.0
 /*
- * GPIO driver for TI TPS65215/TPS65219 PMICs
+ * GPIO driver for TI TPS65214/TPS65215/TPS65219 PMICs
  *
  * Copyright (C) 2025 Texas Instruments Incorporated - http://www.ti.com/
  */
@@ -13,10 +13,15 @@
 #include <linux/regmap.h>
 
 #define TPS65219_GPIO0_DIR_MASK		BIT(3)
+#define TPS65214_GPIO0_DIR_MASK		BIT(1)
 #define TPS6521X_GPIO0_OFFSET		2
 #define TPS6521X_GPIO0_IDX		0
 
 /*
+ * TPS65214 GPIO mapping
+ * Linux gpio offset 0 -> GPIO (pin16) -> bit_offset 2
+ * Linux gpio offset 1 -> GPO1 (pin9 ) -> bit_offset 0
+ *
  * TPS65215 & TPS65219 GPIO mapping
  * Linux gpio offset 0 -> GPIO (pin16) -> bit_offset 2
  * Linux gpio offset 1 -> GPO1 (pin8 ) -> bit_offset 0
@@ -24,10 +29,26 @@
  */
 
 struct tps65219_gpio {
+	int (*change_dir)(struct gpio_chip *gc, unsigned int offset, unsigned int dir);
 	struct gpio_chip gpio_chip;
 	struct tps65219 *tps;
 };
 
+static int tps65214_gpio_get_direction(struct gpio_chip *gc, unsigned int offset)
+{
+	struct tps65219_gpio *gpio = gpiochip_get_data(gc);
+	int ret, val;
+
+	if (offset != TPS6521X_GPIO0_IDX)
+		return GPIO_LINE_DIRECTION_OUT;
+
+	ret = regmap_read(gpio->tps->regmap, TPS65219_REG_GENERAL_CONFIG, &val);
+	if (ret)
+		return ret;
+
+	return !(val & TPS65214_GPIO0_DIR_MASK);
+}
+
 static int tps65219_gpio_get_direction(struct gpio_chip *gc, unsigned int offset)
 {
 	struct tps65219_gpio *gpio = gpiochip_get_data(gc);
@@ -119,6 +140,34 @@ static int tps65219_gpio_change_direction(struct gpio_chip *gc, unsigned int off
 	return -ENOTSUPP;
 }
 
+static int tps65214_gpio_change_direction(struct gpio_chip *gc, unsigned int offset,
+					  unsigned int direction)
+{
+	struct tps65219_gpio *gpio = gpiochip_get_data(gc);
+	struct device *dev = gpio->tps->dev;
+	int val, ret;
+
+	/* Verified if GPIO or GPO in parent function
+	 * Masked value: 0 = GPIO, 1 = VSEL
+	 */
+	ret = regmap_read(gpio->tps->regmap, TPS65219_REG_MFP_1_CONFIG, &val);
+	if (ret)
+		return ret;
+
+	ret = !!(val & BIT(TPS65219_GPIO0_DIR_MASK));
+	if (ret)
+		dev_err(dev, "GPIO%d configured as VSEL, not GPIO\n", offset);
+
+	ret = regmap_update_bits(gpio->tps->regmap, TPS65219_REG_GENERAL_CONFIG,
+				 TPS65214_GPIO0_DIR_MASK, direction);
+	if (ret)
+		dev_err(dev,
+			"Fail to change direction to %u for GPIO%d.\n",
+			direction, offset);
+
+	return ret;
+}
+
 static int tps65219_gpio_direction_input(struct gpio_chip *gc, unsigned int offset)
 {
 	struct tps65219_gpio *gpio = gpiochip_get_data(gc);
@@ -132,11 +181,13 @@ static int tps65219_gpio_direction_input(struct gpio_chip *gc, unsigned int offs
 	if (tps65219_gpio_get_direction(gc, offset) == GPIO_LINE_DIRECTION_IN)
 		return 0;
 
-	return tps65219_gpio_change_direction(gc, offset, GPIO_LINE_DIRECTION_IN);
+	return gpio->change_dir(gc, offset, GPIO_LINE_DIRECTION_IN);
 }
 
 static int tps65219_gpio_direction_output(struct gpio_chip *gc, unsigned int offset, int value)
 {
+	struct tps65219_gpio *gpio = gpiochip_get_data(gc);
+
 	tps65219_gpio_set(gc, offset, value);
 	if (offset != TPS6521X_GPIO0_IDX)
 		return 0;
@@ -144,9 +195,22 @@ static int tps65219_gpio_direction_output(struct gpio_chip *gc, unsigned int off
 	if (tps65219_gpio_get_direction(gc, offset) == GPIO_LINE_DIRECTION_OUT)
 		return 0;
 
-	return tps65219_gpio_change_direction(gc, offset, GPIO_LINE_DIRECTION_OUT);
+	return gpio->change_dir(gc, offset, GPIO_LINE_DIRECTION_OUT);
 }
 
+static const struct gpio_chip tps65214_template_chip = {
+	.label			= "tps65214-gpio",
+	.owner			= THIS_MODULE,
+	.get_direction		= tps65214_gpio_get_direction,
+	.direction_input	= tps65219_gpio_direction_input,
+	.direction_output	= tps65219_gpio_direction_output,
+	.get			= tps65219_gpio_get,
+	.set			= tps65219_gpio_set,
+	.base			= -1,
+	.ngpio			= 2,
+	.can_sleep		= true,
+};
+
 static const struct gpio_chip tps65219_template_chip = {
 	.label			= "tps65219-gpio",
 	.owner			= THIS_MODULE,
@@ -162,6 +226,7 @@ static const struct gpio_chip tps65219_template_chip = {
 
 static int tps65219_gpio_probe(struct platform_device *pdev)
 {
+	enum pmic_id chip = platform_get_device_id(pdev)->driver_data;
 	struct tps65219 *tps = dev_get_drvdata(pdev->dev.parent);
 	struct tps65219_gpio *gpio;
 
@@ -169,22 +234,38 @@ static int tps65219_gpio_probe(struct platform_device *pdev)
 	if (!gpio)
 		return -ENOMEM;
 
+	if (chip == TPS65214) {
+		gpio->gpio_chip = tps65214_template_chip;
+		gpio->change_dir = tps65214_gpio_change_direction;
+	} else if (chip == TPS65219) {
+		gpio->gpio_chip = tps65219_template_chip;
+		gpio->change_dir = tps65219_gpio_change_direction;
+	} else {
+		return -ENODATA;
+	}
+
 	gpio->tps = tps;
-	gpio->gpio_chip = tps65219_template_chip;
 	gpio->gpio_chip.parent = tps->dev;
 
 	return devm_gpiochip_add_data(&pdev->dev, &gpio->gpio_chip, gpio);
 }
 
+static const struct platform_device_id tps6521x_gpio_id_table[] = {
+	{ "tps65214-gpio", TPS65214 },
+	{ "tps65219-gpio", TPS65219 },
+	{ /* sentinel */ }
+};
+MODULE_DEVICE_TABLE(platform, tps6521x_gpio_id_table);
+
 static struct platform_driver tps65219_gpio_driver = {
 	.driver = {
 		.name = "tps65219-gpio",
 	},
 	.probe = tps65219_gpio_probe,
+	.id_table = tps6521x_gpio_id_table,
 };
 module_platform_driver(tps65219_gpio_driver);
 
-MODULE_ALIAS("platform:tps65219-gpio");
 MODULE_AUTHOR("Jonathan Cormier <jcormier@criticallink.com>");
-MODULE_DESCRIPTION("TPS65215/TPS65219 GPIO driver");
+MODULE_DESCRIPTION("TPS65214/TPS65215/TPS65219 GPIO driver");
 MODULE_LICENSE("GPL");
-- 
2.43.0


^ permalink raw reply related	[flat|nested] 9+ messages in thread

* Re: [PATCH v5 1/2] gpio: tps65219: Update _IDX & _OFFSET macro prefix
  2025-07-02 16:49 ` [PATCH v5 1/2] gpio: tps65219: Update _IDX & _OFFSET macro prefix Shree Ramamoorthy
@ 2025-07-03  9:51   ` Bartosz Golaszewski
  2025-07-03 16:08     ` Shree Ramamoorthy
  2025-07-03 13:36   ` Jon Cormier
  1 sibling, 1 reply; 9+ messages in thread
From: Bartosz Golaszewski @ 2025-07-03  9:51 UTC (permalink / raw)
  To: Shree Ramamoorthy
  Cc: aaro.koskinen, andreas, khilman, rogerq, tony, linus.walleij,
	linux-omap, linux-kernel, linux-gpio, m-leonard, praneeth,
	jcormier

On Wed, Jul 2, 2025 at 6:51 PM Shree Ramamoorthy <s-ramamoorthy@ti.com> wrote:
>
> TPS65215 and TPS65219 are overlapping PMIC devices. While their regulator
> features differe, the GPIO features are the same. In the TPS65219 MFD
> driver, the 2 PMICs share the same "tps65219-gpio" compatible string to
> limit support for TPS65215 in this GPIO driver to comments.
>
> The TPS6521X_GPIO0_IDX and TPS6521X_GPIO0_OFFSET macro name prefixes are
> updated to indicate these macros apply to both PMICs.
>
> Signed-off-by: Shree Ramamoorthy <s-ramamoorthy@ti.com>
> Reviewed-by: Roger Quadros <rogerq@kernel.org>
> Acked-by: Linus Walleij <linus.walleij@linaro.org>
> ---
>  drivers/gpio/gpio-tps65219.c | 27 +++++++++++++++++----------
>  1 file changed, 17 insertions(+), 10 deletions(-)
>
> diff --git a/drivers/gpio/gpio-tps65219.c b/drivers/gpio/gpio-tps65219.c
> index 526640c39a11..3c762103babc 100644
> --- a/drivers/gpio/gpio-tps65219.c
> +++ b/drivers/gpio/gpio-tps65219.c
> @@ -1,8 +1,8 @@
>  // SPDX-License-Identifier: GPL-2.0
>  /*
> - * GPIO driver for TI TPS65219 PMICs
> + * GPIO driver for TI TPS65215/TPS65219 PMICs
>   *
> - * Copyright (C) 2022 Texas Instruments Incorporated - http://www.ti.com/
> + * Copyright (C) 2025 Texas Instruments Incorporated - http://www.ti.com/

Should be 2022,2025.

Bart

^ permalink raw reply	[flat|nested] 9+ messages in thread

* Re: [PATCH v5 2/2] gpio: tps65219: Add support for TI TPS65214 PMIC
  2025-07-02 16:49 ` [PATCH v5 2/2] gpio: tps65219: Add support for TI TPS65214 PMIC Shree Ramamoorthy
@ 2025-07-03  9:54   ` Bartosz Golaszewski
  2025-07-03 16:07     ` Shree Ramamoorthy
  2025-07-03 13:39   ` Jon Cormier
  1 sibling, 1 reply; 9+ messages in thread
From: Bartosz Golaszewski @ 2025-07-03  9:54 UTC (permalink / raw)
  To: Shree Ramamoorthy
  Cc: aaro.koskinen, andreas, khilman, rogerq, tony, linus.walleij,
	linux-omap, linux-kernel, linux-gpio, m-leonard, praneeth,
	jcormier

On Wed, Jul 2, 2025 at 6:51 PM Shree Ramamoorthy <s-ramamoorthy@ti.com> wrote:
>
> Add support for the TI TPS65214 PMIC with the addition of an id_table,
> separate TPS65214 template_chip, and device-specific _change_direction
> functions.
>
> - Use platform_get_device_id() to assign dev-specific information.
> - Use different change_direction() functions since TPS65214's GPIO
>   configuration bits are changeable during device operation through bit
>   GPIO_CONFIG in GENERAL_CONFIG register.
> - Remove MODULE_ALIAS since it is now generated by MODULE_DEVICE_TABLE.
>
> Signed-off-by: Shree Ramamoorthy <s-ramamoorthy@ti.com>
> ---
>  drivers/gpio/gpio-tps65219.c | 93 +++++++++++++++++++++++++++++++++---
>  1 file changed, 87 insertions(+), 6 deletions(-)
>
> diff --git a/drivers/gpio/gpio-tps65219.c b/drivers/gpio/gpio-tps65219.c
> index 3c762103babc..7a62d490ad0a 100644
> --- a/drivers/gpio/gpio-tps65219.c
> +++ b/drivers/gpio/gpio-tps65219.c
> @@ -1,6 +1,6 @@
>  // SPDX-License-Identifier: GPL-2.0
>  /*
> - * GPIO driver for TI TPS65215/TPS65219 PMICs
> + * GPIO driver for TI TPS65214/TPS65215/TPS65219 PMICs
>   *
>   * Copyright (C) 2025 Texas Instruments Incorporated - http://www.ti.com/
>   */
> @@ -13,10 +13,15 @@
>  #include <linux/regmap.h>
>
>  #define TPS65219_GPIO0_DIR_MASK                BIT(3)
> +#define TPS65214_GPIO0_DIR_MASK                BIT(1)
>  #define TPS6521X_GPIO0_OFFSET          2
>  #define TPS6521X_GPIO0_IDX             0
>
>  /*
> + * TPS65214 GPIO mapping
> + * Linux gpio offset 0 -> GPIO (pin16) -> bit_offset 2
> + * Linux gpio offset 1 -> GPO1 (pin9 ) -> bit_offset 0
> + *
>   * TPS65215 & TPS65219 GPIO mapping
>   * Linux gpio offset 0 -> GPIO (pin16) -> bit_offset 2
>   * Linux gpio offset 1 -> GPO1 (pin8 ) -> bit_offset 0
> @@ -24,10 +29,26 @@
>   */
>
>  struct tps65219_gpio {
> +       int (*change_dir)(struct gpio_chip *gc, unsigned int offset, unsigned int dir);
>         struct gpio_chip gpio_chip;
>         struct tps65219 *tps;
>  };
>
> +static int tps65214_gpio_get_direction(struct gpio_chip *gc, unsigned int offset)
> +{
> +       struct tps65219_gpio *gpio = gpiochip_get_data(gc);
> +       int ret, val;
> +
> +       if (offset != TPS6521X_GPIO0_IDX)
> +               return GPIO_LINE_DIRECTION_OUT;
> +
> +       ret = regmap_read(gpio->tps->regmap, TPS65219_REG_GENERAL_CONFIG, &val);
> +       if (ret)
> +               return ret;
> +
> +       return !(val & TPS65214_GPIO0_DIR_MASK);
> +}
> +
>  static int tps65219_gpio_get_direction(struct gpio_chip *gc, unsigned int offset)
>  {
>         struct tps65219_gpio *gpio = gpiochip_get_data(gc);
> @@ -119,6 +140,34 @@ static int tps65219_gpio_change_direction(struct gpio_chip *gc, unsigned int off
>         return -ENOTSUPP;
>  }
>
> +static int tps65214_gpio_change_direction(struct gpio_chip *gc, unsigned int offset,
> +                                         unsigned int direction)
> +{
> +       struct tps65219_gpio *gpio = gpiochip_get_data(gc);
> +       struct device *dev = gpio->tps->dev;
> +       int val, ret;
> +
> +       /* Verified if GPIO or GPO in parent function
> +        * Masked value: 0 = GPIO, 1 = VSEL
> +        */
> +       ret = regmap_read(gpio->tps->regmap, TPS65219_REG_MFP_1_CONFIG, &val);
> +       if (ret)
> +               return ret;
> +
> +       ret = !!(val & BIT(TPS65219_GPIO0_DIR_MASK));
> +       if (ret)
> +               dev_err(dev, "GPIO%d configured as VSEL, not GPIO\n", offset);
> +
> +       ret = regmap_update_bits(gpio->tps->regmap, TPS65219_REG_GENERAL_CONFIG,
> +                                TPS65214_GPIO0_DIR_MASK, direction);
> +       if (ret)
> +               dev_err(dev,
> +                       "Fail to change direction to %u for GPIO%d.\n",
> +                       direction, offset);
> +
> +       return ret;
> +}
> +
>  static int tps65219_gpio_direction_input(struct gpio_chip *gc, unsigned int offset)
>  {
>         struct tps65219_gpio *gpio = gpiochip_get_data(gc);
> @@ -132,11 +181,13 @@ static int tps65219_gpio_direction_input(struct gpio_chip *gc, unsigned int offs
>         if (tps65219_gpio_get_direction(gc, offset) == GPIO_LINE_DIRECTION_IN)
>                 return 0;
>
> -       return tps65219_gpio_change_direction(gc, offset, GPIO_LINE_DIRECTION_IN);
> +       return gpio->change_dir(gc, offset, GPIO_LINE_DIRECTION_IN);
>  }
>
>  static int tps65219_gpio_direction_output(struct gpio_chip *gc, unsigned int offset, int value)
>  {
> +       struct tps65219_gpio *gpio = gpiochip_get_data(gc);
> +
>         tps65219_gpio_set(gc, offset, value);
>         if (offset != TPS6521X_GPIO0_IDX)
>                 return 0;
> @@ -144,9 +195,22 @@ static int tps65219_gpio_direction_output(struct gpio_chip *gc, unsigned int off
>         if (tps65219_gpio_get_direction(gc, offset) == GPIO_LINE_DIRECTION_OUT)
>                 return 0;
>
> -       return tps65219_gpio_change_direction(gc, offset, GPIO_LINE_DIRECTION_OUT);
> +       return gpio->change_dir(gc, offset, GPIO_LINE_DIRECTION_OUT);
>  }
>
> +static const struct gpio_chip tps65214_template_chip = {
> +       .label                  = "tps65214-gpio",
> +       .owner                  = THIS_MODULE,
> +       .get_direction          = tps65214_gpio_get_direction,
> +       .direction_input        = tps65219_gpio_direction_input,
> +       .direction_output       = tps65219_gpio_direction_output,
> +       .get                    = tps65219_gpio_get,
> +       .set                    = tps65219_gpio_set,

Please use the set_rv() variant, regular set() is deprecated and will
be removed soon.

> +       .base                   = -1,
> +       .ngpio                  = 2,
> +       .can_sleep              = true,
> +};
> +
>  static const struct gpio_chip tps65219_template_chip = {
>         .label                  = "tps65219-gpio",
>         .owner                  = THIS_MODULE,
> @@ -162,6 +226,7 @@ static const struct gpio_chip tps65219_template_chip = {
>
>  static int tps65219_gpio_probe(struct platform_device *pdev)
>  {
> +       enum pmic_id chip = platform_get_device_id(pdev)->driver_data;
>         struct tps65219 *tps = dev_get_drvdata(pdev->dev.parent);
>         struct tps65219_gpio *gpio;
>
> @@ -169,22 +234,38 @@ static int tps65219_gpio_probe(struct platform_device *pdev)
>         if (!gpio)
>                 return -ENOMEM;
>
> +       if (chip == TPS65214) {
> +               gpio->gpio_chip = tps65214_template_chip;
> +               gpio->change_dir = tps65214_gpio_change_direction;
> +       } else if (chip == TPS65219) {
> +               gpio->gpio_chip = tps65219_template_chip;
> +               gpio->change_dir = tps65219_gpio_change_direction;
> +       } else {
> +               return -ENODATA;
> +       }
> +
>         gpio->tps = tps;
> -       gpio->gpio_chip = tps65219_template_chip;
>         gpio->gpio_chip.parent = tps->dev;
>
>         return devm_gpiochip_add_data(&pdev->dev, &gpio->gpio_chip, gpio);
>  }
>
> +static const struct platform_device_id tps6521x_gpio_id_table[] = {
> +       { "tps65214-gpio", TPS65214 },
> +       { "tps65219-gpio", TPS65219 },
> +       { /* sentinel */ }
> +};
> +MODULE_DEVICE_TABLE(platform, tps6521x_gpio_id_table);
> +
>  static struct platform_driver tps65219_gpio_driver = {
>         .driver = {
>                 .name = "tps65219-gpio",
>         },
>         .probe = tps65219_gpio_probe,
> +       .id_table = tps6521x_gpio_id_table,
>  };
>  module_platform_driver(tps65219_gpio_driver);
>
> -MODULE_ALIAS("platform:tps65219-gpio");
>  MODULE_AUTHOR("Jonathan Cormier <jcormier@criticallink.com>");
> -MODULE_DESCRIPTION("TPS65215/TPS65219 GPIO driver");
> +MODULE_DESCRIPTION("TPS65214/TPS65215/TPS65219 GPIO driver");
>  MODULE_LICENSE("GPL");
> --
> 2.43.0
>
>

Bartosz

^ permalink raw reply	[flat|nested] 9+ messages in thread

* Re: [PATCH v5 1/2] gpio: tps65219: Update _IDX & _OFFSET macro prefix
  2025-07-02 16:49 ` [PATCH v5 1/2] gpio: tps65219: Update _IDX & _OFFSET macro prefix Shree Ramamoorthy
  2025-07-03  9:51   ` Bartosz Golaszewski
@ 2025-07-03 13:36   ` Jon Cormier
  1 sibling, 0 replies; 9+ messages in thread
From: Jon Cormier @ 2025-07-03 13:36 UTC (permalink / raw)
  To: Shree Ramamoorthy
  Cc: aaro.koskinen, andreas, khilman, rogerq, tony, linus.walleij,
	brgl, linux-omap, linux-kernel, linux-gpio, m-leonard, praneeth

On Wed, Jul 2, 2025 at 12:49 PM Shree Ramamoorthy <s-ramamoorthy@ti.com> wrote:
>
> TPS65215 and TPS65219 are overlapping PMIC devices. While their regulator
> features differe, the GPIO features are the same. In the TPS65219 MFD
> driver, the 2 PMICs share the same "tps65219-gpio" compatible string to
> limit support for TPS65215 in this GPIO driver to comments.
>
> The TPS6521X_GPIO0_IDX and TPS6521X_GPIO0_OFFSET macro name prefixes are
> updated to indicate these macros apply to both PMICs.
>
> Signed-off-by: Shree Ramamoorthy <s-ramamoorthy@ti.com>
> Reviewed-by: Roger Quadros <rogerq@kernel.org>
> Acked-by: Linus Walleij <linus.walleij@linaro.org>

Reviewed-by: Jonathan Cormier <jcormier@criticallink.com>
> ---
>  drivers/gpio/gpio-tps65219.c | 27 +++++++++++++++++----------
>  1 file changed, 17 insertions(+), 10 deletions(-)
>
> diff --git a/drivers/gpio/gpio-tps65219.c b/drivers/gpio/gpio-tps65219.c
> index 526640c39a11..3c762103babc 100644
> --- a/drivers/gpio/gpio-tps65219.c
> +++ b/drivers/gpio/gpio-tps65219.c
> @@ -1,8 +1,8 @@
>  // SPDX-License-Identifier: GPL-2.0
>  /*
> - * GPIO driver for TI TPS65219 PMICs
> + * GPIO driver for TI TPS65215/TPS65219 PMICs
>   *
> - * Copyright (C) 2022 Texas Instruments Incorporated - http://www.ti.com/
> + * Copyright (C) 2025 Texas Instruments Incorporated - http://www.ti.com/
>   */
>
>  #include <linux/bits.h>
> @@ -13,8 +13,15 @@
>  #include <linux/regmap.h>
>
>  #define TPS65219_GPIO0_DIR_MASK                BIT(3)
> -#define TPS65219_GPIO0_OFFSET          2
> -#define TPS65219_GPIO0_IDX             0
> +#define TPS6521X_GPIO0_OFFSET          2
> +#define TPS6521X_GPIO0_IDX             0
> +
> +/*
> + * TPS65215 & TPS65219 GPIO mapping
> + * Linux gpio offset 0 -> GPIO (pin16) -> bit_offset 2
> + * Linux gpio offset 1 -> GPO1 (pin8 ) -> bit_offset 0
> + * Linux gpio offset 2 -> GPO2 (pin17) -> bit_offset 1
> + */
>
>  struct tps65219_gpio {
>         struct gpio_chip gpio_chip;
> @@ -26,7 +33,7 @@ static int tps65219_gpio_get_direction(struct gpio_chip *gc, unsigned int offset
>         struct tps65219_gpio *gpio = gpiochip_get_data(gc);
>         int ret, val;
>
> -       if (offset != TPS65219_GPIO0_IDX)
> +       if (offset != TPS6521X_GPIO0_IDX)
>                 return GPIO_LINE_DIRECTION_OUT;
>
>         ret = regmap_read(gpio->tps->regmap, TPS65219_REG_MFP_1_CONFIG, &val);
> @@ -42,7 +49,7 @@ static int tps65219_gpio_get(struct gpio_chip *gc, unsigned int offset)
>         struct device *dev = gpio->tps->dev;
>         int ret, val;
>
> -       if (offset != TPS65219_GPIO0_IDX) {
> +       if (offset != TPS6521X_GPIO0_IDX) {
>                 dev_err(dev, "GPIO%d is output only, cannot get\n", offset);
>                 return -ENOTSUPP;
>         }
> @@ -71,7 +78,7 @@ static void tps65219_gpio_set(struct gpio_chip *gc, unsigned int offset, int val
>         struct device *dev = gpio->tps->dev;
>         int v, mask, bit;
>
> -       bit = (offset == TPS65219_GPIO0_IDX) ? TPS65219_GPIO0_OFFSET : offset - 1;
> +       bit = (offset == TPS6521X_GPIO0_IDX) ? TPS6521X_GPIO0_OFFSET : offset - 1;
>
>         mask = BIT(bit);
>         v = value ? mask : 0;
> @@ -117,7 +124,7 @@ static int tps65219_gpio_direction_input(struct gpio_chip *gc, unsigned int offs
>         struct tps65219_gpio *gpio = gpiochip_get_data(gc);
>         struct device *dev = gpio->tps->dev;
>
> -       if (offset != TPS65219_GPIO0_IDX) {
> +       if (offset != TPS6521X_GPIO0_IDX) {
>                 dev_err(dev, "GPIO%d is output only, cannot change to input\n", offset);
>                 return -ENOTSUPP;
>         }
> @@ -131,7 +138,7 @@ static int tps65219_gpio_direction_input(struct gpio_chip *gc, unsigned int offs
>  static int tps65219_gpio_direction_output(struct gpio_chip *gc, unsigned int offset, int value)
>  {
>         tps65219_gpio_set(gc, offset, value);
> -       if (offset != TPS65219_GPIO0_IDX)
> +       if (offset != TPS6521X_GPIO0_IDX)
>                 return 0;
>
>         if (tps65219_gpio_get_direction(gc, offset) == GPIO_LINE_DIRECTION_OUT)
> @@ -179,5 +186,5 @@ module_platform_driver(tps65219_gpio_driver);
>
>  MODULE_ALIAS("platform:tps65219-gpio");
>  MODULE_AUTHOR("Jonathan Cormier <jcormier@criticallink.com>");
> -MODULE_DESCRIPTION("TPS65219 GPIO driver");
> +MODULE_DESCRIPTION("TPS65215/TPS65219 GPIO driver");
>  MODULE_LICENSE("GPL");
> --
> 2.43.0
>


-- 
Jonathan Cormier
Senior Software Engineer

Voice:  315.425.4045 x222

http://www.CriticalLink.com
6712 Brooklawn Parkway, Syracuse, NY 13211

^ permalink raw reply	[flat|nested] 9+ messages in thread

* Re: [PATCH v5 2/2] gpio: tps65219: Add support for TI TPS65214 PMIC
  2025-07-02 16:49 ` [PATCH v5 2/2] gpio: tps65219: Add support for TI TPS65214 PMIC Shree Ramamoorthy
  2025-07-03  9:54   ` Bartosz Golaszewski
@ 2025-07-03 13:39   ` Jon Cormier
  1 sibling, 0 replies; 9+ messages in thread
From: Jon Cormier @ 2025-07-03 13:39 UTC (permalink / raw)
  To: Shree Ramamoorthy
  Cc: aaro.koskinen, andreas, khilman, rogerq, tony, linus.walleij,
	brgl, linux-omap, linux-kernel, linux-gpio, m-leonard, praneeth

On Wed, Jul 2, 2025 at 12:49 PM Shree Ramamoorthy <s-ramamoorthy@ti.com> wrote:
>
> Add support for the TI TPS65214 PMIC with the addition of an id_table,
> separate TPS65214 template_chip, and device-specific _change_direction
> functions.
>
> - Use platform_get_device_id() to assign dev-specific information.
> - Use different change_direction() functions since TPS65214's GPIO
>   configuration bits are changeable during device operation through bit
>   GPIO_CONFIG in GENERAL_CONFIG register.
> - Remove MODULE_ALIAS since it is now generated by MODULE_DEVICE_TABLE.
>
> Signed-off-by: Shree Ramamoorthy <s-ramamoorthy@ti.com>

Reviewed-by: Jonathan Cormier <jcormier@criticallink.com>

Tested on our AM62x platform with TPS65219.  GPIO offsets remained
consistent and functional.
Tested-by: Jonathan Cormier <jcormier@criticallink.com>

> ---
>  drivers/gpio/gpio-tps65219.c | 93 +++++++++++++++++++++++++++++++++---
>  1 file changed, 87 insertions(+), 6 deletions(-)
>
> diff --git a/drivers/gpio/gpio-tps65219.c b/drivers/gpio/gpio-tps65219.c
> index 3c762103babc..7a62d490ad0a 100644
> --- a/drivers/gpio/gpio-tps65219.c
> +++ b/drivers/gpio/gpio-tps65219.c
> @@ -1,6 +1,6 @@
>  // SPDX-License-Identifier: GPL-2.0
>  /*
> - * GPIO driver for TI TPS65215/TPS65219 PMICs
> + * GPIO driver for TI TPS65214/TPS65215/TPS65219 PMICs
>   *
>   * Copyright (C) 2025 Texas Instruments Incorporated - http://www.ti.com/
>   */
> @@ -13,10 +13,15 @@
>  #include <linux/regmap.h>
>
>  #define TPS65219_GPIO0_DIR_MASK                BIT(3)
> +#define TPS65214_GPIO0_DIR_MASK                BIT(1)
>  #define TPS6521X_GPIO0_OFFSET          2
>  #define TPS6521X_GPIO0_IDX             0
>
>  /*
> + * TPS65214 GPIO mapping
> + * Linux gpio offset 0 -> GPIO (pin16) -> bit_offset 2
> + * Linux gpio offset 1 -> GPO1 (pin9 ) -> bit_offset 0
> + *
>   * TPS65215 & TPS65219 GPIO mapping
>   * Linux gpio offset 0 -> GPIO (pin16) -> bit_offset 2
>   * Linux gpio offset 1 -> GPO1 (pin8 ) -> bit_offset 0
> @@ -24,10 +29,26 @@
>   */
>
>  struct tps65219_gpio {
> +       int (*change_dir)(struct gpio_chip *gc, unsigned int offset, unsigned int dir);
>         struct gpio_chip gpio_chip;
>         struct tps65219 *tps;
>  };
>
> +static int tps65214_gpio_get_direction(struct gpio_chip *gc, unsigned int offset)
> +{
> +       struct tps65219_gpio *gpio = gpiochip_get_data(gc);
> +       int ret, val;
> +
> +       if (offset != TPS6521X_GPIO0_IDX)
> +               return GPIO_LINE_DIRECTION_OUT;
> +
> +       ret = regmap_read(gpio->tps->regmap, TPS65219_REG_GENERAL_CONFIG, &val);
> +       if (ret)
> +               return ret;
> +
> +       return !(val & TPS65214_GPIO0_DIR_MASK);
> +}
> +
>  static int tps65219_gpio_get_direction(struct gpio_chip *gc, unsigned int offset)
>  {
>         struct tps65219_gpio *gpio = gpiochip_get_data(gc);
> @@ -119,6 +140,34 @@ static int tps65219_gpio_change_direction(struct gpio_chip *gc, unsigned int off
>         return -ENOTSUPP;
>  }
>
> +static int tps65214_gpio_change_direction(struct gpio_chip *gc, unsigned int offset,
> +                                         unsigned int direction)
> +{
> +       struct tps65219_gpio *gpio = gpiochip_get_data(gc);
> +       struct device *dev = gpio->tps->dev;
> +       int val, ret;
> +
> +       /* Verified if GPIO or GPO in parent function
> +        * Masked value: 0 = GPIO, 1 = VSEL
> +        */
> +       ret = regmap_read(gpio->tps->regmap, TPS65219_REG_MFP_1_CONFIG, &val);
> +       if (ret)
> +               return ret;
> +
> +       ret = !!(val & BIT(TPS65219_GPIO0_DIR_MASK));
> +       if (ret)
> +               dev_err(dev, "GPIO%d configured as VSEL, not GPIO\n", offset);
> +
> +       ret = regmap_update_bits(gpio->tps->regmap, TPS65219_REG_GENERAL_CONFIG,
> +                                TPS65214_GPIO0_DIR_MASK, direction);
> +       if (ret)
> +               dev_err(dev,
> +                       "Fail to change direction to %u for GPIO%d.\n",
> +                       direction, offset);
> +
> +       return ret;
> +}
> +
>  static int tps65219_gpio_direction_input(struct gpio_chip *gc, unsigned int offset)
>  {
>         struct tps65219_gpio *gpio = gpiochip_get_data(gc);
> @@ -132,11 +181,13 @@ static int tps65219_gpio_direction_input(struct gpio_chip *gc, unsigned int offs
>         if (tps65219_gpio_get_direction(gc, offset) == GPIO_LINE_DIRECTION_IN)
>                 return 0;
>
> -       return tps65219_gpio_change_direction(gc, offset, GPIO_LINE_DIRECTION_IN);
> +       return gpio->change_dir(gc, offset, GPIO_LINE_DIRECTION_IN);
>  }
>
>  static int tps65219_gpio_direction_output(struct gpio_chip *gc, unsigned int offset, int value)
>  {
> +       struct tps65219_gpio *gpio = gpiochip_get_data(gc);
> +
>         tps65219_gpio_set(gc, offset, value);
>         if (offset != TPS6521X_GPIO0_IDX)
>                 return 0;
> @@ -144,9 +195,22 @@ static int tps65219_gpio_direction_output(struct gpio_chip *gc, unsigned int off
>         if (tps65219_gpio_get_direction(gc, offset) == GPIO_LINE_DIRECTION_OUT)
>                 return 0;
>
> -       return tps65219_gpio_change_direction(gc, offset, GPIO_LINE_DIRECTION_OUT);
> +       return gpio->change_dir(gc, offset, GPIO_LINE_DIRECTION_OUT);
>  }
>
> +static const struct gpio_chip tps65214_template_chip = {
> +       .label                  = "tps65214-gpio",
> +       .owner                  = THIS_MODULE,
> +       .get_direction          = tps65214_gpio_get_direction,
> +       .direction_input        = tps65219_gpio_direction_input,
> +       .direction_output       = tps65219_gpio_direction_output,
> +       .get                    = tps65219_gpio_get,
> +       .set                    = tps65219_gpio_set,
> +       .base                   = -1,
> +       .ngpio                  = 2,
> +       .can_sleep              = true,
> +};
> +
>  static const struct gpio_chip tps65219_template_chip = {
>         .label                  = "tps65219-gpio",
>         .owner                  = THIS_MODULE,
> @@ -162,6 +226,7 @@ static const struct gpio_chip tps65219_template_chip = {
>
>  static int tps65219_gpio_probe(struct platform_device *pdev)
>  {
> +       enum pmic_id chip = platform_get_device_id(pdev)->driver_data;
>         struct tps65219 *tps = dev_get_drvdata(pdev->dev.parent);
>         struct tps65219_gpio *gpio;
>
> @@ -169,22 +234,38 @@ static int tps65219_gpio_probe(struct platform_device *pdev)
>         if (!gpio)
>                 return -ENOMEM;
>
> +       if (chip == TPS65214) {
> +               gpio->gpio_chip = tps65214_template_chip;
> +               gpio->change_dir = tps65214_gpio_change_direction;
> +       } else if (chip == TPS65219) {
> +               gpio->gpio_chip = tps65219_template_chip;
> +               gpio->change_dir = tps65219_gpio_change_direction;
> +       } else {
> +               return -ENODATA;
> +       }
> +
>         gpio->tps = tps;
> -       gpio->gpio_chip = tps65219_template_chip;
>         gpio->gpio_chip.parent = tps->dev;
>
>         return devm_gpiochip_add_data(&pdev->dev, &gpio->gpio_chip, gpio);
>  }
>
> +static const struct platform_device_id tps6521x_gpio_id_table[] = {
> +       { "tps65214-gpio", TPS65214 },
> +       { "tps65219-gpio", TPS65219 },
> +       { /* sentinel */ }
> +};
> +MODULE_DEVICE_TABLE(platform, tps6521x_gpio_id_table);
> +
>  static struct platform_driver tps65219_gpio_driver = {
>         .driver = {
>                 .name = "tps65219-gpio",
>         },
>         .probe = tps65219_gpio_probe,
> +       .id_table = tps6521x_gpio_id_table,
>  };
>  module_platform_driver(tps65219_gpio_driver);
>
> -MODULE_ALIAS("platform:tps65219-gpio");
>  MODULE_AUTHOR("Jonathan Cormier <jcormier@criticallink.com>");
> -MODULE_DESCRIPTION("TPS65215/TPS65219 GPIO driver");
> +MODULE_DESCRIPTION("TPS65214/TPS65215/TPS65219 GPIO driver");
>  MODULE_LICENSE("GPL");
> --
> 2.43.0
>


-- 
Jonathan Cormier
Senior Software Engineer

Voice:  315.425.4045 x222

http://www.CriticalLink.com
6712 Brooklawn Parkway, Syracuse, NY 13211

^ permalink raw reply	[flat|nested] 9+ messages in thread

* Re: [PATCH v5 2/2] gpio: tps65219: Add support for TI TPS65214 PMIC
  2025-07-03  9:54   ` Bartosz Golaszewski
@ 2025-07-03 16:07     ` Shree Ramamoorthy
  0 siblings, 0 replies; 9+ messages in thread
From: Shree Ramamoorthy @ 2025-07-03 16:07 UTC (permalink / raw)
  To: Bartosz Golaszewski
  Cc: aaro.koskinen, andreas, khilman, rogerq, tony, linus.walleij,
	linux-omap, linux-kernel, linux-gpio, m-leonard, praneeth,
	jcormier

On 7/3/2025 4:54 AM, Bartosz Golaszewski wrote:
> On Wed, Jul 2, 2025 at 6:51 PM Shree Ramamoorthy <s-ramamoorthy@ti.com> wrote:
>> Add support for the TI TPS65214 PMIC with the addition of an id_table,
>> separate TPS65214 template_chip, and device-specific _change_direction
>> functions.
>>
>> - Use platform_get_device_id() to assign dev-specific information.
>> - Use different change_direction() functions since TPS65214's GPIO
>>   configuration bits are changeable during device operation through bit
>>   GPIO_CONFIG in GENERAL_CONFIG register.
>> - Remove MODULE_ALIAS since it is now generated by MODULE_DEVICE_TABLE.
>>
>> Signed-off-by: Shree Ramamoorthy <s-ramamoorthy@ti.com>
>> ---
>>  drivers/gpio/gpio-tps65219.c | 93 +++++++++++++++++++++++++++++++++---
>>  1 file changed, 87 insertions(+), 6 deletions(-)
>>
>> diff --git a/drivers/gpio/gpio-tps65219.c b/drivers/gpio/gpio-tps65219.c
>> index 3c762103babc..7a62d490ad0a 100644
>> --- a/drivers/gpio/gpio-tps65219.c
>> +++ b/drivers/gpio/gpio-tps65219.c
>> @@ -1,6 +1,6 @@
>>  // SPDX-License-Identifier: GPL-2.0
>>  /*
>> - * GPIO driver for TI TPS65215/TPS65219 PMICs
>> + * GPIO driver for TI TPS65214/TPS65215/TPS65219 PMICs
>>   *
>>   * Copyright (C) 2025 Texas Instruments Incorporated - http://www.ti.com/
>>   */
>> @@ -13,10 +13,15 @@
>>  #include <linux/regmap.h>
>>
>>  #define TPS65219_GPIO0_DIR_MASK                BIT(3)
>> +#define TPS65214_GPIO0_DIR_MASK                BIT(1)
>>  #define TPS6521X_GPIO0_OFFSET          2
>>  #define TPS6521X_GPIO0_IDX             0
>>
>>  /*
>> + * TPS65214 GPIO mapping
>> + * Linux gpio offset 0 -> GPIO (pin16) -> bit_offset 2
>> + * Linux gpio offset 1 -> GPO1 (pin9 ) -> bit_offset 0
>> + *
>>   * TPS65215 & TPS65219 GPIO mapping
>>   * Linux gpio offset 0 -> GPIO (pin16) -> bit_offset 2
>>   * Linux gpio offset 1 -> GPO1 (pin8 ) -> bit_offset 0
>> @@ -24,10 +29,26 @@
>>   */
>>
>>  struct tps65219_gpio {
>> +       int (*change_dir)(struct gpio_chip *gc, unsigned int offset, unsigned int dir);
>>         struct gpio_chip gpio_chip;
>>         struct tps65219 *tps;
>>  };
>>
>> +static int tps65214_gpio_get_direction(struct gpio_chip *gc, unsigned int offset)
>> +{
>> +       struct tps65219_gpio *gpio = gpiochip_get_data(gc);
>> +       int ret, val;
>> +
>> +       if (offset != TPS6521X_GPIO0_IDX)
>> +               return GPIO_LINE_DIRECTION_OUT;
>> +
>> +       ret = regmap_read(gpio->tps->regmap, TPS65219_REG_GENERAL_CONFIG, &val);
>> +       if (ret)
>> +               return ret;
>> +
>> +       return !(val & TPS65214_GPIO0_DIR_MASK);
>> +}
>> +
>>  static int tps65219_gpio_get_direction(struct gpio_chip *gc, unsigned int offset)
>>  {
>>         struct tps65219_gpio *gpio = gpiochip_get_data(gc);
>> @@ -119,6 +140,34 @@ static int tps65219_gpio_change_direction(struct gpio_chip *gc, unsigned int off
>>         return -ENOTSUPP;
>>  }
>>
>> +static int tps65214_gpio_change_direction(struct gpio_chip *gc, unsigned int offset,
>> +                                         unsigned int direction)
>> +{
>> +       struct tps65219_gpio *gpio = gpiochip_get_data(gc);
>> +       struct device *dev = gpio->tps->dev;
>> +       int val, ret;
>> +
>> +       /* Verified if GPIO or GPO in parent function
>> +        * Masked value: 0 = GPIO, 1 = VSEL
>> +        */
>> +       ret = regmap_read(gpio->tps->regmap, TPS65219_REG_MFP_1_CONFIG, &val);
>> +       if (ret)
>> +               return ret;
>> +
>> +       ret = !!(val & BIT(TPS65219_GPIO0_DIR_MASK));
>> +       if (ret)
>> +               dev_err(dev, "GPIO%d configured as VSEL, not GPIO\n", offset);
>> +
>> +       ret = regmap_update_bits(gpio->tps->regmap, TPS65219_REG_GENERAL_CONFIG,
>> +                                TPS65214_GPIO0_DIR_MASK, direction);
>> +       if (ret)
>> +               dev_err(dev,
>> +                       "Fail to change direction to %u for GPIO%d.\n",
>> +                       direction, offset);
>> +
>> +       return ret;
>> +}
>> +
>>  static int tps65219_gpio_direction_input(struct gpio_chip *gc, unsigned int offset)
>>  {
>>         struct tps65219_gpio *gpio = gpiochip_get_data(gc);
>> @@ -132,11 +181,13 @@ static int tps65219_gpio_direction_input(struct gpio_chip *gc, unsigned int offs
>>         if (tps65219_gpio_get_direction(gc, offset) == GPIO_LINE_DIRECTION_IN)
>>                 return 0;
>>
>> -       return tps65219_gpio_change_direction(gc, offset, GPIO_LINE_DIRECTION_IN);
>> +       return gpio->change_dir(gc, offset, GPIO_LINE_DIRECTION_IN);
>>  }
>>
>>  static int tps65219_gpio_direction_output(struct gpio_chip *gc, unsigned int offset, int value)
>>  {
>> +       struct tps65219_gpio *gpio = gpiochip_get_data(gc);
>> +
>>         tps65219_gpio_set(gc, offset, value);
>>         if (offset != TPS6521X_GPIO0_IDX)
>>                 return 0;
>> @@ -144,9 +195,22 @@ static int tps65219_gpio_direction_output(struct gpio_chip *gc, unsigned int off
>>         if (tps65219_gpio_get_direction(gc, offset) == GPIO_LINE_DIRECTION_OUT)
>>                 return 0;
>>
>> -       return tps65219_gpio_change_direction(gc, offset, GPIO_LINE_DIRECTION_OUT);
>> +       return gpio->change_dir(gc, offset, GPIO_LINE_DIRECTION_OUT);
>>  }
>>
>> +static const struct gpio_chip tps65214_template_chip = {
>> +       .label                  = "tps65214-gpio",
>> +       .owner                  = THIS_MODULE,
>> +       .get_direction          = tps65214_gpio_get_direction,
>> +       .direction_input        = tps65219_gpio_direction_input,
>> +       .direction_output       = tps65219_gpio_direction_output,
>> +       .get                    = tps65219_gpio_get,
>> +       .set                    = tps65219_gpio_set,
> Please use the set_rv() variant, regular set() is deprecated and will
> be removed soon.

Will revise this & submit v6 soon. Thanks for reviewing!

>> +       .base                   = -1,
>> +       .ngpio                  = 2,
>> +       .can_sleep              = true,
>> +};
>> +
>>  static const struct gpio_chip tps65219_template_chip = {
>>         .label                  = "tps65219-gpio",
>>         .owner                  = THIS_MODULE,
>> @@ -162,6 +226,7 @@ static const struct gpio_chip tps65219_template_chip = {
>>
>>  static int tps65219_gpio_probe(struct platform_device *pdev)
>>  {
>> +       enum pmic_id chip = platform_get_device_id(pdev)->driver_data;
>>         struct tps65219 *tps = dev_get_drvdata(pdev->dev.parent);
>>         struct tps65219_gpio *gpio;
>>
>> @@ -169,22 +234,38 @@ static int tps65219_gpio_probe(struct platform_device *pdev)
>>         if (!gpio)
>>                 return -ENOMEM;
>>
>> +       if (chip == TPS65214) {
>> +               gpio->gpio_chip = tps65214_template_chip;
>> +               gpio->change_dir = tps65214_gpio_change_direction;
>> +       } else if (chip == TPS65219) {
>> +               gpio->gpio_chip = tps65219_template_chip;
>> +               gpio->change_dir = tps65219_gpio_change_direction;
>> +       } else {
>> +               return -ENODATA;
>> +       }
>> +
>>         gpio->tps = tps;
>> -       gpio->gpio_chip = tps65219_template_chip;
>>         gpio->gpio_chip.parent = tps->dev;
>>
>>         return devm_gpiochip_add_data(&pdev->dev, &gpio->gpio_chip, gpio);
>>  }
>>
>> +static const struct platform_device_id tps6521x_gpio_id_table[] = {
>> +       { "tps65214-gpio", TPS65214 },
>> +       { "tps65219-gpio", TPS65219 },
>> +       { /* sentinel */ }
>> +};
>> +MODULE_DEVICE_TABLE(platform, tps6521x_gpio_id_table);
>> +
>>  static struct platform_driver tps65219_gpio_driver = {
>>         .driver = {
>>                 .name = "tps65219-gpio",
>>         },
>>         .probe = tps65219_gpio_probe,
>> +       .id_table = tps6521x_gpio_id_table,
>>  };
>>  module_platform_driver(tps65219_gpio_driver);
>>
>> -MODULE_ALIAS("platform:tps65219-gpio");
>>  MODULE_AUTHOR("Jonathan Cormier <jcormier@criticallink.com>");
>> -MODULE_DESCRIPTION("TPS65215/TPS65219 GPIO driver");
>> +MODULE_DESCRIPTION("TPS65214/TPS65215/TPS65219 GPIO driver");
>>  MODULE_LICENSE("GPL");
>> --
>> 2.43.0
>>
>>
> Bartosz

^ permalink raw reply	[flat|nested] 9+ messages in thread

* Re: [PATCH v5 1/2] gpio: tps65219: Update _IDX & _OFFSET macro prefix
  2025-07-03  9:51   ` Bartosz Golaszewski
@ 2025-07-03 16:08     ` Shree Ramamoorthy
  0 siblings, 0 replies; 9+ messages in thread
From: Shree Ramamoorthy @ 2025-07-03 16:08 UTC (permalink / raw)
  To: Bartosz Golaszewski
  Cc: aaro.koskinen, andreas, khilman, rogerq, tony, linus.walleij,
	linux-omap, linux-kernel, linux-gpio, m-leonard, praneeth,
	jcormier

On 7/3/2025 4:51 AM, Bartosz Golaszewski wrote:
> On Wed, Jul 2, 2025 at 6:51 PM Shree Ramamoorthy <s-ramamoorthy@ti.com> wrote:
>> TPS65215 and TPS65219 are overlapping PMIC devices. While their regulator
>> features differe, the GPIO features are the same. In the TPS65219 MFD
>> driver, the 2 PMICs share the same "tps65219-gpio" compatible string to
>> limit support for TPS65215 in this GPIO driver to comments.
>>
>> The TPS6521X_GPIO0_IDX and TPS6521X_GPIO0_OFFSET macro name prefixes are
>> updated to indicate these macros apply to both PMICs.
>>
>> Signed-off-by: Shree Ramamoorthy <s-ramamoorthy@ti.com>
>> Reviewed-by: Roger Quadros <rogerq@kernel.org>
>> Acked-by: Linus Walleij <linus.walleij@linaro.org>
>> ---
>>  drivers/gpio/gpio-tps65219.c | 27 +++++++++++++++++----------
>>  1 file changed, 17 insertions(+), 10 deletions(-)
>>
>> diff --git a/drivers/gpio/gpio-tps65219.c b/drivers/gpio/gpio-tps65219.c
>> index 526640c39a11..3c762103babc 100644
>> --- a/drivers/gpio/gpio-tps65219.c
>> +++ b/drivers/gpio/gpio-tps65219.c
>> @@ -1,8 +1,8 @@
>>  // SPDX-License-Identifier: GPL-2.0
>>  /*
>> - * GPIO driver for TI TPS65219 PMICs
>> + * GPIO driver for TI TPS65215/TPS65219 PMICs
>>   *
>> - * Copyright (C) 2022 Texas Instruments Incorporated - http://www.ti.com/
>> + * Copyright (C) 2025 Texas Instruments Incorporated - http://www.ti.com/
> Should be 2022,2025.

Will consolidate the copyright years, thanks!

>
> Bart

^ permalink raw reply	[flat|nested] 9+ messages in thread

end of thread, other threads:[~2025-07-03 16:08 UTC | newest]

Thread overview: 9+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2025-07-02 16:49 [PATCH v5 0/2] Add TI TPS65214 PMIC GPIO Support Shree Ramamoorthy
2025-07-02 16:49 ` [PATCH v5 1/2] gpio: tps65219: Update _IDX & _OFFSET macro prefix Shree Ramamoorthy
2025-07-03  9:51   ` Bartosz Golaszewski
2025-07-03 16:08     ` Shree Ramamoorthy
2025-07-03 13:36   ` Jon Cormier
2025-07-02 16:49 ` [PATCH v5 2/2] gpio: tps65219: Add support for TI TPS65214 PMIC Shree Ramamoorthy
2025-07-03  9:54   ` Bartosz Golaszewski
2025-07-03 16:07     ` Shree Ramamoorthy
2025-07-03 13:39   ` Jon Cormier

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).