Add device-specific structs to select the different PMIC .npgio and .offset
values. With the chip_data struct values selected based on the match data,
having a separate GPIO0_OFFSET macro is no longer needed.
Signed-off-by: Shree Ramamoorthy <s-ramamoorthy@ti.com>
---
drivers/gpio/gpio-tps65219.c | 28 ++++++++++++++++++++++++----
1 file changed, 24 insertions(+), 4 deletions(-)
diff --git a/drivers/gpio/gpio-tps65219.c b/drivers/gpio/gpio-tps65219.c
index 70a4410c473a..f2d8fd65d422 100644
--- a/drivers/gpio/gpio-tps65219.c
+++ b/drivers/gpio/gpio-tps65219.c
@@ -13,7 +13,6 @@
#include <linux/regmap.h>
#define TPS65219_GPIO0_DIR_MASK BIT(3)
-#define TPS65219_GPIO0_OFFSET 2
#define TPS6521X_GPIO0_IDX 0
struct tps65219_gpio {
@@ -21,6 +20,11 @@ struct tps65219_gpio {
struct tps65219 *tps;
};
+struct tps65219_chip_data {
+ int ngpio;
+ int offset;
+};
+
static int tps65219_gpio_get_direction(struct gpio_chip *gc, unsigned int offset)
{
struct tps65219_gpio *gpio = gpiochip_get_data(gc);
@@ -71,7 +75,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 == TPS6521X_GPIO0_IDX) ? TPS65219_GPIO0_OFFSET : offset - 1;
+ bit = (offset == TPS6521X_GPIO0_IDX) ? (gpio->gpio_chip.offset - 1) : offset - 1;
mask = BIT(bit);
v = value ? mask : 0;
@@ -148,14 +152,28 @@ static const struct gpio_chip tps65219_template_chip = {
.get = tps65219_gpio_get,
.set = tps65219_gpio_set,
.base = -1,
- .ngpio = 3,
.can_sleep = true,
};
+static const struct tps65219_chip_data chip_info_table[] = {
+ [TPS65215] = {
+ .ngpio = 2,
+ .offset = 1,
+ },
+ [TPS65219] = {
+ .ngpio = 3,
+ .offset = 2,
+ },
+};
+
static int tps65219_gpio_probe(struct platform_device *pdev)
{
- struct tps65219 *tps = dev_get_drvdata(pdev->dev.parent);
struct tps65219_gpio *gpio;
+ const struct tps65219_chip_data *pmic;
+
+ struct tps65219 *tps = dev_get_drvdata(pdev->dev.parent);
+ enum pmic_id chip = platform_get_device_id(pdev)->driver_data;
+ pmic = &chip_info_table[chip];
gpio = devm_kzalloc(&pdev->dev, sizeof(*gpio), GFP_KERNEL);
if (!gpio)
@@ -164,6 +182,8 @@ static int tps65219_gpio_probe(struct platform_device *pdev)
gpio->tps = tps;
gpio->gpio_chip = tps65219_template_chip;
gpio->gpio_chip.label = dev_name(&pdev->dev);
+ gpio->gpio_chip.ngpio = pmic->ngpio;
+ gpio->gpio_chip.offset = pmic->offset;
gpio->gpio_chip.parent = tps->dev;
return devm_gpiochip_add_data(&pdev->dev, &gpio->gpio_chip, gpio);
--
2.43.0
Hi Shree,
kernel test robot noticed the following build errors:
[auto build test ERROR on next-20250113]
[cannot apply to tmlind-omap/for-next v6.13-rc7 v6.13-rc6 v6.13-rc5 linus/master v6.13-rc7]
[If your patch is applied to the wrong git tree, kindly drop us a note.
And when submitting patch, we suggest to use '--base' as documented in
https://git-scm.com/docs/git-format-patch#_base_tree_information]
url: https://github.com/intel-lab-lkp/linux/commits/Shree-Ramamoorthy/gpio-tps65215-Add-TPS65215-to-platform_device_id-table/20250114-065813
base: next-20250113
patch link: https://lore.kernel.org/r/20250113225530.124213-4-s-ramamoorthy%40ti.com
patch subject: [PATCH v3 3/3] gpio tps65215: Add support for varying gpio/offset values
config: i386-randconfig-004-20250117 (https://download.01.org/0day-ci/archive/20250118/202501180331.d5V1SdDH-lkp@intel.com/config)
compiler: clang version 19.1.3 (https://github.com/llvm/llvm-project ab51eccf88f5321e7c60591c5546b254b6afab99)
reproduce (this is a W=1 build): (https://download.01.org/0day-ci/archive/20250118/202501180331.d5V1SdDH-lkp@intel.com/reproduce)
If you fix the issue in a separate patch/commit (i.e. not just a new version of
the same patch/commit), kindly add following tags
| Reported-by: kernel test robot <lkp@intel.com>
| Closes: https://lore.kernel.org/oe-kbuild-all/202501180331.d5V1SdDH-lkp@intel.com/
All errors (new ones prefixed by >>):
drivers/gpio/gpio-tps65219.c:159:3: error: use of undeclared identifier 'TPS65215'
159 | [TPS65215] = {
| ^
>> drivers/gpio/gpio-tps65219.c:175:15: error: variable has incomplete type 'enum pmic_id'
175 | enum pmic_id chip = platform_get_device_id(pdev)->driver_data;
| ^
drivers/gpio/gpio-tps65219.c:175:7: note: forward declaration of 'enum pmic_id'
175 | enum pmic_id chip = platform_get_device_id(pdev)->driver_data;
| ^
drivers/gpio/gpio-tps65219.c:193:21: error: use of undeclared identifier 'TPS65215'
193 | { "tps65215-gpio", TPS65215 },
| ^
drivers/gpio/gpio-tps65219.c:197:1: error: definition of variable with array type needs an explicit size or an initializer
197 | MODULE_DEVICE_TABLE(platform, tps6521x_gpio_id_table);
| ^
include/linux/module.h:250:21: note: expanded from macro 'MODULE_DEVICE_TABLE'
250 | extern typeof(name) __mod_device_table__##type##__##name \
| ^
<scratch space>:249:1: note: expanded from here
249 | __mod_device_table__platform__tps6521x_gpio_id_table
| ^
4 errors generated.
vim +175 drivers/gpio/gpio-tps65219.c
168
169 static int tps65219_gpio_probe(struct platform_device *pdev)
170 {
171 struct tps65219_gpio *gpio;
172 const struct tps65219_chip_data *pmic;
173
174 struct tps65219 *tps = dev_get_drvdata(pdev->dev.parent);
> 175 enum pmic_id chip = platform_get_device_id(pdev)->driver_data;
176 pmic = &chip_info_table[chip];
177
178 gpio = devm_kzalloc(&pdev->dev, sizeof(*gpio), GFP_KERNEL);
179 if (!gpio)
180 return -ENOMEM;
181
182 gpio->tps = tps;
183 gpio->gpio_chip = tps65219_template_chip;
184 gpio->gpio_chip.label = dev_name(&pdev->dev);
185 gpio->gpio_chip.ngpio = pmic->ngpio;
186 gpio->gpio_chip.offset = pmic->offset;
187 gpio->gpio_chip.parent = tps->dev;
188
189 return devm_gpiochip_add_data(&pdev->dev, &gpio->gpio_chip, gpio);
190 }
191
--
0-DAY CI Kernel Test Service
https://github.com/intel/lkp-tests/wiki
© 2016 - 2025 Red Hat, Inc.