[PATCH v5 3/9] mach-snapdragon: switch to PMIC button driver
Neil Armstrong
neil.armstrong at linaro.org
Fri Dec 1 10:33:18 CET 2023
On 30/11/2023 21:22, Caleb Connolly wrote:
> The PMIC button driver is a much better representation of the hardware
> here, adjust the boards to use upstream DT and the PMIC button driver
> instead of exposing the buttons as GPIOs and relying on the GPIO-button
> driver.
>
> Signed-off-by: Caleb Connolly <caleb.connolly at linaro.org>
> ---
> arch/arm/dts/dragonboard410c-uboot.dtsi | 11 ------
> arch/arm/dts/dragonboard410c.dts | 22 +++++++++---
> arch/arm/dts/dragonboard820c-uboot.dtsi | 12 -------
> arch/arm/dts/dragonboard820c.dts | 23 ++++++++----
> arch/arm/dts/dragonboard845c-uboot.dtsi | 11 ------
> arch/arm/dts/dragonboard845c.dts | 4 +++
> arch/arm/dts/sdm845.dtsi | 23 +++++++++---
> arch/arm/dts/starqltechn-uboot.dtsi | 10 ------
> arch/arm/dts/starqltechn.dts | 20 +++--------
> arch/arm/mach-snapdragon/Kconfig | 3 ++
> arch/arm/mach-snapdragon/init_sdm845.c | 45 +++++-------------------
> board/qualcomm/dragonboard410c/dragonboard410c.c | 31 ++++++----------
> board/qualcomm/dragonboard820c/dragonboard820c.c | 29 +++++----------
> 13 files changed, 91 insertions(+), 153 deletions(-)
>
> diff --git a/arch/arm/dts/dragonboard410c-uboot.dtsi b/arch/arm/dts/dragonboard410c-uboot.dtsi
> index 3b0bd0ed0a1b..cec64bf80f99 100644
> --- a/arch/arm/dts/dragonboard410c-uboot.dtsi
> +++ b/arch/arm/dts/dragonboard410c-uboot.dtsi
> @@ -42,14 +42,3 @@
> gpios = <&pm8916_gpios 3 0>;
> };
> };
> -
> -
> -&pm8916_pon {
> - key_vol_down {
> - gpios = <&pm8916_pon 1 0>;
> - };
> -
> - key_power {
> - gpios = <&pm8916_pon 0 0>;
> - };
> -};
> diff --git a/arch/arm/dts/dragonboard410c.dts b/arch/arm/dts/dragonboard410c.dts
> index 9230dd3fd96c..c41fee977813 100644
> --- a/arch/arm/dts/dragonboard410c.dts
> +++ b/arch/arm/dts/dragonboard410c.dts
> @@ -147,11 +147,23 @@
> #address-cells = <0x1>;
> #size-cells = <0x1>;
>
> - pm8916_pon: pm8916_pon at 800 {
> - compatible = "qcom,pm8916-pwrkey";
> - reg = <0x800 0x96>;
> - #gpio-cells = <2>;
> - gpio-controller;
> + pon at 800 {
> + compatible = "qcom,pm8916-pon";
> + reg = <0x800 0x100>;
> + mode-bootloader = <0x2>;
> + mode-recovery = <0x1>;
> +
> + pwrkey {
> + compatible = "qcom,pm8941-pwrkey";
> + debounce = <15625>;
> + bias-pull-up;
> + };
> +
> + pm8916_resin: resin {
> + compatible = "qcom,pm8941-resin";
> + debounce = <15625>;
> + bias-pull-up;
> + };
> };
>
> pm8916_gpios: pm8916_gpios at c000 {
> diff --git a/arch/arm/dts/dragonboard820c-uboot.dtsi b/arch/arm/dts/dragonboard820c-uboot.dtsi
> index 457728a43ecb..d93c7c1fbdee 100644
> --- a/arch/arm/dts/dragonboard820c-uboot.dtsi
> +++ b/arch/arm/dts/dragonboard820c-uboot.dtsi
> @@ -30,15 +30,3 @@
> };
> };
> };
> -
> -&pm8994_pon {
> - key_vol_down {
> - gpios = <&pm8994_pon 1 0>;
> - label = "key_vol_down";
> - };
> -
> - key_power {
> - gpios = <&pm8994_pon 0 0>;
> - label = "key_power";
> - };
> -};
> diff --git a/arch/arm/dts/dragonboard820c.dts b/arch/arm/dts/dragonboard820c.dts
> index ad201d48749c..0d9c9f7a4922 100644
> --- a/arch/arm/dts/dragonboard820c.dts
> +++ b/arch/arm/dts/dragonboard820c.dts
> @@ -109,12 +109,23 @@
> #address-cells = <0x1>;
> #size-cells = <0x1>;
>
> - pm8994_pon: pm8994_pon at 800 {
> - compatible = "qcom,pm8994-pwrkey";
> - reg = <0x800 0x96>;
> - #gpio-cells = <2>;
> - gpio-controller;
> - gpio-bank-name="pm8994_key.";
> + pm8994_pon: pon at 800 {
> + compatible = "qcom,pm8916-pon";
> + reg = <0x800 0x100>;
> + mode-bootloader = <0x2>;
> + mode-recovery = <0x1>;
> +
> + pwrkey {
> + compatible = "qcom,pm8941-pwrkey";
> + debounce = <15625>;
> + bias-pull-up;
> + };
> +
> + pm8994_resin: resin {
> + compatible = "qcom,pm8941-resin";
> + debounce = <15625>;
> + bias-pull-up;
> + };
> };
>
> pm8994_gpios: pm8994_gpios at c000 {
> diff --git a/arch/arm/dts/dragonboard845c-uboot.dtsi b/arch/arm/dts/dragonboard845c-uboot.dtsi
> index 7728f4f4a3e5..775f45c0149f 100644
> --- a/arch/arm/dts/dragonboard845c-uboot.dtsi
> +++ b/arch/arm/dts/dragonboard845c-uboot.dtsi
> @@ -24,14 +24,3 @@
> };
> };
> };
> -
> -&pm8998_pon {
> - key_vol_down {
> - gpios = <&pm8998_pon 1 0>;
> - label = "key_vol_down";
> - };
> - key_power {
> - gpios = <&pm8998_pon 0 0>;
> - label = "key_power";
> - };
> -};
> diff --git a/arch/arm/dts/dragonboard845c.dts b/arch/arm/dts/dragonboard845c.dts
> index b4f057ac6537..054f253eb32a 100644
> --- a/arch/arm/dts/dragonboard845c.dts
> +++ b/arch/arm/dts/dragonboard845c.dts
> @@ -41,4 +41,8 @@
> };
> };
>
> +&pm8998_resin {
> + status = "okay";
> +};
> +
> #include "dragonboard845c-uboot.dtsi"
> diff --git a/arch/arm/dts/sdm845.dtsi b/arch/arm/dts/sdm845.dtsi
> index 4798ace0ff8b..cd5d890e9a45 100644
> --- a/arch/arm/dts/sdm845.dtsi
> +++ b/arch/arm/dts/sdm845.dtsi
> @@ -78,12 +78,25 @@
> #address-cells = <0x1>;
> #size-cells = <0x1>;
>
> - pm8998_pon: pm8998_pon at 800 {
> - compatible = "qcom,pm8998-pwrkey";
> + pm8998_pon: pon at 800 {
> + compatible = "qcom,pm8998-pon";
> +
> reg = <0x800 0x100>;
> - #gpio-cells = <2>;
> - gpio-controller;
> - gpio-bank-name = "pm8998_key.";
> + mode-bootloader = <0x2>;
> + mode-recovery = <0x1>;
> +
> + pm8998_pwrkey: pwrkey {
> + compatible = "qcom,pm8941-pwrkey";
> + debounce = <15625>;
> + bias-pull-up;
> + };
> +
> + pm8998_resin: resin {
> + compatible = "qcom,pm8941-resin";
> + debounce = <15625>;
> + bias-pull-up;
> + status = "disabled";
> + };
> };
>
> pm8998_gpios: pm8998_gpios at c000 {
> diff --git a/arch/arm/dts/starqltechn-uboot.dtsi b/arch/arm/dts/starqltechn-uboot.dtsi
> index 034d5c1c07ed..55c6d18412ba 100644
> --- a/arch/arm/dts/starqltechn-uboot.dtsi
> +++ b/arch/arm/dts/starqltechn-uboot.dtsi
> @@ -25,13 +25,3 @@
> };
> };
>
> -&pm8998_pon {
> - key_vol_down {
> - gpios = <&pm8998_pon 1 0>;
> - label = "key_vol_down";
> - };
> - key_power {
> - gpios = <&pm8998_pon 0 0>;
> - label = "key_power";
> - };
> -};
> diff --git a/arch/arm/dts/starqltechn.dts b/arch/arm/dts/starqltechn.dts
> index 5b6372bee79a..0842e19adb60 100644
> --- a/arch/arm/dts/starqltechn.dts
> +++ b/arch/arm/dts/starqltechn.dts
> @@ -45,22 +45,6 @@
> format = "a8r8g8b8";
> };
>
> - gpio-keys {
> - compatible = "gpio-keys";
> -
> - key-pwr {
> - label = "Power";
> - linux,code = <KEY_ENTER>;
> - gpios = <&pm8998_pon 0 GPIO_ACTIVE_LOW>;
> - };
> -
> - key-vol-down {
> - label = "Volume Down";
> - linux,code = <KEY_DOWN>;
> - gpios = <&pm8998_pon 1 GPIO_ACTIVE_LOW>;
> - };
> - };
> -
> soc: soc {
> serial at a84000 {
> status = "okay";
> @@ -68,6 +52,10 @@
> };
> };
>
> +&pm8998_resin {
> + status = "okay";
> +};
> +
> &tlmm {
> muic_i2c: muic-i2c-n {
> pins = "GPIO_33", "GPIO_34";
> diff --git a/arch/arm/mach-snapdragon/Kconfig b/arch/arm/mach-snapdragon/Kconfig
> index 3c9f3bee3f18..ad6671081910 100644
> --- a/arch/arm/mach-snapdragon/Kconfig
> +++ b/arch/arm/mach-snapdragon/Kconfig
> @@ -17,6 +17,7 @@ config SDM845
> select LINUX_KERNEL_IMAGE_HEADER
> imply CLK_QCOM_SDM845
> imply PINCTRL_QCOM_SDM845
> + imply BUTTON_QCOM_PMIC
>
> config LNX_KRNL_IMG_TEXT_OFFSET_BASE
> default 0x80000000
> @@ -30,6 +31,7 @@ config TARGET_DRAGONBOARD410C
> select ENABLE_ARM_SOC_BOOT0_HOOK
> imply CLK_QCOM_APQ8016
> imply PINCTRL_QCOM_APQ8016
> + imply BUTTON_QCOM_PMIC
> help
> Support for 96Boards Dragonboard 410C. This board complies with
> 96Board Open Platform Specifications. Features:
> @@ -45,6 +47,7 @@ config TARGET_DRAGONBOARD820C
> bool "96Boards Dragonboard 820C"
> imply CLK_QCOM_APQ8096
> imply PINCTRL_QCOM_APQ8096
> + imply BUTTON_QCOM_PMIC
> help
> Support for 96Boards Dragonboard 820C. This board complies with
> 96Board Open Platform Specifications. Features:
> diff --git a/arch/arm/mach-snapdragon/init_sdm845.c b/arch/arm/mach-snapdragon/init_sdm845.c
> index 1f8850239437..067acc9a6f44 100644
> --- a/arch/arm/mach-snapdragon/init_sdm845.c
> +++ b/arch/arm/mach-snapdragon/init_sdm845.c
> @@ -5,6 +5,7 @@
> * (C) Copyright 2021 Dzmitry Sankouski <dsankouski at gmail.com>
> */
>
> +#include <button.h>
> #include <init.h>
> #include <env.h>
> #include <common.h>
> @@ -32,46 +33,18 @@ __weak int board_init(void)
> /* Check for vol- and power buttons */
> __weak int misc_init_r(void)
> {
> - struct udevice *pon;
> - struct gpio_desc resin;
> - int node, ret;
> + struct udevice *btn;
> + int ret;
> + enum button_state_t state;
>
> - ret = uclass_get_device_by_name(UCLASS_GPIO, "pm8998_pon at 800", &pon);
> + ret = button_get_by_label("pwrkey", &btn);
> if (ret < 0) {
> - printf("Failed to find PMIC pon node. Check device tree\n");
> - return 0;
> + printf("Couldn't find power button!\n");
> + return ret;
> }
>
> - node = fdt_subnode_offset(gd->fdt_blob, dev_of_offset(pon),
> - "key_vol_down");
> - if (node < 0) {
> - printf("Failed to find key_vol_down node. Check device tree\n");
> - return 0;
> - }
> - if (gpio_request_by_name_nodev(offset_to_ofnode(node), "gpios", 0,
> - &resin, 0)) {
> - printf("Failed to request key_vol_down button.\n");
> - return 0;
> - }
> - if (dm_gpio_get_value(&resin)) {
> - env_set("key_vol_down", "1");
> - printf("Volume down button pressed\n");
> - } else {
> - env_set("key_vol_down", "0");
> - }
> -
> - node = fdt_subnode_offset(gd->fdt_blob, dev_of_offset(pon),
> - "key_power");
> - if (node < 0) {
> - printf("Failed to find key_power node. Check device tree\n");
> - return 0;
> - }
> - if (gpio_request_by_name_nodev(offset_to_ofnode(node), "gpios", 0,
> - &resin, 0)) {
> - printf("Failed to request key_power button.\n");
> - return 0;
> - }
> - if (dm_gpio_get_value(&resin)) {
> + state = button_get_state(btn);
> + if (state == BUTTON_ON) {
> env_set("key_power", "1");
> printf("Power button pressed\n");
> } else {
> diff --git a/board/qualcomm/dragonboard410c/dragonboard410c.c b/board/qualcomm/dragonboard410c/dragonboard410c.c
> index 371b3262f8c5..350e0e9e20aa 100644
> --- a/board/qualcomm/dragonboard410c/dragonboard410c.c
> +++ b/board/qualcomm/dragonboard410c/dragonboard410c.c
> @@ -5,6 +5,7 @@
> * (C) Copyright 2015 Mateusz Kulikowski <mateusz.kulikowski at gmail.com>
> */
>
> +#include <button.h>
> #include <common.h>
> #include <cpu_func.h>
> #include <dm.h>
> @@ -108,32 +109,20 @@ int board_usb_init(int index, enum usb_init_type init)
> /* Check for vol- button - if pressed - stop autoboot */
> int misc_init_r(void)
> {
> - struct udevice *pon;
> - struct gpio_desc resin;
> - int node, ret;
> + struct udevice *btn;
> + int ret;
> + enum button_state_t state;
>
> - ret = uclass_get_device_by_name(UCLASS_GPIO, "pm8916_pon at 800", &pon);
> + ret = button_get_by_label("vol_down", &btn);
> if (ret < 0) {
> - printf("Failed to find PMIC pon node. Check device tree\n");
> - return 0;
> + printf("Couldn't find power button!\n");
> + return ret;
> }
>
> - node = fdt_subnode_offset(gd->fdt_blob, dev_of_offset(pon),
> - "key_vol_down");
> - if (node < 0) {
> - printf("Failed to find key_vol_down node. Check device tree\n");
> - return 0;
> - }
> -
> - if (gpio_request_by_name_nodev(offset_to_ofnode(node), "gpios", 0,
> - &resin, 0)) {
> - printf("Failed to request key_vol_down button.\n");
> - return 0;
> - }
> -
> - if (dm_gpio_get_value(&resin)) {
> + state = button_get_state(btn);
> + if (state == BUTTON_ON) {
> env_set("preboot", "setenv preboot; fastboot 0");
> - printf("key_vol_down pressed - Starting fastboot.\n");
> + printf("vol_down pressed - Starting fastboot.\n");
> }
>
> return 0;
> diff --git a/board/qualcomm/dragonboard820c/dragonboard820c.c b/board/qualcomm/dragonboard820c/dragonboard820c.c
> index 6785bf58e949..2f0db628368b 100644
> --- a/board/qualcomm/dragonboard820c/dragonboard820c.c
> +++ b/board/qualcomm/dragonboard820c/dragonboard820c.c
> @@ -5,6 +5,7 @@
> * (C) Copyright 2017 Jorge Ramirez-Ortiz <jorge.ramirez-ortiz at linaro.org>
> */
>
> +#include <button.h>
> #include <cpu_func.h>
> #include <init.h>
> #include <env.h>
> @@ -139,30 +140,18 @@ void reset_cpu(void)
> /* Check for vol- button - if pressed - stop autoboot */
> int misc_init_r(void)
> {
> - struct udevice *pon;
> - struct gpio_desc resin;
> - int node, ret;
> + struct udevice *btn;
> + int ret;
> + enum button_state_t state;
>
> - ret = uclass_get_device_by_name(UCLASS_GPIO, "pm8994_pon at 800", &pon);
> + ret = button_get_by_label("pwrkey", &btn);
> if (ret < 0) {
> - printf("Failed to find PMIC pon node. Check device tree\n");
> - return 0;
> + printf("Couldn't find power button!\n");
> + return ret;
> }
>
> - node = fdt_subnode_offset(gd->fdt_blob, dev_of_offset(pon),
> - "key_vol_down");
> - if (node < 0) {
> - printf("Failed to find key_vol_down node. Check device tree\n");
> - return 0;
> - }
> -
> - if (gpio_request_by_name_nodev(offset_to_ofnode(node), "gpios", 0,
> - &resin, 0)) {
> - printf("Failed to request key_vol_down button.\n");
> - return 0;
> - }
> -
> - if (dm_gpio_get_value(&resin)) {
> + state = button_get_state(btn);
> + if (state == BUTTON_ON) {
> env_set("bootdelay", "-1");
> printf("Power button pressed - dropping to console.\n");
> }
>
Looks good:
Reviewed-by: Neil Armstrong <neil.armstrong at linaro.org>
More information about the U-Boot
mailing list