--- ./adc_battery.c	2007-03-06 13:51:54.000000000 +0300
+++ /usr/src/ipaq/linux-2.6.19-hh/drivers/hwmon/battery/adc_battery.c	2007-03-09 01:58:16.000000000 +0300
@@ -30,6 +30,7 @@
 	struct battery_adc_platform_data *pdata;
 
 	int charge_status;
+	int power_supplied;
 
 	struct adc_request req;
 	struct pin_sense pins[3];
@@ -59,6 +60,7 @@
 static int adc_battery_get_status(struct battery *b)
 {
 	struct battery_adc_priv* drvdata = (struct battery_adc_priv*)b;
+	//printk("*****ADC status: %d\n",drvdata->charge_status);
 	return drvdata->charge_status;
 }
 static int adc_battery_get_voltage(struct battery *b)
@@ -88,7 +90,15 @@
 
 	adc_sense(pdata->adc_dev, &drvdata->req);
 
+	if (pdata->charge_status_func){
+		drvdata->charge_status = pdata->charge_status_func();
+		pdata->charge_status = drvdata->charge_status;  // It may be unnecessary
+	}
+	if (pdata->power_supplied) 
+		drvdata->power_supplied = pdata->power_supplied();
+
 	/* Throw away invalid samples, this may happen soon after resume for example. */
+	
 	if (drvdata->pins[PIN_NO_VOLT].value > 0) {
 	        memcpy(drvdata->last_good_pins, drvdata->pins, sizeof(drvdata->pins));
 #ifdef DEBUG
@@ -103,13 +113,18 @@
 {
 	struct battery_adc_priv *drvdata = platform_get_drvdata((struct platform_device *)data);
 	adc_battery_query((struct platform_device *)data);
+
 	mod_timer(&drvdata->timer, jiffies + (5000 * HZ) / 1000);
 }
 
-#if 0
-static void h4000_apm_get_power_status(struct apm_power_info *info)
+#if 0 
+static void adc_get_apm_power_info(struct battery_adc_platform_data *di,struct apm_power_info *info)
 {
-	int battery_power = ((h4000_batt_info.voltage - BATTERY_MIN) * 100) / (BATTERY_MAX - BATTERY_MIN);
+	//struct battery_adc_platform_data *pdata = di->adc_devplatform_data;
+	//struct battery_adc_priv *drvdata = platform_get_drvdata(di);
+
+	//int battery_power = ((h4000_batt_info.voltage - BATTERY_MIN) * 100) / (BATTERY_MAX - BATTERY_MIN);
+	int battery_power = 70;
 	/* There's nothing impossible with battery being overcharged or overdischarged
 	if (battery_power < 0)
 		battery_power = 0;
@@ -117,17 +132,15 @@
 		battery_power = 100;
 	*/
 
-	info->battery_life = battery_power;
+//	info->battery_life = battery_power;
 
-	if (!GET_H4000_GPIO(AC_IN_N))
+	if (drvdata->power_supplied)
 		info->ac_line_status = APM_AC_ONLINE;
 	else
 		info->ac_line_status = APM_AC_OFFLINE;
 
-	if (GET_H4000_GPIO(CHARGING))
+	if (drvdata->charge_status==BATTERY_STATUS_CHARGING))
 		info->battery_status = APM_BATTERY_STATUS_CHARGING;
-	/*else if (!(GPLR(GPIO_NR_H4000_MBAT_IN) & GPIO_bit(GPIO_NR_H4000_MBAT_IN)))
-		info->battery_status = APM_BATTERY_STATUS_NOT_PRESENT;*/
 	else {
 		if (info->battery_life > 50)
 			info->battery_status = APM_BATTERY_STATUS_HIGH;
@@ -140,6 +153,7 @@
 	/* Consider one "percent" per minute, which is shot in the sky. */
 	info->time = battery_power;
 	info->units = APM_UNITS_MINS;
+
 }
 #endif
 
@@ -166,7 +180,7 @@
 	drvdata->batt_cdev.get_min_charge   = adc_battery_get_min_charge;
 	drvdata->batt_cdev.get_max_charge   = adc_battery_get_max_charge;
 	drvdata->batt_cdev.get_temp         = adc_battery_get_temp;
-	drvdata->batt_cdev.get_status       = adc_battery_get_status;
+	drvdata->batt_cdev.get_status       =  adc_battery_get_status;
 	if (pdata->voltage_pin == -1)
 		drvdata->batt_cdev.get_voltage = NULL;
 	if (pdata->current_pin == -1)
@@ -200,10 +214,6 @@
 	// Still schedule next sampling soon
 	mod_timer(&drvdata->timer, jiffies + (500 * HZ) / 1000);
 
-#ifdef CONFIG_PM
-//	apm_get_power_status = h4000_apm_get_power_status;
-#endif
-
 	return retval;
 }
 

