Skip to content

Commit

Permalink
kc1: Proper reboot mode and boot reason validation
Browse files Browse the repository at this point in the history
With the previous implementation, rebooting without registering a recognized
reboot mode would end up with U-Boot checking for a valid power-on reason, which
might result in the device turning off (e.g. with no USB cable attached and no
buttons pressed).

Since this approach is not viable (breaks reboot in most cases), the validity of
the reboot reason is checked (in turn, by checking that a warm reset happened,
as there is no magic) to detect a reboot and the 'o' char is recognized to
indicate that power-off is required. Still, that might be overridden by the
detection of usual power-on reasons, on purpose.

Signed-off-by: Paul Kocialkowski <contact@paulk.fr>
  • Loading branch information
paulkocialkowski authored and trini committed Apr 1, 2016
1 parent c15ab5b commit 523849a
Showing 1 changed file with 10 additions and 13 deletions.
23 changes: 10 additions & 13 deletions board/amazon/kc1/kc1.c
Original file line number Diff line number Diff line change
Expand Up @@ -88,10 +88,11 @@ int misc_init_r(void)
char reboot_mode[2] = { 0 };
u32 data = 0;
u32 value;
int rc;

/* Reboot mode */

omap_reboot_mode(reboot_mode, sizeof(reboot_mode));
rc = omap_reboot_mode(reboot_mode, sizeof(reboot_mode));

/* USB ID pin pull-up indicates factory (fastboot) cable detection. */
gpio_request(KC1_GPIO_USB_ID, "USB_ID");
Expand All @@ -101,18 +102,7 @@ int misc_init_r(void)
if (value)
reboot_mode[0] = 'b';

if (reboot_mode[0] > 0 && isascii(reboot_mode[0])) {
if (reboot_mode[0] == 'o')
twl6030_power_off();

if (!getenv("reboot-mode"))
setenv("reboot-mode", (char *)reboot_mode);

omap_reboot_mode_clear();
} else {
/* Reboot mode garbage may still be valid, so clear it. */
omap_reboot_mode_clear();

if (rc < 0 || reboot_mode[0] == 'o') {
/*
* When not rebooting, valid power on reasons are either the
* power button, charger plug or USB plug.
Expand All @@ -126,6 +116,13 @@ int misc_init_r(void)
twl6030_power_off();
}

if (reboot_mode[0] > 0 && isascii(reboot_mode[0])) {
if (!getenv("reboot-mode"))
setenv("reboot-mode", (char *)reboot_mode);
}

omap_reboot_mode_clear();

/* Serial number */

omap_die_id_serial();
Expand Down

0 comments on commit 523849a

Please sign in to comment.