mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git
synced 2025-01-01 10:45:49 +00:00
ACPI: fan: Separate file for attributes creation
Move the functionality of creation of sysfs attributes under acpi device to a new file fan_attr.c. This cleans up the core fan code, which just use thermal sysfs interface. The original fan.c is renamed to fan_core.c. No functional changes are expected. Signed-off-by: Srinivas Pandruvada <srinivas.pandruvada@linux.intel.com> Signed-off-by: Rafael J. Wysocki <rafael.j.wysocki@intel.com>
This commit is contained in:
parent
9ddb00a2a1
commit
00ae053a05
@ -81,6 +81,9 @@ obj-$(CONFIG_ACPI_AC) += ac.o
|
||||
obj-$(CONFIG_ACPI_BUTTON) += button.o
|
||||
obj-$(CONFIG_ACPI_TINY_POWER_BUTTON) += tiny-power-button.o
|
||||
obj-$(CONFIG_ACPI_FAN) += fan.o
|
||||
fan-objs := fan_core.o
|
||||
fan-objs += fan_attr.o
|
||||
|
||||
obj-$(CONFIG_ACPI_VIDEO) += video.o
|
||||
obj-$(CONFIG_ACPI_TAD) += acpi_tad.o
|
||||
obj-$(CONFIG_ACPI_PCI_SLOT) += pci_slot.o
|
||||
|
@ -6,9 +6,44 @@
|
||||
*
|
||||
* Add new device IDs before the generic ACPI fan one.
|
||||
*/
|
||||
|
||||
#ifndef _ACPI_FAN_H_
|
||||
#define _ACPI_FAN_H_
|
||||
|
||||
#define ACPI_FAN_DEVICE_IDS \
|
||||
{"INT3404", }, /* Fan */ \
|
||||
{"INTC1044", }, /* Fan for Tiger Lake generation */ \
|
||||
{"INTC1048", }, /* Fan for Alder Lake generation */ \
|
||||
{"INTC10A2", }, /* Fan for Raptor Lake generation */ \
|
||||
{"PNP0C0B", } /* Generic ACPI fan */
|
||||
|
||||
#define ACPI_FPS_NAME_LEN 20
|
||||
|
||||
struct acpi_fan_fps {
|
||||
u64 control;
|
||||
u64 trip_point;
|
||||
u64 speed;
|
||||
u64 noise_level;
|
||||
u64 power;
|
||||
char name[ACPI_FPS_NAME_LEN];
|
||||
struct device_attribute dev_attr;
|
||||
};
|
||||
|
||||
struct acpi_fan_fif {
|
||||
u64 revision;
|
||||
u64 fine_grain_ctrl;
|
||||
u64 step_size;
|
||||
u64 low_speed_notification;
|
||||
};
|
||||
|
||||
struct acpi_fan {
|
||||
bool acpi4;
|
||||
struct acpi_fan_fif fif;
|
||||
struct acpi_fan_fps *fps;
|
||||
int fps_count;
|
||||
struct thermal_cooling_device *cdev;
|
||||
};
|
||||
|
||||
int acpi_fan_create_attributes(struct acpi_device *device);
|
||||
void acpi_fan_delete_attributes(struct acpi_device *device);
|
||||
#endif
|
||||
|
86
drivers/acpi/fan_attr.c
Normal file
86
drivers/acpi/fan_attr.c
Normal file
@ -0,0 +1,86 @@
|
||||
// SPDX-License-Identifier: GPL-2.0-or-later
|
||||
/*
|
||||
* fan_attr.c - Create extra attributes for ACPI Fan driver
|
||||
*
|
||||
* Copyright (C) 2001, 2002 Andy Grover <andrew.grover@intel.com>
|
||||
* Copyright (C) 2001, 2002 Paul Diefenbaugh <paul.s.diefenbaugh@intel.com>
|
||||
* Copyright (C) 2022 Intel Corporation. All rights reserved.
|
||||
*/
|
||||
|
||||
#include <linux/kernel.h>
|
||||
#include <linux/module.h>
|
||||
#include <linux/init.h>
|
||||
#include <linux/acpi.h>
|
||||
|
||||
#include "fan.h"
|
||||
|
||||
MODULE_LICENSE("GPL");
|
||||
|
||||
static ssize_t show_state(struct device *dev, struct device_attribute *attr, char *buf)
|
||||
{
|
||||
struct acpi_fan_fps *fps = container_of(attr, struct acpi_fan_fps, dev_attr);
|
||||
int count;
|
||||
|
||||
if (fps->control == 0xFFFFFFFF || fps->control > 100)
|
||||
count = scnprintf(buf, PAGE_SIZE, "not-defined:");
|
||||
else
|
||||
count = scnprintf(buf, PAGE_SIZE, "%lld:", fps->control);
|
||||
|
||||
if (fps->trip_point == 0xFFFFFFFF || fps->trip_point > 9)
|
||||
count += scnprintf(&buf[count], PAGE_SIZE - count, "not-defined:");
|
||||
else
|
||||
count += scnprintf(&buf[count], PAGE_SIZE - count, "%lld:", fps->trip_point);
|
||||
|
||||
if (fps->speed == 0xFFFFFFFF)
|
||||
count += scnprintf(&buf[count], PAGE_SIZE - count, "not-defined:");
|
||||
else
|
||||
count += scnprintf(&buf[count], PAGE_SIZE - count, "%lld:", fps->speed);
|
||||
|
||||
if (fps->noise_level == 0xFFFFFFFF)
|
||||
count += scnprintf(&buf[count], PAGE_SIZE - count, "not-defined:");
|
||||
else
|
||||
count += scnprintf(&buf[count], PAGE_SIZE - count, "%lld:", fps->noise_level * 100);
|
||||
|
||||
if (fps->power == 0xFFFFFFFF)
|
||||
count += scnprintf(&buf[count], PAGE_SIZE - count, "not-defined\n");
|
||||
else
|
||||
count += scnprintf(&buf[count], PAGE_SIZE - count, "%lld\n", fps->power);
|
||||
|
||||
return count;
|
||||
}
|
||||
|
||||
int acpi_fan_create_attributes(struct acpi_device *device)
|
||||
{
|
||||
struct acpi_fan *fan = acpi_driver_data(device);
|
||||
int i, status = 0;
|
||||
|
||||
for (i = 0; i < fan->fps_count; ++i) {
|
||||
struct acpi_fan_fps *fps = &fan->fps[i];
|
||||
|
||||
snprintf(fps->name, ACPI_FPS_NAME_LEN, "state%d", i);
|
||||
sysfs_attr_init(&fps->dev_attr.attr);
|
||||
fps->dev_attr.show = show_state;
|
||||
fps->dev_attr.store = NULL;
|
||||
fps->dev_attr.attr.name = fps->name;
|
||||
fps->dev_attr.attr.mode = 0444;
|
||||
status = sysfs_create_file(&device->dev.kobj, &fps->dev_attr.attr);
|
||||
if (status) {
|
||||
int j;
|
||||
|
||||
for (j = 0; j < i; ++j)
|
||||
sysfs_remove_file(&device->dev.kobj, &fan->fps[j].dev_attr.attr);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
return status;
|
||||
}
|
||||
|
||||
void acpi_fan_delete_attributes(struct acpi_device *device)
|
||||
{
|
||||
struct acpi_fan *fan = acpi_driver_data(device);
|
||||
int i;
|
||||
|
||||
for (i = 0; i < fan->fps_count; ++i)
|
||||
sysfs_remove_file(&device->dev.kobj, &fan->fps[i].dev_attr.attr);
|
||||
}
|
@ -1,9 +1,10 @@
|
||||
// SPDX-License-Identifier: GPL-2.0-or-later
|
||||
/*
|
||||
* acpi_fan.c - ACPI Fan Driver ($Revision: 29 $)
|
||||
* fan_core.c - ACPI Fan core Driver
|
||||
*
|
||||
* Copyright (C) 2001, 2002 Andy Grover <andrew.grover@intel.com>
|
||||
* Copyright (C) 2001, 2002 Paul Diefenbaugh <paul.s.diefenbaugh@intel.com>
|
||||
* Copyright (C) 2022 Intel Corporation. All rights reserved.
|
||||
*/
|
||||
|
||||
#include <linux/kernel.h>
|
||||
@ -45,33 +46,6 @@ static const struct dev_pm_ops acpi_fan_pm = {
|
||||
#define FAN_PM_OPS_PTR NULL
|
||||
#endif
|
||||
|
||||
#define ACPI_FPS_NAME_LEN 20
|
||||
|
||||
struct acpi_fan_fps {
|
||||
u64 control;
|
||||
u64 trip_point;
|
||||
u64 speed;
|
||||
u64 noise_level;
|
||||
u64 power;
|
||||
char name[ACPI_FPS_NAME_LEN];
|
||||
struct device_attribute dev_attr;
|
||||
};
|
||||
|
||||
struct acpi_fan_fif {
|
||||
u64 revision;
|
||||
u64 fine_grain_ctrl;
|
||||
u64 step_size;
|
||||
u64 low_speed_notification;
|
||||
};
|
||||
|
||||
struct acpi_fan {
|
||||
bool acpi4;
|
||||
struct acpi_fan_fif fif;
|
||||
struct acpi_fan_fps *fps;
|
||||
int fps_count;
|
||||
struct thermal_cooling_device *cdev;
|
||||
};
|
||||
|
||||
static struct platform_driver acpi_fan_driver = {
|
||||
.probe = acpi_fan_probe,
|
||||
.remove = acpi_fan_remove,
|
||||
@ -270,39 +244,6 @@ static int acpi_fan_speed_cmp(const void *a, const void *b)
|
||||
return fps1->speed - fps2->speed;
|
||||
}
|
||||
|
||||
static ssize_t show_state(struct device *dev, struct device_attribute *attr, char *buf)
|
||||
{
|
||||
struct acpi_fan_fps *fps = container_of(attr, struct acpi_fan_fps, dev_attr);
|
||||
int count;
|
||||
|
||||
if (fps->control == 0xFFFFFFFF || fps->control > 100)
|
||||
count = scnprintf(buf, PAGE_SIZE, "not-defined:");
|
||||
else
|
||||
count = scnprintf(buf, PAGE_SIZE, "%lld:", fps->control);
|
||||
|
||||
if (fps->trip_point == 0xFFFFFFFF || fps->trip_point > 9)
|
||||
count += scnprintf(&buf[count], PAGE_SIZE - count, "not-defined:");
|
||||
else
|
||||
count += scnprintf(&buf[count], PAGE_SIZE - count, "%lld:", fps->trip_point);
|
||||
|
||||
if (fps->speed == 0xFFFFFFFF)
|
||||
count += scnprintf(&buf[count], PAGE_SIZE - count, "not-defined:");
|
||||
else
|
||||
count += scnprintf(&buf[count], PAGE_SIZE - count, "%lld:", fps->speed);
|
||||
|
||||
if (fps->noise_level == 0xFFFFFFFF)
|
||||
count += scnprintf(&buf[count], PAGE_SIZE - count, "not-defined:");
|
||||
else
|
||||
count += scnprintf(&buf[count], PAGE_SIZE - count, "%lld:", fps->noise_level * 100);
|
||||
|
||||
if (fps->power == 0xFFFFFFFF)
|
||||
count += scnprintf(&buf[count], PAGE_SIZE - count, "not-defined\n");
|
||||
else
|
||||
count += scnprintf(&buf[count], PAGE_SIZE - count, "%lld\n", fps->power);
|
||||
|
||||
return count;
|
||||
}
|
||||
|
||||
static int acpi_fan_get_fps(struct acpi_device *device)
|
||||
{
|
||||
struct acpi_fan *fan = acpi_driver_data(device);
|
||||
@ -347,25 +288,6 @@ static int acpi_fan_get_fps(struct acpi_device *device)
|
||||
sort(fan->fps, fan->fps_count, sizeof(*fan->fps),
|
||||
acpi_fan_speed_cmp, NULL);
|
||||
|
||||
for (i = 0; i < fan->fps_count; ++i) {
|
||||
struct acpi_fan_fps *fps = &fan->fps[i];
|
||||
|
||||
snprintf(fps->name, ACPI_FPS_NAME_LEN, "state%d", i);
|
||||
sysfs_attr_init(&fps->dev_attr.attr);
|
||||
fps->dev_attr.show = show_state;
|
||||
fps->dev_attr.store = NULL;
|
||||
fps->dev_attr.attr.name = fps->name;
|
||||
fps->dev_attr.attr.mode = 0444;
|
||||
status = sysfs_create_file(&device->dev.kobj, &fps->dev_attr.attr);
|
||||
if (status) {
|
||||
int j;
|
||||
|
||||
for (j = 0; j < i; ++j)
|
||||
sysfs_remove_file(&device->dev.kobj, &fan->fps[j].dev_attr.attr);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
err:
|
||||
kfree(obj);
|
||||
return status;
|
||||
@ -396,6 +318,10 @@ static int acpi_fan_probe(struct platform_device *pdev)
|
||||
if (result)
|
||||
return result;
|
||||
|
||||
result = acpi_fan_create_attributes(device);
|
||||
if (result)
|
||||
return result;
|
||||
|
||||
fan->acpi4 = true;
|
||||
} else {
|
||||
result = acpi_device_update_power(device, NULL);
|
||||
@ -437,12 +363,8 @@ static int acpi_fan_probe(struct platform_device *pdev)
|
||||
return 0;
|
||||
|
||||
err_end:
|
||||
if (fan->acpi4) {
|
||||
int i;
|
||||
|
||||
for (i = 0; i < fan->fps_count; ++i)
|
||||
sysfs_remove_file(&device->dev.kobj, &fan->fps[i].dev_attr.attr);
|
||||
}
|
||||
if (fan->acpi4)
|
||||
acpi_fan_delete_attributes(device);
|
||||
|
||||
return result;
|
||||
}
|
||||
@ -453,10 +375,8 @@ static int acpi_fan_remove(struct platform_device *pdev)
|
||||
|
||||
if (fan->acpi4) {
|
||||
struct acpi_device *device = ACPI_COMPANION(&pdev->dev);
|
||||
int i;
|
||||
|
||||
for (i = 0; i < fan->fps_count; ++i)
|
||||
sysfs_remove_file(&device->dev.kobj, &fan->fps[i].dev_attr.attr);
|
||||
acpi_fan_delete_attributes(device);
|
||||
}
|
||||
sysfs_remove_link(&pdev->dev.kobj, "thermal_cooling");
|
||||
sysfs_remove_link(&fan->cdev->device.kobj, "device");
|
Loading…
Reference in New Issue
Block a user