Commit 70dd6bea authored by Jean Delvare's avatar Jean Delvare

hwmon: (asus_atk0110) Don't load if ACPI resources aren't enforced

When the user passes the kernel parameter acpi_enforce_resources=lax,
the ACPI resources are no longer protected, so a native driver can
make use of them. In that case, we do not want the asus_atk0110 to be
loaded. Unfortunately, this driver loads automatically due to its
MODULE_DEVICE_TABLE, so the user ends up with two drivers loaded for
the same device - this is bad.

So I suggest that we prevent the asus_atk0110 driver from loading if
acpi_enforce_resources=lax.
Signed-off-by: default avatarJean Delvare <khali@linux-fr.org>
Acked-by: default avatarLuca Tettamanti <kronos.it@gmail.com>
Cc: Len Brown <lenb@kernel.org>
parent 31f46717
...@@ -1206,6 +1206,15 @@ int acpi_check_mem_region(resource_size_t start, resource_size_t n, ...@@ -1206,6 +1206,15 @@ int acpi_check_mem_region(resource_size_t start, resource_size_t n,
} }
EXPORT_SYMBOL(acpi_check_mem_region); EXPORT_SYMBOL(acpi_check_mem_region);
/*
* Let drivers know whether the resource checks are effective
*/
int acpi_resources_are_enforced(void)
{
return acpi_enforce_resources == ENFORCE_RESOURCES_STRICT;
}
EXPORT_SYMBOL(acpi_resources_are_enforced);
/* /*
* Acquire a spinlock. * Acquire a spinlock.
* *
......
...@@ -1411,6 +1411,13 @@ static int __init atk0110_init(void) ...@@ -1411,6 +1411,13 @@ static int __init atk0110_init(void)
{ {
int ret; int ret;
/* Make sure it's safe to access the device through ACPI */
if (!acpi_resources_are_enforced()) {
pr_err("atk: Resources not safely usable due to "
"acpi_enforce_resources kernel parameter\n");
return -EBUSY;
}
ret = acpi_bus_register_driver(&atk_driver); ret = acpi_bus_register_driver(&atk_driver);
if (ret) if (ret)
pr_info("atk: acpi_bus_register_driver failed: %d\n", ret); pr_info("atk: acpi_bus_register_driver failed: %d\n", ret);
......
...@@ -248,6 +248,8 @@ int acpi_check_region(resource_size_t start, resource_size_t n, ...@@ -248,6 +248,8 @@ int acpi_check_region(resource_size_t start, resource_size_t n,
int acpi_check_mem_region(resource_size_t start, resource_size_t n, int acpi_check_mem_region(resource_size_t start, resource_size_t n,
const char *name); const char *name);
int acpi_resources_are_enforced(void);
#ifdef CONFIG_PM_SLEEP #ifdef CONFIG_PM_SLEEP
void __init acpi_no_s4_hw_signature(void); void __init acpi_no_s4_hw_signature(void);
void __init acpi_old_suspend_ordering(void); void __init acpi_old_suspend_ordering(void);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment