static int battery_set_property(struct power_supply *battery,
		enum power_supply_property psp,
		const union power_supply_propval *val)
{

	switch (psp) {
		case POWER_SUPPLY_PROP_CAPACITY:
			g_force_soc_use = true;

			if (0 <= val->intval && 100 >= val->intval)
			{
				g_force_soc_val = val->intval;
			} else {
				g_force_soc_use = false;
			}

			printk("[BATTERY_DEBUG]   FORCE[%sABLE] SOC[%d] \n",
				g_force_soc_use ? "EN" : "DIS",
				g_force_soc_use ? g_force_soc_val : fg_read_soc());
			power_supply_changed(battery);

			break;

		default:
			return -EINVAL;
	}

	return 0;
}
Exemple #2
0
static int s3c_get_bat_level(struct power_supply *bat_ps)
{
	int fg_soc = -1;
	int fg_vcell = -1;

	if ((fg_soc = fg_read_soc()) < 0) {
		dev_err(dev, "%s: Can't read soc!!!\n", __func__);
		fg_soc = s3c_bat_info.bat_info.level;
	}
	
	if ((fg_vcell = fg_read_vcell()) < 0) {
		dev_err(dev, "%s: Can't read vcell!!!\n", __func__);
		fg_vcell = s3c_bat_info.bat_info.batt_vol;
	} else
		s3c_bat_info.bat_info.batt_vol = fg_vcell;

	if (is_over_abs_time()) {
		//phj:here we can reach the MAXIMUM of soc for a given battery
		if (fg_soc)
			s3c_bat_info.max_soc_value=fg_soc;
		fg_soc = 100;
		s3c_bat_info.bat_info.batt_is_full = 1;
		dev_info(dev, "%s: charging time is over\n", __func__);
		s3c_set_chg_en(DISABLE);
		goto __end__;
	}

//	fg_soc = (fg_soc*100)/s3c_bat_info.max_soc_value;
//	if (fg_soc > 100)	fg_soc = 100;
//	fg_soc = 140 * (1 - exp(-fg_soc / 70)) - 4;  /* implemented in fg_tab */
	fg_soc = fg_tab[fg_soc];

	check_recharging_bat(avg_fg_vcell(fg_vcell));

__end__:
	dev_dbg(dev, "%s: fg_vcell = %d, fg_soc = %d, is_full = %d\n",
			__func__, fg_vcell, fg_soc, 
			s3c_bat_info.bat_info.batt_is_full);
	return fg_soc;
}
static void max8903_work(struct work_struct *work)
{
	struct max8903_data* data;
	struct max8903_pdata *pdata;
	static int msg_update_cnt =0;
	static int old_soc = 0;
	int soc = fg_read_soc();
	int ta_in, usb_in;

	data = container_of(work, struct max8903_data, work.work);

	pdata = data->pdata;

	if(pdata) {
		ta_in = gpio_get_value(pdata->dok) ? 0 : 1;
		usb_in = gpio_get_value(pdata->uok) ? 0 : 1;
	} else {
		ta_in = data->ta_in;
		usb_in = data->usb_in;
	}

	if ( ta_in && usb_in ) {
		usb_is_connected = true;
		dc_is_connected = false;
	} else if ( ta_in ) {
		usb_is_connected = false;
		dc_is_connected = true;
	} else {
		usb_is_connected = false;
		dc_is_connected = false;
	}


#ifdef SUPPORT_USB_STATE
	if(!data->usb_in && !data->ta_in)
		power_supply_changed(&data->battery);
	else if(data->ta_in)
		power_supply_changed(&data->adapter);
	else if(data->usb_in)
		power_supply_changed(&data->usb);
#else
	if(old_soc != soc || (data->ta_in != ta_in) || (data->usb_in != usb_in)) {
#ifdef FEATURE_TOUCH_NOISE
		if(data->ta_in != ta_in) {
			atm1664_power_noise(ta_in); 	
		}
#endif

		data->ta_in = ta_in;
		data->usb_in = usb_in;

		g_update_need = true;
	}

	if(g_update_need) {
#ifdef BATTERY_DEBUG
		if ( g_debug_enable ) {
			printk("[*NOTIFY] old_soc=%d soc=%d \n", old_soc , soc);
		}
#endif
		g_update_need = false;
		old_soc = soc;
		if(data->ta_in && data->usb_in)
			power_supply_changed(&data->usb);
		else if(data->ta_in)
			power_supply_changed(&data->adapter);
		else
			power_supply_changed(&data->battery);
	}
#endif

	if ( msg_update_cnt > 58 ) {
		printk("[BATTERY] old_soc=%d soc=%d, vcell=%duV, dc=%s, usb=%s\n", old_soc, soc, fg_read_vcell(), data->ta_in ? "true" : "false", data->usb_in ? "true" : "false");
		msg_update_cnt = 0;
	} else {
		msg_update_cnt++;
	}

#ifdef BATTERY_DEBUG
	if ( g_debug_enable ) {
		printk("[BATTERY] old_soc=%d soc=%d, vcell=%duV, dc=%s, usb=%s\n", old_soc, soc, fg_read_vcell(), data->ta_in ? "true" : "false", data->usb_in ? "true" : "false");
	}
#endif

	schedule_delayed_work(&data->work, msecs_to_jiffies(WORK_DELAY));
}
static int battery_get_property(struct power_supply *battery,
		enum power_supply_property psp,
		union power_supply_propval *val)
{
	struct max8903_data *data = container_of(battery,
			struct max8903_data, battery);

