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; }
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); } }
/********************************************************************* * 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; }