xref: /openbmc/linux/drivers/platform/x86/msi-ec.h (revision 1ac731c529cd4d6adbce134754b51ff7d822b145)
1*392cacf2SNikita Kravets /* SPDX-License-Identifier: GPL-2.0-or-later */
2*392cacf2SNikita Kravets 
3*392cacf2SNikita Kravets /*
4*392cacf2SNikita Kravets  * msi-ec: MSI laptops' embedded controller driver.
5*392cacf2SNikita Kravets  *
6*392cacf2SNikita Kravets  * Copyright (C) 2023 Jose Angel Pastrana <japp0005@red.ujaen.es>
7*392cacf2SNikita Kravets  * Copyright (C) 2023 Aakash Singh <mail@singhaakash.dev>
8*392cacf2SNikita Kravets  * Copyright (C) 2023 Nikita Kravets <teackot@gmail.com>
9*392cacf2SNikita Kravets  */
10*392cacf2SNikita Kravets 
11*392cacf2SNikita Kravets #ifndef _MSI_EC_H_
12*392cacf2SNikita Kravets #define _MSI_EC_H_
13*392cacf2SNikita Kravets 
14*392cacf2SNikita Kravets #include <linux/types.h>
15*392cacf2SNikita Kravets 
16*392cacf2SNikita Kravets #define MSI_EC_DRIVER_NAME "msi-ec"
17*392cacf2SNikita Kravets 
18*392cacf2SNikita Kravets #define MSI_EC_ADDR_UNKNOWN 0xff01 // unknown address
19*392cacf2SNikita Kravets #define MSI_EC_ADDR_UNSUPP  0xff01 // unsupported parameter
20*392cacf2SNikita Kravets 
21*392cacf2SNikita Kravets // Firmware info addresses are universal
22*392cacf2SNikita Kravets #define MSI_EC_FW_VERSION_ADDRESS 0xa0
23*392cacf2SNikita Kravets #define MSI_EC_FW_DATE_ADDRESS    0xac
24*392cacf2SNikita Kravets #define MSI_EC_FW_TIME_ADDRESS    0xb4
25*392cacf2SNikita Kravets #define MSI_EC_FW_VERSION_LENGTH  12
26*392cacf2SNikita Kravets #define MSI_EC_FW_DATE_LENGTH     8
27*392cacf2SNikita Kravets #define MSI_EC_FW_TIME_LENGTH     8
28*392cacf2SNikita Kravets 
29*392cacf2SNikita Kravets struct msi_ec_charge_control_conf {
30*392cacf2SNikita Kravets 	int address;
31*392cacf2SNikita Kravets 	int offset_start;
32*392cacf2SNikita Kravets 	int offset_end;
33*392cacf2SNikita Kravets 	int range_min;
34*392cacf2SNikita Kravets 	int range_max;
35*392cacf2SNikita Kravets };
36*392cacf2SNikita Kravets 
37*392cacf2SNikita Kravets struct msi_ec_webcam_conf {
38*392cacf2SNikita Kravets 	int address;
39*392cacf2SNikita Kravets 	int block_address;
40*392cacf2SNikita Kravets 	int bit;
41*392cacf2SNikita Kravets };
42*392cacf2SNikita Kravets 
43*392cacf2SNikita Kravets struct msi_ec_fn_super_swap_conf {
44*392cacf2SNikita Kravets 	int address;
45*392cacf2SNikita Kravets 	int bit;
46*392cacf2SNikita Kravets };
47*392cacf2SNikita Kravets 
48*392cacf2SNikita Kravets struct msi_ec_cooler_boost_conf {
49*392cacf2SNikita Kravets 	int address;
50*392cacf2SNikita Kravets 	int bit;
51*392cacf2SNikita Kravets };
52*392cacf2SNikita Kravets 
53*392cacf2SNikita Kravets #define MSI_EC_MODE_NULL { NULL, 0 }
54*392cacf2SNikita Kravets struct msi_ec_mode {
55*392cacf2SNikita Kravets 	const char *name;
56*392cacf2SNikita Kravets 	int value;
57*392cacf2SNikita Kravets };
58*392cacf2SNikita Kravets 
59*392cacf2SNikita Kravets struct msi_ec_shift_mode_conf {
60*392cacf2SNikita Kravets 	int address;
61*392cacf2SNikita Kravets 	struct msi_ec_mode modes[5]; // fixed size for easier hard coding
62*392cacf2SNikita Kravets };
63*392cacf2SNikita Kravets 
64*392cacf2SNikita Kravets struct msi_ec_super_battery_conf {
65*392cacf2SNikita Kravets 	int address;
66*392cacf2SNikita Kravets 	int mask;
67*392cacf2SNikita Kravets };
68*392cacf2SNikita Kravets 
69*392cacf2SNikita Kravets struct msi_ec_fan_mode_conf {
70*392cacf2SNikita Kravets 	int address;
71*392cacf2SNikita Kravets 	struct msi_ec_mode modes[5]; // fixed size for easier hard coding
72*392cacf2SNikita Kravets };
73*392cacf2SNikita Kravets 
74*392cacf2SNikita Kravets struct msi_ec_cpu_conf {
75*392cacf2SNikita Kravets 	int rt_temp_address;
76*392cacf2SNikita Kravets 	int rt_fan_speed_address; // realtime
77*392cacf2SNikita Kravets 	int rt_fan_speed_base_min;
78*392cacf2SNikita Kravets 	int rt_fan_speed_base_max;
79*392cacf2SNikita Kravets 	int bs_fan_speed_address; // basic
80*392cacf2SNikita Kravets 	int bs_fan_speed_base_min;
81*392cacf2SNikita Kravets 	int bs_fan_speed_base_max;
82*392cacf2SNikita Kravets };
83*392cacf2SNikita Kravets 
84*392cacf2SNikita Kravets struct msi_ec_gpu_conf {
85*392cacf2SNikita Kravets 	int rt_temp_address;
86*392cacf2SNikita Kravets 	int rt_fan_speed_address; // realtime
87*392cacf2SNikita Kravets };
88*392cacf2SNikita Kravets 
89*392cacf2SNikita Kravets struct msi_ec_led_conf {
90*392cacf2SNikita Kravets 	int micmute_led_address;
91*392cacf2SNikita Kravets 	int mute_led_address;
92*392cacf2SNikita Kravets 	int bit;
93*392cacf2SNikita Kravets };
94*392cacf2SNikita Kravets 
95*392cacf2SNikita Kravets #define MSI_EC_KBD_BL_STATE_MASK 0x3
96*392cacf2SNikita Kravets struct msi_ec_kbd_bl_conf {
97*392cacf2SNikita Kravets 	int bl_mode_address;
98*392cacf2SNikita Kravets 	int bl_modes[2];
99*392cacf2SNikita Kravets 	int max_mode;
100*392cacf2SNikita Kravets 
101*392cacf2SNikita Kravets 	int bl_state_address;
102*392cacf2SNikita Kravets 	int state_base_value;
103*392cacf2SNikita Kravets 	int max_state;
104*392cacf2SNikita Kravets };
105*392cacf2SNikita Kravets 
106*392cacf2SNikita Kravets struct msi_ec_conf {
107*392cacf2SNikita Kravets 	const char * const *allowed_fw;
108*392cacf2SNikita Kravets 
109*392cacf2SNikita Kravets 	struct msi_ec_charge_control_conf charge_control;
110*392cacf2SNikita Kravets 	struct msi_ec_webcam_conf         webcam;
111*392cacf2SNikita Kravets 	struct msi_ec_fn_super_swap_conf  fn_super_swap;
112*392cacf2SNikita Kravets 	struct msi_ec_cooler_boost_conf   cooler_boost;
113*392cacf2SNikita Kravets 	struct msi_ec_shift_mode_conf     shift_mode;
114*392cacf2SNikita Kravets 	struct msi_ec_super_battery_conf  super_battery;
115*392cacf2SNikita Kravets 	struct msi_ec_fan_mode_conf       fan_mode;
116*392cacf2SNikita Kravets 	struct msi_ec_cpu_conf            cpu;
117*392cacf2SNikita Kravets 	struct msi_ec_gpu_conf            gpu;
118*392cacf2SNikita Kravets 	struct msi_ec_led_conf            leds;
119*392cacf2SNikita Kravets 	struct msi_ec_kbd_bl_conf         kbd_bl;
120*392cacf2SNikita Kravets };
121*392cacf2SNikita Kravets 
122*392cacf2SNikita Kravets #endif // _MSI_EC_H_
123