• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /* SPDX-License-Identifier: GPL-2.0-only */
2 
3 #include <console/console.h>
4 #include <device/device.h>
5 #include <ec/acpi/ec.h>
6 
7 #include "chip.h"
8 
9 #define KBC_TIMEOUT_US 1000000 // 1s
10 
11 /*
12  * kbc1126_thermal_init: initialize fan control
13  * The code is found in EcThermalInit of the vendor firmware.
14  */
kbc1126_thermal_init(u8 cmd,u8 value)15 static int kbc1126_thermal_init(u8 cmd, u8 value)
16 {
17 	printk(BIOS_DEBUG, "KBC1126: initialize fan control.\n");
18 
19 	if (send_ec_command_timeout(cmd, KBC_TIMEOUT_US) < 0)
20 		return -1;
21 
22 	if (send_ec_data_timeout(0x27, KBC_TIMEOUT_US) < 0)
23 		return -1;
24 
25 	if (send_ec_data_timeout(0x01, KBC_TIMEOUT_US) < 0)
26 		return -1;
27 
28 	/*
29 	 * The following code is needed for fan control when AC is plugged in.
30 	 */
31 
32 	if (send_ec_command_timeout(cmd, KBC_TIMEOUT_US) < 0)
33 		return -1;
34 
35 	if (send_ec_data_timeout(0xd5, KBC_TIMEOUT_US) < 0)
36 		return -1;
37 
38 	if (send_ec_data_timeout(value, KBC_TIMEOUT_US) < 0)
39 		return -1;
40 
41 	printk(BIOS_DEBUG, "KBC1126: fan control initialized.\n");
42 	return 0;
43 }
44 
45 /*
46  * kbc1126_kbd_led: set CapsLock and NumLock LEDs
47  * This is used in MemoryErrorReport of the vendor firmware.
48  */
kbc1126_kbd_led(u8 cmd,u8 val)49 static void kbc1126_kbd_led(u8 cmd, u8 val)
50 {
51 	if (send_ec_command_timeout(cmd, KBC_TIMEOUT_US) < 0)
52 		return;
53 
54 	if (send_ec_data_timeout(0xf0, KBC_TIMEOUT_US) < 0)
55 		return;
56 
57 	if (send_ec_data_timeout(val, KBC_TIMEOUT_US) < 0)
58 		return;
59 }
60 
kbc1126_enable(struct device * dev)61 static void kbc1126_enable(struct device *dev)
62 {
63 	struct ec_hp_kbc1126_config *conf = dev->chip_info;
64 
65 	ec_set_ports(conf->ec_cmd_port, conf->ec_data_port);
66 	kbc1126_kbd_led(conf->ec_ctrl_reg, 0);
67 	if (kbc1126_thermal_init(conf->ec_ctrl_reg, conf->ec_fan_ctrl_value) < 0)
68 		printk(BIOS_DEBUG, "KBC1126: error when initializing fan control.\n");
69 }
70 
71 struct chip_operations ec_hp_kbc1126_ops = {
72 	.name = "SMSC KBC1126 for HP laptops",
73 	.enable_dev = kbc1126_enable
74 };
75