Move PMC logic to board
This commit is contained in:
		@@ -4,5 +4,6 @@
 | 
			
		||||
#include <ec/pmc.h>
 | 
			
		||||
 | 
			
		||||
void pmc_init(void);
 | 
			
		||||
void pmc_event(struct Pmc * pmc);
 | 
			
		||||
 | 
			
		||||
#endif // _BOARD_PMC_H
 | 
			
		||||
 
 | 
			
		||||
@@ -1,6 +1,75 @@
 | 
			
		||||
#include <board/acpi.h>
 | 
			
		||||
#include <board/pmc.h>
 | 
			
		||||
#include <common/debug.h>
 | 
			
		||||
 | 
			
		||||
void pmc_init(void) {
 | 
			
		||||
    *(PMC_1.control) = 0x41;
 | 
			
		||||
    *(PMC_2.control) = 0x41;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#define PMC_TIMEOUT 1000
 | 
			
		||||
 | 
			
		||||
enum PmcState {
 | 
			
		||||
    PMC_STATE_DEFAULT,
 | 
			
		||||
    PMC_STATE_ACPI_READ,
 | 
			
		||||
    PMC_STATE_ACPI_WRITE,
 | 
			
		||||
    PMC_STATE_ACPI_WRITE_ADDR,
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
void pmc_event(struct Pmc * pmc) {
 | 
			
		||||
    static enum PmcState state = PMC_STATE_DEFAULT;
 | 
			
		||||
    static uint8_t state_data[2] = {0, 0};
 | 
			
		||||
 | 
			
		||||
    uint8_t sts = pmc_status(pmc);
 | 
			
		||||
    if (sts & PMC_STS_IBF) {
 | 
			
		||||
        uint8_t data = pmc_read(pmc);
 | 
			
		||||
        if (sts & PMC_STS_CMD) {
 | 
			
		||||
            DEBUG("pmc cmd: %02X\n", data);
 | 
			
		||||
 | 
			
		||||
            state = PMC_STATE_DEFAULT;
 | 
			
		||||
            switch (data) {
 | 
			
		||||
            case 0x80:
 | 
			
		||||
                state = PMC_STATE_ACPI_READ;
 | 
			
		||||
                break;
 | 
			
		||||
            case 0x81:
 | 
			
		||||
                state = PMC_STATE_ACPI_WRITE;
 | 
			
		||||
                break;
 | 
			
		||||
            case 0x82:
 | 
			
		||||
                DEBUG("  burst enable\n");
 | 
			
		||||
                // TODO: figure out what burst is
 | 
			
		||||
                pmc_write(pmc, 0x90, PMC_TIMEOUT);
 | 
			
		||||
                break;
 | 
			
		||||
            case 0x83:
 | 
			
		||||
                DEBUG("  burst disable\n");
 | 
			
		||||
                // TODO: figure out what burst is
 | 
			
		||||
                break;
 | 
			
		||||
            case 0x84:
 | 
			
		||||
                DEBUG("  SCI queue\n");
 | 
			
		||||
                // TODO: queue is always empty
 | 
			
		||||
                pmc_write(pmc, 0, PMC_TIMEOUT);
 | 
			
		||||
                break;
 | 
			
		||||
            }
 | 
			
		||||
        } else {
 | 
			
		||||
            DEBUG("pmc data: %02X\n", data);
 | 
			
		||||
 | 
			
		||||
            switch (state) {
 | 
			
		||||
            case PMC_STATE_ACPI_READ:
 | 
			
		||||
                state = PMC_STATE_DEFAULT;
 | 
			
		||||
                uint8_t value = acpi_read(data);
 | 
			
		||||
                pmc_write(pmc, value, PMC_TIMEOUT);
 | 
			
		||||
                break;
 | 
			
		||||
            case PMC_STATE_ACPI_WRITE:
 | 
			
		||||
                state = PMC_STATE_ACPI_WRITE_ADDR;
 | 
			
		||||
                state_data[0] = data;
 | 
			
		||||
                break;
 | 
			
		||||
            case PMC_STATE_ACPI_WRITE_ADDR:
 | 
			
		||||
                state = PMC_STATE_DEFAULT;
 | 
			
		||||
                acpi_write(state_data[0], data);
 | 
			
		||||
                break;
 | 
			
		||||
            default:
 | 
			
		||||
                state = PMC_STATE_DEFAULT;
 | 
			
		||||
                break;
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -26,8 +26,6 @@ uint8_t pmc_status(struct Pmc * pmc);
 | 
			
		||||
uint8_t pmc_read(struct Pmc * pmc);
 | 
			
		||||
bool pmc_write(struct Pmc * pmc, uint8_t data, int timeout);
 | 
			
		||||
 | 
			
		||||
void pmc_event(struct Pmc * pmc);
 | 
			
		||||
 | 
			
		||||
volatile uint8_t __xdata __at(0x1500) PM1STS;
 | 
			
		||||
volatile uint8_t __xdata __at(0x1501) PM1DO;
 | 
			
		||||
volatile uint8_t __xdata __at(0x1504) PM1DI;
 | 
			
		||||
 
 | 
			
		||||
@@ -1,5 +1,3 @@
 | 
			
		||||
#include <board/acpi.h>
 | 
			
		||||
#include <common/debug.h>
 | 
			
		||||
#include <ec/pmc.h>
 | 
			
		||||
 | 
			
		||||
#define PMC(NUM) { \
 | 
			
		||||
@@ -33,70 +31,3 @@ bool pmc_write(struct Pmc * pmc, uint8_t data, int timeout) {
 | 
			
		||||
    *(pmc->data_out) = data;
 | 
			
		||||
    return true;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#define PMC_TIMEOUT 1000
 | 
			
		||||
 | 
			
		||||
enum PmcState {
 | 
			
		||||
    PMC_STATE_DEFAULT,
 | 
			
		||||
    PMC_STATE_ACPI_READ,
 | 
			
		||||
    PMC_STATE_ACPI_WRITE,
 | 
			
		||||
    PMC_STATE_ACPI_WRITE_ADDR,
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
void pmc_event(struct Pmc * pmc) {
 | 
			
		||||
    static enum PmcState state = PMC_STATE_DEFAULT;
 | 
			
		||||
    static uint8_t state_data[2] = {0, 0};
 | 
			
		||||
 | 
			
		||||
    uint8_t sts = pmc_status(pmc);
 | 
			
		||||
    if (sts & PMC_STS_IBF) {
 | 
			
		||||
        uint8_t data = pmc_read(pmc);
 | 
			
		||||
        if (sts & PMC_STS_CMD) {
 | 
			
		||||
            DEBUG("pmc cmd: %02X\n", data);
 | 
			
		||||
 | 
			
		||||
            state = PMC_STATE_DEFAULT;
 | 
			
		||||
            switch (data) {
 | 
			
		||||
            case 0x80:
 | 
			
		||||
                state = PMC_STATE_ACPI_READ;
 | 
			
		||||
                break;
 | 
			
		||||
            case 0x81:
 | 
			
		||||
                state = PMC_STATE_ACPI_WRITE;
 | 
			
		||||
                break;
 | 
			
		||||
            case 0x82:
 | 
			
		||||
                DEBUG("  burst enable\n");
 | 
			
		||||
                // TODO: figure out what burst is
 | 
			
		||||
                pmc_write(pmc, 0x90, PMC_TIMEOUT);
 | 
			
		||||
                break;
 | 
			
		||||
            case 0x83:
 | 
			
		||||
                DEBUG("  burst disable\n");
 | 
			
		||||
                // TODO: figure out what burst is
 | 
			
		||||
                break;
 | 
			
		||||
            case 0x84:
 | 
			
		||||
                DEBUG("  SCI queue\n");
 | 
			
		||||
                // TODO: queue is always empty
 | 
			
		||||
                pmc_write(pmc, 0, PMC_TIMEOUT);
 | 
			
		||||
                break;
 | 
			
		||||
            }
 | 
			
		||||
        } else {
 | 
			
		||||
            DEBUG("pmc data: %02X\n", data);
 | 
			
		||||
 | 
			
		||||
            switch (state) {
 | 
			
		||||
            case PMC_STATE_ACPI_READ:
 | 
			
		||||
                state = PMC_STATE_DEFAULT;
 | 
			
		||||
                uint8_t value = acpi_read(data);
 | 
			
		||||
                pmc_write(pmc, value, PMC_TIMEOUT);
 | 
			
		||||
                break;
 | 
			
		||||
            case PMC_STATE_ACPI_WRITE:
 | 
			
		||||
                state = PMC_STATE_ACPI_WRITE_ADDR;
 | 
			
		||||
                state_data[0] = data;
 | 
			
		||||
                break;
 | 
			
		||||
            case PMC_STATE_ACPI_WRITE_ADDR:
 | 
			
		||||
                state = PMC_STATE_DEFAULT;
 | 
			
		||||
                acpi_write(state_data[0], data);
 | 
			
		||||
                break;
 | 
			
		||||
            default:
 | 
			
		||||
                state = PMC_STATE_DEFAULT;
 | 
			
		||||
                break;
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user