aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--arch/arm/mach-pxa/corgi_pm.c3
-rw-r--r--arch/arm/mach-pxa/include/mach/sharpsl_pm.h8
-rw-r--r--arch/arm/mach-pxa/sharpsl.h2
-rw-r--r--arch/arm/mach-pxa/sharpsl_pm.c104
-rw-r--r--arch/arm/mach-pxa/spitz_pm.c3
5 files changed, 54 insertions, 66 deletions
diff --git a/arch/arm/mach-pxa/corgi_pm.c b/arch/arm/mach-pxa/corgi_pm.c
index 7f04b3a761d1..a093282fe4db 100644
--- a/arch/arm/mach-pxa/corgi_pm.c
+++ b/arch/arm/mach-pxa/corgi_pm.c
@@ -41,7 +41,6 @@ static void corgi_charger_init(void)
41 pxa_gpio_mode(CORGI_GPIO_CHRG_ON | GPIO_OUT); 41 pxa_gpio_mode(CORGI_GPIO_CHRG_ON | GPIO_OUT);
42 pxa_gpio_mode(CORGI_GPIO_CHRG_UKN | GPIO_OUT); 42 pxa_gpio_mode(CORGI_GPIO_CHRG_UKN | GPIO_OUT);
43 pxa_gpio_mode(CORGI_GPIO_KEY_INT | GPIO_IN); 43 pxa_gpio_mode(CORGI_GPIO_KEY_INT | GPIO_IN);
44 sharpsl_pm_pxa_init();
45} 44}
46 45
47static void corgi_measure_temp(int on) 46static void corgi_measure_temp(int on)
@@ -191,7 +190,7 @@ unsigned long corgipm_read_devdata(int type)
191 190
192static struct sharpsl_charger_machinfo corgi_pm_machinfo = { 191static struct sharpsl_charger_machinfo corgi_pm_machinfo = {
193 .init = corgi_charger_init, 192 .init = corgi_charger_init,
194 .exit = sharpsl_pm_pxa_remove, 193 .exit = NULL,
195 .gpio_batlock = CORGI_GPIO_BAT_COVER, 194 .gpio_batlock = CORGI_GPIO_BAT_COVER,
196 .gpio_acin = CORGI_GPIO_AC_IN, 195 .gpio_acin = CORGI_GPIO_AC_IN,
197 .gpio_batfull = CORGI_GPIO_CHRG_FULL, 196 .gpio_batfull = CORGI_GPIO_CHRG_FULL,
diff --git a/arch/arm/mach-pxa/include/mach/sharpsl_pm.h b/arch/arm/mach-pxa/include/mach/sharpsl_pm.h
index 2d00db22b981..1920dc6b05dc 100644
--- a/arch/arm/mach-pxa/include/mach/sharpsl_pm.h
+++ b/arch/arm/mach-pxa/include/mach/sharpsl_pm.h
@@ -8,8 +8,8 @@
8 * published by the Free Software Foundation. 8 * published by the Free Software Foundation.
9 * 9 *
10 */ 10 */
11 11#ifndef _MACH_SHARPSL_PM
12#include <linux/interrupt.h> 12#define _MACH_SHARPSL_PM
13 13
14struct sharpsl_charger_machinfo { 14struct sharpsl_charger_machinfo {
15 void (*init)(void); 15 void (*init)(void);
@@ -100,7 +100,5 @@ extern struct sharpsl_pm_status sharpsl_pm;
100 100
101void sharpsl_battery_kick(void); 101void sharpsl_battery_kick(void);
102void sharpsl_pm_led(int val); 102void sharpsl_pm_led(int val);
103irqreturn_t sharpsl_ac_isr(int irq, void *dev_id);
104irqreturn_t sharpsl_chrg_full_isr(int irq, void *dev_id);
105irqreturn_t sharpsl_fatal_isr(int irq, void *dev_id);
106 103
104#endif
diff --git a/arch/arm/mach-pxa/sharpsl.h b/arch/arm/mach-pxa/sharpsl.h
index f1cd00ea0322..55259f4756c8 100644
--- a/arch/arm/mach-pxa/sharpsl.h
+++ b/arch/arm/mach-pxa/sharpsl.h
@@ -44,8 +44,6 @@ void corgi_lcdtg_hw_init(int mode);
44 44
45extern struct battery_thresh spitz_battery_levels_acin[]; 45extern struct battery_thresh spitz_battery_levels_acin[];
46extern struct battery_thresh spitz_battery_levels_noac[]; 46extern struct battery_thresh spitz_battery_levels_noac[];
47void sharpsl_pm_pxa_init(void);
48void sharpsl_pm_pxa_remove(void);
49int sharpsl_pm_pxa_read_max1111(int channel); 47int sharpsl_pm_pxa_read_max1111(int channel);
50 48
51 49
diff --git a/arch/arm/mach-pxa/sharpsl_pm.c b/arch/arm/mach-pxa/sharpsl_pm.c
index 9d61c4916968..540b567278f5 100644
--- a/arch/arm/mach-pxa/sharpsl_pm.c
+++ b/arch/arm/mach-pxa/sharpsl_pm.c
@@ -15,19 +15,16 @@
15#undef DEBUG 15#undef DEBUG
16 16
17#include <linux/module.h> 17#include <linux/module.h>
18#include <linux/init.h>
19#include <linux/kernel.h> 18#include <linux/kernel.h>
20#include <linux/interrupt.h> 19#include <linux/interrupt.h>
21#include <linux/irq.h> 20#include <linux/irq.h>
22#include <linux/platform_device.h> 21#include <linux/platform_device.h>
23#include <linux/apm-emulation.h> 22#include <linux/apm-emulation.h>
24#include <linux/timer.h> 23#include <linux/timer.h>
25#include <linux/apm_bios.h>
26#include <linux/delay.h> 24#include <linux/delay.h>
27#include <linux/leds.h> 25#include <linux/leds.h>
28#include <linux/suspend.h> 26#include <linux/suspend.h>
29 27
30#include <mach/hardware.h>
31#include <asm/mach-types.h> 28#include <asm/mach-types.h>
32#include <mach/pm.h> 29#include <mach/pm.h>
33#include <mach/pxa2xx-regs.h> 30#include <mach/pxa2xx-regs.h>
@@ -36,6 +33,8 @@
36#include <mach/sharpsl.h> 33#include <mach/sharpsl.h>
37#include <mach/sharpsl_pm.h> 34#include <mach/sharpsl_pm.h>
38 35
36#include "sharpsl.h"
37
39/* 38/*
40 * Constants 39 * Constants
41 */ 40 */
@@ -73,8 +72,8 @@ static void sharpsl_battery_thread(struct work_struct *private_);
73 * Variables 72 * Variables
74 */ 73 */
75struct sharpsl_pm_status sharpsl_pm; 74struct sharpsl_pm_status sharpsl_pm;
76DECLARE_DELAYED_WORK(toggle_charger, sharpsl_charge_toggle); 75static DECLARE_DELAYED_WORK(toggle_charger, sharpsl_charge_toggle);
77DECLARE_DELAYED_WORK(sharpsl_bat, sharpsl_battery_thread); 76static DECLARE_DELAYED_WORK(sharpsl_bat, sharpsl_battery_thread);
78DEFINE_LED_TRIGGER(sharpsl_charge_led_trigger); 77DEFINE_LED_TRIGGER(sharpsl_charge_led_trigger);
79 78
80 79
@@ -194,52 +193,6 @@ int sharpsl_pm_pxa_read_max1111(int channel)
194#endif 193#endif
195} 194}
196 195
197void sharpsl_pm_pxa_init(void)
198{
199 pxa_gpio_mode(sharpsl_pm.machinfo->gpio_acin | GPIO_IN);
200 pxa_gpio_mode(sharpsl_pm.machinfo->gpio_batfull | GPIO_IN);
201 pxa_gpio_mode(sharpsl_pm.machinfo->gpio_batlock | GPIO_IN);
202
203 /* Register interrupt handlers */
204 if (request_irq(IRQ_GPIO(sharpsl_pm.machinfo->gpio_acin), sharpsl_ac_isr, IRQF_DISABLED, "AC Input Detect", sharpsl_ac_isr)) {
205 dev_err(sharpsl_pm.dev, "Could not get irq %d.\n", IRQ_GPIO(sharpsl_pm.machinfo->gpio_acin));
206 }
207 else set_irq_type(IRQ_GPIO(sharpsl_pm.machinfo->gpio_acin),IRQ_TYPE_EDGE_BOTH);
208
209 if (request_irq(IRQ_GPIO(sharpsl_pm.machinfo->gpio_batlock), sharpsl_fatal_isr, IRQF_DISABLED, "Battery Cover", sharpsl_fatal_isr)) {
210 dev_err(sharpsl_pm.dev, "Could not get irq %d.\n", IRQ_GPIO(sharpsl_pm.machinfo->gpio_batlock));
211 }
212 else set_irq_type(IRQ_GPIO(sharpsl_pm.machinfo->gpio_batlock),IRQ_TYPE_EDGE_FALLING);
213
214 if (sharpsl_pm.machinfo->gpio_fatal) {
215 if (request_irq(IRQ_GPIO(sharpsl_pm.machinfo->gpio_fatal), sharpsl_fatal_isr, IRQF_DISABLED, "Fatal Battery", sharpsl_fatal_isr)) {
216 dev_err(sharpsl_pm.dev, "Could not get irq %d.\n", IRQ_GPIO(sharpsl_pm.machinfo->gpio_fatal));
217 }
218 else set_irq_type(IRQ_GPIO(sharpsl_pm.machinfo->gpio_fatal),IRQ_TYPE_EDGE_FALLING);
219 }
220
221 if (sharpsl_pm.machinfo->batfull_irq)
222 {
223 /* Register interrupt handler. */
224 if (request_irq(IRQ_GPIO(sharpsl_pm.machinfo->gpio_batfull), sharpsl_chrg_full_isr, IRQF_DISABLED, "CO", sharpsl_chrg_full_isr)) {
225 dev_err(sharpsl_pm.dev, "Could not get irq %d.\n", IRQ_GPIO(sharpsl_pm.machinfo->gpio_batfull));
226 }
227 else set_irq_type(IRQ_GPIO(sharpsl_pm.machinfo->gpio_batfull),IRQ_TYPE_EDGE_RISING);
228 }
229}
230
231void sharpsl_pm_pxa_remove(void)
232{
233 free_irq(IRQ_GPIO(sharpsl_pm.machinfo->gpio_acin), sharpsl_ac_isr);
234 free_irq(IRQ_GPIO(sharpsl_pm.machinfo->gpio_batlock), sharpsl_fatal_isr);
235
236 if (sharpsl_pm.machinfo->gpio_fatal)
237 free_irq(IRQ_GPIO(sharpsl_pm.machinfo->gpio_fatal), sharpsl_fatal_isr);
238
239 if (sharpsl_pm.machinfo->batfull_irq)
240 free_irq(IRQ_GPIO(sharpsl_pm.machinfo->gpio_batfull), sharpsl_chrg_full_isr);
241}
242
243static int get_percentage(int voltage) 196static int get_percentage(int voltage)
244{ 197{
245 int i = sharpsl_pm.machinfo->bat_levels - 1; 198 int i = sharpsl_pm.machinfo->bat_levels - 1;
@@ -427,7 +380,7 @@ static void sharpsl_ac_timer(unsigned long data)
427} 380}
428 381
429 382
430irqreturn_t sharpsl_ac_isr(int irq, void *dev_id) 383static irqreturn_t sharpsl_ac_isr(int irq, void *dev_id)
431{ 384{
432 /* Delay the event slightly to debounce */ 385 /* Delay the event slightly to debounce */
433 /* Must be a smaller delay than the chrg_full_isr below */ 386 /* Must be a smaller delay than the chrg_full_isr below */
@@ -462,7 +415,7 @@ static void sharpsl_chrg_full_timer(unsigned long data)
462/* Charging Finished Interrupt (Not present on Corgi) */ 415/* Charging Finished Interrupt (Not present on Corgi) */
463/* Can trigger at the same time as an AC status change so 416/* Can trigger at the same time as an AC status change so
464 delay until after that has been processed */ 417 delay until after that has been processed */
465irqreturn_t sharpsl_chrg_full_isr(int irq, void *dev_id) 418static irqreturn_t sharpsl_chrg_full_isr(int irq, void *dev_id)
466{ 419{
467 if (sharpsl_pm.flags & SHARPSL_SUSPENDED) 420 if (sharpsl_pm.flags & SHARPSL_SUSPENDED)
468 return IRQ_HANDLED; 421 return IRQ_HANDLED;
@@ -473,7 +426,7 @@ irqreturn_t sharpsl_chrg_full_isr(int irq, void *dev_id)
473 return IRQ_HANDLED; 426 return IRQ_HANDLED;
474} 427}
475 428
476irqreturn_t sharpsl_fatal_isr(int irq, void *dev_id) 429static irqreturn_t sharpsl_fatal_isr(int irq, void *dev_id)
477{ 430{
478 int is_fatal = 0; 431 int is_fatal = 0;
479 432
@@ -966,6 +919,37 @@ static int __init sharpsl_pm_probe(struct platform_device *pdev)
966 919
967 sharpsl_pm.machinfo->init(); 920 sharpsl_pm.machinfo->init();
968 921
922 pxa_gpio_mode(sharpsl_pm.machinfo->gpio_acin | GPIO_IN);
923 pxa_gpio_mode(sharpsl_pm.machinfo->gpio_batfull | GPIO_IN);
924 pxa_gpio_mode(sharpsl_pm.machinfo->gpio_batlock | GPIO_IN);
925
926 /* Register interrupt handlers */
927 if (request_irq(IRQ_GPIO(sharpsl_pm.machinfo->gpio_acin), sharpsl_ac_isr, IRQF_DISABLED, "AC Input Detect", sharpsl_ac_isr)) {
928 dev_err(sharpsl_pm.dev, "Could not get irq %d.\n", IRQ_GPIO(sharpsl_pm.machinfo->gpio_acin));
929 }
930 else set_irq_type(IRQ_GPIO(sharpsl_pm.machinfo->gpio_acin),IRQ_TYPE_EDGE_BOTH);
931
932 if (request_irq(IRQ_GPIO(sharpsl_pm.machinfo->gpio_batlock), sharpsl_fatal_isr, IRQF_DISABLED, "Battery Cover", sharpsl_fatal_isr)) {
933 dev_err(sharpsl_pm.dev, "Could not get irq %d.\n", IRQ_GPIO(sharpsl_pm.machinfo->gpio_batlock));
934 }
935 else set_irq_type(IRQ_GPIO(sharpsl_pm.machinfo->gpio_batlock),IRQ_TYPE_EDGE_FALLING);
936
937 if (sharpsl_pm.machinfo->gpio_fatal) {
938 if (request_irq(IRQ_GPIO(sharpsl_pm.machinfo->gpio_fatal), sharpsl_fatal_isr, IRQF_DISABLED, "Fatal Battery", sharpsl_fatal_isr)) {
939 dev_err(sharpsl_pm.dev, "Could not get irq %d.\n", IRQ_GPIO(sharpsl_pm.machinfo->gpio_fatal));
940 }
941 else set_irq_type(IRQ_GPIO(sharpsl_pm.machinfo->gpio_fatal),IRQ_TYPE_EDGE_FALLING);
942 }
943
944 if (sharpsl_pm.machinfo->batfull_irq)
945 {
946 /* Register interrupt handler. */
947 if (request_irq(IRQ_GPIO(sharpsl_pm.machinfo->gpio_batfull), sharpsl_chrg_full_isr, IRQF_DISABLED, "CO", sharpsl_chrg_full_isr)) {
948 dev_err(sharpsl_pm.dev, "Could not get irq %d.\n", IRQ_GPIO(sharpsl_pm.machinfo->gpio_batfull));
949 }
950 else set_irq_type(IRQ_GPIO(sharpsl_pm.machinfo->gpio_batfull),IRQ_TYPE_EDGE_RISING);
951 }
952
969 ret = device_create_file(&pdev->dev, &dev_attr_battery_percentage); 953 ret = device_create_file(&pdev->dev, &dev_attr_battery_percentage);
970 ret |= device_create_file(&pdev->dev, &dev_attr_battery_voltage); 954 ret |= device_create_file(&pdev->dev, &dev_attr_battery_voltage);
971 if (ret != 0) 955 if (ret != 0)
@@ -991,7 +975,17 @@ static int sharpsl_pm_remove(struct platform_device *pdev)
991 975
992 led_trigger_unregister_simple(sharpsl_charge_led_trigger); 976 led_trigger_unregister_simple(sharpsl_charge_led_trigger);
993 977
994 sharpsl_pm.machinfo->exit(); 978 free_irq(IRQ_GPIO(sharpsl_pm.machinfo->gpio_acin), sharpsl_ac_isr);
979 free_irq(IRQ_GPIO(sharpsl_pm.machinfo->gpio_batlock), sharpsl_fatal_isr);
980
981 if (sharpsl_pm.machinfo->gpio_fatal)
982 free_irq(IRQ_GPIO(sharpsl_pm.machinfo->gpio_fatal), sharpsl_fatal_isr);
983
984 if (sharpsl_pm.machinfo->batfull_irq)
985 free_irq(IRQ_GPIO(sharpsl_pm.machinfo->gpio_batfull), sharpsl_chrg_full_isr);
986
987 if (sharpsl_pm.machinfo->exit)
988 sharpsl_pm.machinfo->exit();
995 989
996 del_timer_sync(&sharpsl_pm.chrg_full_timer); 990 del_timer_sync(&sharpsl_pm.chrg_full_timer);
997 del_timer_sync(&sharpsl_pm.ac_timer); 991 del_timer_sync(&sharpsl_pm.ac_timer);
diff --git a/arch/arm/mach-pxa/spitz_pm.c b/arch/arm/mach-pxa/spitz_pm.c
index 2e4490562c9e..724ffb030317 100644
--- a/arch/arm/mach-pxa/spitz_pm.c
+++ b/arch/arm/mach-pxa/spitz_pm.c
@@ -41,7 +41,6 @@ static void spitz_charger_init(void)
41{ 41{
42 pxa_gpio_mode(SPITZ_GPIO_KEY_INT | GPIO_IN); 42 pxa_gpio_mode(SPITZ_GPIO_KEY_INT | GPIO_IN);
43 pxa_gpio_mode(SPITZ_GPIO_SYNC | GPIO_IN); 43 pxa_gpio_mode(SPITZ_GPIO_SYNC | GPIO_IN);
44 sharpsl_pm_pxa_init();
45} 44}
46 45
47static void spitz_measure_temp(int on) 46static void spitz_measure_temp(int on)
@@ -182,7 +181,7 @@ unsigned long spitzpm_read_devdata(int type)
182 181
183struct sharpsl_charger_machinfo spitz_pm_machinfo = { 182struct sharpsl_charger_machinfo spitz_pm_machinfo = {
184 .init = spitz_charger_init, 183 .init = spitz_charger_init,
185 .exit = sharpsl_pm_pxa_remove, 184 .exit = NULL,
186 .gpio_batlock = SPITZ_GPIO_BAT_COVER, 185 .gpio_batlock = SPITZ_GPIO_BAT_COVER,
187 .gpio_acin = SPITZ_GPIO_AC_IN, 186 .gpio_acin = SPITZ_GPIO_AC_IN,
188 .gpio_batfull = SPITZ_GPIO_CHRG_FULL, 187 .gpio_batfull = SPITZ_GPIO_CHRG_FULL,