/* SPDX-License-Identifier: GPL-2.0-only */ #include #include #include #include "sch5555_ec.h" uint8_t sch5555_mbox_read(uint8_t addr1, uint16_t addr2) { // clear ec-to-host mailbox uint8_t tmp = inb(SCH555x_EMI_IOBASE + 1); outb(tmp, SCH555x_EMI_IOBASE + 1); // send address outw(0 | 0x8001, SCH555x_EMI_IOBASE + 2); outw((addr1 * 2) | 0x100, SCH555x_EMI_IOBASE + 4); outw(4 | 0x8002, SCH555x_EMI_IOBASE + 2); outl(addr2 << 16, SCH555x_EMI_IOBASE + 4); // send message to ec outb(1, SCH555x_EMI_IOBASE); // wait for ack for (size_t retry = 0; retry < 0xfff; ++retry) if (inb(SCH555x_EMI_IOBASE + 1) & 1) break; // read result outw(4 | 0x8000, SCH555x_EMI_IOBASE + 2); return inb(SCH555x_EMI_IOBASE + 4); } void sch5555_mbox_write(uint8_t addr1, uint16_t addr2, uint8_t val) { // clear ec-to-host mailbox uint8_t tmp = inb(SCH555x_EMI_IOBASE + 1); outb(tmp, SCH555x_EMI_IOBASE + 1); // send address and value outw(0 | 0x8001, SCH555x_EMI_IOBASE + 2); outw((addr1 * 2) | 0x101, SCH555x_EMI_IOBASE + 4); outw(4 | 0x8002, SCH555x_EMI_IOBASE + 2); outl(val | (addr2 << 16), SCH555x_EMI_IOBASE + 4); // send message to ec outb(1, SCH555x_EMI_IOBASE); // wait for ack for (size_t retry = 0; retry < 0xfff; ++retry) if (inb(SCH555x_EMI_IOBASE + 1) & 1) break; }