84 lines
2.9 KiB
Diff
84 lines
2.9 KiB
Diff
From 530be0418a0d05cad538ff62ae16b43d2d4462e3 Mon Sep 17 00:00:00 2001
|
|
From: mokopatches <mokopatches@openmoko.org>
|
|
Date: Sun, 13 Apr 2008 07:23:57 +0100
|
|
Subject: [PATCH] fix-pcf50606-LOWBAT-kill-init.patch
|
|
|
|
---
|
|
drivers/i2c/chips/pcf50606.c | 53 ++++++++++++++++++++++++++++++++++++-----
|
|
1 files changed, 46 insertions(+), 7 deletions(-)
|
|
|
|
diff --git a/drivers/i2c/chips/pcf50606.c b/drivers/i2c/chips/pcf50606.c
|
|
index b530583..a1c92d3 100644
|
|
--- a/drivers/i2c/chips/pcf50606.c
|
|
+++ b/drivers/i2c/chips/pcf50606.c
|
|
@@ -654,8 +654,20 @@ static void pcf50606_work(struct work_struct *work)
|
|
if (pcf->onkey_seconds >=
|
|
pcf->pdata->onkey_seconds_required) {
|
|
/* Ask init to do 'ctrlaltdel' */
|
|
- DEBUGPC("SIGINT(init) ");
|
|
- kill_proc(1, SIGINT, 1);
|
|
+ /*
|
|
+ * currently Linux reacts badly to issuing a
|
|
+ * signal to PID #1 before init is started.
|
|
+ * What happens is that the next kernel thread
|
|
+ * to start, which is the JFFS2 Garbage
|
|
+ * collector in our case, gets the signal
|
|
+ * instead and proceeds to fail to fork --
|
|
+ * which is very bad. Therefore we confirm
|
|
+ * PID #1 exists before issuing the signal
|
|
+ */
|
|
+ if (find_task_by_pid(1)) {
|
|
+ kill_proc(1, SIGINT, 1);
|
|
+ DEBUGPC("SIGINT(init) ");
|
|
+ }
|
|
/* FIXME: what to do if userspace doesn't
|
|
* shut down? Do we want to force it? */
|
|
}
|
|
@@ -749,11 +761,38 @@ static void pcf50606_work(struct work_struct *work)
|
|
}
|
|
/* FIXME: TSCPRES */
|
|
if (pcfirq[2] & PCF50606_INT3_LOWBAT) {
|
|
- /* Really low battery voltage, we have 8 seconds left */
|
|
- DEBUGPC("LOWBAT ");
|
|
- apm_queue_event(APM_LOW_BATTERY);
|
|
- DEBUGPC("SIGPWR(init) ");
|
|
- kill_proc(1, SIGPWR, 1);
|
|
+ if (__reg_read(pcf, PCF50606_REG_OOCS) & PCF50606_OOCS_EXTON) {
|
|
+ /*
|
|
+ * hey no need to freak out, we have some kind of
|
|
+ * valid charger power
|
|
+ */
|
|
+ DEBUGPC("(NO)BAT ");
|
|
+ } else {
|
|
+ /* Really low battery voltage, we have 8 seconds left */
|
|
+ DEBUGPC("LOWBAT ");
|
|
+ /*
|
|
+ * currently Linux reacts badly to issuing a signal to
|
|
+ * PID #1 before init is started. What happens is that
|
|
+ * the next kernel thread to start, which is the JFFS2
|
|
+ * Garbage collector in our case, gets the signal
|
|
+ * instead and proceeds to fail to fork -- which is
|
|
+ * very bad. Therefore we confirm PID #1 exists
|
|
+ * before issuing SPIGPWR
|
|
+ */
|
|
+ if (find_task_by_pid(1)) {
|
|
+ apm_queue_event(APM_LOW_BATTERY);
|
|
+ DEBUGPC("SIGPWR(init) ");
|
|
+ kill_proc(1, SIGPWR, 1);
|
|
+ } else
|
|
+ /*
|
|
+ * well, our situation is like this: we do not
|
|
+ * have any external power, we have a low
|
|
+ * battery and since PID #1 doesn't exist yet,
|
|
+ * we are early in the boot, likely before
|
|
+ * rootfs mount. We should just call it a day
|
|
+ */
|
|
+ apm_queue_event(APM_CRITICAL_SUSPEND);
|
|
+ }
|
|
/* Tell PMU we are taking care of this */
|
|
reg_set_bit_mask(pcf, PCF50606_REG_OOCC1,
|
|
PCF50606_OOCC1_TOTRST,
|
|
--
|
|
1.5.6.5
|
|
|