* Re: [PATCH 5/8] gpio: max7360: Add MAX7360 gpio support
@ 2024-12-22 22:12 kernel test robot
0 siblings, 0 replies; 4+ messages in thread
From: kernel test robot @ 2024-12-22 22:12 UTC (permalink / raw)
To: oe-kbuild; +Cc: lkp, Dan Carpenter
BCC: lkp@intel.com
CC: oe-kbuild-all@lists.linux.dev
In-Reply-To: <20241219-mdb-max7360-support-v1-5-8e8317584121@bootlin.com>
References: <20241219-mdb-max7360-support-v1-5-8e8317584121@bootlin.com>
TO: "Mathieu Dubois-Briand" <mathieu.dubois-briand@bootlin.com>
TO: Lee Jones <lee@kernel.org>
TO: Rob Herring <robh@kernel.org>
TO: Krzysztof Kozlowski <krzk@kernel.org>
TO: Conor Dooley <conor+dt@kernel.org>
TO: Kamel Bouhara <kamel.bouhara@bootlin.com>
TO: Linus Walleij <linus.walleij@linaro.org>
TO: Bartosz Golaszewski <brgl@bgdev.pl>
TO: Dmitry Torokhov <dmitry.torokhov@gmail.com>
TO: "Uwe Kleine-König" <ukleinek@kernel.org>
CC: devicetree@vger.kernel.org
CC: linux-kernel@vger.kernel.org
CC: linux-gpio@vger.kernel.org
CC: linux-input@vger.kernel.org
CC: linux-pwm@vger.kernel.org
CC: "Grégory Clement" <gregory.clement@bootlin.com>
CC: Thomas Petazzoni <thomas.petazzoni@bootlin.com>
CC: "Mathieu Dubois-Briand" <mathieu.dubois-briand@bootlin.com>
Hi Mathieu,
kernel test robot noticed the following build warnings:
[auto build test WARNING on 78d4f34e2115b517bcbfe7ec0d018bbbb6f9b0b8]
url: https://github.com/intel-lab-lkp/linux/commits/Mathieu-Dubois-Briand/dt-bindings-Add-MAX7360-MFD-device/20241220-002541
base: 78d4f34e2115b517bcbfe7ec0d018bbbb6f9b0b8
patch link: https://lore.kernel.org/r/20241219-mdb-max7360-support-v1-5-8e8317584121%40bootlin.com
patch subject: [PATCH 5/8] gpio: max7360: Add MAX7360 gpio support
:::::: branch date: 3 days ago
:::::: commit date: 3 days ago
config: loongarch-randconfig-r071-20241222 (https://download.01.org/0day-ci/archive/20241223/202412230526.xbsyoRYK-lkp@intel.com/config)
compiler: loongarch64-linux-gcc (GCC) 14.2.0
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>
| Reported-by: Dan Carpenter <error27@gmail.com>
| Closes: https://lore.kernel.org/r/202412230526.xbsyoRYK-lkp@intel.com/
smatch warnings:
drivers/gpio/gpio-max7360.c:56 max7360_gpio_set_value() error: uninitialized symbol 'val'.
drivers/gpio/gpio-max7360.c:388 max7360_gpio_probe() warn: inconsistent indenting
vim +/val +56 drivers/gpio/gpio-max7360.c
19f89f1d3446db Mathieu Dubois-Briand 2024-12-19 37
19f89f1d3446db Mathieu Dubois-Briand 2024-12-19 38 static void max7360_gpio_set_value(struct gpio_chip *gc,
19f89f1d3446db Mathieu Dubois-Briand 2024-12-19 39 unsigned int pin, int state)
19f89f1d3446db Mathieu Dubois-Briand 2024-12-19 40 {
19f89f1d3446db Mathieu Dubois-Briand 2024-12-19 41 struct max7360_gpio *max7360_gpio = gpiochip_get_data(gc);
19f89f1d3446db Mathieu Dubois-Briand 2024-12-19 42 unsigned int val;
19f89f1d3446db Mathieu Dubois-Briand 2024-12-19 43 int ret;
19f89f1d3446db Mathieu Dubois-Briand 2024-12-19 44
19f89f1d3446db Mathieu Dubois-Briand 2024-12-19 45 if (max7360_gpio->gpio_function == MAX7360_GPIO_COL) {
19f89f1d3446db Mathieu Dubois-Briand 2024-12-19 46 int off = MAX7360_MAX_GPIO - (gc->ngpio - pin);
19f89f1d3446db Mathieu Dubois-Briand 2024-12-19 47
19f89f1d3446db Mathieu Dubois-Briand 2024-12-19 48 ret = regmap_write_bits(max7360_gpio->regmap, MAX7360_REG_PORTS,
19f89f1d3446db Mathieu Dubois-Briand 2024-12-19 49 BIT(off), state ? BIT(off) : 0);
19f89f1d3446db Mathieu Dubois-Briand 2024-12-19 50 } else {
19f89f1d3446db Mathieu Dubois-Briand 2024-12-19 51 ret = regmap_write(max7360_gpio->regmap,
19f89f1d3446db Mathieu Dubois-Briand 2024-12-19 52 MAX7360_REG_PWMBASE + pin, state ? 0xFF : 0);
19f89f1d3446db Mathieu Dubois-Briand 2024-12-19 53 }
19f89f1d3446db Mathieu Dubois-Briand 2024-12-19 54
19f89f1d3446db Mathieu Dubois-Briand 2024-12-19 55 if (ret)
19f89f1d3446db Mathieu Dubois-Briand 2024-12-19 @56 dev_err(max7360_gpio->dev,
19f89f1d3446db Mathieu Dubois-Briand 2024-12-19 57 "failed to set value %d on gpio-%d", val, pin);
19f89f1d3446db Mathieu Dubois-Briand 2024-12-19 58 }
19f89f1d3446db Mathieu Dubois-Briand 2024-12-19 59
--
0-DAY CI Kernel Test Service
https://github.com/intel/lkp-tests/wiki
^ permalink raw reply [flat|nested] 4+ messages in thread* [PATCH 0/8] Add support for MAX7360 multifunction device
@ 2024-12-19 16:21 Mathieu Dubois-Briand
2024-12-19 16:21 ` [PATCH 5/8] gpio: max7360: Add MAX7360 gpio support Mathieu Dubois-Briand
0 siblings, 1 reply; 4+ messages in thread
From: Mathieu Dubois-Briand @ 2024-12-19 16:21 UTC (permalink / raw)
To: Lee Jones, Rob Herring, Krzysztof Kozlowski, Conor Dooley,
Kamel Bouhara, Linus Walleij, Bartosz Golaszewski,
Dmitry Torokhov, Uwe Kleine-König
Cc: devicetree, linux-kernel, linux-gpio, linux-input, linux-pwm,
Grégory Clement, Thomas Petazzoni, Mathieu Dubois-Briand
This series implements a set of drivers allowing to support the Maxim
Integrated MAX7360 device.
The MAX7360 is an I2C key-switch and led controller, with following
functionalities:
- Keypad controller for a key matrix of up to 8 rows and 8 columns.
- Rotary encoder support, for a single rotary encoder.
- Up to 8 PWM outputs.
- Up to 8 GPIOs with support for interrupts and 6 GPOs.
Chipset pins are shared between all functionalities, so all cannot be
used at the same time.
Signed-off-by: Mathieu Dubois-Briand <mathieu.dubois-briand@bootlin.com>
---
Kamel Bouhara (2):
mfd: Add max7360 support
pwm: max7360: Add MAX7360 PWM support
Mathieu Dubois-Briand (6):
dt-bindings: Add MAX7360 MFD device
dt-bindings: Add MAX7360 subdevices
gpio: max7360: Add MAX7360 gpio support
input: keyboard: Add support for MAX7360 keypad
input: misc: Add support for MAX7360 rotary
MAINTAINERS: Add entry on MAX7360 driver
.../devicetree/bindings/gpio/max7360-gpio.yaml | 96 +++++
.../devicetree/bindings/input/max7360-keypad.yaml | 67 +++
.../devicetree/bindings/input/max7360-rotary.yaml | 52 +++
Documentation/devicetree/bindings/mfd/max7360.yaml | 56 +++
.../devicetree/bindings/pwm/max7360-pwm.yaml | 35 ++
MAINTAINERS | 12 +
drivers/gpio/Kconfig | 11 +
drivers/gpio/Makefile | 1 +
drivers/gpio/gpio-max7360.c | 453 +++++++++++++++++++++
drivers/input/keyboard/Kconfig | 12 +
drivers/input/keyboard/Makefile | 1 +
drivers/input/keyboard/max7360-keypad.c | 297 ++++++++++++++
drivers/input/misc/Kconfig | 11 +
drivers/input/misc/Makefile | 1 +
drivers/input/misc/max7360-rotary.c | 194 +++++++++
drivers/mfd/Kconfig | 12 +
drivers/mfd/Makefile | 1 +
drivers/mfd/max7360.c | 302 ++++++++++++++
drivers/pwm/Kconfig | 11 +
drivers/pwm/Makefile | 1 +
drivers/pwm/pwm-max7360.c | 173 ++++++++
include/linux/mfd/max7360.h | 103 +++++
22 files changed, 1902 insertions(+)
---
base-commit: 78d4f34e2115b517bcbfe7ec0d018bbbb6f9b0b8
change-id: 20241219-mdb-max7360-support-223a8ce45ba3
Best regards,
--
Mathieu Dubois-Briand <mathieu.dubois-briand@bootlin.com>
^ permalink raw reply [flat|nested] 4+ messages in thread* [PATCH 5/8] gpio: max7360: Add MAX7360 gpio support 2024-12-19 16:21 [PATCH 0/8] Add support for MAX7360 multifunction device Mathieu Dubois-Briand @ 2024-12-19 16:21 ` Mathieu Dubois-Briand 2024-12-20 15:54 ` kernel test robot 2024-12-20 16:39 ` kernel test robot 0 siblings, 2 replies; 4+ messages in thread From: Mathieu Dubois-Briand @ 2024-12-19 16:21 UTC (permalink / raw) To: Lee Jones, Rob Herring, Krzysztof Kozlowski, Conor Dooley, Kamel Bouhara, Linus Walleij, Bartosz Golaszewski, Dmitry Torokhov, Uwe Kleine-König Cc: devicetree, linux-kernel, linux-gpio, linux-input, linux-pwm, Grégory Clement, Thomas Petazzoni, Mathieu Dubois-Briand Add driver for Maxim Integrated MAX7360 GPIO/GPO controller. Two sets of GPIOs are provided by the device: - Up to 8 GPIOs, shared with the PWM and rotary encoder functionalities. These GPIOs also provide interrupts on input changes. - Up to 6 GPOs, on unused keypad columns pins. Co-developed-by: Kamel Bouhara <kamel.bouhara@bootlin.com> Signed-off-by: Kamel Bouhara <kamel.bouhara@bootlin.com> Signed-off-by: Mathieu Dubois-Briand <mathieu.dubois-briand@bootlin.com> --- drivers/gpio/Kconfig | 11 ++ drivers/gpio/Makefile | 1 + drivers/gpio/gpio-max7360.c | 453 ++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 465 insertions(+) diff --git a/drivers/gpio/Kconfig b/drivers/gpio/Kconfig index 93ee3aa092f8..efe07e21c442 100644 --- a/drivers/gpio/Kconfig +++ b/drivers/gpio/Kconfig @@ -1444,6 +1444,17 @@ config GPIO_MADERA help Support for GPIOs on Cirrus Logic Madera class codecs. +config GPIO_MAX7360 + tristate "MAX7360 GPIO support" + depends on MFD_MAX7360 + depends on OF_GPIO + help + Allows to use MAX7360 I/O Expander PWM lines as GPIO and keypad COL + lines as GPO. + + This driver can also be built as a module. If so, the module will be + called gpio-max7360. + config GPIO_MAX77620 tristate "GPIO support for PMIC MAX77620 and MAX20024" depends on MFD_MAX77620 diff --git a/drivers/gpio/Makefile b/drivers/gpio/Makefile index af3ba4d81b58..581341b3e3e4 100644 --- a/drivers/gpio/Makefile +++ b/drivers/gpio/Makefile @@ -100,6 +100,7 @@ obj-$(CONFIG_GPIO_MAX7300) += gpio-max7300.o obj-$(CONFIG_GPIO_MAX7301) += gpio-max7301.o obj-$(CONFIG_GPIO_MAX730X) += gpio-max730x.o obj-$(CONFIG_GPIO_MAX732X) += gpio-max732x.o +obj-$(CONFIG_GPIO_MAX7360) += gpio-max7360.o obj-$(CONFIG_GPIO_MAX77620) += gpio-max77620.o obj-$(CONFIG_GPIO_MAX77650) += gpio-max77650.o obj-$(CONFIG_GPIO_MB86S7X) += gpio-mb86s7x.o diff --git a/drivers/gpio/gpio-max7360.c b/drivers/gpio/gpio-max7360.c new file mode 100644 index 000000000000..0e587aa53cf8 --- /dev/null +++ b/drivers/gpio/gpio-max7360.c @@ -0,0 +1,453 @@ +// SPDX-License-Identifier: GPL-2.0-only +/* + * Copyright 2024 Bootlin + * + * Author: Kamel BOUHARA <kamel.bouhara@bootlin.com> + * Author: Mathieu Dubois-Briand <mathieu.dubois-briand@bootlin.com> + */ + +#include <linux/gpio/consumer.h> +#include <linux/gpio/driver.h> +#include <linux/init.h> +#include <linux/interrupt.h> +#include <linux/mfd/max7360.h> +#include <linux/module.h> +#include <linux/of.h> +#include <linux/platform_device.h> +#include <linux/regmap.h> +#include <linux/slab.h> + +#define MAX7360_GPIO_PORT 1 +#define MAX7360_GPIO_COL 2 + +struct max7360_gpio { + struct gpio_chip chip; + struct device *dev; + struct regmap *regmap; + int gpio_function; + + /* + * Interrupts handling data: only used when gpio_function is + * MAX7360_GPIO_PORT. + */ + u8 masked_interrupts; + u8 in_values; + unsigned int irq_types[MAX7360_MAX_GPIO]; +}; + +static void max7360_gpio_set_value(struct gpio_chip *gc, + unsigned int pin, int state) +{ + struct max7360_gpio *max7360_gpio = gpiochip_get_data(gc); + unsigned int val; + int ret; + + if (max7360_gpio->gpio_function == MAX7360_GPIO_COL) { + int off = MAX7360_MAX_GPIO - (gc->ngpio - pin); + + ret = regmap_write_bits(max7360_gpio->regmap, MAX7360_REG_PORTS, + BIT(off), state ? BIT(off) : 0); + } else { + ret = regmap_write(max7360_gpio->regmap, + MAX7360_REG_PWMBASE + pin, state ? 0xFF : 0); + } + + if (ret) + dev_err(max7360_gpio->dev, + "failed to set value %d on gpio-%d", val, pin); +} + +static int max7360_gpio_get_value(struct gpio_chip *gc, unsigned int pin) +{ + struct max7360_gpio *max7360_gpio = gpiochip_get_data(gc); + unsigned int val; + int off; + int ret; + + if (max7360_gpio->gpio_function == MAX7360_GPIO_COL) { + off = MAX7360_MAX_GPIO - (gc->ngpio - pin); + + ret = regmap_read(max7360_gpio->regmap, MAX7360_REG_PORTS, &val); + } else { + off = pin; + ret = regmap_read(max7360_gpio->regmap, MAX7360_REG_GPIOIN, &val); + } + + if (ret) { + dev_err(max7360_gpio->dev, "failed to read gpio-%d", pin); + return ret; + } + + return !!(val & BIT(off)); +} + +static int max7360_gpio_get_direction(struct gpio_chip *gc, unsigned int pin) +{ + struct max7360_gpio *max7360_gpio = gpiochip_get_data(gc); + unsigned int val; + int ret; + + if (max7360_gpio->gpio_function == MAX7360_GPIO_COL) + return GPIO_LINE_DIRECTION_OUT; + + ret = regmap_read(max7360_gpio->regmap, MAX7360_REG_GPIOCTRL, &val); + if (ret) { + dev_err(max7360_gpio->dev, "failed to read gpio-%d direction", + pin); + return ret; + } + + if (val & BIT(pin)) + return GPIO_LINE_DIRECTION_OUT; + + return GPIO_LINE_DIRECTION_IN; +} + +static int max7360_gpio_direction_input(struct gpio_chip *gc, unsigned int pin) +{ + struct max7360_gpio *max7360_gpio = gpiochip_get_data(gc); + int ret; + + if (max7360_gpio->gpio_function == MAX7360_GPIO_COL) + return -EIO; + + ret = regmap_write_bits(max7360_gpio->regmap, MAX7360_REG_GPIOCTRL, + BIT(pin), 0); + if (ret) { + dev_err(max7360_gpio->dev, "failed to set gpio-%d direction", + pin); + return ret; + } + + return 0; +} + +static int max7360_gpio_direction_output(struct gpio_chip *gc, unsigned int pin, + int state) +{ + struct max7360_gpio *max7360_gpio = gpiochip_get_data(gc); + int ret; + + if (max7360_gpio->gpio_function == MAX7360_GPIO_PORT) { + ret = regmap_write_bits(max7360_gpio->regmap, + MAX7360_REG_GPIOCTRL, BIT(pin), + BIT(pin)); + if (ret) { + dev_err(max7360_gpio->dev, + "failed to set gpio-%d direction", pin); + return ret; + } + } + + max7360_gpio_set_value(gc, pin, state); + + return 0; +} + +static int max7360_gpio_request(struct gpio_chip *gc, unsigned int pin) +{ + struct max7360_gpio *max7360_gpio = gpiochip_get_data(gc); + + /* + * GPOs on COL pins (keypad columns) can always be requested: this + * driver has full access to them, up to the number set in chip.ngpio. + * GPIOs on PORT pins are shared with the PWM and rotary encoder + * drivers: they have to be requested from the MFD driver. + */ + if (max7360_gpio->gpio_function == MAX7360_GPIO_COL) + return 0; + + return max7360_port_pin_request(max7360_gpio->dev->parent, pin, true); +} + +static void max7360_gpio_free(struct gpio_chip *gc, unsigned int pin) +{ + struct max7360_gpio *max7360_gpio = gpiochip_get_data(gc); + + if (max7360_gpio->gpio_function == MAX7360_GPIO_COL) + return; + + max7360_port_pin_request(max7360_gpio->dev->parent, pin, false); +} + +static struct gpio_chip max7360_gpio_chip = { + .label = "max7360", + .request = max7360_gpio_request, + .free = max7360_gpio_free, + .get_direction = max7360_gpio_get_direction, + .direction_input = max7360_gpio_direction_input, + .direction_output = max7360_gpio_direction_output, + .get = max7360_gpio_get_value, + .set = max7360_gpio_set_value, + .base = -1, + .can_sleep = true, +}; + +static irqreturn_t max7360_gpio_irq(int irq, void *data) +{ + struct max7360_gpio *max7360_gpio = data; + unsigned long pending; + unsigned int gpio_irq; + unsigned int type; + unsigned int count = 0; + int val; + int irqn; + int ret; + + ret = regmap_read(max7360_gpio->regmap, MAX7360_REG_GPIOIN, &val); + if (ret) { + dev_err(max7360_gpio->dev, "Failed to read gpio values: %d\n", + ret); + return IRQ_NONE; + } + + /* MAX7360 generates interrupts but does not report which pins changed: + * compare the pin value with the value they had in previous interrupt + * and report interrupt if the change match the set IRQ type. + */ + pending = val ^ max7360_gpio->in_values; + for_each_set_bit(irqn, &pending, max7360_gpio->chip.ngpio) { + type = max7360_gpio->irq_types[irqn]; + if (max7360_gpio->masked_interrupts & BIT(irqn)) + continue; + if ((val & BIT(irqn)) && type == IRQ_TYPE_EDGE_FALLING) + continue; + if (!(val & BIT(irqn)) && type == IRQ_TYPE_EDGE_RISING) + continue; + gpio_irq = irq_find_mapping(max7360_gpio->chip.irq.domain, irqn); + handle_nested_irq(gpio_irq); + count++; + } + + max7360_gpio->in_values = val; + + if (count == 0) + return IRQ_NONE; + + return IRQ_HANDLED; +} + +static void max7360_gpio_irq_unmask(struct irq_data *data) +{ + struct max7360_gpio *max7360_gpio; + unsigned int pin = irqd_to_hwirq(data); + unsigned int val; + int ret; + + max7360_gpio = gpiochip_get_data(irq_data_get_irq_chip_data(data)); + + /* Read current pin value, so we know if the pin changed in the next + * interrupt. + * No lock should be needed regarding the interrupt handler: as long as + * the corresponding bit has not been cleared in masked_interrupts, this + * gpio is ignored. + */ + ret = regmap_read(max7360_gpio->regmap, MAX7360_REG_GPIOIN, &val); + if (ret) + dev_err(max7360_gpio->dev, "Failed to read gpio values: %d\n", + ret); + + max7360_gpio->in_values &= ~BIT(pin); + max7360_gpio->in_values |= val & BIT(pin); + + ret = regmap_write_bits(max7360_gpio->regmap, MAX7360_REG_PWMCFG + pin, + MAX7360_PORT_CFG_INTERRUPT_MASK, 0); + + if (ret) + dev_err(max7360_gpio->dev, "failed to unmask gpio-%d", pin); + + max7360_gpio->masked_interrupts &= ~BIT(pin); +} + +static void max7360_gpio_irq_mask(struct irq_data *data) +{ + struct max7360_gpio *max7360_gpio; + unsigned int pin = irqd_to_hwirq(data); + int ret; + + max7360_gpio = gpiochip_get_data(irq_data_get_irq_chip_data(data)); + + max7360_gpio->masked_interrupts |= BIT(pin); + + ret = regmap_write_bits(max7360_gpio->regmap, MAX7360_REG_PWMCFG + pin, + MAX7360_PORT_CFG_INTERRUPT_MASK, + MAX7360_PORT_CFG_INTERRUPT_MASK); + + if (ret) + dev_err(max7360_gpio->dev, "failed to mask gpio-%d", pin); +} + +static void max7360_gpio_irq_enable(struct irq_data *data) +{ + max7360_gpio_irq_unmask(data); +} + +static void max7360_gpio_irq_disable(struct irq_data *data) +{ + max7360_gpio_irq_mask(data); +} + +static int max7360_gpio_irq_set_type(struct irq_data *data, + unsigned int flow_type) +{ + struct max7360_gpio *max7360_gpio; + unsigned int pin; + unsigned int val; + int ret; + + pin = irqd_to_hwirq(data); + max7360_gpio = gpiochip_get_data(irq_data_get_irq_chip_data(data)); + + switch (flow_type) { + case IRQ_TYPE_EDGE_RISING: + val = 0; + break; + case IRQ_TYPE_EDGE_FALLING: + case IRQ_TYPE_EDGE_BOTH: + val = MAX7360_PORT_CFG_INTERRUPT_EDGES; + break; + default: + return -EINVAL; + } + ret = regmap_write_bits(max7360_gpio->regmap, MAX7360_REG_PWMCFG + pin, + MAX7360_PORT_CFG_INTERRUPT_EDGES, val); + + if (ret) + dev_err(max7360_gpio->dev, "failed to unmask gpio-%d", pin); + + max7360_gpio->irq_types[pin] = flow_type; + + return 0; +} + +static const struct irq_chip max7360_gpio_irqchip = { + .name = "max7360", + .irq_enable = max7360_gpio_irq_enable, + .irq_disable = max7360_gpio_irq_disable, + .irq_mask = max7360_gpio_irq_mask, + .irq_unmask = max7360_gpio_irq_unmask, + .irq_set_type = max7360_gpio_irq_set_type, + .flags = IRQCHIP_IMMUTABLE, + GPIOCHIP_IRQ_RESOURCE_HELPERS, +}; + +static int max7360_gpio_probe(struct platform_device *pdev) +{ + struct max7360_gpio *max7360_gpio; + unsigned int ngpios; + unsigned int outconf; + struct gpio_irq_chip *girq; + unsigned long flags; + int irq; + int ret; + + if (!pdev->dev.parent) { + dev_err(&pdev->dev, "no parent device\n"); + return -ENODEV; + } + + max7360_gpio = devm_kzalloc(&pdev->dev, sizeof(struct max7360_gpio), + GFP_KERNEL); + if (!max7360_gpio) + return -ENOMEM; + + if (of_property_read_u32(pdev->dev.of_node, "ngpios", &ngpios)) { + dev_err(&pdev->dev, "Missing ngpios OF property\n"); + return -ENODEV; + } + + max7360_gpio->regmap = dev_get_regmap(pdev->dev.parent, NULL); + if (!max7360_gpio->regmap) { + dev_err(&pdev->dev, "could not get parent regmap\n"); + return -ENODEV; + } + + max7360_gpio->dev = &pdev->dev; + max7360_gpio->chip = max7360_gpio_chip; + max7360_gpio->chip.ngpio = ngpios; + max7360_gpio->chip.parent = &pdev->dev; + max7360_gpio->chip.base = -1; + max7360_gpio->gpio_function = (int)device_get_match_data(&pdev->dev); + + dev_dbg(&pdev->dev, "gpio count: %d\n", max7360_gpio->chip.ngpio); + + if (max7360_gpio->gpio_function == MAX7360_GPIO_PORT) { + /* Port GPIOs: set output mode configuration (constant-current + * or not). + * This property is optional. + */ + outconf = 0; + ret = of_property_read_u32(pdev->dev.of_node, + "constant-current-disable", &outconf); + if (ret && (ret != -EINVAL)) { + dev_err(&pdev->dev, + "Failed to read constant-current-disable OF property\n"); + return -ENODEV; + } + + regmap_write(max7360_gpio->regmap, MAX7360_REG_GPIOOUTM, outconf); + } + + if (max7360_gpio->gpio_function == MAX7360_GPIO_PORT && + of_property_read_bool(pdev->dev.of_node, "interrupt-controller")) { + /* Port GPIOs: declare IRQ chip, if configuration was provided. + */ + irq = platform_get_irq(pdev, 0); + if (irq < 0) + return dev_err_probe(&pdev->dev, irq, + "Failed to get IRQ"); + + flags = IRQF_TRIGGER_LOW | IRQF_ONESHOT | IRQF_SHARED; + ret = devm_request_threaded_irq(&pdev->dev, irq, NULL, + max7360_gpio_irq, flags, + "max7360-gpio", max7360_gpio); + if (ret) + return dev_err_probe(&pdev->dev, ret, + "Failed to register interrupt: %d\n", + ret); + + girq = &max7360_gpio->chip.irq; + gpio_irq_chip_set_chip(girq, &max7360_gpio_irqchip); + girq->parent_handler = NULL; + girq->num_parents = 0; + girq->parents = NULL; + girq->threaded = true; + girq->default_type = IRQ_TYPE_NONE; + girq->handler = handle_simple_irq; + } + + ret = devm_gpiochip_add_data(&pdev->dev, &max7360_gpio->chip, max7360_gpio); + if (ret) { + dev_err(&pdev->dev, "unable to add gpiochip: %d\n", ret); + return ret; + } + + return 0; +} + +static const struct of_device_id max7360_gpio_of_match[] = { + { + .compatible = "maxim,max7360-gpo", + .data = (void *)MAX7360_GPIO_COL + }, { + .compatible = "maxim,max7360-gpio", + .data = (void *)MAX7360_GPIO_PORT + }, { + } +}; +MODULE_DEVICE_TABLE(of, max7360_gpio_of_match); + +static struct platform_driver max7360_gpio_driver = { + .driver = { + .name = "max7360-gpio", + .of_match_table = of_match_ptr(max7360_gpio_of_match), + }, + .probe = max7360_gpio_probe, +}; +module_platform_driver(max7360_gpio_driver); + +MODULE_DESCRIPTION("MAX7360 GPIO driver"); +MODULE_AUTHOR("Kamel BOUHARA <kamel.bouhara@bootlin.com>"); +MODULE_AUTHOR("Mathieu Dubois-Briand <mathieu.dubois-briand@bootlin.com>"); +MODULE_ALIAS("platform:max7360-gpio"); +MODULE_LICENSE("GPL"); -- 2.39.5 ^ permalink raw reply related [flat|nested] 4+ messages in thread
* Re: [PATCH 5/8] gpio: max7360: Add MAX7360 gpio support 2024-12-19 16:21 ` [PATCH 5/8] gpio: max7360: Add MAX7360 gpio support Mathieu Dubois-Briand @ 2024-12-20 15:54 ` kernel test robot 2024-12-20 16:39 ` kernel test robot 1 sibling, 0 replies; 4+ messages in thread From: kernel test robot @ 2024-12-20 15:54 UTC (permalink / raw) To: Mathieu Dubois-Briand, Lee Jones, Rob Herring, Krzysztof Kozlowski, Conor Dooley, Kamel Bouhara, Linus Walleij, Bartosz Golaszewski, Dmitry Torokhov, Uwe Kleine-König Cc: llvm, oe-kbuild-all, devicetree, linux-kernel, linux-gpio, linux-input, linux-pwm, Grégory Clement, Thomas Petazzoni, Mathieu Dubois-Briand Hi Mathieu, kernel test robot noticed the following build warnings: [auto build test WARNING on 78d4f34e2115b517bcbfe7ec0d018bbbb6f9b0b8] url: https://github.com/intel-lab-lkp/linux/commits/Mathieu-Dubois-Briand/dt-bindings-Add-MAX7360-MFD-device/20241220-002541 base: 78d4f34e2115b517bcbfe7ec0d018bbbb6f9b0b8 patch link: https://lore.kernel.org/r/20241219-mdb-max7360-support-v1-5-8e8317584121%40bootlin.com patch subject: [PATCH 5/8] gpio: max7360: Add MAX7360 gpio support config: arm64-allmodconfig (https://download.01.org/0day-ci/archive/20241220/202412202337.8jOygMaK-lkp@intel.com/config) compiler: clang version 18.1.8 (https://github.com/llvm/llvm-project 3b5b5c1ec4a3095ab096dd780e84d7ab81f3d7ff) reproduce (this is a W=1 build): (https://download.01.org/0day-ci/archive/20241220/202412202337.8jOygMaK-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/202412202337.8jOygMaK-lkp@intel.com/ All warnings (new ones prefixed by >>): drivers/gpio/gpio-max7360.c:57:41: warning: variable 'val' is uninitialized when used here [-Wuninitialized] 57 | "failed to set value %d on gpio-%d", val, pin); | ^~~ include/linux/dev_printk.h:154:65: note: expanded from macro 'dev_err' 154 | dev_printk_index_wrap(_dev_err, KERN_ERR, dev, dev_fmt(fmt), ##__VA_ARGS__) | ^~~~~~~~~~~ include/linux/dev_printk.h:110:23: note: expanded from macro 'dev_printk_index_wrap' 110 | _p_func(dev, fmt, ##__VA_ARGS__); \ | ^~~~~~~~~~~ drivers/gpio/gpio-max7360.c:42:18: note: initialize the variable 'val' to silence this warning 42 | unsigned int val; | ^ | = 0 >> drivers/gpio/gpio-max7360.c:370:32: warning: cast to smaller integer type 'int' from 'const void *' [-Wvoid-pointer-to-int-cast] 370 | max7360_gpio->gpio_function = (int)device_get_match_data(&pdev->dev); | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2 warnings generated. vim +370 drivers/gpio/gpio-max7360.c 333 334 static int max7360_gpio_probe(struct platform_device *pdev) 335 { 336 struct max7360_gpio *max7360_gpio; 337 unsigned int ngpios; 338 unsigned int outconf; 339 struct gpio_irq_chip *girq; 340 unsigned long flags; 341 int irq; 342 int ret; 343 344 if (!pdev->dev.parent) { 345 dev_err(&pdev->dev, "no parent device\n"); 346 return -ENODEV; 347 } 348 349 max7360_gpio = devm_kzalloc(&pdev->dev, sizeof(struct max7360_gpio), 350 GFP_KERNEL); 351 if (!max7360_gpio) 352 return -ENOMEM; 353 354 if (of_property_read_u32(pdev->dev.of_node, "ngpios", &ngpios)) { 355 dev_err(&pdev->dev, "Missing ngpios OF property\n"); 356 return -ENODEV; 357 } 358 359 max7360_gpio->regmap = dev_get_regmap(pdev->dev.parent, NULL); 360 if (!max7360_gpio->regmap) { 361 dev_err(&pdev->dev, "could not get parent regmap\n"); 362 return -ENODEV; 363 } 364 365 max7360_gpio->dev = &pdev->dev; 366 max7360_gpio->chip = max7360_gpio_chip; 367 max7360_gpio->chip.ngpio = ngpios; 368 max7360_gpio->chip.parent = &pdev->dev; 369 max7360_gpio->chip.base = -1; > 370 max7360_gpio->gpio_function = (int)device_get_match_data(&pdev->dev); 371 372 dev_dbg(&pdev->dev, "gpio count: %d\n", max7360_gpio->chip.ngpio); 373 374 if (max7360_gpio->gpio_function == MAX7360_GPIO_PORT) { 375 /* Port GPIOs: set output mode configuration (constant-current 376 * or not). 377 * This property is optional. 378 */ 379 outconf = 0; 380 ret = of_property_read_u32(pdev->dev.of_node, 381 "constant-current-disable", &outconf); 382 if (ret && (ret != -EINVAL)) { 383 dev_err(&pdev->dev, 384 "Failed to read constant-current-disable OF property\n"); 385 return -ENODEV; 386 } 387 388 regmap_write(max7360_gpio->regmap, MAX7360_REG_GPIOOUTM, outconf); 389 } 390 391 if (max7360_gpio->gpio_function == MAX7360_GPIO_PORT && 392 of_property_read_bool(pdev->dev.of_node, "interrupt-controller")) { 393 /* Port GPIOs: declare IRQ chip, if configuration was provided. 394 */ 395 irq = platform_get_irq(pdev, 0); 396 if (irq < 0) 397 return dev_err_probe(&pdev->dev, irq, 398 "Failed to get IRQ"); 399 400 flags = IRQF_TRIGGER_LOW | IRQF_ONESHOT | IRQF_SHARED; 401 ret = devm_request_threaded_irq(&pdev->dev, irq, NULL, 402 max7360_gpio_irq, flags, 403 "max7360-gpio", max7360_gpio); 404 if (ret) 405 return dev_err_probe(&pdev->dev, ret, 406 "Failed to register interrupt: %d\n", 407 ret); 408 409 girq = &max7360_gpio->chip.irq; 410 gpio_irq_chip_set_chip(girq, &max7360_gpio_irqchip); 411 girq->parent_handler = NULL; 412 girq->num_parents = 0; 413 girq->parents = NULL; 414 girq->threaded = true; 415 girq->default_type = IRQ_TYPE_NONE; 416 girq->handler = handle_simple_irq; 417 } 418 419 ret = devm_gpiochip_add_data(&pdev->dev, &max7360_gpio->chip, max7360_gpio); 420 if (ret) { 421 dev_err(&pdev->dev, "unable to add gpiochip: %d\n", ret); 422 return ret; 423 } 424 425 return 0; 426 } 427 -- 0-DAY CI Kernel Test Service https://github.com/intel/lkp-tests/wiki ^ permalink raw reply [flat|nested] 4+ messages in thread
* Re: [PATCH 5/8] gpio: max7360: Add MAX7360 gpio support 2024-12-19 16:21 ` [PATCH 5/8] gpio: max7360: Add MAX7360 gpio support Mathieu Dubois-Briand 2024-12-20 15:54 ` kernel test robot @ 2024-12-20 16:39 ` kernel test robot 1 sibling, 0 replies; 4+ messages in thread From: kernel test robot @ 2024-12-20 16:39 UTC (permalink / raw) To: Mathieu Dubois-Briand, Lee Jones, Rob Herring, Krzysztof Kozlowski, Conor Dooley, Kamel Bouhara, Linus Walleij, Bartosz Golaszewski, Dmitry Torokhov, Uwe Kleine-König Cc: oe-kbuild-all, devicetree, linux-kernel, linux-gpio, linux-input, linux-pwm, Grégory Clement, Thomas Petazzoni, Mathieu Dubois-Briand Hi Mathieu, kernel test robot noticed the following build warnings: [auto build test WARNING on 78d4f34e2115b517bcbfe7ec0d018bbbb6f9b0b8] url: https://github.com/intel-lab-lkp/linux/commits/Mathieu-Dubois-Briand/dt-bindings-Add-MAX7360-MFD-device/20241220-002541 base: 78d4f34e2115b517bcbfe7ec0d018bbbb6f9b0b8 patch link: https://lore.kernel.org/r/20241219-mdb-max7360-support-v1-5-8e8317584121%40bootlin.com patch subject: [PATCH 5/8] gpio: max7360: Add MAX7360 gpio support config: loongarch-allyesconfig (https://download.01.org/0day-ci/archive/20241221/202412210008.Saks0Eu4-lkp@intel.com/config) compiler: loongarch64-linux-gcc (GCC) 14.2.0 reproduce (this is a W=1 build): (https://download.01.org/0day-ci/archive/20241221/202412210008.Saks0Eu4-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/202412210008.Saks0Eu4-lkp@intel.com/ All warnings (new ones prefixed by >>): drivers/gpio/gpio-max7360.c: In function 'max7360_gpio_probe': >> drivers/gpio/gpio-max7360.c:370:39: warning: cast from pointer to integer of different size [-Wpointer-to-int-cast] 370 | max7360_gpio->gpio_function = (int)device_get_match_data(&pdev->dev); | ^ vim +370 drivers/gpio/gpio-max7360.c 333 334 static int max7360_gpio_probe(struct platform_device *pdev) 335 { 336 struct max7360_gpio *max7360_gpio; 337 unsigned int ngpios; 338 unsigned int outconf; 339 struct gpio_irq_chip *girq; 340 unsigned long flags; 341 int irq; 342 int ret; 343 344 if (!pdev->dev.parent) { 345 dev_err(&pdev->dev, "no parent device\n"); 346 return -ENODEV; 347 } 348 349 max7360_gpio = devm_kzalloc(&pdev->dev, sizeof(struct max7360_gpio), 350 GFP_KERNEL); 351 if (!max7360_gpio) 352 return -ENOMEM; 353 354 if (of_property_read_u32(pdev->dev.of_node, "ngpios", &ngpios)) { 355 dev_err(&pdev->dev, "Missing ngpios OF property\n"); 356 return -ENODEV; 357 } 358 359 max7360_gpio->regmap = dev_get_regmap(pdev->dev.parent, NULL); 360 if (!max7360_gpio->regmap) { 361 dev_err(&pdev->dev, "could not get parent regmap\n"); 362 return -ENODEV; 363 } 364 365 max7360_gpio->dev = &pdev->dev; 366 max7360_gpio->chip = max7360_gpio_chip; 367 max7360_gpio->chip.ngpio = ngpios; 368 max7360_gpio->chip.parent = &pdev->dev; 369 max7360_gpio->chip.base = -1; > 370 max7360_gpio->gpio_function = (int)device_get_match_data(&pdev->dev); 371 372 dev_dbg(&pdev->dev, "gpio count: %d\n", max7360_gpio->chip.ngpio); 373 374 if (max7360_gpio->gpio_function == MAX7360_GPIO_PORT) { 375 /* Port GPIOs: set output mode configuration (constant-current 376 * or not). 377 * This property is optional. 378 */ 379 outconf = 0; 380 ret = of_property_read_u32(pdev->dev.of_node, 381 "constant-current-disable", &outconf); 382 if (ret && (ret != -EINVAL)) { 383 dev_err(&pdev->dev, 384 "Failed to read constant-current-disable OF property\n"); 385 return -ENODEV; 386 } 387 388 regmap_write(max7360_gpio->regmap, MAX7360_REG_GPIOOUTM, outconf); 389 } 390 391 if (max7360_gpio->gpio_function == MAX7360_GPIO_PORT && 392 of_property_read_bool(pdev->dev.of_node, "interrupt-controller")) { 393 /* Port GPIOs: declare IRQ chip, if configuration was provided. 394 */ 395 irq = platform_get_irq(pdev, 0); 396 if (irq < 0) 397 return dev_err_probe(&pdev->dev, irq, 398 "Failed to get IRQ"); 399 400 flags = IRQF_TRIGGER_LOW | IRQF_ONESHOT | IRQF_SHARED; 401 ret = devm_request_threaded_irq(&pdev->dev, irq, NULL, 402 max7360_gpio_irq, flags, 403 "max7360-gpio", max7360_gpio); 404 if (ret) 405 return dev_err_probe(&pdev->dev, ret, 406 "Failed to register interrupt: %d\n", 407 ret); 408 409 girq = &max7360_gpio->chip.irq; 410 gpio_irq_chip_set_chip(girq, &max7360_gpio_irqchip); 411 girq->parent_handler = NULL; 412 girq->num_parents = 0; 413 girq->parents = NULL; 414 girq->threaded = true; 415 girq->default_type = IRQ_TYPE_NONE; 416 girq->handler = handle_simple_irq; 417 } 418 419 ret = devm_gpiochip_add_data(&pdev->dev, &max7360_gpio->chip, max7360_gpio); 420 if (ret) { 421 dev_err(&pdev->dev, "unable to add gpiochip: %d\n", ret); 422 return ret; 423 } 424 425 return 0; 426 } 427 -- 0-DAY CI Kernel Test Service https://github.com/intel/lkp-tests/wiki ^ permalink raw reply [flat|nested] 4+ messages in thread
end of thread, other threads:[~2024-12-22 22:12 UTC | newest] Thread overview: 4+ messages (download: mbox.gz follow: Atom feed -- links below jump to the message on this page -- 2024-12-22 22:12 [PATCH 5/8] gpio: max7360: Add MAX7360 gpio support kernel test robot -- strict thread matches above, loose matches on Subject: below -- 2024-12-19 16:21 [PATCH 0/8] Add support for MAX7360 multifunction device Mathieu Dubois-Briand 2024-12-19 16:21 ` [PATCH 5/8] gpio: max7360: Add MAX7360 gpio support Mathieu Dubois-Briand 2024-12-20 15:54 ` kernel test robot 2024-12-20 16:39 ` kernel test robot
This is an external index of several public inboxes, see mirroring instructions on how to clone and mirror all data and code used by this external index.