Skip to content

Commit

Permalink
Initialize GPIOs from static config table
Browse files Browse the repository at this point in the history
gpio_init() is now the same for every board, and only requires an array
that defines the init data for GPIOs.

The idea is to be able to support tooling for generating and validating
the GPIO configs.

Signed-off-by: Tim Crawford <[email protected]>
  • Loading branch information
crawfxrd committed Dec 5, 2024
1 parent a5e34b5 commit 89aef41
Show file tree
Hide file tree
Showing 36 changed files with 4,355 additions and 7,414 deletions.
311 changes: 118 additions & 193 deletions src/board/system76/addw1/gpio.c
Original file line number Diff line number Diff line change
Expand Up @@ -44,198 +44,123 @@ struct Gpio __code WLAN_EN = GPIO(J, 2);
struct Gpio __code WLAN_PWR_EN = GPIO(B, 0);
// uncrustify:on

static const struct GpioInit __code gpio_cfg_init[] = {
// General control
{ &GCR, 0x04 }, // Enable LPC reset on GPD2

// Port data
{ &GPDRA, BIT(3) }, // SYS_FAN
{ &GPDRB, 0 },
{ &GPDRC, 0 },
{ &GPDRD, BIT(5) | BIT(4) | BIT(3) }, // PWR_BTN#, SCI#, SMI#
{ &GPDRE, 0 },
{ &GPDRF, BIT(6) }, // H_PECI
{ &GPDRG, BIT(6) }, // AIRPLAN_LED#
{ &GPDRH, 0 },
{ &GPDRI, 0 },
{ &GPDRJ, BIT(5) | BIT(4) | BIT(3) | BIT(1) }, // LED_CAP#, LED_NUM#, LED_SCROLL#, KBC_MUTE#

// Port control
{ &GPCRA0, GPIO_ALT }, // EC_PWM_LEDKB_P
{ &GPCRA1, GPIO_ALT }, // KBC_BEEP
{ &GPCRA2, GPIO_ALT }, // CPU_FAN
{ &GPCRA3, GPIO_OUT | GPIO_UP }, // TODO: SYS_FAN
{ &GPCRA4, GPIO_ALT }, // VGA_FAN
{ &GPCRA5, GPIO_ALT }, // EC_PWM_LEDKB_R
{ &GPCRA6, GPIO_ALT }, // EC_PWM_LEDKB_G
{ &GPCRA7, GPIO_ALT }, // EC_PWM_LEDKB_B

{ &GPCRB0, GPIO_OUT | GPIO_UP }, // WLAN_PWR_EN
{ &GPCRB1, GPIO_OUT | GPIO_UP }, // H_PROCHOT_EC
{ &GPCRB2, GPIO_IN | GPIO_UP }, // LAN_WAKEUP#
{ &GPCRB3, GPIO_ALT }, // SMC_BAT
{ &GPCRB4, GPIO_ALT }, // SMD_BAT
{ &GPCRB5, GPIO_OUT | GPIO_UP }, // SUSBC_EN#
{ &GPCRB6, GPIO_IN | GPIO_UP }, // AC_IN#
{ &GPCRB7, GPIO_IN | GPIO_UP }, // PERKB-DET#

{ &GPCRC0, GPIO_IN }, // ALL_SYS_PWRGD
{ &GPCRC1, GPIO_OUT }, // SMC_VGA_THERM
{ &GPCRC2, GPIO_OUT }, // SMD_VGA_THERM
{ &GPCRC3, GPIO_ALT | GPIO_UP }, // KB-SO16
{ &GPCRC4, GPIO_IN | GPIO_UP }, // CNVI_DET#_EC
{ &GPCRC5, GPIO_ALT | GPIO_UP }, // KB-SO17
{ &GPCRC6, GPIO_OUT }, // PM_PWROK
{ &GPCRC7, GPIO_OUT | GPIO_UP }, // LED_ACIN

{ &GPCRD0, GPIO_IN | GPIO_UP }, // PWR_SW#
{ &GPCRD1, GPIO_IN | GPIO_UP }, // LID_SW#
{ &GPCRD2, GPIO_ALT }, // BUF_PLT_RST#
{ &GPCRD3, GPIO_IN }, // SMI#
{ &GPCRD4, GPIO_IN }, // SCI#
{ &GPCRD5, GPIO_OUT | GPIO_UP }, // PWR_BTN#
{ &GPCRD6, GPIO_ALT }, // CPU_FANSEN
{ &GPCRD7, GPIO_ALT }, // ALL_FANSEN

{ &GPCRE0, GPIO_OUT | GPIO_UP }, // SWI#
{ &GPCRE1, GPIO_IN }, // OVERT#
{ &GPCRE2, GPIO_IN | GPIO_UP }, // RGBKB-DET#
{ &GPCRE3, GPIO_IN }, // DGPU_PWR_EN
{ &GPCRE4, GPIO_OUT | GPIO_DOWN }, // DD_ON
{ &GPCRE5, GPIO_OUT }, // EC_RSMRST#
{ &GPCRE6, GPIO_OUT | GPIO_UP }, // SB_KBCRST#
{ &GPCRE7, GPIO_OUT | GPIO_UP }, // AC_PRESENT

{ &GPCRF0, GPIO_IN }, // 80CLK
{ &GPCRF1, GPIO_OUT | GPIO_UP }, // USB_CHARGE_EN
{ &GPCRF2, GPIO_IN | GPIO_UP }, // 3IN1
{ &GPCRF3, GPIO_OUT | GPIO_UP }, // BT_EN
{ &GPCRF4, GPIO_ALT }, // TP_CLK
{ &GPCRF5, GPIO_ALT }, // TP_DATA
{ &GPCRF6, GPIO_ALT }, // H_PECI
{ &GPCRF7, GPIO_OUT | GPIO_UP }, // USB_PWR_EN#

{ &GPCRG0, GPIO_OUT | GPIO_UP }, // CCD_EN
{ &GPCRG1, GPIO_IN }, // GC6_FB_EN_PCH
{ &GPCRG2, GPIO_OUT }, // AUTO_LOAD
{ &GPCRG3, GPIO_ALT }, // ALSPI_CE#
{ &GPCRG4, GPIO_ALT }, // ALSPI_MSI
{ &GPCRG5, GPIO_ALT }, // ALSPI_MSO
{ &GPCRG6, GPIO_OUT | GPIO_UP }, // AIRPLAN_LED#
{ &GPCRG7, GPIO_ALT }, // ALSPI_SCLK

{ &GPCRH0, GPIO_IN }, // ECCLKRUN#
{ &GPCRH1, GPIO_IN }, // SUSC#_PCH
{ &GPCRH2, GPIO_OUT | GPIO_UP }, // BKL_EN
{ &GPCRH3, GPIO_OUT | GPIO_UP }, // LED_BAT_CHG
{ &GPCRH4, GPIO_OUT | GPIO_UP }, // LED_BAT_FULL
{ &GPCRH5, GPIO_OUT | GPIO_UP }, // LED_PWR
{ &GPCRH6, GPIO_IN }, // SUSB#_PCH

{ &GPCRI0, GPIO_ALT }, // BAT_DET
{ &GPCRI1, GPIO_ALT }, // BAT_VOLT
{ &GPCRI2, GPIO_OUT }, // ME_WE
{ &GPCRI3, GPIO_ALT }, // THERM_VOLT
{ &GPCRI4, GPIO_ALT }, // TOTAL_CUR
{ &GPCRI5, GPIO_IN }, // MPS_ID
{ &GPCRI6, GPIO_OUT }, // FANSEN_SEL (L:VGA H:SYS)
{ &GPCRI7, GPIO_IN }, // MODEL_ID

{ &GPCRJ0, GPIO_OUT }, // SLP_SUS_EC#
{ &GPCRJ1, GPIO_OUT }, // KBC_MUTE#
{ &GPCRJ2, GPIO_OUT | GPIO_UP }, // WLAN_EN
{ &GPCRJ3, GPIO_OUT | GPIO_UP }, // LED_SCROLL#
{ &GPCRJ4, GPIO_OUT | GPIO_UP }, // LED_NUM#
{ &GPCRJ5, GPIO_OUT | GPIO_UP }, // LED_CAP#
{ &GPCRJ6, GPIO_OUT | GPIO_UP }, // POWER_IC_EN
{ &GPCRJ7, GPIO_OUT }, // VBATT_BOOST#

{ &GPCRM0, GPIO_ALT }, // LPC_AD0
{ &GPCRM1, GPIO_ALT }, // LPC_AD1
{ &GPCRM2, GPIO_ALT }, // LPC_AD2
{ &GPCRM3, GPIO_ALT }, // LPC_AD3
{ &GPCRM4, GPIO_ALT }, // PCLK_KBC
{ &GPCRM5, GPIO_ALT }, // LPC_FRAME#
{ &GPCRM6, GPIO_ALT }, // SERIRQ
};

