blob: 1df5026531c6b70b0db9c1909d5f599c16c07a00 [file] [log] [blame]
/* SPDX-License-Identifier: GPL-2.0-only */
#include <arch/io.h>
#include <device/pnp_ops.h>
#include <superio/smsc/sch555x/sch555x.h>
#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;
}