[PATCH] Check battery after resume

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Patched against latest test tree.
Compile and field tested.

Check battery after resume

Signed-off-by: Thomas Renninger <mail@xxxxxxxxxxxx>


 drivers/acpi/battery.c |   33 ++++++++++++++++++++++++++++++++-
 1 files changed, 32 insertions(+), 1 deletion(-)

Index: linux-acpi-2.6.git_i386/drivers/acpi/battery.c
===================================================================
--- linux-acpi-2.6.git_i386.orig/drivers/acpi/battery.c
+++ linux-acpi-2.6.git_i386/drivers/acpi/battery.c
@@ -64,6 +64,7 @@ extern void *acpi_unlock_battery_dir(str
 
 static int acpi_battery_add(struct acpi_device *device);
 static int acpi_battery_remove(struct acpi_device *device, int type);
+static int acpi_battery_resume(struct acpi_device *device, int state);
 
 static struct acpi_driver acpi_battery_driver = {
 	.name = ACPI_BATTERY_DRIVER_NAME,
@@ -72,6 +73,7 @@ static struct acpi_driver acpi_battery_d
 	.ops = {
 		.add = acpi_battery_add,
 		.remove = acpi_battery_remove,
+		.resume = acpi_battery_resume,
 		},
 };
 
@@ -269,6 +271,14 @@ acpi_battery_set_alarm(struct acpi_batte
 	return 0;
 }
 
+/* 
+ * returns:
+ *   0 on success
+ *  <0 on failure
+ *   1 if new battery found
+ *   2 if battery got removed
+ */
+
 static int acpi_battery_check(struct acpi_battery *battery)
 {
 	int result = 0;
@@ -311,12 +321,14 @@ static int acpi_battery_check(struct acp
 			battery->flags.alarm = 1;
 			acpi_battery_set_alarm(battery, battery->trips.warning);
 		}
+		result = 1;
 	}
 
 	/* Removal? */
 
 	else if (battery->flags.present && !device->status.battery_present) {
 		ACPI_DEBUG_PRINT((ACPI_DB_INFO, "Battery removed\n"));
+		result = 2;
 	}
 
 	battery->flags.present = device->status.battery_present;
@@ -703,7 +715,7 @@ static int acpi_battery_add(struct acpi_
 	acpi_driver_data(device) = battery;
 
 	result = acpi_battery_check(battery);
-	if (result)
+	if (result < 0)
 		goto end;
 
 	result = acpi_battery_add_fs(device);
@@ -753,6 +765,25 @@ static int acpi_battery_remove(struct ac
 	return 0;
 }
 
+static int acpi_battery_resume(struct acpi_device *device, int state){
+
+	int result = 0;
+	struct acpi_battery *battery = NULL;
+
+	if (!device || !acpi_driver_data(device))
+		return -EINVAL;
+
+	battery = (struct acpi_battery *)acpi_driver_data(device);
+	
+	result = acpi_battery_check(battery);
+	if (result > 0){
+		acpi_bus_generate_event(device,
+					ACPI_NOTIFY_DEVICE_CHECK,
+					battery->flags.present);
+	}
+	return 0;
+}
+
 static int __init acpi_battery_init(void)
 {
 	int result;

Check battery after resume

Signed-off-by: Thomas Renninger <mail@xxxxxxxxxxxx>


 drivers/acpi/battery.c |   33 ++++++++++++++++++++++++++++++++-
 1 files changed, 32 insertions(+), 1 deletion(-)

Index: linux-acpi-2.6.git_i386/drivers/acpi/battery.c
===================================================================
--- linux-acpi-2.6.git_i386.orig/drivers/acpi/battery.c
+++ linux-acpi-2.6.git_i386/drivers/acpi/battery.c
@@ -64,6 +64,7 @@ extern void *acpi_unlock_battery_dir(str
 
 static int acpi_battery_add(struct acpi_device *device);
 static int acpi_battery_remove(struct acpi_device *device, int type);
+static int acpi_battery_resume(struct acpi_device *device, int state);
 
 static struct acpi_driver acpi_battery_driver = {
 	.name = ACPI_BATTERY_DRIVER_NAME,
@@ -72,6 +73,7 @@ static struct acpi_driver acpi_battery_d
 	.ops = {
 		.add = acpi_battery_add,
 		.remove = acpi_battery_remove,
+		.resume = acpi_battery_resume,
 		},
 };
 
@@ -269,6 +271,14 @@ acpi_battery_set_alarm(struct acpi_batte
 	return 0;
 }
 
+/* 
+ * returns:
+ *   0 on success
+ *  <0 on failure
+ *   1 if new battery found
+ *   2 if battery got removed
+ */
+
 static int acpi_battery_check(struct acpi_battery *battery)
 {
 	int result = 0;
@@ -311,12 +321,14 @@ static int acpi_battery_check(struct acp
 			battery->flags.alarm = 1;
 			acpi_battery_set_alarm(battery, battery->trips.warning);
 		}
+		result = 1;
 	}
 
 	/* Removal? */
 
 	else if (battery->flags.present && !device->status.battery_present) {
 		ACPI_DEBUG_PRINT((ACPI_DB_INFO, "Battery removed\n"));
+		result = 2;
 	}
 
 	battery->flags.present = device->status.battery_present;
@@ -703,7 +715,7 @@ static int acpi_battery_add(struct acpi_
 	acpi_driver_data(device) = battery;
 
 	result = acpi_battery_check(battery);
-	if (result)
+	if (result < 0)
 		goto end;
 
 	result = acpi_battery_add_fs(device);
@@ -753,6 +765,25 @@ static int acpi_battery_remove(struct ac
 	return 0;
 }
 
+static int acpi_battery_resume(struct acpi_device *device, int state){
+
+	int result = 0;
+	struct acpi_battery *battery = NULL;
+
+	if (!device || !acpi_driver_data(device))
+		return -EINVAL;
+
+	battery = (struct acpi_battery *)acpi_driver_data(device);
+	
+	result = acpi_battery_check(battery);
+	if (result > 0){
+		acpi_bus_generate_event(device,
+					ACPI_NOTIFY_DEVICE_CHECK,
+					battery->flags.present);
+	}
+	return 0;
+}
+
 static int __init acpi_battery_init(void)
 {
 	int result;

[Index of Archives]     [Linux IBM ACPI]     [Linux Power Management]     [Linux Kernel]     [Linux Laptop]     [Kernel Newbies]     [Share Photos]     [Security]     [Netfilter]     [Bugtraq]     [Yosemite News]     [MIPS Linux]     [ARM Linux]     [Linux Security]     [Linux RAID]     [Samba]     [Video 4 Linux]     [Device Mapper]     [Linux Resources]

  Powered by Linux