[U-Boot] [PATCH] lsxl: support power switch
Michael Walle
michael at walle.cc
Tue Jul 31 12:52:03 CEST 2012
On Tue, July 31, 2012 07:59, Prafulla Wadaskar wrote:
>
>
>> -----Original Message-----
>> From: Michael Walle [mailto:michael at walle.cc]
>> Sent: 31 July 2012 02:17
>> To: u-boot at 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 <michael at walle.cc>
>> Cc: Prafulla Wadaskar <prafulla at 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
More information about the U-Boot
mailing list