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 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; }
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; }