On Tue, July 31, 2012 07:59, Prafulla Wadaskar wrote: > > >> -----Original Message----- >> From: Michael Walle [mailto:mich...@walle.cc] >> Sent: 31 July 2012 02:17 >> To: u-boot@lists.denx.de >> Cc: Michael Walle; Prafulla Wadaskar >> Subject: [PATCH] lsxl: support power switch >> >> This patch restores the Linkstation's original behaviour when powering >> off. >> Once the (soft) power switch is turned off, linux will reboot and the >> bootloader turns off HDD and USB power. Then it loops as long as the >> switch >> is in the off position, before continuing the boot process again. >> >> Additionally, this patch fixes the board function set_led(LED_OFF). >> >> Signed-off-by: Michael Walle <mich...@walle.cc> >> Cc: Prafulla Wadaskar <prafu...@marvell.com> >> --- >> board/buffalo/lsxl/lsxl.c | 22 +++++++++++++++++++++- >> 1 files changed, 21 insertions(+), 1 deletions(-) >> >> diff --git a/board/buffalo/lsxl/lsxl.c b/board/buffalo/lsxl/lsxl.c >> index fe15511..b3f31d6 100644 >> --- a/board/buffalo/lsxl/lsxl.c >> +++ b/board/buffalo/lsxl/lsxl.c >> @@ -158,7 +158,7 @@ static void set_led(int state) >> { >> switch (state) { >> case LED_OFF: >> - __set_led(0, 0, 0, 0, 0, 0); >> + __set_led(0, 0, 0, 1, 1, 1); >> break; >> case LED_ALARM_ON: >> __set_led(0, 0, 0, 0, 1, 1); >> @@ -192,6 +192,25 @@ int board_init(void) >> } >> >> #ifdef CONFIG_MISC_INIT_R >> +static void check_power_switch(void) >> +{ >> + if (kw_gpio_get_value(GPIO_POWER_SWITCH)) { >> + /* turn off HDD and USB power */ >> + kw_gpio_set_value(GPIO_HDD_POWER, 0); >> + kw_gpio_set_value(GPIO_USB_VBUS, 0); >> + set_led(LED_OFF); >> + >> + /* loop until released */ >> + while (kw_gpio_get_value(GPIO_POWER_SWITCH)) >> + ; > > Please avoid infinite loop, may you introduce timeout?
actually, thats the use case, to loop indefinitely ;) See the commit message. The GPIO is a switch not a button. As long as it is switched to "Power Off" uboot should loop. > >> + >> + /* turn power on again */ >> + kw_gpio_set_value(GPIO_HDD_POWER, 1); >> + kw_gpio_set_value(GPIO_USB_VBUS, 1); >> + set_led(LED_POWER_BLINKING); >> + } >> +} >> + >> void check_enetaddr(void) >> { >> uchar enetaddr[6]; >> @@ -261,6 +280,7 @@ static void check_push_button(void) >> >> int misc_init_r(void) >> { >> + check_power_switch(); >> check_enetaddr(); >> check_push_button(); > > Ack for rest of the code. Thanks for the review. -- michael _______________________________________________ U-Boot mailing list U-Boot@lists.denx.de http://lists.denx.de/mailman/listinfo/u-boot