Message ID | 20220121133732.2397273-3-andre.przywara@arm.com |
---|---|
State | Accepted |
Delegated to: | Andre Przywara |
Headers | show |
Series | sunxi: Add option to prevent boot on plug-in | expand |
On Fri, Jan 21, 2022 at 01:37:32PM +0000, Andre Przywara wrote: > From: Chris Morgan <macromorgan@hotmail.com> > > For sunxi boards with the AXP209, AXP221, AXP809, and AXP818 PMICs > (plus possibly others, I only confirmed the datasheets for these), > it is sometimes desirable to not boot whenever the device is > plugged in. An example would be when using the NTC CHIP inside a > PocketCHIP. > This provides a configurable option to check if bit 0 of > register 0 of the PMIC says it was powered because of a power button > press (0) or a plug-in event (1). If the value is 1 and this option > is selected, the device shuts down shortly after printing a message > to console stating the reason why it's shutting down. Powering up the > board with the power button is not affected. Tested-By: Chris Morgan <macromorgan@hotmail.com> > > Signed-off-by: Chris Morgan <macromorgan@hotmail.com> > [Andre: reword to speak of boot, remove #ifdefs] > Signed-off-by: Andre Przywara <andre.przywara@arm.com> > > adapt board.c to generic AXP symbols > --- > arch/arm/mach-sunxi/Kconfig | 10 ++++++++++ > board/sunxi/board.c | 11 +++++++++++ > 2 files changed, 21 insertions(+) > > diff --git a/arch/arm/mach-sunxi/Kconfig b/arch/arm/mach-sunxi/Kconfig > index 2c18cf02d1..d7f9a03152 100644 > --- a/arch/arm/mach-sunxi/Kconfig > +++ b/arch/arm/mach-sunxi/Kconfig > @@ -785,6 +785,16 @@ config AXP_GPIO > ---help--- > Say Y here to enable support for the gpio pins of the axp PMIC ICs. > > +config AXP_DISABLE_BOOT_ON_POWERON > + bool "Disable device boot on power plug-in" > + depends on AXP209_POWER || AXP221_POWER || AXP809_POWER || AXP818_POWER > + default n > + ---help--- > + Say Y here to prevent the device from booting up because of a plug-in > + event. When set, the device will boot into the SPL briefly to > + determine why it was powered on, and if it was determined because of > + a plug-in event instead of a button press event it will shut back off. > + > config VIDEO_SUNXI > bool "Enable graphical uboot console on HDMI, LCD or VGA" > depends on !MACH_SUN8I_A83T > diff --git a/board/sunxi/board.c b/board/sunxi/board.c > index fdbcd40269..3b5e7f3cdc 100644 > --- a/board/sunxi/board.c > +++ b/board/sunxi/board.c > @@ -27,6 +27,7 @@ > #include <asm/arch/dram.h> > #include <asm/arch/mmc.h> > #include <asm/arch/prcm.h> > +#include <asm/arch/pmic_bus.h> > #include <asm/arch/spl.h> > #include <asm/global_data.h> > #include <linux/delay.h> > @@ -601,6 +602,16 @@ void sunxi_board_init(void) > defined CONFIG_AXP809_POWER || defined CONFIG_AXP818_POWER > power_failed = axp_init(); > > + if (IS_ENABLED(AXP_DISABLE_BOOT_ON_POWERON) && !power_failed) { This doesn't work for me unless I change this to IS_ENABLED(CONFIG_AXP_DISABLE_BOOT_ON_POWERON) With this change though, it works just fine on my use case. > + u8 boot_reason; > + > + pmic_bus_read(AXP_POWER_STATUS, &boot_reason); > + if (boot_reason & AXP_POWER_STATUS_ALDO_IN) { > + printf("Power on by plug-in, shutting down.\n"); > + pmic_bus_write(0x32, BIT(7)); > + } > + } > + > #if defined CONFIG_AXP221_POWER || defined CONFIG_AXP809_POWER || \ > defined CONFIG_AXP818_POWER > power_failed |= axp_set_dcdc1(CONFIG_AXP_DCDC1_VOLT); > -- > 2.25.1 >
On Fri, 21 Jan 2022 10:35:33 -0600 Chris Morgan <macromorgan@hotmail.com> wrote: Hi Chris, > On Fri, Jan 21, 2022 at 01:37:32PM +0000, Andre Przywara wrote: > > From: Chris Morgan <macromorgan@hotmail.com> > > > > For sunxi boards with the AXP209, AXP221, AXP809, and AXP818 PMICs > > (plus possibly others, I only confirmed the datasheets for these), > > it is sometimes desirable to not boot whenever the device is > > plugged in. An example would be when using the NTC CHIP inside a > > PocketCHIP. > > This provides a configurable option to check if bit 0 of > > register 0 of the PMIC says it was powered because of a power button > > press (0) or a plug-in event (1). If the value is 1 and this option > > is selected, the device shuts down shortly after printing a message > > to console stating the reason why it's shutting down. Powering up the > > board with the power button is not affected. > > Tested-By: Chris Morgan <macromorgan@hotmail.com> Thanks (although please refrain from using this tag if it's actually broken, as you point out below) > > > > > Signed-off-by: Chris Morgan <macromorgan@hotmail.com> > > [Andre: reword to speak of boot, remove #ifdefs] > > Signed-off-by: Andre Przywara <andre.przywara@arm.com> > > > > adapt board.c to generic AXP symbols > > --- > > arch/arm/mach-sunxi/Kconfig | 10 ++++++++++ > > board/sunxi/board.c | 11 +++++++++++ > > 2 files changed, 21 insertions(+) > > > > diff --git a/arch/arm/mach-sunxi/Kconfig b/arch/arm/mach-sunxi/Kconfig > > index 2c18cf02d1..d7f9a03152 100644 > > --- a/arch/arm/mach-sunxi/Kconfig > > +++ b/arch/arm/mach-sunxi/Kconfig > > @@ -785,6 +785,16 @@ config AXP_GPIO > > ---help--- > > Say Y here to enable support for the gpio pins of the axp PMIC ICs. > > > > +config AXP_DISABLE_BOOT_ON_POWERON > > + bool "Disable device boot on power plug-in" > > + depends on AXP209_POWER || AXP221_POWER || AXP809_POWER || AXP818_POWER > > + default n > > + ---help--- > > + Say Y here to prevent the device from booting up because of a plug-in > > + event. When set, the device will boot into the SPL briefly to > > + determine why it was powered on, and if it was determined because of > > + a plug-in event instead of a button press event it will shut back off. > > + > > config VIDEO_SUNXI > > bool "Enable graphical uboot console on HDMI, LCD or VGA" > > depends on !MACH_SUN8I_A83T > > diff --git a/board/sunxi/board.c b/board/sunxi/board.c > > index fdbcd40269..3b5e7f3cdc 100644 > > --- a/board/sunxi/board.c > > +++ b/board/sunxi/board.c > > @@ -27,6 +27,7 @@ > > #include <asm/arch/dram.h> > > #include <asm/arch/mmc.h> > > #include <asm/arch/prcm.h> > > +#include <asm/arch/pmic_bus.h> > > #include <asm/arch/spl.h> > > #include <asm/global_data.h> > > #include <linux/delay.h> > > @@ -601,6 +602,16 @@ void sunxi_board_init(void) > > defined CONFIG_AXP809_POWER || defined CONFIG_AXP818_POWER > > power_failed = axp_init(); > > > > + if (IS_ENABLED(AXP_DISABLE_BOOT_ON_POWERON) && !power_failed) { > > This doesn't work for me unless I change this to > IS_ENABLED(CONFIG_AXP_DISABLE_BOOT_ON_POWERON) Argh, of course, the usual mix up between CONFIG_IS_ENABLED and IS_ENABLED ;-) I guess you meant with the rest of the line (&& !power_failed) as well? I will give it some testing tonight, then queue this, if nobody screams. Cheers, Andre. > > With this change though, it works just fine on my use case. > > > + u8 boot_reason; > > + > > + pmic_bus_read(AXP_POWER_STATUS, &boot_reason); > > + if (boot_reason & AXP_POWER_STATUS_ALDO_IN) { > > + printf("Power on by plug-in, shutting down.\n"); > > + pmic_bus_write(0x32, BIT(7)); > > + } > > + } > > + > > #if defined CONFIG_AXP221_POWER || defined CONFIG_AXP809_POWER || \ > > defined CONFIG_AXP818_POWER > > power_failed |= axp_set_dcdc1(CONFIG_AXP_DCDC1_VOLT); > > -- > > 2.25.1 > >
diff --git a/arch/arm/mach-sunxi/Kconfig b/arch/arm/mach-sunxi/Kconfig index 2c18cf02d1..d7f9a03152 100644 --- a/arch/arm/mach-sunxi/Kconfig +++ b/arch/arm/mach-sunxi/Kconfig @@ -785,6 +785,16 @@ config AXP_GPIO ---help--- Say Y here to enable support for the gpio pins of the axp PMIC ICs. +config AXP_DISABLE_BOOT_ON_POWERON + bool "Disable device boot on power plug-in" + depends on AXP209_POWER || AXP221_POWER || AXP809_POWER || AXP818_POWER + default n + ---help--- + Say Y here to prevent the device from booting up because of a plug-in + event. When set, the device will boot into the SPL briefly to + determine why it was powered on, and if it was determined because of + a plug-in event instead of a button press event it will shut back off. + config VIDEO_SUNXI bool "Enable graphical uboot console on HDMI, LCD or VGA" depends on !MACH_SUN8I_A83T diff --git a/board/sunxi/board.c b/board/sunxi/board.c index fdbcd40269..3b5e7f3cdc 100644 --- a/board/sunxi/board.c +++ b/board/sunxi/board.c @@ -27,6 +27,7 @@ #include <asm/arch/dram.h> #include <asm/arch/mmc.h> #include <asm/arch/prcm.h> +#include <asm/arch/pmic_bus.h> #include <asm/arch/spl.h> #include <asm/global_data.h> #include <linux/delay.h> @@ -601,6 +602,16 @@ void sunxi_board_init(void) defined CONFIG_AXP809_POWER || defined CONFIG_AXP818_POWER power_failed = axp_init(); + if (IS_ENABLED(AXP_DISABLE_BOOT_ON_POWERON) && !power_failed) { + u8 boot_reason; + + pmic_bus_read(AXP_POWER_STATUS, &boot_reason); + if (boot_reason & AXP_POWER_STATUS_ALDO_IN) { + printf("Power on by plug-in, shutting down.\n"); + pmic_bus_write(0x32, BIT(7)); + } + } + #if defined CONFIG_AXP221_POWER || defined CONFIG_AXP809_POWER || \ defined CONFIG_AXP818_POWER power_failed |= axp_set_dcdc1(CONFIG_AXP_DCDC1_VOLT);