From 70e6476208b767a741347ae48c7111406dc5fda8 Mon Sep 17 00:00:00 2001 From: Tim Crawford Date: Thu, 27 Aug 2020 15:09:39 -0600 Subject: [PATCH] power: Enable Wake-on-LAN --- src/board/system76/addw2/gpio.c | 1 + src/board/system76/addw2/include/board/gpio.h | 1 + src/board/system76/bonw14/gpio.c | 1 + .../system76/bonw14/include/board/gpio.h | 1 + src/board/system76/common/power.c | 22 +++++++++++++++++++ src/board/system76/darp5/gpio.c | 1 + src/board/system76/darp5/include/board/gpio.h | 1 + src/board/system76/galp3-c/gpio.c | 1 + .../system76/galp3-c/include/board/gpio.h | 1 + src/board/system76/gaze15/gpio.c | 1 + .../system76/gaze15/include/board/gpio.h | 1 + src/board/system76/lemp9/include/board/gpio.h | 1 + src/board/system76/oryp6/gpio.c | 1 + src/board/system76/oryp6/include/board/gpio.h | 1 + 14 files changed, 35 insertions(+) diff --git a/src/board/system76/addw2/gpio.c b/src/board/system76/addw2/gpio.c index e3b8c26..d7ccb65 100644 --- a/src/board/system76/addw2/gpio.c +++ b/src/board/system76/addw2/gpio.c @@ -12,6 +12,7 @@ struct Gpio __code DGPU_PWR_EN = GPIO(H, 4); struct Gpio __code EC_EN = GPIO(B, 6); // renamed to SUSBC_EN struct Gpio __code EC_RSMRST_N = GPIO(E, 5); struct Gpio __code GC6_FB_EN = GPIO(H, 3); +struct Gpio __code LAN_WAKEUP_N = GPIO(B, 2); struct Gpio __code LED_ACIN = GPIO(C, 7); struct Gpio __code LED_AIRPLANE_N = GPIO(H, 7); struct Gpio __code LED_CAP_N = GPIO(J, 2); diff --git a/src/board/system76/addw2/include/board/gpio.h b/src/board/system76/addw2/include/board/gpio.h index 4fb84b1..36d8879 100644 --- a/src/board/system76/addw2/include/board/gpio.h +++ b/src/board/system76/addw2/include/board/gpio.h @@ -23,6 +23,7 @@ extern struct Gpio __code DGPU_PWR_EN; extern struct Gpio __code EC_EN; // renamed to SUSBC_EN extern struct Gpio __code EC_RSMRST_N; extern struct Gpio __code GC6_FB_EN; +extern struct Gpio __code LAN_WAKEUP_N; extern struct Gpio __code LED_ACIN; extern struct Gpio __code LED_AIRPLANE_N; extern struct Gpio __code LED_CAP_N; diff --git a/src/board/system76/bonw14/gpio.c b/src/board/system76/bonw14/gpio.c index 0294e16..d8e690c 100644 --- a/src/board/system76/bonw14/gpio.c +++ b/src/board/system76/bonw14/gpio.c @@ -15,6 +15,7 @@ struct Gpio __code DGPU_PWR_EN = GPIO(A, 0); struct Gpio __code EC_EN = GPIO(B, 6); struct Gpio __code EC_RSMRST_N = GPIO(E, 5); struct Gpio __code GC6_FB_EN = GPIO(H, 3); +struct Gpio __code LAN_WAKEUP_N = GPIO(B, 2); // renamed to LAN_WAKE# struct Gpio __code LED_ACIN = GPIO(C, 7); struct Gpio __code LED_BAT_CHG = GPIO(H, 5); struct Gpio __code LED_BAT_FULL = GPIO(J, 0); diff --git a/src/board/system76/bonw14/include/board/gpio.h b/src/board/system76/bonw14/include/board/gpio.h index be0e1eb..1b8fcd3 100644 --- a/src/board/system76/bonw14/include/board/gpio.h +++ b/src/board/system76/bonw14/include/board/gpio.h @@ -26,6 +26,7 @@ extern struct Gpio __code DGPU_PWR_EN; extern struct Gpio __code EC_EN; extern struct Gpio __code EC_RSMRST_N; extern struct Gpio __code GC6_FB_EN; +extern struct Gpio __code LAN_WAKEUP_N; extern struct Gpio __code LED_ACIN; #define HAVE_LED_AIRPLANE_N 0 extern struct Gpio __code LED_BAT_CHG; diff --git a/src/board/system76/common/power.c b/src/board/system76/common/power.c index e9f947d..50894af 100644 --- a/src/board/system76/common/power.c +++ b/src/board/system76/common/power.c @@ -24,6 +24,10 @@ #define HAVE_EC_EN 1 #endif +#ifndef HAVE_LAN_WAKEUP_N + #define HAVE_LAN_WAKEUP_N 1 +#endif + #ifndef HAVE_LED_BAT_CHG #define HAVE_LED_BAT_CHG 1 #endif @@ -486,6 +490,24 @@ void power_event(void) { } } +#if HAVE_LAN_WAKEUP_N + static bool wake_last = true; + bool wake_new = gpio_get(&LAN_WAKEUP_N); + if (!wake_new && wake_last) { + update_power_state(); + DEBUG("%02X: LAN_WAKEUP# asserted\n", main_cycle); + if (power_state == POWER_STATE_DS5) { + power_on_s5(); + } + } + #if LEVEL >= LEVEL_DEBUG + else if (wake_new && !wake_last) { + DEBUG("%02X: LAN_WAKEUP# de-asserted\n", main_cycle); + } + #endif + wake_last = wake_new; +#endif // HAVE_LAN_WAKEUP_N + static uint32_t last_time = 0; uint32_t time = time_get(); if (power_state == POWER_STATE_S0) { diff --git a/src/board/system76/darp5/gpio.c b/src/board/system76/darp5/gpio.c index ec639cf..1fed325 100644 --- a/src/board/system76/darp5/gpio.c +++ b/src/board/system76/darp5/gpio.c @@ -11,6 +11,7 @@ struct Gpio __code CCD_EN = GPIO(G, 0); struct Gpio __code DD_ON = GPIO(E, 4); struct Gpio __code EC_EN = GPIO(E, 1); struct Gpio __code EC_RSMRST_N = GPIO(E, 5); +struct Gpio __code LAN_WAKEUP_N = GPIO(B, 2); struct Gpio __code LED_ACIN = GPIO(C, 7); struct Gpio __code LED_AIRPLANE_N = GPIO(G, 6); struct Gpio __code LED_BAT_CHG = GPIO(A, 5); diff --git a/src/board/system76/darp5/include/board/gpio.h b/src/board/system76/darp5/include/board/gpio.h index b6ac461..0f34c23 100644 --- a/src/board/system76/darp5/include/board/gpio.h +++ b/src/board/system76/darp5/include/board/gpio.h @@ -22,6 +22,7 @@ extern struct Gpio __code CCD_EN; extern struct Gpio __code DD_ON; extern struct Gpio __code EC_EN; extern struct Gpio __code EC_RSMRST_N; +extern struct Gpio __code LAN_WAKEUP_N; extern struct Gpio __code LED_ACIN; extern struct Gpio __code LED_AIRPLANE_N; extern struct Gpio __code LED_BAT_CHG; diff --git a/src/board/system76/galp3-c/gpio.c b/src/board/system76/galp3-c/gpio.c index d40203c..18d7481 100644 --- a/src/board/system76/galp3-c/gpio.c +++ b/src/board/system76/galp3-c/gpio.c @@ -11,6 +11,7 @@ struct Gpio __code CCD_EN = GPIO(G, 0); struct Gpio __code DD_ON = GPIO(E, 4); struct Gpio __code EC_EN = GPIO(E, 1); struct Gpio __code EC_RSMRST_N = GPIO(E, 5); +struct Gpio __code LAN_WAKEUP_N = GPIO(B, 2); struct Gpio __code LED_ACIN = GPIO(C, 7); struct Gpio __code LED_AIRPLANE_N = GPIO(G, 6); struct Gpio __code LED_BAT_CHG = GPIO(A, 5); diff --git a/src/board/system76/galp3-c/include/board/gpio.h b/src/board/system76/galp3-c/include/board/gpio.h index b6ac461..0f34c23 100644 --- a/src/board/system76/galp3-c/include/board/gpio.h +++ b/src/board/system76/galp3-c/include/board/gpio.h @@ -22,6 +22,7 @@ extern struct Gpio __code CCD_EN; extern struct Gpio __code DD_ON; extern struct Gpio __code EC_EN; extern struct Gpio __code EC_RSMRST_N; +extern struct Gpio __code LAN_WAKEUP_N; extern struct Gpio __code LED_ACIN; extern struct Gpio __code LED_AIRPLANE_N; extern struct Gpio __code LED_BAT_CHG; diff --git a/src/board/system76/gaze15/gpio.c b/src/board/system76/gaze15/gpio.c index 36157c4..d450a22 100644 --- a/src/board/system76/gaze15/gpio.c +++ b/src/board/system76/gaze15/gpio.c @@ -12,6 +12,7 @@ struct Gpio __code DD_ON = GPIO(E, 4); struct Gpio __code DGPU_PWR_EN = GPIO(J, 2); struct Gpio __code EC_RSMRST_N = GPIO(E, 5); struct Gpio __code GC6_FB_EN = GPIO(J, 3); +struct Gpio __code LAN_WAKEUP_N = GPIO(B, 2); struct Gpio __code LED_ACIN = GPIO(C, 7); struct Gpio __code LED_AIRPLANE_N = GPIO(H, 7); struct Gpio __code LED_BAT_CHG = GPIO(H, 5); diff --git a/src/board/system76/gaze15/include/board/gpio.h b/src/board/system76/gaze15/include/board/gpio.h index 784f910..3cc1671 100644 --- a/src/board/system76/gaze15/include/board/gpio.h +++ b/src/board/system76/gaze15/include/board/gpio.h @@ -24,6 +24,7 @@ extern struct Gpio __code DGPU_PWR_EN; #define HAVE_EC_EN 0 extern struct Gpio __code EC_RSMRST_N; extern struct Gpio __code GC6_FB_EN; +extern struct Gpio __code LAN_WAKEUP_N; extern struct Gpio __code LED_ACIN; extern struct Gpio __code LED_AIRPLANE_N; extern struct Gpio __code LED_BAT_CHG; diff --git a/src/board/system76/lemp9/include/board/gpio.h b/src/board/system76/lemp9/include/board/gpio.h index a54f45b..f4f7877 100644 --- a/src/board/system76/lemp9/include/board/gpio.h +++ b/src/board/system76/lemp9/include/board/gpio.h @@ -23,6 +23,7 @@ extern struct Gpio __code DD_ON; extern struct Gpio __code EC_EN; extern struct Gpio __code EC_RSMRST_N; extern struct Gpio __code EC_SMD_EN_N; +#define HAVE_LAN_WAKEUP_N 0 extern struct Gpio __code LED_ACIN; #define HAVE_LED_AIRPLANE_N 0 #define HAVE_LED_BAT_CHG 0 diff --git a/src/board/system76/oryp6/gpio.c b/src/board/system76/oryp6/gpio.c index c0a7953..0c07ddb 100644 --- a/src/board/system76/oryp6/gpio.c +++ b/src/board/system76/oryp6/gpio.c @@ -13,6 +13,7 @@ struct Gpio __code DGPU_PWR_EN = GPIO(F, 7); struct Gpio __code EC_EN = GPIO(B, 6); // renamed to SUSBC_EN struct Gpio __code EC_RSMRST_N = GPIO(E, 5); struct Gpio __code GC6_FB_EN = GPIO(J, 7); +struct Gpio __code LAN_WAKEUP_N = GPIO(B, 2); struct Gpio __code LED_ACIN = GPIO(C, 7); struct Gpio __code LED_BAT_CHG = GPIO(H, 5); struct Gpio __code LED_BAT_FULL = GPIO(J, 0); diff --git a/src/board/system76/oryp6/include/board/gpio.h b/src/board/system76/oryp6/include/board/gpio.h index 21b8f10..b3f57d5 100644 --- a/src/board/system76/oryp6/include/board/gpio.h +++ b/src/board/system76/oryp6/include/board/gpio.h @@ -24,6 +24,7 @@ extern struct Gpio __code DGPU_PWR_EN; extern struct Gpio __code EC_EN; extern struct Gpio __code EC_RSMRST_N; extern struct Gpio __code GC6_FB_EN; +extern struct Gpio __code LAN_WAKEUP_N; extern struct Gpio __code LED_ACIN; #define HAVE_LED_AIRPLANE_N 0 extern struct Gpio __code LED_BAT_CHG;