1 /* SPDX-License-Identifier: GPL-2.0-only */
4 #include <console/console.h>
6 #include <device/device.h>
7 #include <device/pnp.h>
8 #include <pc80/keyboard.h>
13 /* helper functions from drivers/pc80/keyboard.c */
14 static int input_buffer_empty(u16 status_reg
)
17 for (timeout
= KBC_TIMEOUT_IN_MS
; timeout
&& (inb(status_reg
) & KBD_IBF
);
23 printk(BIOS_WARNING
, "EC-IT8518 Unexpected input buffer full\n");
24 printk(BIOS_WARNING
, " Status (0x%x): 0x%x\n", status_reg
, inb(status_reg
));
29 static int output_buffer_full(u16 status_reg
)
32 for (timeout
= KBC_TIMEOUT_IN_MS
; timeout
&& ((inb(status_reg
)
33 & KBD_OBF
) == 0); timeout
--) {
38 printk(BIOS_INFO
, "EC-IT8518 output buffer result timeout\n");
39 printk(BIOS_INFO
, " Status (0x%x): 0x%x\n", status_reg
, inb(status_reg
));
44 /* The IT8518 60/64 EC registers are the same command/status IB/OB KBC pair.
45 * Check status from 64 port before each command.
47 * Ex. Get panel ID command C43/D77
48 * Check IBF empty. Then Write 0x43(CMD) to 0x64 Port
49 * Check IBF empty. Then Write 0x77(DATA) to 0x60 Port
50 * Check OBF set. Then Get Data(0x03:panel ID) from 0x60
51 * Different commands return may or may not respond and may have multiple
52 * bytes. Keep it simple for nor
55 u8
ec_kbc_read_ob(void)
57 if (!output_buffer_full(KBD_STATUS
)) return 0;
61 void ec_kbc_write_cmd(u8 cmd
)
63 if (!input_buffer_empty(KBD_STATUS
)) return;
64 outb(cmd
, KBD_COMMAND
);
67 void ec_kbc_write_ib(u8 data
)
69 if (!input_buffer_empty(KBD_STATUS
)) return;
74 * These functions are for accessing the IT8518 device RAM space via 0x66/0x68
79 if (!output_buffer_full(EC_SC
)) return 0;
83 void ec_write_cmd(u8 cmd
)
85 if (!input_buffer_empty(EC_SC
)) return;
89 void ec_write_ib(u8 data
)
91 if (!input_buffer_empty(EC_SC
)) return;
102 void ec_write(u16 addr
, u8 data
)
109 u8
ec_it8518_get_event(void)
112 u8 status
= inb(EC_SC
);
113 if (status
& SCI_EVT
) {
116 } else if (status
& SMI_EVT
) {
117 ec_kbc_write_cmd(EC_KBD_SMI_EVENT
);
118 cmd
= ec_kbc_read_ob();
123 void ec_it8518_enable_wake_events(void)
126 * Set the bit in ECRAM that will enable the Lid switch as a wake source
128 u8 reg8
= ec_read(EC_WAKE_SRC_ENABLE
);
129 ec_write(EC_WAKE_SRC_ENABLE
, reg8
| EC_LID_WAKE_ENABLE
);
132 static void it8518_init(struct device
*dev
)
137 printk(BIOS_DEBUG
, "Quanta IT8518: Initializing keyboard.\n");
138 pc_keyboard_init(NO_AUX_DEVICE
);
141 static struct device_operations ops
= {
143 .read_resources
= noop_read_resources
,
144 .set_resources
= noop_set_resources
,
147 static struct pnp_info pnp_dev_info
[] = {
151 static void enable_dev(struct device
*dev
)
153 pnp_enable_devices(dev
, &ops
, ARRAY_SIZE(pnp_dev_info
), pnp_dev_info
);
156 struct chip_operations ec_quanta_it8518_ops
= {
157 .name
= "QUANTA IT8518 EC",
158 .enable_dev
= enable_dev