GPIO interrupt configuration failed on nRF9160 with npm1300

Hi all,

I'm working on a custom board based on the nRF9160 and using nRF Connect SDK v3.0.2. We’ve developed the board in-house and integrated the npm1300 PMIC as part of our power management solution.

Everything is working well overall, but I’m facing an issue with GPIO buttons. Specifically:

  • I use the first two GPIOs from the npm1300 as buttons.
  • I also have five other buttons directly connected to GPIOs on the nRF9160, and those work fine.
  • I use GPIO 0.26 from the nRF9160 as host-int-gpio property

However, when I declare the two npm1300-based buttons in the devicetree, I get this error during application startup:

[00:00:00.382,568] <err> gpio_keys: Could not set gpio callback
[00:00:00.382,598] <err> gpio_keys: Pin 5 interrupt configuration failed: -88

Here is the relevant devicetree snippet for the npm1300

npm1300_pmic: npm1300@6b {
		compatible = "nordic,npm1300";
		reg = <0x6b>;		
		pmic-int-pin = <4>;
		host-int-gpios = <&gpio0 26 GPIO_ACTIVE_HIGH>;
		ship-to-active-time-ms = <1008>;
		long-press-reset = "one-button";
		status = "okay";

		npm1300_gpio: npm1300_gpio {
			compatible = "nordic,npm1300-gpio";
			status = "okay";
			gpio-controller;
			#gpio-cells = <2>;
			ngpios = <5>;
		};

		npm1300_regulators: regulators {
			compatible = "nordic,npm1300-regulator";
			status = "okay";

			npm1300_buck1: BUCK1 {
				status = "disabled";
			};

			regulator_3v0: BUCK2 {
				regulator-min-microvolt = <3000000>;
				regulator-max-microvolt = <3000000>;
				regulator-init-microvolt = <3000000>;
				regulator-boot-on;
				regulator-always-on;
			};

			// LDO1 
			regulator_display: LDO1 {
				regulator-initial-mode = <NPM1300_LDSW_MODE_LDSW>;
				regulator-boot-on;
				status = "okay";
			};

			// LDO2 is not used
			npm1300_ldo2: LDO2 {
				status = "disabled";
			};
		};		

		npm1300_charger: charger {
			compatible = "nordic,npm1300-charger";
			term-microvolt = <4200000>;
			term-warm-microvolt = <4000000>;
			current-microamp = <400000>; 
			term-current-percent = <10>;
			dischg-limit-microamp = <1000000>;
			vbus-limit-microamp = <500000>;
			thermistor-ohms = <10000>;
			thermistor-beta = <3435>;	//3380
			charging-enable;
		};		

		npm1300_leds: leds {
			compatible = "nordic,npm1300-led";			
			nordic,led0-mode = "charging";
			nordic,led1-mode = "host";
			nordic,led2-mode = "host";
		};
		
		npm1300_buttons: buttons {
			compatible = "gpio-keys";
			status = "okay";
		};
	};

And here is the devicetree definition for the buttons :

	buttons: buttons {
        compatible = "gpio-keys";
		debounce-interval-ms = <100>;

        button0: button_0 {
            label = "bt0-enter";
            gpios = <&gpio0 0 (GPIO_PULL_UP | GPIO_ACTIVE_LOW)>;
            zephyr,code = <INPUT_KEY_ENTER>;
        };

        button1: button_1 {
            label = "bt1-up";
            gpios = <&gpio0 1 (GPIO_PULL_UP | GPIO_ACTIVE_LOW)>;
            zephyr,code = <INPUT_KEY_UP>;
        };

        button2: button_2 {
            label = "bt2-left";
            gpios = <&gpio0 2 (GPIO_PULL_UP | GPIO_ACTIVE_LOW)>;			
            zephyr,code = <INPUT_KEY_LEFT>;
        };

        button3: button_3 {
            label = "bt3-down";
            gpios = <&gpio0 3 (GPIO_PULL_UP | GPIO_ACTIVE_LOW)>;
            zephyr,code = <INPUT_KEY_DOWN>;
        };

        button4: button_4 {
            label = "bt4-right";
            gpios = <&gpio0 4 (GPIO_PULL_UP | GPIO_ACTIVE_LOW)>;
            zephyr,code = <INPUT_KEY_RIGHT>;
        };

		button5: button_5 {
			label = "bt5";
			gpios = <&npm1300_gpio 0 (GPIO_PULL_UP | GPIO_ACTIVE_LOW)>;
			zephyr,code = <INPUT_KEY_1>;
		};

		button6: button_6 {
			label = "bt6";
			gpios = <&npm1300_gpio 1 (GPIO_PULL_UP | GPIO_ACTIVE_LOW)>;
			zephyr,code = <INPUT_KEY_2>;
		};		
};

I'm really not sure what’s going wrong here. Has anyone encountered something similar when using npm1300 GPIOs as input buttons? Any ideas or pointers would be greatly appreciated!

Thanks in advance!

Parents
  • Hello,

    The error mentions interrupt configuration which has code -88 (ENOSYS, not implemented), We suspect there is an interrupt directly on the PMIC pin, which is not supported. 

    To get interrupts from button presses connected to PMIC, you have to try differently

    1. Define PMIC interrupt callback

    static void pmic_callback(const struct device *dev, struct gpio_callback *cb, uint32_t events)
    {
        if (events & BIT(NPM1300_EVENT_GPIO0_EDGE)) {
            // button connected to nPM1300 GPIO0 is pressed or released
        }
        // handle other events in the same manner
    }

    2. Register it using npm1300 mfd API 

    static struct gpio_callback event_cb;
    
    gpio_init_callback(&event_cb, pmic_callback, BIT(NPM1300_EVENT_GPIO0_EDGE) /* | more_events */);
    mfd_npm1300_add_callback(pmic, &event_cb);

    You can check out the one button sample source to see how we set up event handling on nPM1300 (that one uses different events, but the approach is the same)

Reply
  • Hello,

    The error mentions interrupt configuration which has code -88 (ENOSYS, not implemented), We suspect there is an interrupt directly on the PMIC pin, which is not supported. 

    To get interrupts from button presses connected to PMIC, you have to try differently

    1. Define PMIC interrupt callback

    static void pmic_callback(const struct device *dev, struct gpio_callback *cb, uint32_t events)
    {
        if (events & BIT(NPM1300_EVENT_GPIO0_EDGE)) {
            // button connected to nPM1300 GPIO0 is pressed or released
        }
        // handle other events in the same manner
    }

    2. Register it using npm1300 mfd API 

    static struct gpio_callback event_cb;
    
    gpio_init_callback(&event_cb, pmic_callback, BIT(NPM1300_EVENT_GPIO0_EDGE) /* | more_events */);
    mfd_npm1300_add_callback(pmic, &event_cb);

    You can check out the one button sample source to see how we set up event handling on nPM1300 (that one uses different events, but the approach is the same)

Children
Related