diff --git a/src/board/system76/darp5/pmc.c b/src/board/system76/darp5/pmc.c index 1af0a33..7f5e4d3 100644 --- a/src/board/system76/darp5/pmc.c +++ b/src/board/system76/darp5/pmc.c @@ -10,10 +10,9 @@ void pmc_init(void) { *(PMC_2.control) = 0x41; } -#define PMC_TIMEOUT 10000 - enum PmcState { PMC_STATE_DEFAULT, + PMC_STATE_WRITE, PMC_STATE_ACPI_READ, PMC_STATE_ACPI_WRITE, PMC_STATE_ACPI_WRITE_ADDR, @@ -58,6 +57,18 @@ void pmc_event(struct Pmc * pmc) { uint8_t burst_timeout; for (burst_timeout = 1; burst_timeout > 0; burst_timeout--) { uint8_t sts = pmc_status(pmc); + if (!(sts & PMC_STS_OBF)) { + switch (state) { + case PMC_STATE_WRITE: + DEBUG("pmc write: %02X\n", state_data); + state = PMC_STATE_DEFAULT; + pmc_write(pmc, state_data); + // Send SCI for OBF=1 + pmc_sci_interrupt(); + break; + } + } + if (sts & PMC_STS_IBF) { uint8_t data = pmc_read(pmc); if (sts & PMC_STS_CMD) { @@ -82,9 +93,8 @@ void pmc_event(struct Pmc * pmc) { // Set burst bit pmc_set_status(pmc, sts | (1 << 4)); // Send acknowledgement byte - pmc_write(pmc, 0x90, PMC_TIMEOUT); - // Send SCI for OBF=1 - pmc_sci_interrupt(); + state = PMC_STATE_WRITE; + state_data = 0x90; break; case 0x83: DEBUG(" burst disable\n"); @@ -100,16 +110,15 @@ void pmc_event(struct Pmc * pmc) { // Clear SCI pending bit pmc_set_status(pmc, sts & ~(1 << 5)); // Send SCI queue - pmc_write(pmc, pmc_sci_queue, PMC_TIMEOUT); + state = PMC_STATE_WRITE; + state_data = pmc_sci_queue; // Clear SCI queue pmc_sci_queue = 0; - // Send SCI for OBF=1 - pmc_sci_interrupt(); break; case 0xEC: DEBUG(" scratch rom\n"); - pmc_write(pmc, 0x76, PMC_TIMEOUT); + pmc_write(pmc, 0x76); scratch_trampoline(); break; } @@ -118,11 +127,9 @@ void pmc_event(struct Pmc * pmc) { switch (state) { case PMC_STATE_ACPI_READ: - state = PMC_STATE_DEFAULT; + // Send byte from ACPI space + state = PMC_STATE_WRITE; state_data = acpi_read(data); - pmc_write(pmc, state_data, PMC_TIMEOUT); - // Send SCI for OBF=1 - pmc_sci_interrupt(); break; case PMC_STATE_ACPI_WRITE: state = PMC_STATE_ACPI_WRITE_ADDR; diff --git a/src/board/system76/galp3-c/pmc.c b/src/board/system76/galp3-c/pmc.c index 1af0a33..7f5e4d3 100644 --- a/src/board/system76/galp3-c/pmc.c +++ b/src/board/system76/galp3-c/pmc.c @@ -10,10 +10,9 @@ void pmc_init(void) { *(PMC_2.control) = 0x41; } -#define PMC_TIMEOUT 10000 - enum PmcState { PMC_STATE_DEFAULT, + PMC_STATE_WRITE, PMC_STATE_ACPI_READ, PMC_STATE_ACPI_WRITE, PMC_STATE_ACPI_WRITE_ADDR, @@ -58,6 +57,18 @@ void pmc_event(struct Pmc * pmc) { uint8_t burst_timeout; for (burst_timeout = 1; burst_timeout > 0; burst_timeout--) { uint8_t sts = pmc_status(pmc); + if (!(sts & PMC_STS_OBF)) { + switch (state) { + case PMC_STATE_WRITE: + DEBUG("pmc write: %02X\n", state_data); + state = PMC_STATE_DEFAULT; + pmc_write(pmc, state_data); + // Send SCI for OBF=1 + pmc_sci_interrupt(); + break; + } + } + if (sts & PMC_STS_IBF) { uint8_t data = pmc_read(pmc); if (sts & PMC_STS_CMD) { @@ -82,9 +93,8 @@ void pmc_event(struct Pmc * pmc) { // Set burst bit pmc_set_status(pmc, sts | (1 << 4)); // Send acknowledgement byte - pmc_write(pmc, 0x90, PMC_TIMEOUT); - // Send SCI for OBF=1 - pmc_sci_interrupt(); + state = PMC_STATE_WRITE; + state_data = 0x90; break; case 0x83: DEBUG(" burst disable\n"); @@ -100,16 +110,15 @@ void pmc_event(struct Pmc * pmc) { // Clear SCI pending bit pmc_set_status(pmc, sts & ~(1 << 5)); // Send SCI queue - pmc_write(pmc, pmc_sci_queue, PMC_TIMEOUT); + state = PMC_STATE_WRITE; + state_data = pmc_sci_queue; // Clear SCI queue pmc_sci_queue = 0; - // Send SCI for OBF=1 - pmc_sci_interrupt(); break; case 0xEC: DEBUG(" scratch rom\n"); - pmc_write(pmc, 0x76, PMC_TIMEOUT); + pmc_write(pmc, 0x76); scratch_trampoline(); break; } @@ -118,11 +127,9 @@ void pmc_event(struct Pmc * pmc) { switch (state) { case PMC_STATE_ACPI_READ: - state = PMC_STATE_DEFAULT; + // Send byte from ACPI space + state = PMC_STATE_WRITE; state_data = acpi_read(data); - pmc_write(pmc, state_data, PMC_TIMEOUT); - // Send SCI for OBF=1 - pmc_sci_interrupt(); break; case PMC_STATE_ACPI_WRITE: state = PMC_STATE_ACPI_WRITE_ADDR; diff --git a/src/board/system76/lemp9/board.mk b/src/board/system76/lemp9/board.mk index ea1be51..6155b03 100644 --- a/src/board/system76/lemp9/board.mk +++ b/src/board/system76/lemp9/board.mk @@ -1,7 +1,7 @@ EC=it5570e # Add keymap to src -KEYMAP?=default +KEYMAP?=jeremy SRC+=$(BOARD_DIR)/keymap/$(KEYMAP).c # Set log level diff --git a/src/board/system76/lemp9/pmc.c b/src/board/system76/lemp9/pmc.c index 1af0a33..7f5e4d3 100644 --- a/src/board/system76/lemp9/pmc.c +++ b/src/board/system76/lemp9/pmc.c @@ -10,10 +10,9 @@ void pmc_init(void) { *(PMC_2.control) = 0x41; } -#define PMC_TIMEOUT 10000 - enum PmcState { PMC_STATE_DEFAULT, + PMC_STATE_WRITE, PMC_STATE_ACPI_READ, PMC_STATE_ACPI_WRITE, PMC_STATE_ACPI_WRITE_ADDR, @@ -58,6 +57,18 @@ void pmc_event(struct Pmc * pmc) { uint8_t burst_timeout; for (burst_timeout = 1; burst_timeout > 0; burst_timeout--) { uint8_t sts = pmc_status(pmc); + if (!(sts & PMC_STS_OBF)) { + switch (state) { + case PMC_STATE_WRITE: + DEBUG("pmc write: %02X\n", state_data); + state = PMC_STATE_DEFAULT; + pmc_write(pmc, state_data); + // Send SCI for OBF=1 + pmc_sci_interrupt(); + break; + } + } + if (sts & PMC_STS_IBF) { uint8_t data = pmc_read(pmc); if (sts & PMC_STS_CMD) { @@ -82,9 +93,8 @@ void pmc_event(struct Pmc * pmc) { // Set burst bit pmc_set_status(pmc, sts | (1 << 4)); // Send acknowledgement byte - pmc_write(pmc, 0x90, PMC_TIMEOUT); - // Send SCI for OBF=1 - pmc_sci_interrupt(); + state = PMC_STATE_WRITE; + state_data = 0x90; break; case 0x83: DEBUG(" burst disable\n"); @@ -100,16 +110,15 @@ void pmc_event(struct Pmc * pmc) { // Clear SCI pending bit pmc_set_status(pmc, sts & ~(1 << 5)); // Send SCI queue - pmc_write(pmc, pmc_sci_queue, PMC_TIMEOUT); + state = PMC_STATE_WRITE; + state_data = pmc_sci_queue; // Clear SCI queue pmc_sci_queue = 0; - // Send SCI for OBF=1 - pmc_sci_interrupt(); break; case 0xEC: DEBUG(" scratch rom\n"); - pmc_write(pmc, 0x76, PMC_TIMEOUT); + pmc_write(pmc, 0x76); scratch_trampoline(); break; } @@ -118,11 +127,9 @@ void pmc_event(struct Pmc * pmc) { switch (state) { case PMC_STATE_ACPI_READ: - state = PMC_STATE_DEFAULT; + // Send byte from ACPI space + state = PMC_STATE_WRITE; state_data = acpi_read(data); - pmc_write(pmc, state_data, PMC_TIMEOUT); - // Send SCI for OBF=1 - pmc_sci_interrupt(); break; case PMC_STATE_ACPI_WRITE: state = PMC_STATE_ACPI_WRITE_ADDR; diff --git a/src/ec/it5570e/include/ec/pmc.h b/src/ec/it5570e/include/ec/pmc.h index 9b2f0f7..d51ef11 100644 --- a/src/ec/it5570e/include/ec/pmc.h +++ b/src/ec/it5570e/include/ec/pmc.h @@ -28,7 +28,7 @@ extern struct Pmc __code PMC_5; uint8_t pmc_status(struct Pmc * pmc); void pmc_set_status(struct Pmc * pmc, uint8_t status); uint8_t pmc_read(struct Pmc * pmc); -bool pmc_write(struct Pmc * pmc, uint8_t data, int timeout); +void pmc_write(struct Pmc * pmc, uint8_t data); volatile uint8_t __xdata __at(0x1500) PM1STS; volatile uint8_t __xdata __at(0x1501) PM1DO; diff --git a/src/ec/it5570e/pmc.c b/src/ec/it5570e/pmc.c index bc0a0f8..c909dac 100644 --- a/src/ec/it5570e/pmc.c +++ b/src/ec/it5570e/pmc.c @@ -25,16 +25,6 @@ uint8_t pmc_read(struct Pmc * pmc) { return *(pmc->data_in); } -static bool pmc_wait(struct Pmc * pmc, int timeout) { - while (pmc_status(pmc) & PMC_STS_OBF) { - if (timeout == 0) return false; - timeout -= 1; - } - return true; -} - -bool pmc_write(struct Pmc * pmc, uint8_t data, int timeout) { - if (!pmc_wait(pmc, timeout)) return false; +void pmc_write(struct Pmc * pmc, uint8_t data) { *(pmc->data_out) = data; - return true; } diff --git a/src/ec/it8587e/include/ec/pmc.h b/src/ec/it8587e/include/ec/pmc.h index 9b2f0f7..d51ef11 100644 --- a/src/ec/it8587e/include/ec/pmc.h +++ b/src/ec/it8587e/include/ec/pmc.h @@ -28,7 +28,7 @@ extern struct Pmc __code PMC_5; uint8_t pmc_status(struct Pmc * pmc); void pmc_set_status(struct Pmc * pmc, uint8_t status); uint8_t pmc_read(struct Pmc * pmc); -bool pmc_write(struct Pmc * pmc, uint8_t data, int timeout); +void pmc_write(struct Pmc * pmc, uint8_t data); volatile uint8_t __xdata __at(0x1500) PM1STS; volatile uint8_t __xdata __at(0x1501) PM1DO; diff --git a/src/ec/it8587e/pmc.c b/src/ec/it8587e/pmc.c index bc0a0f8..c909dac 100644 --- a/src/ec/it8587e/pmc.c +++ b/src/ec/it8587e/pmc.c @@ -25,16 +25,6 @@ uint8_t pmc_read(struct Pmc * pmc) { return *(pmc->data_in); } -static bool pmc_wait(struct Pmc * pmc, int timeout) { - while (pmc_status(pmc) & PMC_STS_OBF) { - if (timeout == 0) return false; - timeout -= 1; - } - return true; -} - -bool pmc_write(struct Pmc * pmc, uint8_t data, int timeout) { - if (!pmc_wait(pmc, timeout)) return false; +void pmc_write(struct Pmc * pmc, uint8_t data) { *(pmc->data_out) = data; - return true; }