2 * Battery and Power Management code for the Sharp SL-C7xx and SL-Cxx00
5 * Copyright (c) 2004-2005 Richard Purdie
7 * Based on code written by Sharp for 2.4 kernels
9 * This program is free software; you can redistribute it and/or modify
10 * it under the terms of the GNU General Public License version 2 as
11 * published by the Free Software Foundation.
17 #include <linux/module.h>
18 #include <linux/init.h>
19 #include <linux/kernel.h>
20 #include <linux/interrupt.h>
21 #include <linux/irq.h>
22 #include <linux/platform_device.h>
23 #include <linux/apm-emulation.h>
25 #include <mach/hardware.h>
26 #include <asm/mach-types.h>
28 #include <mach/pxa2xx-gpio.h>
29 #include <mach/sharpsl.h>
32 struct battery_thresh spitz_battery_levels_acin
[] = {
75 struct battery_thresh spitz_battery_levels_noac
[] = {
118 /* MAX1111 Commands */
119 #define MAXCTRL_PD0 1u << 0
120 #define MAXCTRL_PD1 1u << 1
121 #define MAXCTRL_SGL 1u << 2
122 #define MAXCTRL_UNI 1u << 3
123 #define MAXCTRL_SEL_SH 4
124 #define MAXCTRL_STR 1u << 7
129 int sharpsl_pm_pxa_read_max1111(int channel
)
131 if (machine_is_tosa()) // Ugly, better move this function into another module
134 #ifdef CONFIG_CORGI_SSP_DEPRECATED
135 return corgi_ssp_max1111_get((channel
<< MAXCTRL_SEL_SH
) | MAXCTRL_PD0
| MAXCTRL_PD1
136 | MAXCTRL_SGL
| MAXCTRL_UNI
| MAXCTRL_STR
);
138 extern int max1111_read_channel(int);
140 /* max1111 accepts channels from 0-3, however,
141 * it is encoded from 0-7 here in the code.
143 return max1111_read_channel(channel
>> 1);
147 void sharpsl_pm_pxa_init(void)
149 pxa_gpio_mode(sharpsl_pm
.machinfo
->gpio_acin
| GPIO_IN
);
150 pxa_gpio_mode(sharpsl_pm
.machinfo
->gpio_batfull
| GPIO_IN
);
151 pxa_gpio_mode(sharpsl_pm
.machinfo
->gpio_batlock
| GPIO_IN
);
153 /* Register interrupt handlers */
154 if (request_irq(IRQ_GPIO(sharpsl_pm
.machinfo
->gpio_acin
), sharpsl_ac_isr
, IRQF_DISABLED
, "AC Input Detect", sharpsl_ac_isr
)) {
155 dev_err(sharpsl_pm
.dev
, "Could not get irq %d.\n", IRQ_GPIO(sharpsl_pm
.machinfo
->gpio_acin
));
157 else set_irq_type(IRQ_GPIO(sharpsl_pm
.machinfo
->gpio_acin
),IRQ_TYPE_EDGE_BOTH
);
159 if (request_irq(IRQ_GPIO(sharpsl_pm
.machinfo
->gpio_batlock
), sharpsl_fatal_isr
, IRQF_DISABLED
, "Battery Cover", sharpsl_fatal_isr
)) {
160 dev_err(sharpsl_pm
.dev
, "Could not get irq %d.\n", IRQ_GPIO(sharpsl_pm
.machinfo
->gpio_batlock
));
162 else set_irq_type(IRQ_GPIO(sharpsl_pm
.machinfo
->gpio_batlock
),IRQ_TYPE_EDGE_FALLING
);
164 if (sharpsl_pm
.machinfo
->gpio_fatal
) {
165 if (request_irq(IRQ_GPIO(sharpsl_pm
.machinfo
->gpio_fatal
), sharpsl_fatal_isr
, IRQF_DISABLED
, "Fatal Battery", sharpsl_fatal_isr
)) {
166 dev_err(sharpsl_pm
.dev
, "Could not get irq %d.\n", IRQ_GPIO(sharpsl_pm
.machinfo
->gpio_fatal
));
168 else set_irq_type(IRQ_GPIO(sharpsl_pm
.machinfo
->gpio_fatal
),IRQ_TYPE_EDGE_FALLING
);
171 if (sharpsl_pm
.machinfo
->batfull_irq
)
173 /* Register interrupt handler. */
174 if (request_irq(IRQ_GPIO(sharpsl_pm
.machinfo
->gpio_batfull
), sharpsl_chrg_full_isr
, IRQF_DISABLED
, "CO", sharpsl_chrg_full_isr
)) {
175 dev_err(sharpsl_pm
.dev
, "Could not get irq %d.\n", IRQ_GPIO(sharpsl_pm
.machinfo
->gpio_batfull
));
177 else set_irq_type(IRQ_GPIO(sharpsl_pm
.machinfo
->gpio_batfull
),IRQ_TYPE_EDGE_RISING
);
181 void sharpsl_pm_pxa_remove(void)
183 free_irq(IRQ_GPIO(sharpsl_pm
.machinfo
->gpio_acin
), sharpsl_ac_isr
);
184 free_irq(IRQ_GPIO(sharpsl_pm
.machinfo
->gpio_batlock
), sharpsl_fatal_isr
);
186 if (sharpsl_pm
.machinfo
->gpio_fatal
)
187 free_irq(IRQ_GPIO(sharpsl_pm
.machinfo
->gpio_fatal
), sharpsl_fatal_isr
);
189 if (sharpsl_pm
.machinfo
->batfull_irq
)
190 free_irq(IRQ_GPIO(sharpsl_pm
.machinfo
->gpio_batfull
), sharpsl_chrg_full_isr
);