root/drivers/platform/x86/tuxedo/nb04/wmi_util.h
/* SPDX-License-Identifier: GPL-2.0-or-later */
/*
 * This code gives functions to avoid code duplication while interacting with
 * the TUXEDO NB04 wmi interfaces.
 *
 * Copyright (C) 2024-2025 Werner Sembach <wse@tuxedocomputers.com>
 */

#ifndef TUXEDO_NB04_WMI_UTIL_H
#define TUXEDO_NB04_WMI_UTIL_H

#include <linux/wmi.h>

#define TUX_GET_DEVICE_STATUS_DEVICE_ID_TOUCHPAD        1
#define TUX_GET_DEVICE_STATUS_DEVICE_ID_KEYBOARD        2
#define TUX_GET_DEVICE_STATUS_DEVICE_ID_APP_PAGES       3

#define TUX_GET_DEVICE_STATUS_KBL_TYPE_NONE             0
#define TUX_GET_DEVICE_STATUS_KBL_TYPE_PER_KEY          1
#define TUX_GET_DEVICE_STATUS_KBL_TYPE_FOUR_ZONE        2
#define TUX_GET_DEVICE_STATUS_KBL_TYPE_WHITE_ONLY       3

#define TUX_GET_DEVICE_STATUS_KEYBOARD_LAYOUT_ANSII     0
#define TUX_GET_DEVICE_STATUS_KEYBOARD_LAYOUT_ISO       1

#define TUX_GET_DEVICE_STATUS_COLOR_ID_RED              1
#define TUX_GET_DEVICE_STATUS_COLOR_ID_GREEN            2
#define TUX_GET_DEVICE_STATUS_COLOR_ID_YELLOW           3
#define TUX_GET_DEVICE_STATUS_COLOR_ID_BLUE             4
#define TUX_GET_DEVICE_STATUS_COLOR_ID_PURPLE           5
#define TUX_GET_DEVICE_STATUS_COLOR_ID_INDIGO           6
#define TUX_GET_DEVICE_STATUS_COLOR_ID_WHITE            7

#define TUX_GET_DEVICE_STATUS_APP_PAGES_DASHBOARD       BIT(0)
#define TUX_GET_DEVICE_STATUS_APP_PAGES_SYSTEMINFOS     BIT(1)
#define TUX_GET_DEVICE_STATUS_APP_PAGES_KBL             BIT(2)
#define TUX_GET_DEVICE_STATUS_APP_PAGES_HOTKEYS         BIT(3)

union tux_wmi_xx_8in_80out_in_t {
        u8 raw[8];
        struct __packed {
                u8 device_type;
                u8 reserved[7];
        } get_device_status_in;
};

union tux_wmi_xx_8in_80out_out_t {
        u8 raw[80];
        struct __packed {
                u16 return_status;
                u8 device_enabled;
                u8 kbl_type;
                u8 kbl_side_bar_supported;
                u8 keyboard_physical_layout;
                u8 app_pages;
                u8 per_key_kbl_default_color;
                u8 four_zone_kbl_default_color_1;
                u8 four_zone_kbl_default_color_2;
                u8 four_zone_kbl_default_color_3;
                u8 four_zone_kbl_default_color_4;
                u8 light_bar_kbl_default_color;
                u8 reserved_0[1];
                u16 dedicated_gpu_id;
                u8 reserved_1[64];
        } get_device_status_out;
};

enum tux_wmi_xx_8in_80out_methods {
        TUX_GET_DEVICE_STATUS   = 2,
};

#define TUX_KBL_SET_MULTIPLE_KEYS_LIGHTING_SETTINGS_COUNT_MAX   120

union tux_wmi_xx_496in_80out_in_t {
        u8 raw[496];
        struct __packed {
                u8 reserved[15];
                u8 rgb_configs_cnt;
                struct tux_kbl_set_multiple_keys_in_rgb_config_t {
                        u8 key_id;
                        u8 red;
                        u8 green;
                        u8 blue;
                } rgb_configs[TUX_KBL_SET_MULTIPLE_KEYS_LIGHTING_SETTINGS_COUNT_MAX];
        }  kbl_set_multiple_keys_in;
};

union tux_wmi_xx_496in_80out_out_t {
        u8 raw[80];
        struct __packed {
                u8 return_value;
                u8 reserved[79];
        } kbl_set_multiple_keys_out;
};

enum tux_wmi_xx_496in_80out_methods {
        TUX_KBL_SET_MULTIPLE_KEYS       = 6,
};

int tux_wmi_xx_8in_80out(struct wmi_device *wdev,
                         enum tux_wmi_xx_8in_80out_methods method,
                         union tux_wmi_xx_8in_80out_in_t *in,
                         union tux_wmi_xx_8in_80out_out_t *out);
int tux_wmi_xx_496in_80out(struct wmi_device *wdev,
                           enum tux_wmi_xx_496in_80out_methods method,
                           union tux_wmi_xx_496in_80out_in_t *in,
                           union tux_wmi_xx_496in_80out_out_t *out);

#endif