]> pilppa.org Git - familiar-h63xx-build.git/blob - org.handhelds.familiar/packages/linux/openzaurus-sa-2.4.18-rmk7-pxa3-embedix20030509/battery.patch
OE tree imported from monotone branch org.openembedded.oz354fam083 at revision 8b12e3...
[familiar-h63xx-build.git] / org.handhelds.familiar / packages / linux / openzaurus-sa-2.4.18-rmk7-pxa3-embedix20030509 / battery.patch
1
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
4 @@ -14,10 +14,11 @@
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.
8   *
9   * ChangeLog:
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
14   *
15   */
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;
32  
33  
34 -/*** gloabal variables ************************************************************/
35 -int charge_status = 0;                 /* charge status  1 : charge  0: not charge */
36 -
37 -typedef struct BatteryThresh {
38 -       int high;
39 -       int low;
40 -       int verylow;
41 -} BATTERY_THRESH;
42 +/* defines */
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
47  
48 +/*** gloabal variables ************************************************************/
49 +int charge_status = 0; /* charge status  1 : charge  0: not charge */
50  
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 = {
54 -  368, 358, 356
55 -};
56 -
57 -BATTERY_THRESH  collie_main_battery_thresh_nofl = {
58 -  378, 364, 362
59 -};
60 -#else
61 -BATTERY_THRESH  collie_main_battery_thresh_fl = {
62 -  368, 358, 356
63 -};
64 -
65 -BATTERY_THRESH  collie_main_battery_thresh_nofl = {
66 -  378, 365, 363
67 +typedef struct {
68 +    int voltage_thres[2];              /* 0: nofl 1: fl */
69 +    int percent;
70 +    int state;
71 +} main_battery_thres;
72 +    
73 +#define MAIN_BATTERY_THRES 4
74 +
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! */
82  };
83 -#endif
84 -
85 -
86  
87  typedef struct ChargeThresh {
88    int bar1;
89    int bar2;
90    int bar3;
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 )
96  
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
101 -
102  #define COLLIE_AC_LINE_STATUS  (!( GPLR & GPIO_AC_IN ) ? APM_AC_OFFLINE : APM_AC_ONLINE)
103  
104 -
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 ) )
113  
114  #define COLLIE_BACKUP_BATTERY_CK_TIME  ( 10*60*1*100 )         // 10min
115  #define COLLIE_BACKUP_BATTERY_LOW      ( 190 ) 
116  
117 @@ -212,10 +203,11 @@ unsigned int LPOCntWk = 0;
118  static DECLARE_WAIT_QUEUE_HEAD(queue);
119  static int     msglevel;
120  
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;
126  int ad_revise = 0;
127  
128  static int MainCntWk = COLLIE_MAIN_GOOD_COUNT;
129 @@ -229,10 +221,11 @@ static struct pm_dev *battery_pm_dev;      /
130  
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;
136  
137  static DECLARE_WAIT_QUEUE_HEAD(wq_on);
138  static DECLARE_WAIT_QUEUE_HEAD(wq_off);
139  #if 1 // 2003.1.29
140  static DECLARE_WAIT_QUEUE_HEAD(battery_waitqueue);
141 @@ -276,28 +269,11 @@ int collie_apm_get_power_status(u_char *
142         }
143         collie_battery_status = *battery_status;
144  #endif
145  
146         // main battery status to percentage
147 -       switch (*battery_status)
148 -         {
149 -         case COLLIE_BATTERY_STATUS_HIGH:
150 -           *battery_percentage = 100;
151 -           break;
152 -         case COLLIE_BATTERY_STATUS_LOW:
153 -           *battery_percentage = 40;
154 -           break;
155 -         case COLLIE_BATTERY_STATUS_VERYLOW:
156 -           *battery_percentage = 5;
157 -           break;
158 -         case COLLIE_BATTERY_STATUS_CRITICAL:
159 -           *battery_percentage = 1;
160 -           break;
161 -         default:
162 -           *battery_percentage = 100;
163 -           break;
164 -         }
165 +       *battery_percentage = collie_main_battery_percent;
166  
167         if ( *ac_line_status == APM_AC_ONLINE )
168           *battery_percentage = 100;
169  
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; }
175           }
176  
177 -         collie_main_battery = GetMainLevel(GetMainADCtoPower(voltage));
178 -         collie_main_charge_battery = GetMainChargePercent(GetMainADCtoPower(voltage));
179 +         collie_main_battery_voltage = GetMainADCtoPower(voltage);
180 +         do_main_battery();
181 +         collie_main_charge_battery = GetMainChargePercent(collie_main_battery_voltage);
182  
183           DPRINTK2("charge percent = %d ( at %d ) \n",collie_main_charge_battery,jiffies);
184  
185           DPRINTK(" get Main battery status %d\n",collie_main_battery);
186  
187 @@ -562,36 +539,36 @@ int GetMainChargePercent( int Volt )
188    } else {
189      return 5;
190    }
191  }
192  
193 -int GetMainLevel( int Volt )
194 +static void do_main_battery()
195  {
196 -
197 -  DPRINTK("  volt = %d  \n",Volt);
198 -
199 -
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;
207 -       else
208 -               return COLLIE_BATTERY_STATUS_CRITICAL;
209 -  } else {
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;
216 -       else
217 -               return COLLIE_BATTERY_STATUS_CRITICAL;
218 -  }
219 -
220 +       int i = MAIN_BATTERY_THRES;
221 +       int fl = (counter_step_contrast)? 1 : 0;
222 +  
223 +       while ( i > 0 &&
224 +               ( collie_main_battery_voltage > main_batt_thres[i].voltage_thres[fl] ) )
225 +               i--;
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] */
229 +       
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;
236 +               
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]) /
241 +                  deltav; 
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 );
243 +       }
244  }
245  
246  
247  int GetBackLevel( int Volt )
248  {
249 @@ -834,20 +811,18 @@ unsigned short chkFatalBatt(void)
250      GEDR = GPIO_CO;
251      //    printk("CO = %x\n",GEDR&GPIO_CO);
252    }
253  
254  
255 -  if ( volt < collie_main_battery_thresh_nofl.verylow )
256 +  if ( volt < main_batt_thres[MAIN_BATTERY_THRES].voltage_thres[0] )
257      return 0;
258    else
259      return 1;
260  #endif
261  }
262  
263  
264 -
265 -
266  int suspend_collie_check_temp(void)
267  {
268    unsigned short temp , i = 0;
269  
270    while(1) {
271 @@ -1032,10 +1007,11 @@ struct proc_dir_entry *proc_batt;
272  typedef struct collie_battery_entry {
273         int*            addr;
274         int             def_value;
275         char*           name;
276         char*           description;
277 +       char            readonly;
278         unsigned short  low_ino;
279  } collie_battery_entry_t;
280  
281  #if 1 // 2003.1.29
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" }
285  };
286  #else
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 }
293  };
294  #endif
295  #define NUM_OF_BATTERY_ENTRY   (sizeof(collie_battery_params)/sizeof(collie_battery_entry_t))
296  
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
299                 }
300         }
301         if (current_param==NULL) {
302                 return -EINVAL;
303         }
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));
308         *ppos += count;
309         if (count>nbytes)       /* Assume output can be read at one time */
310                 return -EINVAL;
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];
315                         break;
316                 }
317         }
318 -       if (current_param==NULL) {
319 +//     if (current_param==NULL) {
320 +       if (current_param==NULL || current_param->readonly) {
321                 return -EINVAL;
322         }
323  
324         param = simple_strtoul(buf,&endp,0);
325         if (param == -1) {
326