Skip to content

Commit 9a4e102

Browse files
jackpot51crawfxrd
andcommitted
lemp14: Add Lemur Pro 14
The 14" (lemp14) and 16" (lemp14-b) share the same BIOS firmware, but have different EC firmware based on the keyboard interfaces. Co-authored-by: Tim Crawford <tcrawford@system76.com> Signed-off-by: Tim Crawford <tcrawford@system76.com>
1 parent 6eca817 commit 9a4e102

9 files changed

Lines changed: 615 additions & 0 deletions

File tree

src/app/main/power/intel.c

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,10 @@
5151
#define HAVE_LED_BAT_FULL 1
5252
#endif
5353

54+
#ifndef HAVE_LED_PWR_BTN
55+
#define HAVE_LED_PWR_BTN 0
56+
#endif
57+
5458
#ifndef HAVE_PCH_DPWROK_EC
5559
#define HAVE_PCH_DPWROK_EC 1
5660
#endif
@@ -619,6 +623,9 @@ void power_event(void) {
619623
// Modern suspend, flashing green light
620624
if ((time - last_time) >= 1000) {
621625
gpio_set(&LED_PWR, !gpio_get(&LED_PWR));
626+
#if HAVE_LED_PWR_BTN
627+
gpio_set(&LED_PWR_BTN, !gpio_get(&LED_PWR_BTN));
628+
#endif
622629
last_time = time;
623630
}
624631
gpio_set(&LED_ACIN, false);
@@ -627,22 +634,34 @@ void power_event(void) {
627634
{
628635
// CPU on, green light
629636
gpio_set(&LED_PWR, true);
637+
#if HAVE_LED_PWR_BTN
638+
gpio_set(&LED_PWR_BTN, true);
639+
#endif
630640
gpio_set(&LED_ACIN, false);
631641
}
632642
} else if (power_state == POWER_STATE_S3) {
633643
// Suspended, flashing green light
634644
if ((time - last_time) >= 1000) {
635645
gpio_set(&LED_PWR, !gpio_get(&LED_PWR));
646+
#if HAVE_LED_PWR_BTN
647+
gpio_set(&LED_PWR_BTN, !gpio_get(&LED_PWR_BTN));
648+
#endif
636649
last_time = time;
637650
}
638651
gpio_set(&LED_ACIN, false);
639652
} else if (!ac_new) {
640653
// AC plugged in, orange light
641654
gpio_set(&LED_PWR, false);
655+
#if HAVE_LED_PWR_BTN
656+
gpio_set(&LED_PWR_BTN, false);
657+
#endif
642658
gpio_set(&LED_ACIN, true);
643659
} else {
644660
// CPU off and AC adapter unplugged, flashing orange light
645661
gpio_set(&LED_PWR, false);
662+
#if HAVE_LED_PWR_BTN
663+
gpio_set(&LED_PWR_BTN, false);
664+
#endif
646665
if ((time - last_time) >= 1000) {
647666
gpio_set(&LED_ACIN, !gpio_get(&LED_ACIN));
648667
last_time = time;
Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,53 @@
1+
# SPDX-License-Identifier: GPL-3.0-only
2+
3+
# Variant with:
4+
# - 16" display
5+
# - 18x8 keyboard matrix
6+
# - KBLED using PWM interface
7+
8+
board-y += board.c
9+
board-y += gpio.c
10+
11+
EC = ite
12+
CONFIG_EC_ITE_IT5570E = y
13+
CONFIG_EC_FLASH_SIZE_256K = y
14+
15+
# Intel-based host
16+
CONFIG_PLATFORM_INTEL = y
17+
CONFIG_BUS_ESPI = y
18+
CONFIG_PECI_OVER_ESPI = y
19+
20+
# Enable firmware security
21+
CONFIG_SECURITY = y
22+
23+
# Keyboard configuration
24+
KEYBOARD = 18H9LHA05
25+
KEYMAP = darp10
26+
CONFIG_HAVE_KBLED = y
27+
CONFIG_KBLED = rgb_pwm
28+
29+
# Set touchpad PS2 bus
30+
CONFIG_PS2_TOUCHPAD = PS2_3
31+
32+
# Set smart charger parameters
33+
CONFIG_CHARGER = oz26786
34+
CONFIG_I2C_SMBUS = I2C_4
35+
CONFIG_CHARGER_ADAPTER_RSENSE = 5
36+
CONFIG_CHARGER_BATTERY_RSENSE = 10
37+
CONFIG_CHARGER_CHARGE_CURRENT = 1536
38+
CONFIG_CHARGER_CHARGE_VOLTAGE = 17600
39+
CONFIG_CHARGER_INPUT_CURRENT = 3420
40+
41+
# Set CPU power limits in watts
42+
CONFIG_POWER_LIMIT_AC = 65
43+
CONFIG_POWER_LIMIT_DC = 45
44+
45+
# Fan configs
46+
CONFIG_FAN1_PWM = DCR2
47+
CONFIG_FAN1_POINTS = " \
48+
FAN_POINT(70, 40), \
49+
FAN_POINT(75, 50), \
50+
FAN_POINT(80, 60), \
51+
FAN_POINT(85, 65), \
52+
FAN_POINT(90, 65), \
53+
"
Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
// SPDX-License-Identifier: GPL-3.0-only
2+
3+
#include <app/board.h>
4+
#include <app/battery.h>
5+
#include <app/espi.h>
6+
#include <board/gpio.h>
7+
#include <ec/ec.h>
8+
9+
void board_init(void) {
10+
espi_init();
11+
12+
// Make sure charger is in off state, also enables PSYS
13+
battery_charger_disable();
14+
15+
// Allow backlight to be turned on
16+
gpio_set(&BKL_EN, true);
17+
// Enable camera
18+
gpio_set(&CCD_EN, true);
19+
}
20+
21+
void board_event(void) {
22+
espi_event();
23+
24+
ec_read_post_codes();
25+
}

src/board/system76/lemp14-b/gpio.c

Lines changed: 168 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,168 @@
1+
// SPDX-License-Identifier: GPL-3.0-only
2+
3+
#include <board/gpio.h>
4+
#include <common/macro.h>
5+
6+
// uncrustify:off
7+
struct Gpio __code ACIN_N = GPIO(B, 0);
8+
struct Gpio __code AC_PRESENT = GPIO(A, 4);
9+
struct Gpio __code ALL_SYS_PWRGD = GPIO(C, 0);
10+
struct Gpio __code BKL_EN = GPIO(C, 7);
11+
struct Gpio __code BUF_PLT_RST_N = GPIO(D, 2); // renamed to ESPI_RESET#
12+
struct Gpio __code CCD_EN = GPIO(D, 1);
13+
struct Gpio __code CPU_C10_GATE_N = GPIO(F, 7);
14+
struct Gpio __code DD_ON = GPIO(E, 4);
15+
struct Gpio __code EC_EN = GPIO(B, 6); // renamed to SUSBC_EC#
16+
struct Gpio __code EC_RSMRST_N = GPIO(E, 5);
17+
struct Gpio __code LED_ACIN = GPIO(H, 2);
18+
struct Gpio __code LED_PWR = GPIO(I, 2); // renamed to LED_PWR_BTN
19+
struct Gpio __code LID_SW_N = GPIO(B, 1);
20+
struct Gpio __code ME_WE = GPIO(D, 7);
21+
struct Gpio __code PCH_PWROK_EC = GPIO(F, 3);
22+
struct Gpio __code PD_EN = GPIO(D, 0); // renamed to PD_POWER_EN
23+
struct Gpio __code PM_PWROK = GPIO(H, 7); // renamed to EC_PWROK
24+
struct Gpio __code PWR_BTN_N = GPIO(D, 5);
25+
struct Gpio __code PWR_SW_N = GPIO(B, 3);
26+
struct Gpio __code RGBKB_DET_N = GPIO(I, 2);
27+
struct Gpio __code SLP_S0_N = GPIO(B, 5);
28+
struct Gpio __code SUSB_N_PCH = GPIO(H, 0);
29+
struct Gpio __code SUSC_N_PCH = GPIO(H, 1);
30+
struct Gpio __code VA_EC_EN = GPIO(J, 4);
31+
struct Gpio __code VCCST_EN = GPIO(D, 3);
32+
struct Gpio __code VCCST_EN_PG = GPIO(H, 6);
33+
struct Gpio __code WLAN_PWR_EN = GPIO(A, 3);
34+
struct Gpio __code XLP_OUT = GPIO(B, 4);
35+
// uncrustify:on
36+
37+
static const struct GpioInit __code gpio_cfg_init[] = {
38+
// General control
39+
{ &GCR, 0b10 << 1 }, // Enable LPC reset on GPD2
40+
{ &GCR2, 0 }, // Disable PECI
41+
{ &GCR6, 0 }, // Disable UARTs
42+
{ &GCR8, BIT(4) }, // PWRSW WDT 2 Enable 1
43+
{ &GCR9, BIT(5) }, // PWRSW WDT 2 Enable 2
44+
{ &GCR10, BIT(1) }, // PWRSW counter 12 seconds
45+
{ &GCR15, BIT(4) }, // Enable SMBus channel 4
46+
{ &GCR19, BIT(7) | BIT(0) }, // Set GPB5 and GPD2 to 1.8V
47+
{ &GCR20, BIT(7) }, // Set GPD3 to 1.8V, GPF2 and GPF3 to 3.3V
48+
{ &GCR21, BIT(6) | BIT(5) | BIT(2) | BIT(1) }, // Set GPF6, GPF7, GPH0, and GPH1 to 1.8V
49+
{ &GCR22, BIT(7) },
50+
{ &GCR23, BIT(0) }, // Set GPM6 power domain to VCC
51+
52+
// Port data
53+
{ &GPDRA, 0 },
54+
{ &GPDRB, BIT(4) }, // XLP_OUT
55+
{ &GPDRC, 0 },
56+
{ &GPDRD, BIT(5) }, // PWR_BTN#
57+
{ &GPDRE, BIT(3) }, // USB_PWR_EN
58+
{ &GPDRF, 0 },
59+
{ &GPDRG, BIT(6) }, // H_PROCHOT_EC
60+
{ &GPDRH, 0 },
61+
{ &GPDRI, 0 },
62+
{ &GPDRJ, BIT(1) }, // KBC_MUTE#
63+
{ &GPDRM, 0 },
64+
65+
// Port control
66+
{ &GPCRA0, GPIO_OUT }, // EC_PWM_LEDKB_P
67+
{ &GPCRA1, GPIO_IN }, // KBC_BEEP
68+
{ &GPCRA2, GPIO_ALT }, // CPU_FAN
69+
{ &GPCRA3, GPIO_OUT }, // WLAN_PWR_EN
70+
{ &GPCRA4, GPIO_OUT }, // AC_PRESENT_EC
71+
{ &GPCRA5, GPIO_ALT }, // EC_PWM_LEDKB_R
72+
{ &GPCRA6, GPIO_ALT }, // EC_PWM_LEDKB_G
73+
{ &GPCRA7, GPIO_IN }, // TBTA_VBUS_2_EN#
74+
75+
{ &GPCRB0, GPIO_IN | GPIO_UP }, // AC_IN#
76+
{ &GPCRB1, GPIO_IN | GPIO_UP }, // LID_SW#
77+
{ &GPCRB2, GPIO_IN }, // PCIE_WAKE#
78+
{ &GPCRB3, GPIO_IN }, // PWR_SW#
79+
{ &GPCRB4, GPIO_OUT }, // XLP_OUT
80+
{ &GPCRB5, GPIO_IN }, // SLP_S0#
81+
{ &GPCRB6, GPIO_OUT }, // SUSBC_EC#
82+
83+
{ &GPCRC0, GPIO_IN }, // ALL_SYS_PWRGD
84+
{ &GPCRC1, GPIO_ALT | GPIO_UP }, // SMB_CLK_EC
85+
{ &GPCRC2, GPIO_ALT | GPIO_UP }, // SMB_DATA_EC
86+
{ &GPCRC3, GPIO_ALT | GPIO_UP }, // KB-SO16
87+
{ &GPCRC4, GPIO_IN | GPIO_UP }, // CNVI_DET#
88+
{ &GPCRC5, GPIO_ALT | GPIO_UP }, // KB-SO17
89+
{ &GPCRC6, GPIO_IN }, // TMRI1-TEST
90+
{ &GPCRC7, GPIO_OUT }, // BKL_EN
91+
92+
{ &GPCRD0, GPIO_OUT }, // PD_POWER_EN
93+
{ &GPCRD1, GPIO_OUT }, // CCD_EN
94+
{ &GPCRD2, GPIO_ALT }, // ESPI_RESET#
95+
{ &GPCRD3, GPIO_IN }, // VCCST_EN
96+
{ &GPCRD4, GPIO_OUT }, // NC
97+
{ &GPCRD5, GPIO_OUT }, // EC_PWR_BTN#
98+
{ &GPCRD6, GPIO_ALT | GPIO_DOWN }, // CPU_FANSEN
99+
{ &GPCRD7, GPIO_OUT }, // EC_ME_WE
100+
101+
{ &GPCRE0, GPIO_ALT | GPIO_UP }, // SMC_BAT
102+
{ &GPCRE1, GPIO_IN }, // GPE1_TEST
103+
{ &GPCRE2, GPIO_IN }, // ACE_I2C_IRQ2Z
104+
{ &GPCRE3, GPIO_OUT }, // USB_PWR_EN
105+
{ &GPCRE4, GPIO_OUT }, // DD_ON
106+
{ &GPCRE5, GPIO_OUT }, // EC_RSMRST#
107+
{ &GPCRE6, GPIO_IN }, // JACK_IN#_EC
108+
{ &GPCRE7, GPIO_ALT | GPIO_UP }, // SMD_BAT
109+
110+
{ &GPCRF0, GPIO_OUT }, // 80CLK
111+
{ &GPCRF1, GPIO_OUT }, // USB_CHARGE_EN
112+
{ &GPCRF2, GPIO_OUT }, // 3IN1
113+
{ &GPCRF3, GPIO_OUT }, // PCH_PWROK_EC
114+
{ &GPCRF4, GPIO_ALT | GPIO_UP }, // TP_CLK
115+
{ &GPCRF5, GPIO_ALT | GPIO_UP }, // TP_DATA
116+
{ &GPCRF6, GPIO_IN }, // SLP_A#
117+
{ &GPCRF7, GPIO_IN }, // CPU_C10_GATE#
118+
119+
{ &GPCRG0, GPIO_IN }, // 10k pull-down
120+
{ &GPCRG1, GPIO_IN }, // WLAN_EN
121+
{ &GPCRG2, GPIO_IN }, // Pull up to VDD3
122+
{ &GPCRG3, GPIO_ALT }, // ALSPI_CE#
123+
{ &GPCRG4, GPIO_ALT }, // ALSPI_MSI
124+
{ &GPCRG5, GPIO_ALT }, // ALSPI_MSO
125+
{ &GPCRG6, GPIO_OUT }, // H_PROCHOT_EC
126+
{ &GPCRG7, GPIO_ALT }, // ALSPI_SCLK
127+
128+
{ &GPCRH0, GPIO_IN }, // SUSB#_PCH
129+
{ &GPCRH1, GPIO_IN }, // SUSC#_PCH
130+
{ &GPCRH2, GPIO_OUT }, // LED_ACIN
131+
{ &GPCRH3, GPIO_OUT }, // 3G_EN
132+
{ &GPCRH4, GPIO_OUT }, // 3G_PWR_EN
133+
{ &GPCRH5, GPIO_IN }, // TBTA_VBUS_1_EN#
134+
{ &GPCRH6, GPIO_OUT }, // VCCST_EN_PG
135+
{ &GPCRH7, GPIO_OUT }, // EC_PWROK
136+
137+
{ &GPCRI0, GPIO_ALT }, // BAT_DET
138+
{ &GPCRI1, GPIO_ALT }, // BAT_VOLT
139+
{ &GPCRI2, GPIO_IN | GPIO_UP }, // RGBKB-DET#
140+
{ &GPCRI3, GPIO_ALT }, // THERM_VOLT_CPU_1
141+
{ &GPCRI4, GPIO_ALT }, // TOTAL_CUR
142+
{ &GPCRI5, GPIO_OUT }, // LED_PWR_BTN
143+
{ &GPCRI6, GPIO_ALT }, // THERM_VOLT_CPU_2
144+
{ &GPCRI7, GPIO_IN }, // MODEL_ID
145+
146+
{ &GPCRJ0, GPIO_IN }, // SINK_CTRL_EC_1
147+
{ &GPCRJ1, GPIO_OUT }, // KBC_MUTE#
148+
{ &GPCRJ2, GPIO_ALT }, // KBLIGHT_ADJ
149+
{ &GPCRJ3, GPIO_IN }, // SINK_CTRL_EC_2
150+
{ &GPCRJ4, GPIO_OUT }, // VA_EC_EN
151+
{ &GPCRJ5, GPIO_IN }, // VBATT_BOOST#
152+
{ &GPCRJ6, GPIO_OUT }, // EC_GPIO
153+
{ &GPCRJ7, GPIO_IN | GPIO_UP }, // LEDKB_DET#
154+
155+
{ &GPCRM0, GPIO_ALT | GPIO_UP | GPIO_DOWN }, // ESPI_IO0_EC
156+
{ &GPCRM1, GPIO_ALT | GPIO_UP | GPIO_DOWN }, // ESPI_IO1_EC
157+
{ &GPCRM2, GPIO_ALT | GPIO_UP | GPIO_DOWN }, // ESPI_IO2_EC
158+
{ &GPCRM3, GPIO_ALT | GPIO_UP | GPIO_DOWN }, // ESPI_IO3_EC
159+
{ &GPCRM4, GPIO_ALT | GPIO_UP | GPIO_DOWN }, // ESPI_CLK_EC
160+
{ &GPCRM5, GPIO_ALT }, // ESPI_CS_EC#
161+
{ &GPCRM6, GPIO_IN | GPIO_UP | GPIO_DOWN }, // ESPI_ALRT0#
162+
};
163+
164+
void gpio_init(void) {
165+
for (uint8_t i = 0; i < ARRAY_SIZE(gpio_cfg_init); i++) {
166+
*gpio_cfg_init[i].reg = gpio_cfg_init[i].data;
167+
}
168+
}
Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,51 @@
1+
// SPDX-License-Identifier: GPL-3.0-only
2+
3+
#ifndef _BOARD_GPIO_H
4+
#define _BOARD_GPIO_H
5+
6+
#include <ec/gpio.h>
7+
8+
void gpio_init(void);
9+
10+
extern struct Gpio __code ACIN_N;
11+
extern struct Gpio __code AC_PRESENT;
12+
extern struct Gpio __code ALL_SYS_PWRGD;
13+
extern struct Gpio __code BKL_EN;
14+
#define HAVE_BT_EN 0
15+
extern struct Gpio __code BUF_PLT_RST_N;
16+
extern struct Gpio __code CCD_EN;
17+
extern struct Gpio __code CPU_C10_GATE_N;
18+
extern struct Gpio __code DD_ON;
19+
extern struct Gpio __code EC_EN;
20+
extern struct Gpio __code EC_RSMRST_N;
21+
#define HAVE_LAN_WAKEUP_N 0
22+
extern struct Gpio __code LED_ACIN;
23+
#define HAVE_LED_AIRPLANE_N 0
24+
#define HAVE_LED_BAT_CHG 0
25+
#define HAVE_LED_BAT_FULL 0
26+
extern struct Gpio __code LED_PWR;
27+
extern struct Gpio __code LID_SW_N;
28+
extern struct Gpio __code ME_WE;
29+
#define HAVE_PCH_DPWROK_EC 0
30+
extern struct Gpio __code PCH_PWROK_EC;
31+
#define HAVE_PD_EN 1
32+
extern struct Gpio __code PD_EN;
33+
extern struct Gpio __code PM_PWROK;
34+
extern struct Gpio __code PWR_BTN_N;
35+
extern struct Gpio __code PWR_SW_N;
36+
extern struct Gpio __code RGBKB_DET_N;
37+
extern struct Gpio __code SLP_S0_N;
38+
#define HAVE_SLP_SUS_N 0
39+
extern struct Gpio __code SUSB_N_PCH;
40+
extern struct Gpio __code SUSC_N_PCH;
41+
#define HAVE_SUSWARN_N 0
42+
#define HAVE_SUS_PWR_ACK 0
43+
extern struct Gpio __code VA_EC_EN;
44+
#define HAVE_VCCST_EN 1
45+
extern struct Gpio __code VCCST_EN;
46+
extern struct Gpio __code VCCST_EN_PG;
47+
#define HAVE_WLAN_EN 0
48+
extern struct Gpio __code WLAN_PWR_EN;
49+
extern struct Gpio __code XLP_OUT;
50+
51+
#endif // _BOARD_GPIO_H

0 commit comments

Comments
 (0)