mirror of
https://mirrors.bfsu.edu.cn/git/linux.git
synced 2024-11-25 13:14:07 +08:00
platform/x86: toshiba_acpi: Add fan RPM reading (internals)
This add the internal feature detection and reading function for fan RPM. The approach is based on tracing ACPI calls using AMLI (a tracer/debugger built into ACPI.sys) while using the Windows cooling self-test software. The call used is {HCI_GET, 0x45, 0, 1, 0, 0} which returns: {0x0, 0x45, fan_rpm, probably_max_rpm, 0x0, 0x0} What is probably the max RPM is not currently used. Signed-off-by: Arvid Norlander <lkml@vorpal.se> Link: https://lore.kernel.org/r/20220902174018.1720029-2-lkml@vorpal.se Reviewed-by: Hans de Goede <hdegoede@redhat.com> Signed-off-by: Hans de Goede <hdegoede@redhat.com>
This commit is contained in:
parent
db55fb8a06
commit
dd193dcdc9
@ -106,6 +106,7 @@ MODULE_LICENSE("GPL");
|
||||
#define HCI_VIDEO_OUT 0x001c
|
||||
#define HCI_HOTKEY_EVENT 0x001e
|
||||
#define HCI_LCD_BRIGHTNESS 0x002a
|
||||
#define HCI_FAN_RPM 0x0045
|
||||
#define HCI_WIRELESS 0x0056
|
||||
#define HCI_ACCELEROMETER 0x006d
|
||||
#define HCI_COOLING_METHOD 0x007f
|
||||
@ -185,6 +186,7 @@ struct toshiba_acpi_dev {
|
||||
unsigned int illumination_supported:1;
|
||||
unsigned int video_supported:1;
|
||||
unsigned int fan_supported:1;
|
||||
unsigned int fan_rpm_supported:1;
|
||||
unsigned int system_event_supported:1;
|
||||
unsigned int ntfy_supported:1;
|
||||
unsigned int info_supported:1;
|
||||
@ -1611,6 +1613,29 @@ static const struct proc_ops fan_proc_ops = {
|
||||
.proc_write = fan_proc_write,
|
||||
};
|
||||
|
||||
/* Fan RPM */
|
||||
static int get_fan_rpm(struct toshiba_acpi_dev *dev, u32 *rpm)
|
||||
{
|
||||
u32 in[TCI_WORDS] = { HCI_GET, HCI_FAN_RPM, 0, 1, 0, 0 };
|
||||
u32 out[TCI_WORDS];
|
||||
acpi_status status = tci_raw(dev, in, out);
|
||||
|
||||
if (ACPI_FAILURE(status)) {
|
||||
pr_err("ACPI call to get Fan speed failed\n");
|
||||
return -EIO;
|
||||
}
|
||||
|
||||
if (out[0] == TOS_NOT_SUPPORTED)
|
||||
return -ENODEV;
|
||||
|
||||
if (out[0] == TOS_SUCCESS) {
|
||||
*rpm = out[2];
|
||||
return 0;
|
||||
}
|
||||
|
||||
return -EIO;
|
||||
}
|
||||
|
||||
static int keys_proc_show(struct seq_file *m, void *v)
|
||||
{
|
||||
struct toshiba_acpi_dev *dev = m->private;
|
||||
@ -2915,6 +2940,8 @@ static void print_supported_features(struct toshiba_acpi_dev *dev)
|
||||
pr_cont(" video-out");
|
||||
if (dev->fan_supported)
|
||||
pr_cont(" fan");
|
||||
if (dev->fan_rpm_supported)
|
||||
pr_cont(" fan-rpm");
|
||||
if (dev->tr_backlight_supported)
|
||||
pr_cont(" transflective-backlight");
|
||||
if (dev->illumination_supported)
|
||||
@ -3144,6 +3171,9 @@ iio_error:
|
||||
ret = get_fan_status(dev, &dummy);
|
||||
dev->fan_supported = !ret;
|
||||
|
||||
ret = get_fan_rpm(dev, &dummy);
|
||||
dev->fan_rpm_supported = !ret;
|
||||
|
||||
toshiba_wwan_available(dev);
|
||||
if (dev->wwan_supported)
|
||||
toshiba_acpi_setup_wwan_rfkill(dev);
|
||||
|
Loading…
Reference in New Issue
Block a user