2 --- linux/arch/arm/mach-sa1100/collie_battery.c Tue Jul 22 02:24:32 2003
3 +++ linux/arch/arm/mach-sa1100/collie_battery.c Tue Jul 22 03:07:56 2003
5 * but WITHOUT ANY WARRANTY; without even the implied warranty of
6 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
7 * GNU General Public License for more details.
10 + * Nov 2002 Dietz Proepper: improved battery status.
11 * 12-Nov-2001 Lineo Japan, Inc.
12 * 30-Jul-2002 Lineo Japan, Inc. for 2.4.18
13 * 29-Jan-2003 Sharp Corporation modify for new QT I/F
16 @@ -79,10 +80,11 @@ int collie_read_BackBattery(void);
17 int collie_read_Temp(void);
18 int collie_check_temp(void);
19 int collie_check_voltage(void);
20 static void collie_charge_on(void);
21 static void collie_charge_off(void);
22 +static void do_main_battery(void);
23 int set_led_status(int which,int status);
24 int GetMainLevel( int Volt );
25 int GetBackLevel( int Volt );
26 int collie_get_main_battery(void);
27 unsigned short GetBackupBatteryAD(void);
28 @@ -91,40 +93,35 @@ int suspend_collie_read_Temp(void);
29 /*** extern ***********************************************************************/
30 extern u32 apm_wakeup_src_mask;
31 extern int counter_step_contrast;
34 -/*** gloabal variables ************************************************************/
35 -int charge_status = 0; /* charge status 1 : charge 0: not charge */
37 -typedef struct BatteryThresh {
43 +#define COLLIE_BATTERY_STATUS_HIGH APM_BATTERY_STATUS_HIGH
44 +#define COLLIE_BATTERY_STATUS_LOW APM_BATTERY_STATUS_LOW
45 +#define COLLIE_BATTERY_STATUS_VERYLOW APM_BATTERY_STATUS_VERY_LOW
46 +#define COLLIE_BATTERY_STATUS_CRITICAL APM_BATTERY_STATUS_CRITICAL
48 +/*** gloabal variables ************************************************************/
49 +int charge_status = 0; /* charge status 1 : charge 0: not charge */
51 -#if defined(CONFIG_COLLIE_TS) || defined(CONFIG_COLLIE_TR0) || \
52 - defined(CONFIG_COLLIE_TR1) || defined(CONFIG_COLLIE_DEV)
53 -BATTERY_THRESH collie_main_battery_thresh_fl = {
57 -BATTERY_THRESH collie_main_battery_thresh_nofl = {
61 -BATTERY_THRESH collie_main_battery_thresh_fl = {
65 -BATTERY_THRESH collie_main_battery_thresh_nofl = {
68 + int voltage_thres[2]; /* 0: nofl 1: fl */
71 +} main_battery_thres;
73 +#define MAIN_BATTERY_THRES 4
75 +main_battery_thres main_batt_thres[MAIN_BATTERY_THRES+2] = {
76 + {{5000, 5000}, 100, COLLIE_BATTERY_STATUS_HIGH }, /* do not remove! */
77 + {{412,408}, 100, COLLIE_BATTERY_STATUS_HIGH},
78 + {{378,368}, 40, COLLIE_BATTERY_STATUS_HIGH},
79 + {{364,358}, 5, COLLIE_BATTERY_STATUS_LOW},
80 + {{362,356}, 1, COLLIE_BATTERY_STATUS_CRITICAL},
81 + {{0, 0}, 1, COLLIE_BATTERY_STATUS_CRITICAL } /* do not remove, too! */
87 typedef struct ChargeThresh {
91 @@ -180,24 +177,18 @@ static struct miscdevice battery_device
92 #define GetBackADCtoPower(x) (( 330 * x * 2 ) / 1024 ) // MAX 3.3V
93 #define ConvRevise(x) ( ( ad_revise * x ) / 652 )
94 #define MAIN_DIFF 50 // 0.5V
95 #define DIFF_CNT ( 3 - 1 )
97 -#define COLLIE_BATTERY_STATUS_HIGH APM_BATTERY_STATUS_HIGH
98 -#define COLLIE_BATTERY_STATUS_LOW APM_BATTERY_STATUS_LOW
99 -#define COLLIE_BATTERY_STATUS_VERYLOW APM_BATTERY_STATUS_VERY_LOW
100 -#define COLLIE_BATTERY_STATUS_CRITICAL APM_BATTERY_STATUS_CRITICAL
102 #define COLLIE_AC_LINE_STATUS (!( GPLR & GPIO_AC_IN ) ? APM_AC_OFFLINE : APM_AC_ONLINE)
105 #define COLLIE_PM_TICK ( 1000 / 10 ) // 1sec
106 #define COLLIE_APO_TICKTIME ( 5 * COLLIE_PM_TICK ) // 5sec
107 #define COLLIE_LPO_TICKTIME COLLIE_APO_TICKTIME
108 #define COLLIE_APO_DEFAULT ( ( 3 * 60 ) * COLLIE_PM_TICK ) // 3 min
109 #define COLLIE_LPO_DEFAULT ( 20 * COLLIE_PM_TICK ) // 20 sec
110 -#define COLLIE_MAIN_GOOD_COUNT ( 10*60 / ( COLLIE_APO_TICKTIME / COLLIE_PM_TICK ) )
111 +#define COLLIE_MAIN_GOOD_COUNT ( 1*60 / ( COLLIE_APO_TICKTIME / COLLIE_PM_TICK ) )
112 #define COLLIE_MAIN_NOGOOD_COUNT ( 1*60 / ( COLLIE_APO_TICKTIME / COLLIE_PM_TICK ) )
114 #define COLLIE_BACKUP_BATTERY_CK_TIME ( 10*60*1*100 ) // 10min
115 #define COLLIE_BACKUP_BATTERY_LOW ( 190 )
117 @@ -212,10 +203,11 @@ unsigned int LPOCntWk = 0;
118 static DECLARE_WAIT_QUEUE_HEAD(queue);
121 int collie_backup_battery = COLLIE_BATTERY_STATUS_HIGH;
122 int collie_main_battery = COLLIE_BATTERY_STATUS_HIGH;
123 +int collie_main_battery_percent = 100;
124 int collie_main_charge_battery = 100;
125 int collie_ac_status = APM_AC_OFFLINE;
128 static int MainCntWk = COLLIE_MAIN_GOOD_COUNT;
129 @@ -229,10 +221,11 @@ static struct pm_dev *battery_pm_dev; /
131 static int battery_off_flag = 0; /* charge : suspend while get adc */
132 static int collie_charge_temp = 973;
133 static int collie_charge_volt = 465; /* charge : check charge 3.0V */
134 static int charge_off_mode = 0; /* charge : check volt or non */
135 +static int collie_main_battery_voltage = 400;
137 static DECLARE_WAIT_QUEUE_HEAD(wq_on);
138 static DECLARE_WAIT_QUEUE_HEAD(wq_off);
140 static DECLARE_WAIT_QUEUE_HEAD(battery_waitqueue);
141 @@ -276,28 +269,11 @@ int collie_apm_get_power_status(u_char *
143 collie_battery_status = *battery_status;
146 // main battery status to percentage
147 - switch (*battery_status)
149 - case COLLIE_BATTERY_STATUS_HIGH:
150 - *battery_percentage = 100;
152 - case COLLIE_BATTERY_STATUS_LOW:
153 - *battery_percentage = 40;
155 - case COLLIE_BATTERY_STATUS_VERYLOW:
156 - *battery_percentage = 5;
158 - case COLLIE_BATTERY_STATUS_CRITICAL:
159 - *battery_percentage = 1;
162 - *battery_percentage = 100;
165 + *battery_percentage = collie_main_battery_percent;
167 if ( *ac_line_status == APM_AC_ONLINE )
168 *battery_percentage = 100;
170 // good or ac in --> GOOD_COUNT
171 @@ -529,12 +505,13 @@ int collie_get_main_battery(void)
172 voltage = collie_read_MainBattery();
173 if ( voltage > 0 ) break;
174 if ( i++ > 5 ) { voltage = 380; break; }
177 - collie_main_battery = GetMainLevel(GetMainADCtoPower(voltage));
178 - collie_main_charge_battery = GetMainChargePercent(GetMainADCtoPower(voltage));
179 + collie_main_battery_voltage = GetMainADCtoPower(voltage);
181 + collie_main_charge_battery = GetMainChargePercent(collie_main_battery_voltage);
183 DPRINTK2("charge percent = %d ( at %d ) \n",collie_main_charge_battery,jiffies);
185 DPRINTK(" get Main battery status %d\n",collie_main_battery);
187 @@ -562,36 +539,36 @@ int GetMainChargePercent( int Volt )
193 -int GetMainLevel( int Volt )
194 +static void do_main_battery()
197 - DPRINTK(" volt = %d \n",Volt);
200 - if ( counter_step_contrast ) {
201 - if ( Volt > collie_main_battery_thresh_fl.high )
202 - return COLLIE_BATTERY_STATUS_HIGH;
203 - else if ( Volt > collie_main_battery_thresh_fl.low )
204 - return COLLIE_BATTERY_STATUS_LOW;
205 - else if ( Volt > collie_main_battery_thresh_fl.verylow )
206 - return COLLIE_BATTERY_STATUS_VERYLOW;
208 - return COLLIE_BATTERY_STATUS_CRITICAL;
210 - if ( Volt > collie_main_battery_thresh_nofl.high )
211 - return COLLIE_BATTERY_STATUS_HIGH;
212 - else if ( Volt > collie_main_battery_thresh_nofl.low )
213 - return COLLIE_BATTERY_STATUS_LOW;
214 - else if ( Volt > collie_main_battery_thresh_nofl.verylow )
215 - return COLLIE_BATTERY_STATUS_VERYLOW;
217 - return COLLIE_BATTERY_STATUS_CRITICAL;
220 + int i = MAIN_BATTERY_THRES;
221 + int fl = (counter_step_contrast)? 1 : 0;
224 + ( collie_main_battery_voltage > main_batt_thres[i].voltage_thres[fl] ) )
226 + /* i is now between 0 and MAIN_BATTERY_THRES. That means
227 + * we can safely access main_batt_thres[i] and
228 + * main_batt_thres[i+1] */
230 + collie_main_battery = main_batt_thres[i].state;
231 + { /* perhaps we should put that deltas to our table, too? */
232 + long deltav = main_batt_thres[i].voltage_thres[fl] -
233 + main_batt_thres[i+1].voltage_thres[fl];
234 + long deltap = main_batt_thres[i].percent -
235 + main_batt_thres[i+1].percent;
237 + collie_main_battery_percent = /* (1) */
238 + main_batt_thres[i+1].percent +
239 + deltap * (collie_main_battery_voltage -
240 + main_batt_thres[i+1].voltage_thres[fl]) /
242 + DPRINTK("Battery stuff: v=%i i=%i , dv=%li , dp=%li , p=%i",collie_main_battery_voltage , i, deltav, deltap, collie_main_battery_percent );
247 int GetBackLevel( int Volt )
249 @@ -834,20 +811,18 @@ unsigned short chkFatalBatt(void)
251 // printk("CO = %x\n",GEDR&GPIO_CO);
255 - if ( volt < collie_main_battery_thresh_nofl.verylow )
256 + if ( volt < main_batt_thres[MAIN_BATTERY_THRES].voltage_thres[0] )
266 int suspend_collie_check_temp(void)
268 unsigned short temp , i = 0;
271 @@ -1032,10 +1007,11 @@ struct proc_dir_entry *proc_batt;
272 typedef struct collie_battery_entry {
278 unsigned short low_ino;
279 } collie_battery_entry_t;
282 static collie_battery_entry_t collie_battery_params[] = {
283 @@ -1044,11 +1020,13 @@ static collie_battery_entry_t collie_bat
284 { &collie_change_battery_status , 0 , "chg_status", "Change status" }
287 static collie_battery_entry_t collie_battery_params[] = {
288 /* { addr, def_value, name, description }*/
289 - { &msglevel, 0, "msglevel", "debug message output level" }
290 +/* { &msglevel, 0, "msglevel", "debug message output level" } */
291 + { &msglevel, 0, "msglevel", "debug message output level", 0 },
292 + { &collie_main_battery_voltage, -1, "main_voltage", "main battery voltage", 1 }
295 #define NUM_OF_BATTERY_ENTRY (sizeof(collie_battery_params)/sizeof(collie_battery_entry_t))
297 static ssize_t collie_battery_read_params(struct file *file, char *buf,
298 @@ -1069,11 +1047,12 @@ static ssize_t collie_battery_read_param
301 if (current_param==NULL) {
304 - count = sprintf(outputbuf, "0x%08X\n",
305 +// count = sprintf(outputbuf, "0x%08X\n",
306 + count = sprintf(outputbuf, "%04i\n",
307 *((volatile Word *) current_param->addr));
309 if (count>nbytes) /* Assume output can be read at one time */
311 if (copy_to_user(buf, outputbuf, count))
312 @@ -1094,11 +1073,12 @@ static ssize_t collie_battery_write_para
313 if(collie_battery_params[i].low_ino==i_ino) {
314 current_param = &collie_battery_params[i];
318 - if (current_param==NULL) {
319 +// if (current_param==NULL) {
320 + if (current_param==NULL || current_param->readonly) {
324 param = simple_strtoul(buf,&endp,0);