void pm3_ibf_interrupt(void) { int new_p80_idx, i; enum ec2i_message ec2i_r; /* set LDN */ if (ec2i_write(HOST_INDEX_LDN, LDN_RTCT) == EC2I_WRITE_SUCCESS) { /* get P80L current index */ ec2i_r = ec2i_read(HOST_INDEX_DSLDC6); /* clear IBF */ pm_clear_ibf(LPC_HOST_PORT_80H); /* read OK */ if ((ec2i_r & 0xff00) == EC2I_READ_SUCCESS) { new_p80_idx = ec2i_r & P80L_BRAM_BANK1_SIZE_MASK; for (i = 0; i < (P80L_P80LE - P80L_P80LB + 1); i++) { if (++p80l_index > P80L_P80LE) p80l_index = P80L_P80LB; port_80_write(IT83XX_BRAM_BANK1(p80l_index)); if (p80l_index == new_p80_idx) break; } } } else { pm_clear_ibf(LPC_HOST_PORT_80H); } task_clear_pending_irq(IT83XX_IRQ_PMC3_IN); }
static void pnpcfg_init(void) { int table; for (table = 0x00; table < EC2I_SETTING_COUNT; table++) { if (ec2i_write(pnpcfg_settings[table].index_port, pnpcfg_settings[table].data_port) == EC2I_WRITE_ERROR) break; } }
static void pnpcfg_init(void) { int table; /* Host access is disabled */ IT83XX_EC2I_LSIOHA |= 0x3; for (table = 0x00; table < EC2I_SETTING_COUNT; table++) { if (ec2i_write(pnpcfg_settings[table].index_port, pnpcfg_settings[table].data_port) == EC2I_WRITE_ERROR) break; } }
static void lpc_init(void) { enum ec2i_message ec2i_r; /* SPI slave interface is disabled */ IT83XX_GCTRL_SSCR = 0; /* * DLM 52k~56k size select enable. * For mapping LPC I/O cycle 800h ~ 9FFh to DLM 8D800 ~ 8D9FF. */ IT83XX_GCTRL_MCCR2 |= 0x10; /* The register pair to access PNPCFG is 004Eh and 004Fh */ IT83XX_GCTRL_BADRSEL = 0x01; /* Disable KBC IRQ */ IT83XX_KBC_KBIRQR = 0x00; /* * bit2, Output Buffer Empty CPU Interrupt Enable. * bit3, Input Buffer Full CPU Interrupt Enable. * bit5, IBF/OBF EC clear mode. * 0b: IBF cleared if EC read data register, EC reset, or host reset. * OBF cleared if host read data register, or EC reset. * 1b: IBF cleared if EC write-1 to bit7 at related registers, * EC reset, or host reset. * OBF cleared if host read data register, EC write-1 to bit6 at * related registers, or EC reset. */ IT83XX_KBC_KBHICR |= 0x2C; /* PM1 Input Buffer Full Interrupt Enable for 62h/66 port */ pm_set_ctrl(LPC_ACPI_CMD, PM_CTRL_IBFIE, 1); /* PM2 Input Buffer Full Interrupt Enable for 200h/204 port */ pm_set_ctrl(LPC_HOST_CMD, PM_CTRL_IBFIE, 1); memset(lpc_get_memmap_range(), 0, EC_MEMMAP_SIZE); memset(lpc_host_args, 0, sizeof(*lpc_host_args)); /* Host LPC I/O cycle mapping to RAM */ /* * bit[4], H2RAM through LPC IO cycle. * bit[1], H2RAM window 1 enabled. * bit[0], H2RAM window 0 enabled. */ IT83XX_SMFI_HRAMWC |= 0x13; /* * bit[7:6] * Host RAM Window[x] Read Protect Enable * 00b: Disabled * 01b: Lower half of RAM window protected * 10b: Upper half of RAM window protected * 11b: All protected * * bit[5:4] * Host RAM Window[x] Write Protect Enable * 00b: Disabled * 01b: Lower half of RAM window protected * 10b: Upper half of RAM window protected * 11b: All protected * * bit[2:0] * Host RAM Window 1 Size (HRAMW1S) * 0h: 16 bytes * 1h: 32 bytes * 2h: 64 bytes * 3h: 128 bytes * 4h: 256 bytes * 5h: 512 bytes * 6h: 1024 bytes * 7h: 2048 bytes */ /* H2RAM Win 0 Base Address 800h allow r/w for host_cmd_memmap */ IT83XX_SMFI_HRAMW0BA = 0x80; IT83XX_SMFI_HRAMW0AAS = 0x04; /* H2RAM Win 1 Base Address 900h allow r for acpi_ec_memmap */ IT83XX_SMFI_HRAMW1BA = 0x90; IT83XX_SMFI_HRAMW1AAS = 0x34; /* We support LPC args and version 3 protocol */ *(lpc_get_memmap_range() + EC_MEMMAP_HOST_CMD_FLAGS) = EC_HOST_CMD_FLAG_LPC_ARGS_SUPPORTED | EC_HOST_CMD_FLAG_VERSION_3; /* * bit[5], Dedicated interrupt * INT3: PMC1 Output Buffer Empty Int * INT25: PMC1 Input Buffer Full Int * INT26: PMC2 Output Buffer Empty Int * INT27: PMC2 Input Buffer Full Int */ IT83XX_PMC_MBXCTRL |= 0x20; /* PM3 Input Buffer Full Interrupt Enable for 80h port */ pm_set_ctrl(LPC_HOST_PORT_80H, PM_CTRL_IBFIE, 1); p80l_index = P80L_P80LC; if (ec2i_write(HOST_INDEX_LDN, LDN_RTCT) == EC2I_WRITE_SUCCESS) { /* get P80L current index */ ec2i_r = ec2i_read(HOST_INDEX_DSLDC6); /* read OK */ if ((ec2i_r & 0xff00) == EC2I_READ_SUCCESS) p80l_index = ec2i_r & P80L_BRAM_BANK1_SIZE_MASK; } /* * bit[7], enable P80L function. * bit[6], accept port 80h cycle. * bit[1-0], 10b: I2EC is read-only. */ IT83XX_GCTRL_SPCTRL1 |= 0xC2; gpio_enable_interrupt(GPIO_PCH_PLTRST_L); task_clear_pending_irq(IT83XX_IRQ_KBC_OUT); task_disable_irq(IT83XX_IRQ_KBC_OUT); task_clear_pending_irq(IT83XX_IRQ_KBC_IN); task_enable_irq(IT83XX_IRQ_KBC_IN); task_clear_pending_irq(IT83XX_IRQ_PMC_IN); pm_set_status(LPC_ACPI_CMD, EC_LPC_STATUS_PROCESSING, 0); task_enable_irq(IT83XX_IRQ_PMC_IN); task_clear_pending_irq(IT83XX_IRQ_PMC2_IN); pm_set_status(LPC_HOST_CMD, EC_LPC_STATUS_PROCESSING, 0); task_enable_irq(IT83XX_IRQ_PMC2_IN); task_clear_pending_irq(IT83XX_IRQ_PMC3_IN); task_enable_irq(IT83XX_IRQ_PMC3_IN); /* Restore event masks if needed */ lpc_post_sysjump(); /* Sufficiently initialized */ init_done = 1; /* Update host events now that we can copy them to memmap */ update_host_event_status(); }