	switch (psp) {
		case POWER_SUPPLY_PROP_ONLINE:
			val->intval = 1; //always
			dev_dbg(data->dev, "%s: ONLINE=%d\n", __func__, val->intval);
			break;
		case POWER_SUPPLY_PROP_STATUS:
			val->intval = POWER_SUPPLY_STATUS_UNKNOWN;
			if (data->pdata->chg) {
#ifdef SUPPORT_USB_STATE
				if (gpio_get_value(data->pdata->chg) == 0) { // low is charging
					if(fg_read_soc() >= FULL_SOC || fg_read_vcell() >= FULL_VCELL) {
						val->intval = POWER_SUPPLY_STATUS_FULL;
						gpio_set_value(data->pdata->cen, 1); // off
					} else if(data->ta_in || data->usb_in) {
						val->intval = POWER_SUPPLY_STATUS_CHARGING;
					} else {
						val->intval = POWER_SUPPLY_STATUS_UNKNOWN;
					}
				} else { // not charging
					if(fg_read_soc() < FULL_SOC || fg_read_vcell() < FULL_VCELL) {
						gpio_set_value(data->pdata->cen, 0); // on
					}

					if (data->usb_in || data->ta_in) 
						val->intval = POWER_SUPPLY_STATUS_NOT_CHARGING;
					else
						val->intval = POWER_SUPPLY_STATUS_DISCHARGING;
				}
#else
				if(gpio_get_value(data->pdata->chg) == 0) { // low is charging
					if((fg_read_soc() >= FULL_SOC || fg_read_vcell() >= FULL_VCELL)
						&& (data->ta_in && !data->usb_in)) {
						val->intval = POWER_SUPPLY_STATUS_FULL;
						gpio_set_value(data->pdata->cen, 1); // off
					} else if(data->ta_in) {
						if(data->usb_in) {
							val->intval = POWER_SUPPLY_STATUS_NOT_CHARGING;
						} else {
							val->intval = POWER_SUPPLY_STATUS_CHARGING;
						}
					} else {
						val->intval = POWER_SUPPLY_STATUS_UNKNOWN;
					}

				} else { // not charging
					if(fg_read_soc() < FULL_SOC && fg_read_vcell() < FULL_VCELL) {
						gpio_set_value(data->pdata->cen, 0); // on
					}

					val->intval = POWER_SUPPLY_STATUS_DISCHARGING;
				}
#endif
			}
			break;
		case POWER_SUPPLY_PROP_HEALTH:
			val->intval = POWER_SUPPLY_HEALTH_GOOD;
			if (data->fault)
				val->intval = POWER_SUPPLY_HEALTH_UNSPEC_FAILURE;
			break;
		case POWER_SUPPLY_PROP_VOLTAGE_NOW:
			val->intval = fg_read_vcell();
			break;
                        
                case POWER_SUPPLY_PROP_TEMP:      
                        val->intval = 5;
		        break;      
		case POWER_SUPPLY_PROP_CAPACITY:
			val->intval = fg_read_soc(); // mehmet_VE %1 battery hack
			if (val->intval >= FULL_SOC) {
				val->intval = 100;
                        }                             
                        if (val->intval >= EMPTY_VOLT) {
                                val->intval = val->intval + 1;
                        }
			break;
#ifdef BATTERY_DEBUG
			if (g_force_soc_use) {
				val->intval = g_force_soc_val;
			}
#endif
			break;
		case POWER_SUPPLY_PROP_TECHNOLOGY:
			val->intval = POWER_SUPPLY_TECHNOLOGY_LIPO;
			break;
		default:
			return -EINVAL;
	}
	return 0;
}
Exemple #5
0
static ssize_t s3c_bat_show_property(struct device *dev,
                                      struct device_attribute *attr,
                                      char *buf)
{
        int i = 0;
        const ptrdiff_t off = attr - s3c_battery_attrs;

        switch (off) {
        case BATT_VOL:
                i += scnprintf(buf + i, PAGE_SIZE - i, "%d\n",
                               s3c_bat_info.bat_info.batt_vol);
                break;
        case BATT_VOL_ADC:
		s3c_bat_info.bat_info.batt_vol_adc = 0;
                i += scnprintf(buf + i, PAGE_SIZE - i, "%d\n",
                               s3c_bat_info.bat_info.batt_vol_adc);
                break;
        case BATT_VOL_ADC_CAL:
                i += scnprintf(buf + i, PAGE_SIZE - i, "%d\n",
                               s3c_bat_info.bat_info.batt_vol_adc_cal);
                break;
        case BATT_TEMP:
                i += scnprintf(buf + i, PAGE_SIZE - i, "%d\n",
                               s3c_bat_info.bat_info.batt_temp);
                break;
        case BATT_TEMP_ADC:
		s3c_bat_info.bat_info.batt_temp_adc = 
			s3c_bat_get_adc_data(S3C_ADC_TEMPERATURE);
                i += scnprintf(buf + i, PAGE_SIZE - i, "%d\n",
                               s3c_bat_info.bat_info.batt_temp_adc);
                break;	
#ifdef __TEST_MODE_INTERFACE__
	case BATT_TEST_MODE:
		i += scnprintf(buf + i, PAGE_SIZE - i, "%d\n",
		s3c_bat_info.bat_info.batt_test_mode);
		break;
#endif /* __TEST_MODE_INTERFACE__ */
        case BATT_TEMP_ADC_CAL:
                i += scnprintf(buf + i, PAGE_SIZE - i, "%d\n",
                               s3c_bat_info.bat_info.batt_temp_adc_cal);
                break;
        case BATT_VOL_ADC_AVER:
		i += scnprintf(buf + i, PAGE_SIZE - i, "%d\n",
			s3c_bat_info.bat_info.batt_vol_adc_aver);
		break;
#ifdef __TEST_MODE_INTERFACE__
	case BATT_VOL_AVER:
		i += scnprintf(buf + i, PAGE_SIZE - i, "%d\n",
			s3c_bat_info.bat_info.batt_vol_aver);
		break;
	case BATT_TEMP_AVER:
		i += scnprintf(buf + i, PAGE_SIZE - i, "%d\n",
			s3c_bat_info.bat_info.batt_temp_aver);
		break;
	case BATT_TEMP_ADC_AVER:
		i += scnprintf(buf + i, PAGE_SIZE - i, "%d\n",
			s3c_bat_info.bat_info.batt_temp_adc_aver);
		break;
	case BATT_V_F_ADC:
		i += scnprintf(buf + i, PAGE_SIZE - i, "%d\n",
			s3c_bat_info.bat_info.batt_v_f_adc);
		break;
#endif /* __TEST_MODE_INTERFACE__ */
	case BATT_CHARGING_SOURCE:
		i += scnprintf(buf + i, PAGE_SIZE - i, "%d\n",
			s3c_bat_info.bat_info.charging_source);
		break;

	case BATT_FG_SOC:
		i += scnprintf(buf + i, PAGE_SIZE - i, "%d\n",
			fg_read_soc());
		break;
	case BATT_MAX_SOC:
		i += scnprintf(buf + i, PAGE_SIZE - i, "%d\n",
			s3c_bat_info.max_soc_value);
		break;

        default:
                i = -EINVAL;
        }       
        
        return i;
}