| // SPDX-License-Identifier: GPL-2.0-or-later |
| /* |
| * AMD SFH tablet-mode switch driver |
| * |
| * Copyright (c) 2026, Advanced Micro Devices, Inc. |
| * All Rights Reserved. |
| * |
| * Author: Basavaraj Natikar <Basavaraj.Natikar@amd.com> |
| */ |
| |
| #include <linux/amd-pmf-io.h> |
| #include <linux/auxiliary_bus.h> |
| #include <linux/input.h> |
| #include <linux/module.h> |
| #include <linux/pci_ids.h> |
| |
| #define POLL_INTERVAL_MS 200 |
| |
| static void sfh_tm_poll(struct input_dev *input) |
| { |
| struct amd_sfh_info info = {}; |
| |
| if (amd_get_sfh_info(&info, MT_OP_MODE)) |
| return; |
| |
| input_report_switch(input, SW_TABLET_MODE, |
| info.op_mode == SFH_MODE_TABLET); |
| input_sync(input); |
| } |
| |
| static int sfh_tm_probe(struct auxiliary_device *auxdev, |
| const struct auxiliary_device_id *id) |
| { |
| struct device *dev = &auxdev->dev; |
| struct amd_sfh_info info = {}; |
| struct input_dev *input; |
| int error; |
| |
| error = amd_get_sfh_info(&info, MT_OP_MODE); |
| if (error) |
| return error == -EINVAL ? -ENODEV : error; |
| |
| input = devm_input_allocate_device(dev); |
| if (!input) |
| return -ENOMEM; |
| |
| input->name = "AMD SFH tablet mode switch"; |
| input->phys = "amd-sfh/tabletmode"; |
| input->id.bustype = BUS_HOST; |
| input->id.vendor = PCI_VENDOR_ID_AMD; |
| input_set_capability(input, EV_SW, SW_TABLET_MODE); |
| |
| error = input_setup_polling(input, sfh_tm_poll); |
| if (error) |
| return error; |
| input_set_poll_interval(input, POLL_INTERVAL_MS); |
| |
| sfh_tm_poll(input); |
| |
| error = input_register_device(input); |
| if (error) |
| return error; |
| |
| return 0; |
| } |
| |
| static const struct auxiliary_device_id sfh_tm_id_table[] = { |
| { .name = "amd_sfh.tabletmode" }, |
| {} |
| }; |
| MODULE_DEVICE_TABLE(auxiliary, sfh_tm_id_table); |
| |
| static struct auxiliary_driver sfh_tm_driver = { |
| .name = "tabletmode", |
| .id_table = sfh_tm_id_table, |
| .probe = sfh_tm_probe, |
| }; |
| module_auxiliary_driver(sfh_tm_driver); |
| |
| MODULE_DESCRIPTION("AMD SFH tablet mode switch"); |
| MODULE_LICENSE("GPL"); |