From 5a813481e008fc1afaac3eb50aa78f400d4792e3 Mon Sep 17 00:00:00 2001 From: ed Date: Thu, 3 Jan 2019 22:50:20 +0000 Subject: [PATCH] Convert back to being on the platform device bus - this should enable to work with older versions of lm_sensors --- asus-wmi-sensors.c | 76 ++++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 74 insertions(+), 2 deletions(-) diff --git a/asus-wmi-sensors.c b/asus-wmi-sensors.c index 1327272..fbaac07 100644 --- a/asus-wmi-sensors.c +++ b/asus-wmi-sensors.c @@ -4,6 +4,7 @@ * * Copyright (C) 2018 Ed Brindley */ +#define PLATFORM_DRIVER #include #include @@ -12,6 +13,7 @@ #include #include #include +#include #include MODULE_AUTHOR("Ed Brindley "); @@ -69,8 +71,13 @@ struct asus_wmi_sensor_info { }; struct asus_wmi_sensors { + #ifdef PLATFORM_DRIVER + struct platform_driver platform_driver; + struct platform_device *platform_device; + #else struct wmi_driver wmi_driver; struct wmi_device *wmi_device; + #endif u8 buffer; struct mutex lock; @@ -324,8 +331,12 @@ static int configure_sensor_setup(struct asus_wmi_sensors *asus_wmi_sensors) int i, idx; int nr_count[hwmon_max] = {0}, nr_types = 0; u32 nr_sensors = 0; - struct device *hwdev, *dev = &asus_wmi_sensors->wmi_device->dev; - + struct device *hwdev; + #ifdef PLATFORM_DRIVER + struct device *dev = &asus_wmi_sensors->platform_device->dev; + #else + struct device *dev = &asus_wmi_sensors->wmi_device->dev; + #endif struct hwmon_channel_info *asus_wmi_hwmon_chan; struct asus_wmi_sensor_info *temp_sensor; enum hwmon_sensor_types type; @@ -460,6 +471,8 @@ static int is_board_supported(void) { return -ENODEV; } +#ifndef PLATFORM_DRIVER + static int asus_wmi_sensors_probe(struct wmi_device *wdev) { struct device *dev = &wdev->dev; @@ -505,3 +518,62 @@ static struct wmi_driver asus_wmi_sensors = { }; module_wmi_driver(asus_wmi_sensors); +#endif + +#ifdef PLATFORM_DRIVER +static struct platform_device *asus_wmi_sensors_platform_device; + +static int asus_wmi_probe(struct platform_device *pdev) +{ + if (!wmi_has_guid(ASUS_HW_GUID)) { + pr_info("asuswmisensors: ASUS Management GUID not found\n"); + return -ENODEV; + } + + if (is_board_supported()) { + return -ENODEV; + } + + pr_info("asuswmisensors: ASUS WMI sensors driver loaded\n"); + return 0; +} + +static struct platform_driver asus_wmi_sensors_platform_driver = { + .driver = { + .name = "asus-wmi-sensors", + }, + .probe = asus_wmi_probe +}; + +static int __init asus_wmi_init(void) +{ + struct asus_wmi_sensors *asus_wmi_sensors; + + asus_wmi_sensors_platform_device = platform_create_bundle(&asus_wmi_sensors_platform_driver, + asus_wmi_probe, + NULL, 0, NULL, 0); + + if (IS_ERR(asus_wmi_sensors_platform_device)) + return PTR_ERR(asus_wmi_sensors_platform_device); + + asus_wmi_sensors = devm_kzalloc(&asus_wmi_sensors_platform_device->dev, sizeof(struct asus_wmi_sensors), GFP_KERNEL); + if (!asus_wmi_sensors) + return -ENOMEM; + + asus_wmi_sensors->platform_device = asus_wmi_sensors_platform_device; + asus_wmi_sensors->platform_driver = asus_wmi_sensors_platform_driver; + + platform_set_drvdata(asus_wmi_sensors->platform_device, asus_wmi_sensors); + + return configure_sensor_setup(asus_wmi_sensors); +} + +static void __exit asus_wmi_exit(void) + { + platform_device_unregister(asus_wmi_sensors_platform_device); + platform_driver_unregister(&asus_wmi_sensors_platform_driver); + } + + module_init(asus_wmi_init); + module_exit(asus_wmi_exit); + #endif \ No newline at end of file