18c2ecf20Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0-or-later 28c2ecf20Sopenharmony_ci/* 38c2ecf20Sopenharmony_ci * MXM WMI driver 48c2ecf20Sopenharmony_ci * 58c2ecf20Sopenharmony_ci * Copyright(C) 2010 Red Hat. 68c2ecf20Sopenharmony_ci */ 78c2ecf20Sopenharmony_ci#include <linux/kernel.h> 88c2ecf20Sopenharmony_ci#include <linux/module.h> 98c2ecf20Sopenharmony_ci#include <linux/init.h> 108c2ecf20Sopenharmony_ci#include <linux/mxm-wmi.h> 118c2ecf20Sopenharmony_ci#include <linux/acpi.h> 128c2ecf20Sopenharmony_ci 138c2ecf20Sopenharmony_ciMODULE_AUTHOR("Dave Airlie"); 148c2ecf20Sopenharmony_ciMODULE_DESCRIPTION("MXM WMI Driver"); 158c2ecf20Sopenharmony_ciMODULE_LICENSE("GPL"); 168c2ecf20Sopenharmony_ci 178c2ecf20Sopenharmony_ci#define MXM_WMMX_GUID "F6CB5C3C-9CAE-4EBD-B577-931EA32A2CC0" 188c2ecf20Sopenharmony_ci 198c2ecf20Sopenharmony_ciMODULE_ALIAS("wmi:"MXM_WMMX_GUID); 208c2ecf20Sopenharmony_ci 218c2ecf20Sopenharmony_ci#define MXM_WMMX_FUNC_MXDS 0x5344584D /* "MXDS" */ 228c2ecf20Sopenharmony_ci#define MXM_WMMX_FUNC_MXMX 0x53445344 /* "MXMX" */ 238c2ecf20Sopenharmony_ci 248c2ecf20Sopenharmony_cistruct mxds_args { 258c2ecf20Sopenharmony_ci u32 func; 268c2ecf20Sopenharmony_ci u32 args; 278c2ecf20Sopenharmony_ci u32 xarg; 288c2ecf20Sopenharmony_ci}; 298c2ecf20Sopenharmony_ci 308c2ecf20Sopenharmony_ciint mxm_wmi_call_mxds(int adapter) 318c2ecf20Sopenharmony_ci{ 328c2ecf20Sopenharmony_ci struct mxds_args args = { 338c2ecf20Sopenharmony_ci .func = MXM_WMMX_FUNC_MXDS, 348c2ecf20Sopenharmony_ci .args = 0, 358c2ecf20Sopenharmony_ci .xarg = 1, 368c2ecf20Sopenharmony_ci }; 378c2ecf20Sopenharmony_ci struct acpi_buffer input = { (acpi_size)sizeof(args), &args }; 388c2ecf20Sopenharmony_ci acpi_status status; 398c2ecf20Sopenharmony_ci 408c2ecf20Sopenharmony_ci printk("calling mux switch %d\n", adapter); 418c2ecf20Sopenharmony_ci 428c2ecf20Sopenharmony_ci status = wmi_evaluate_method(MXM_WMMX_GUID, 0x0, adapter, &input, NULL); 438c2ecf20Sopenharmony_ci 448c2ecf20Sopenharmony_ci if (ACPI_FAILURE(status)) 458c2ecf20Sopenharmony_ci return status; 468c2ecf20Sopenharmony_ci 478c2ecf20Sopenharmony_ci printk("mux switched %d\n", status); 488c2ecf20Sopenharmony_ci return 0; 498c2ecf20Sopenharmony_ci 508c2ecf20Sopenharmony_ci} 518c2ecf20Sopenharmony_ciEXPORT_SYMBOL_GPL(mxm_wmi_call_mxds); 528c2ecf20Sopenharmony_ci 538c2ecf20Sopenharmony_ciint mxm_wmi_call_mxmx(int adapter) 548c2ecf20Sopenharmony_ci{ 558c2ecf20Sopenharmony_ci struct mxds_args args = { 568c2ecf20Sopenharmony_ci .func = MXM_WMMX_FUNC_MXMX, 578c2ecf20Sopenharmony_ci .args = 0, 588c2ecf20Sopenharmony_ci .xarg = 1, 598c2ecf20Sopenharmony_ci }; 608c2ecf20Sopenharmony_ci struct acpi_buffer input = { (acpi_size)sizeof(args), &args }; 618c2ecf20Sopenharmony_ci acpi_status status; 628c2ecf20Sopenharmony_ci 638c2ecf20Sopenharmony_ci printk("calling mux switch %d\n", adapter); 648c2ecf20Sopenharmony_ci 658c2ecf20Sopenharmony_ci status = wmi_evaluate_method(MXM_WMMX_GUID, 0x0, adapter, &input, NULL); 668c2ecf20Sopenharmony_ci 678c2ecf20Sopenharmony_ci if (ACPI_FAILURE(status)) 688c2ecf20Sopenharmony_ci return status; 698c2ecf20Sopenharmony_ci 708c2ecf20Sopenharmony_ci printk("mux mutex set switched %d\n", status); 718c2ecf20Sopenharmony_ci return 0; 728c2ecf20Sopenharmony_ci 738c2ecf20Sopenharmony_ci} 748c2ecf20Sopenharmony_ciEXPORT_SYMBOL_GPL(mxm_wmi_call_mxmx); 758c2ecf20Sopenharmony_ci 768c2ecf20Sopenharmony_cibool mxm_wmi_supported(void) 778c2ecf20Sopenharmony_ci{ 788c2ecf20Sopenharmony_ci bool guid_valid; 798c2ecf20Sopenharmony_ci guid_valid = wmi_has_guid(MXM_WMMX_GUID); 808c2ecf20Sopenharmony_ci return guid_valid; 818c2ecf20Sopenharmony_ci} 828c2ecf20Sopenharmony_ciEXPORT_SYMBOL_GPL(mxm_wmi_supported); 838c2ecf20Sopenharmony_ci 848c2ecf20Sopenharmony_cistatic int __init mxm_wmi_init(void) 858c2ecf20Sopenharmony_ci{ 868c2ecf20Sopenharmony_ci return 0; 878c2ecf20Sopenharmony_ci} 888c2ecf20Sopenharmony_ci 898c2ecf20Sopenharmony_cistatic void __exit mxm_wmi_exit(void) 908c2ecf20Sopenharmony_ci{ 918c2ecf20Sopenharmony_ci} 928c2ecf20Sopenharmony_ci 938c2ecf20Sopenharmony_cimodule_init(mxm_wmi_init); 948c2ecf20Sopenharmony_cimodule_exit(mxm_wmi_exit); 95