#include <linux/time.h>
#include <linux/err.h>
#include <linux/acpi.h>
+#include <linux/platform_device.h>
#define ACPI_POWER_METER_NAME "power_meter"
#define ACPI_POWER_METER_DEVICE_NAME "Power Meter"
/* Handle ACPI event notifications */
static void acpi_power_meter_notify(acpi_handle handle, u32 event, void *data)
{
- struct acpi_device *device = data;
- struct acpi_power_meter_resource *resource = acpi_driver_data(device);
+ struct device *dev = data;
+ struct acpi_power_meter_resource *resource = dev_get_drvdata(dev);
int res;
guard(mutex)(&acpi_notify_lock);
remove_domain_devices(resource);
res = read_capabilities(resource);
if (res)
- dev_err_once(&device->dev, "read capabilities failed.\n");
+ dev_err_once(dev, "read capabilities failed.\n");
res = read_domain_devices(resource);
if (res && res != -ENODEV)
- dev_err_once(&device->dev, "read domain devices failed.\n");
+ dev_err_once(dev, "read domain devices failed.\n");
mutex_unlock(&resource->lock);
resource->hwmon_dev =
- hwmon_device_register_with_info(&device->dev,
+ hwmon_device_register_with_info(dev,
ACPI_POWER_METER_NAME,
resource,
&power_meter_chip_info,
power_extra_groups);
if (IS_ERR(resource->hwmon_dev))
- dev_err_once(&device->dev, "register hwmon device failed.\n");
+ dev_err_once(dev, "register hwmon device failed.\n");
break;
case METER_NOTIFY_TRIP:
- sysfs_notify(&device->dev.kobj, NULL, POWER_AVERAGE_NAME);
+ sysfs_notify(&dev->kobj, NULL, POWER_AVERAGE_NAME);
break;
case METER_NOTIFY_CAP:
mutex_lock(&resource->lock);
res = update_cap(resource);
if (res)
- dev_err_once(&device->dev, "update cap failed when capping value is changed.\n");
+ dev_err_once(dev, "update cap failed when capping value is changed.\n");
mutex_unlock(&resource->lock);
- sysfs_notify(&device->dev.kobj, NULL, POWER_CAP_NAME);
+ sysfs_notify(&dev->kobj, NULL, POWER_CAP_NAME);
break;
case METER_NOTIFY_INTERVAL:
- sysfs_notify(&device->dev.kobj, NULL, POWER_AVG_INTERVAL_NAME);
+ sysfs_notify(&dev->kobj, NULL, POWER_AVG_INTERVAL_NAME);
break;
case METER_NOTIFY_CAPPING:
mutex_lock(&resource->lock);
resource->power_alarm = true;
mutex_unlock(&resource->lock);
- sysfs_notify(&device->dev.kobj, NULL, POWER_ALARM_NAME);
- dev_info(&device->dev, "Capping in progress.\n");
+ sysfs_notify(&dev->kobj, NULL, POWER_ALARM_NAME);
+ dev_info(dev, "Capping in progress.\n");
break;
default:
WARN(1, "Unexpected event %d\n", event);
}
acpi_bus_generate_netlink_event(ACPI_POWER_METER_CLASS,
- dev_name(&device->dev), event, 0);
+ dev_name(&resource->acpi_dev->dev),
+ event, 0);
}
-static int acpi_power_meter_add(struct acpi_device *device)
+static int acpi_power_meter_probe(struct platform_device *pdev)
{
- int res;
+ struct acpi_device *device = ACPI_COMPANION(&pdev->dev);
struct acpi_power_meter_resource *resource;
-
- if (!device)
- return -EINVAL;
+ int res;
resource = kzalloc_obj(*resource);
if (!resource)
mutex_init(&resource->lock);
strscpy(acpi_device_name(device), ACPI_POWER_METER_DEVICE_NAME);
strscpy(acpi_device_class(device), ACPI_POWER_METER_CLASS);
- device->driver_data = resource;
+
+ platform_set_drvdata(pdev, resource);
#if IS_REACHABLE(CONFIG_ACPI_IPMI)
/*
struct acpi_device *ipi_device = acpi_dev_get_first_match_dev("IPI0001", NULL, -1);
if (ipi_device && acpi_wait_for_acpi_ipmi())
- dev_warn(&device->dev, "Waiting for ACPI IPMI timeout");
+ dev_warn(&pdev->dev, "Waiting for ACPI IPMI timeout");
acpi_dev_put(ipi_device);
}
#endif
goto exit_free_capability;
resource->hwmon_dev =
- hwmon_device_register_with_info(&device->dev,
+ hwmon_device_register_with_info(&pdev->dev,
ACPI_POWER_METER_NAME, resource,
&power_meter_chip_info,
power_extra_groups);
}
res = acpi_dev_install_notify_handler(device, ACPI_DEVICE_NOTIFY,
- acpi_power_meter_notify, device);
+ acpi_power_meter_notify, &pdev->dev);
if (res)
goto exit_hwmon;
return res;
}
-static void acpi_power_meter_remove(struct acpi_device *device)
+static void acpi_power_meter_remove(struct platform_device *pdev)
{
- struct acpi_power_meter_resource *resource = acpi_driver_data(device);
+ struct acpi_power_meter_resource *resource = platform_get_drvdata(pdev);
- acpi_dev_remove_notify_handler(device, ACPI_DEVICE_NOTIFY,
+ acpi_dev_remove_notify_handler(resource->acpi_dev, ACPI_DEVICE_NOTIFY,
acpi_power_meter_notify);
if (!IS_ERR(resource->hwmon_dev))
static int acpi_power_meter_resume(struct device *dev)
{
- struct acpi_power_meter_resource *resource;
-
- resource = acpi_driver_data(to_acpi_device(dev));
+ struct acpi_power_meter_resource *resource = dev_get_drvdata(dev);
free_capabilities(resource);
read_capabilities(resource);
static DEFINE_SIMPLE_DEV_PM_OPS(acpi_power_meter_pm, NULL,
acpi_power_meter_resume);
-static struct acpi_driver acpi_power_meter_driver = {
- .name = "power_meter",
- .class = ACPI_POWER_METER_CLASS,
- .ids = power_meter_ids,
- .ops = {
- .add = acpi_power_meter_add,
- .remove = acpi_power_meter_remove,
- },
- .drv.pm = pm_sleep_ptr(&acpi_power_meter_pm),
+static struct platform_driver acpi_power_meter_driver = {
+ .probe = acpi_power_meter_probe,
+ .remove = acpi_power_meter_remove,
+ .driver = {
+ .name = "acpi-power-meter",
+ .acpi_match_table = power_meter_ids,
+ .pm = &acpi_power_meter_pm,
+ },
};
/* Module init/exit routines */
dmi_check_system(pm_dmi_table);
- result = acpi_bus_register_driver(&acpi_power_meter_driver);
+ result = platform_driver_register(&acpi_power_meter_driver);
if (result < 0)
return result;
static void __exit acpi_power_meter_exit(void)
{
- acpi_bus_unregister_driver(&acpi_power_meter_driver);
+ platform_driver_unregister(&acpi_power_meter_driver);
}
MODULE_AUTHOR("Darrick J. Wong <darrick.wong@oracle.com>");