void gpio_init(void) {
// Enable LPC reset on GPD2
GCR = 0x04;

// Set GPIO data
// SYS_FAN
GPDRA = BIT(3);
GPDRB = 0x00;
GPDRC = 0x00;
// PWR_BTN#, SCI#, SMI#
GPDRD = BIT(5) | BIT(4) | BIT(3);
GPDRE = 0x00;
// H_PECI
GPDRF = BIT(6);
// AIRPLAN_LED#
GPDRG = BIT(6);
GPDRH = 0x00;
GPDRI = 0x00;
// LED_CAP#, LED_NUM#, LED_SCROLL#, KBC_MUTE#
GPDRJ = BIT(5) | BIT(4) | BIT(3) | BIT(1);

// Set GPIO control
// EC_PWM_LEDKB_P
GPCRA0 = GPIO_ALT;
// KBC_BEEP
GPCRA1 = GPIO_ALT;
// CPU_FAN
GPCRA2 = GPIO_ALT;
// SYS_FAN TODO
GPCRA3 = GPIO_OUT | GPIO_UP;
// VGA_FAN
GPCRA4 = GPIO_ALT;
// EC_PWM_LEDKB_R
GPCRA5 = GPIO_ALT;
// EC_PWM_LEDKB_G
GPCRA6 = GPIO_ALT;
// EC_PWM_LEDKB_B
GPCRA7 = GPIO_ALT;
// WLAN_PWR_EN
GPCRB0 = GPIO_OUT | GPIO_UP;
// H_PROCHOT_EC
GPCRB1 = GPIO_OUT | GPIO_UP;
// LAN_WAKEUP#
GPCRB2 = GPIO_IN | GPIO_UP;
// SMC_BAT
GPCRB3 = GPIO_ALT;
// SMD_BAT
GPCRB4 = GPIO_ALT;
// SUSBC_EN#
GPCRB5 = GPIO_OUT | GPIO_UP;
// AC_IN#
GPCRB6 = GPIO_IN | GPIO_UP;
// PERKB-DET#
GPCRB7 = GPIO_IN | GPIO_UP;
// ALL_SYS_PWRGD
GPCRC0 = GPIO_IN;
// SMC_VGA_THERM
GPCRC1 = GPIO_OUT;
// SMD_VGA_THERM
GPCRC2 = GPIO_OUT;
// KB-SO16
GPCRC3 = GPIO_ALT | GPIO_UP;
// CNVI_DET#_EC
GPCRC4 = GPIO_IN | GPIO_UP;
// KB-SO17
GPCRC5 = GPIO_ALT | GPIO_UP;
// PM_PWROK
GPCRC6 = GPIO_OUT;
// LED_ACIN
GPCRC7 = GPIO_OUT | GPIO_UP;
// PWR_SW#
GPCRD0 = GPIO_IN | GPIO_UP;
// LID_SW#
GPCRD1 = GPIO_IN | GPIO_UP;
// BUF_PLT_RST#
GPCRD2 = GPIO_ALT;
// SMI#
GPCRD3 = GPIO_IN;
// SCI#
GPCRD4 = GPIO_IN;
// PWR_BTN#
GPCRD5 = GPIO_OUT | GPIO_UP;
// CPU_FANSEN
GPCRD6 = GPIO_ALT;
// ALL_FANSEN
GPCRD7 = GPIO_ALT;
// SWI#
GPCRE0 = GPIO_OUT | GPIO_UP;
// OVERT#
GPCRE1 = GPIO_IN;
// RGBKB-DET#
GPCRE2 = GPIO_IN | GPIO_UP;
// DGPU_PWR_EN
GPCRE3 = GPIO_IN;
// DD_ON
GPCRE4 = GPIO_OUT | GPIO_DOWN;
// EC_RSMRST#
GPCRE5 = GPIO_OUT;
// SB_KBCRST#
GPCRE6 = GPIO_OUT | GPIO_UP;
// AC_PRESENT
GPCRE7 = GPIO_OUT | GPIO_UP;
// 80CLK
GPCRF0 = GPIO_IN;
// USB_CHARGE_EN
GPCRF1 = GPIO_OUT | GPIO_UP;
// 3IN1
GPCRF2 = GPIO_IN | GPIO_UP;
// BT_EN
GPCRF3 = GPIO_OUT | GPIO_UP;
// TP_CLK
GPCRF4 = GPIO_ALT;
// TP_DATA
GPCRF5 = GPIO_ALT;
// H_PECI
GPCRF6 = GPIO_ALT;
// USB_PWR_EN#
GPCRF7 = GPIO_OUT | GPIO_UP;
// CCD_EN
GPCRG0 = GPIO_OUT | GPIO_UP;
// GC6_FB_EN_PCH
GPCRG1 = GPIO_IN;
// AUTO_LOAD
GPCRG2 = GPIO_OUT;
// ALSPI_CE#
GPCRG3 = GPIO_ALT;
// ALSPI_MSI
GPCRG4 = GPIO_ALT;
// ALSPI_MSO
GPCRG5 = GPIO_ALT;
// AIRPLAN_LED#
GPCRG6 = GPIO_OUT | GPIO_UP;
// ALSPI_SCLK
GPCRG7 = GPIO_ALT;
// ECCLKRUN#
GPCRH0 = GPIO_IN;
// SUSC#_PCH
GPCRH1 = GPIO_IN;
// BKL_EN
GPCRH2 = GPIO_OUT | GPIO_UP;
// LED_BAT_CHG
GPCRH3 = GPIO_OUT | GPIO_UP;
// LED_BAT_FULL
GPCRH4 = GPIO_OUT | GPIO_UP;
// LED_PWR
GPCRH5 = GPIO_OUT | GPIO_UP;
// SUSB#_PCH
GPCRH6 = GPIO_IN;
// BAT_DET
GPCRI0 = GPIO_ALT;
// BAT_VOLT
GPCRI1 = GPIO_ALT;
// ME_WE
GPCRI2 = GPIO_OUT;
// THERM_VOLT
GPCRI3 = GPIO_ALT;
// TOTAL_CUR
GPCRI4 = GPIO_ALT;
// MPS_ID
GPCRI5 = GPIO_IN;
// FANSEN_SEL (L:VGA H:SYS)
GPCRI6 = GPIO_OUT;
// MODEL_ID
GPCRI7 = GPIO_IN;
// SLP_SUS_EC#
GPCRJ0 = GPIO_OUT;
// KBC_MUTE#
GPCRJ1 = GPIO_OUT;
// WLAN_EN
GPCRJ2 = GPIO_OUT | GPIO_UP;
// LED_SCROLL#
GPCRJ3 = GPIO_OUT | GPIO_UP;
// LED_NUM#
GPCRJ4 = GPIO_OUT | GPIO_UP;
// LED_CAP#
GPCRJ5 = GPIO_OUT | GPIO_UP;
// POWER_IC_EN
GPCRJ6 = GPIO_OUT | GPIO_UP;
// VBATT_BOOST#
GPCRJ7 = GPIO_OUT;
// LPC_AD0
GPCRM0 = GPIO_ALT;
// LPC_AD1
GPCRM1 = GPIO_ALT;
// LPC_AD2
GPCRM2 = GPIO_ALT;
// LPC_AD3
GPCRM3 = GPIO_ALT;
// PCLK_KBC
GPCRM4 = GPIO_ALT;
// LPC_FRAME#
GPCRM5 = GPIO_ALT;
// SERIRQ
GPCRM6 = GPIO_ALT;
for (uint8_t i = 0; i < ARRAY_SIZE(gpio_cfg_init); i++) {
*gpio_cfg_init[i].reg = gpio_cfg_init[i].data;
}
}
Loading

0 comments on commit 89aef41

Please sign in to comment.