From: Hans de Goede <hdegoede@redhat.com>
To: "Rafael J . Wysocki" <rjw@rjwysocki.net>,
Len Brown <lenb@kernel.org>, Sebastian Reichel <sre@kernel.org>,
Chen-Yu Tsai <wens@csie.org>
Cc: Hans de Goede <hdegoede@redhat.com>,
Andy Shevchenko <andriy.shevchenko@linux.intel.com>,
linux-acpi@vger.kernel.org, linux-pm@vger.kernel.org
Subject: [PATCH 1/4] acpi: battery: Add acpi_battery_unregister() function
Date: Thu, 16 Mar 2017 17:15:58 +0100 [thread overview]
Message-ID: <20170316161601.32267-2-hdegoede@redhat.com> (raw)
In-Reply-To: <20170316161601.32267-1-hdegoede@redhat.com>
On some systems we have a native pmic driver which provides battery
monitoring, while the acpi battery driver is broken on these systems
due to bad dstds or because of missing vendor specific acpi opregion
(e.g. BMOP opregion) support, which the acpi battery device in the
dsdt relies on.
This leads to there being 2 battery power_supply-s registed like this:
~$ acpi
Battery 0: Charging, 84%, 00:49:39 until charged
Battery 1: Unknown, 0%, rate information unavailable
Even if the acpi battery where to function fine (which on systems
where we have a native pmic driver it often doesn't) we still do not
want to export the same battery to userspace twice.
This commit adds an acpi_battery_unregister() function which native
pmic drivers can call to tell the acpi-battery driver to unregister
itself so that we do not end up with 2 power_supply-s for the same
battery device.
BugLink: https://bugzilla.kernel.org/show_bug.cgi?id=194811
Signed-off-by: Hans de Goede <hdegoede@redhat.com>
Tested-by: Sergei Trusov <t.rus76@ya.ru>
---
drivers/acpi/battery.c | 32 +++++++++++++++++++++++++++++++-
include/linux/power/acpi.h | 18 ++++++++++++++++++
2 files changed, 49 insertions(+), 1 deletion(-)
create mode 100644 include/linux/power/acpi.h
diff --git a/drivers/acpi/battery.c b/drivers/acpi/battery.c
index 4ef1e46..644e154 100644
--- a/drivers/acpi/battery.c
+++ b/drivers/acpi/battery.c
@@ -31,6 +31,7 @@
#include <linux/delay.h>
#include <linux/slab.h>
#include <linux/suspend.h>
+#include <linux/mutex.h>
#include <asm/unaligned.h>
#ifdef CONFIG_ACPI_PROCFS_POWER
@@ -41,6 +42,7 @@
#include <linux/acpi.h>
#include <linux/power_supply.h>
+#include <linux/power/acpi.h>
#include "battery.h"
@@ -66,6 +68,10 @@ MODULE_AUTHOR("Alexey Starikovskiy <astarikovskiy@suse.de>");
MODULE_DESCRIPTION("ACPI Battery Driver");
MODULE_LICENSE("GPL");
+enum init_state_enum { BAT_NONE, BAT_INITIALIZED, BAT_EXITED };
+
+static enum init_state_enum init_state;
+static DEFINE_MUTEX(init_state_mutex);
static async_cookie_t async_cookie;
static int battery_bix_broken_package;
static int battery_notification_delay_ms;
@@ -1336,17 +1342,41 @@ static int __init acpi_battery_init(void)
if (acpi_disabled)
return -ENODEV;
+ /* Check if acpi_battery_unregister got called before _init() */
+ mutex_lock(&init_state_mutex);
+ if (init_state != BAT_NONE)
+ goto out_unlock;
+
async_cookie = async_schedule(acpi_battery_init_async, NULL);
+ init_state = BAT_INITIALIZED;
+out_unlock:
+ mutex_unlock(&init_state_mutex);
+
return 0;
}
-static void __exit acpi_battery_exit(void)
+void acpi_battery_unregister(void)
{
+ /* Check if _init() is done and only do unregister once */
+ mutex_lock(&init_state_mutex);
+ if (init_state != BAT_INITIALIZED)
+ goto out_exit;
+
async_synchronize_cookie(async_cookie + 1);
acpi_bus_unregister_driver(&acpi_battery_driver);
#ifdef CONFIG_ACPI_PROCFS_POWER
acpi_unlock_battery_dir(acpi_battery_dir);
#endif
+
+out_exit:
+ init_state = BAT_EXITED;
+ mutex_unlock(&init_state_mutex);
+}
+EXPORT_SYMBOL_GPL(acpi_battery_unregister);
+
+static void __exit acpi_battery_exit(void)
+{
+ acpi_battery_unregister();
}
module_init(acpi_battery_init);
diff --git a/include/linux/power/acpi.h b/include/linux/power/acpi.h
new file mode 100644
index 0000000..83bdfb9
--- /dev/null
+++ b/include/linux/power/acpi.h
@@ -0,0 +1,18 @@
+/*
+ * Functions exported by the acpi power_supply drivers
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation.
+ */
+
+#ifndef __LINUX_POWER_ACPI_H_
+#define __LINUX_POWER_ACPI_H_
+
+#if IS_ENABLED(CONFIG_ACPI_BATTERY)
+void acpi_battery_unregister(void);
+#else
+static inline void acpi_battery_unregister(void) {}
+#endif
+
+#endif
--
2.9.3
next prev parent reply other threads:[~2017-03-16 16:15 UTC|newest]
Thread overview: 35+ messages / expand[flat|nested] mbox.gz Atom feed top
2017-03-16 16:15 [PATCH 0/4] Avoid duplicate registering of ACPI and native power-supplies Hans de Goede
2017-03-16 16:15 ` Hans de Goede [this message]
2017-03-16 16:29 ` [PATCH 1/4] acpi: battery: Add acpi_battery_unregister() function Andy Shevchenko
2017-03-20 13:03 ` Hans de Goede
2017-03-20 13:10 ` Andy Shevchenko
2017-03-20 13:11 ` Hans de Goede
2017-03-27 1:16 ` Zheng, Lv
2017-03-31 8:53 ` Hans de Goede
2017-03-31 9:00 ` Hans de Goede
2017-03-16 16:15 ` [PATCH 2/4] acpi: ac: Add acpi_ac_unregister() function Hans de Goede
2017-03-16 16:31 ` Andy Shevchenko
2017-03-16 16:16 ` [PATCH 3/4] power: supply: axp288_fuel_gauge: Unregister duplicate ACPI battery supply Hans de Goede
2017-03-16 16:33 ` Andy Shevchenko
2017-03-20 13:07 ` Hans de Goede
2017-03-29 20:31 ` Rafael J. Wysocki
2017-03-31 9:01 ` Hans de Goede
2017-03-31 9:05 ` Rafael J. Wysocki
2017-03-31 9:08 ` Hans de Goede
2017-03-31 9:11 ` Rafael J. Wysocki
2017-03-31 9:57 ` Hans de Goede
2017-03-31 22:30 ` Rafael J. Wysocki
2017-04-01 13:22 ` Hans de Goede
2017-04-07 7:18 ` Hans de Goede
2017-04-10 7:31 ` Hans de Goede
2017-04-10 18:13 ` Hans de Goede
2017-04-10 20:01 ` Rafael J. Wysocki
2017-04-11 9:18 ` Hans de Goede
2017-04-11 13:51 ` Rafael J. Wysocki
2017-03-16 16:16 ` [PATCH 4/4] power: supply: axp288_charger: Unregister duplicate ACPI ac supply Hans de Goede
2017-03-16 16:34 ` Andy Shevchenko
2017-03-20 1:33 ` [PATCH 0/4] Avoid duplicate registering of ACPI and native power-supplies Sebastian Reichel
2017-03-20 13:11 ` Hans de Goede
2017-03-20 13:18 ` Andy Shevchenko
2017-03-20 13:19 ` Hans de Goede
2017-03-20 21:55 ` Rafael J. Wysocki
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20170316161601.32267-2-hdegoede@redhat.com \
--to=hdegoede@redhat.com \
--cc=andriy.shevchenko@linux.intel.com \
--cc=lenb@kernel.org \
--cc=linux-acpi@vger.kernel.org \
--cc=linux-pm@vger.kernel.org \
--cc=rjw@rjwysocki.net \
--cc=sre@kernel.org \
--cc=wens@csie.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).