コード例 #1
0
static int wm831x_bat_get_prop(struct power_supply *psy,
			       enum power_supply_property psp,
			       union power_supply_propval *val)
{
	struct wm831x_power *wm831x_power = dev_get_drvdata(psy->dev->parent);
	struct wm831x *wm831x = wm831x_power->wm831x;
	int ret = 0;

	switch (psp) {
	case POWER_SUPPLY_PROP_STATUS:
		ret = wm831x_bat_check_status(wm831x, &val->intval);
		break;
	case POWER_SUPPLY_PROP_ONLINE:
		ret = wm831x_power_check_online(wm831x, WM831X_PWR_SRC_BATT,
						val);
		break;
	case POWER_SUPPLY_PROP_VOLTAGE_NOW:
		ret = wm831x_power_read_voltage(wm831x, WM831X_AUX_BATT, val);
		break;
	case POWER_SUPPLY_PROP_HEALTH:
		ret = wm831x_bat_check_health(wm831x, &val->intval);
		break;
	case POWER_SUPPLY_PROP_CHARGE_TYPE:
		ret = wm831x_bat_check_type(wm831x, &val->intval);
		break;
	default:
		ret = -EINVAL;
		break;
	}

	return ret;
}
コード例 #2
0
ファイル: wm831x_power.c プロジェクト: AndrewDB/rk3066-kernel
static ssize_t power_prop_show(struct device *dev,
		struct device_attribute *attr, char *buf)
{
	ssize_t ret = 0;
	int level, power_status, system_status, chg_ctl1, chg_ctl2, chg_status;
    union power_supply_propval val;

	if (!g_wm831x_power)
		return -1;
	power_status = wm831x_reg_read(g_wm831x_power->wm831x, WM831X_POWER_STATE);
	if (power_status < 0)
		return power_status;
	//printk("wm831x power status %#x\n", ret);

	system_status = wm831x_reg_read(g_wm831x_power->wm831x, WM831X_SYSTEM_STATUS);
	if (system_status < 0)
		return system_status;
	//printk("wm831x system status %#x\n", ret);

	chg_ctl1 = wm831x_reg_read(g_wm831x_power->wm831x, WM831X_CHARGER_CONTROL_1);
	if (chg_ctl1 < 0)
		return chg_ctl1;
	//printk("wm831x charger control1 %#x\n", ret);

	chg_ctl2 = wm831x_reg_read(g_wm831x_power->wm831x, WM831X_CHARGER_CONTROL_2);
	if (chg_ctl2 < 0)
		return chg_ctl2;
	//printk("wm831x charger control2 %#x\n", ret);

	chg_status = wm831x_reg_read(g_wm831x_power->wm831x, WM831X_CHARGER_STATUS);
	if (chg_status < 0)
		return chg_status;
	//printk("wm831x charger status %#x\n", ret);

	ret = wm831x_power_read_voltage(g_wm831x_power->wm831x, WM831X_AUX_BATT, &val);
	if (ret < 0)
		return ret;
	wm831x_batt_vol_level(g_wm831x_power, val.intval / 1000, &level);
	//printk("batt_vol = %d batt_level = %d\n", val.intval, level);
	//
	sprintf(buf, "power_status=%#x\n"
			     "system_status=%#x\n"
				 "chg_ctl1=%#x\n"
				 "chg_ctl2=%#x\n"
				 "chg_status=%#x\n"
				 "batt_vol=%d\n"
				 "batt_level=%d%%\n",
				 power_status,
				 system_status,
				 chg_ctl1,
				 chg_ctl2,
				 chg_status,
				 val.intval,
				 level);
	ret = strlen(buf) + 1;
	return ret;
}
コード例 #3
0
ファイル: wm831x_power.c プロジェクト: AndrewDB/rk3066-kernel
static void wm831x_batt_work(struct work_struct *work)
{
	int online, status,health,level, ret; 
    union power_supply_propval val;
	struct wm831x_power *power = container_of(work, struct wm831x_power, batt_work);

	ret = wm831x_power_check_online(power->wm831x, WM831X_PWR_SRC_BATT, &val);
	if (ret < 0) {
		printk("%s: check bat online failer...  err = %d\n", __FUNCTION__, ret);
		return;
	}
	online = val.intval;

	ret = wm831x_bat_check_status(power->wm831x, &status);
	if (ret < 0) {
		printk("%s: check bat status failer...  err = %d\n", __FUNCTION__, ret);
		return;
	}

	ret = wm831x_bat_check_health(power->wm831x, &health);
	if (ret < 0) {
		printk("%s: check bat health failer...  err = %d\n", __FUNCTION__, ret);
		return;
	}

	ret = wm831x_power_read_voltage(power->wm831x, WM831X_AUX_BATT, &val);
	if (ret < 0) {
		printk("%s: read bat voltage failer...err = %d\n", __FUNCTION__, ret);
		return;
	}
	power->batt_info.voltage = val.intval;

	wm831x_batt_vol_level(power, val.intval / 1000, &level);
	//mod_timer(&power->timer, jiffies + msecs_to_jiffies(power->interval));

	if (online != power->batt_info.online || status != power->batt_info.status
			|| health != power->batt_info.health || level != power->batt_info.level)
	{
		power->batt_info.online = online;
		power->batt_info.status = status;
		power->batt_info.health = health;
		power->batt_info.level  = level;

		power_supply_changed(&power->battery);
	}

}
コード例 #4
0
ファイル: wm831x_power.c プロジェクト: AndrewDB/rk3066-kernel
/*********************************************************************
 *		USB Power
 *********************************************************************/
static int wm831x_usb_get_prop(struct power_supply *psy,
			       enum power_supply_property psp,
			       union power_supply_propval *val)
{
	struct wm831x_power *wm831x_power = dev_get_drvdata(psy->dev->parent);
	struct wm831x *wm831x = wm831x_power->wm831x;
	int ret = 0;

	switch (psp) {
	case POWER_SUPPLY_PROP_ONLINE:
		ret = wm831x_power_check_online(wm831x, WM831X_PWR_USB, val);
		break;
	case POWER_SUPPLY_PROP_VOLTAGE_NOW:
		ret = wm831x_power_read_voltage(wm831x, WM831X_AUX_USB, val);
		break;
	default:
		ret = -EINVAL;
		break;
	}

	return ret;
}