1*4882a593Smuzhiyun /* SPDX-License-Identifier: GPL-2.0-only */ 2*4882a593Smuzhiyun /* 3*4882a593Smuzhiyun * Common functions for kernel modules using Dell SMBIOS 4*4882a593Smuzhiyun * 5*4882a593Smuzhiyun * Copyright (c) Red Hat <mjg@redhat.com> 6*4882a593Smuzhiyun * Copyright (c) 2014 Gabriele Mazzotta <gabriele.mzt@gmail.com> 7*4882a593Smuzhiyun * Copyright (c) 2014 Pali Rohár <pali@kernel.org> 8*4882a593Smuzhiyun * 9*4882a593Smuzhiyun * Based on documentation in the libsmbios package: 10*4882a593Smuzhiyun * Copyright (C) 2005-2014 Dell Inc. 11*4882a593Smuzhiyun */ 12*4882a593Smuzhiyun 13*4882a593Smuzhiyun #ifndef _DELL_SMBIOS_H_ 14*4882a593Smuzhiyun #define _DELL_SMBIOS_H_ 15*4882a593Smuzhiyun 16*4882a593Smuzhiyun #include <linux/device.h> 17*4882a593Smuzhiyun #include <uapi/linux/wmi.h> 18*4882a593Smuzhiyun 19*4882a593Smuzhiyun /* Classes and selects used only in kernel drivers */ 20*4882a593Smuzhiyun #define CLASS_KBD_BACKLIGHT 4 21*4882a593Smuzhiyun #define SELECT_KBD_BACKLIGHT 11 22*4882a593Smuzhiyun 23*4882a593Smuzhiyun /* Tokens used in kernel drivers, any of these 24*4882a593Smuzhiyun * should be filtered from userspace access 25*4882a593Smuzhiyun */ 26*4882a593Smuzhiyun #define BRIGHTNESS_TOKEN 0x007d 27*4882a593Smuzhiyun #define KBD_LED_AC_TOKEN 0x0451 28*4882a593Smuzhiyun #define KBD_LED_OFF_TOKEN 0x01E1 29*4882a593Smuzhiyun #define KBD_LED_ON_TOKEN 0x01E2 30*4882a593Smuzhiyun #define KBD_LED_AUTO_TOKEN 0x01E3 31*4882a593Smuzhiyun #define KBD_LED_AUTO_25_TOKEN 0x02EA 32*4882a593Smuzhiyun #define KBD_LED_AUTO_50_TOKEN 0x02EB 33*4882a593Smuzhiyun #define KBD_LED_AUTO_75_TOKEN 0x02EC 34*4882a593Smuzhiyun #define KBD_LED_AUTO_100_TOKEN 0x02F6 35*4882a593Smuzhiyun #define GLOBAL_MIC_MUTE_ENABLE 0x0364 36*4882a593Smuzhiyun #define GLOBAL_MIC_MUTE_DISABLE 0x0365 37*4882a593Smuzhiyun 38*4882a593Smuzhiyun struct notifier_block; 39*4882a593Smuzhiyun 40*4882a593Smuzhiyun struct calling_interface_token { 41*4882a593Smuzhiyun u16 tokenID; 42*4882a593Smuzhiyun u16 location; 43*4882a593Smuzhiyun union { 44*4882a593Smuzhiyun u16 value; 45*4882a593Smuzhiyun u16 stringlength; 46*4882a593Smuzhiyun }; 47*4882a593Smuzhiyun }; 48*4882a593Smuzhiyun 49*4882a593Smuzhiyun struct calling_interface_structure { 50*4882a593Smuzhiyun struct dmi_header header; 51*4882a593Smuzhiyun u16 cmdIOAddress; 52*4882a593Smuzhiyun u8 cmdIOCode; 53*4882a593Smuzhiyun u32 supportedCmds; 54*4882a593Smuzhiyun struct calling_interface_token tokens[]; 55*4882a593Smuzhiyun } __packed; 56*4882a593Smuzhiyun 57*4882a593Smuzhiyun int dell_smbios_register_device(struct device *d, void *call_fn); 58*4882a593Smuzhiyun void dell_smbios_unregister_device(struct device *d); 59*4882a593Smuzhiyun 60*4882a593Smuzhiyun int dell_smbios_error(int value); 61*4882a593Smuzhiyun int dell_smbios_call_filter(struct device *d, 62*4882a593Smuzhiyun struct calling_interface_buffer *buffer); 63*4882a593Smuzhiyun int dell_smbios_call(struct calling_interface_buffer *buffer); 64*4882a593Smuzhiyun 65*4882a593Smuzhiyun struct calling_interface_token *dell_smbios_find_token(int tokenid); 66*4882a593Smuzhiyun 67*4882a593Smuzhiyun enum dell_laptop_notifier_actions { 68*4882a593Smuzhiyun DELL_LAPTOP_KBD_BACKLIGHT_BRIGHTNESS_CHANGED, 69*4882a593Smuzhiyun }; 70*4882a593Smuzhiyun 71*4882a593Smuzhiyun int dell_laptop_register_notifier(struct notifier_block *nb); 72*4882a593Smuzhiyun int dell_laptop_unregister_notifier(struct notifier_block *nb); 73*4882a593Smuzhiyun void dell_laptop_call_notifier(unsigned long action, void *data); 74*4882a593Smuzhiyun 75*4882a593Smuzhiyun /* for the supported backends */ 76*4882a593Smuzhiyun #ifdef CONFIG_DELL_SMBIOS_WMI 77*4882a593Smuzhiyun int init_dell_smbios_wmi(void); 78*4882a593Smuzhiyun void exit_dell_smbios_wmi(void); 79*4882a593Smuzhiyun #else /* CONFIG_DELL_SMBIOS_WMI */ init_dell_smbios_wmi(void)80*4882a593Smuzhiyunstatic inline int init_dell_smbios_wmi(void) 81*4882a593Smuzhiyun { 82*4882a593Smuzhiyun return -ENODEV; 83*4882a593Smuzhiyun } exit_dell_smbios_wmi(void)84*4882a593Smuzhiyunstatic inline void exit_dell_smbios_wmi(void) 85*4882a593Smuzhiyun {} 86*4882a593Smuzhiyun #endif /* CONFIG_DELL_SMBIOS_WMI */ 87*4882a593Smuzhiyun 88*4882a593Smuzhiyun #ifdef CONFIG_DELL_SMBIOS_SMM 89*4882a593Smuzhiyun int init_dell_smbios_smm(void); 90*4882a593Smuzhiyun void exit_dell_smbios_smm(void); 91*4882a593Smuzhiyun #else /* CONFIG_DELL_SMBIOS_SMM */ init_dell_smbios_smm(void)92*4882a593Smuzhiyunstatic inline int init_dell_smbios_smm(void) 93*4882a593Smuzhiyun { 94*4882a593Smuzhiyun return -ENODEV; 95*4882a593Smuzhiyun } exit_dell_smbios_smm(void)96*4882a593Smuzhiyunstatic inline void exit_dell_smbios_smm(void) 97*4882a593Smuzhiyun {} 98*4882a593Smuzhiyun #endif /* CONFIG_DELL_SMBIOS_SMM */ 99*4882a593Smuzhiyun 100*4882a593Smuzhiyun #endif /* _DELL_SMBIOS_H_ */ 101