Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Initialize GPIOs from static config table #475

Open
wants to merge 1 commit into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
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
Loading