static int da9052_rtc_read_time(struct device *dev, struct rtc_time *rtc_tm) { struct da9052_rtc *rtc = dev_get_drvdata(dev); uint8_t v[6]; int ret; ret = da9052_group_read(rtc->da9052, DA9052_COUNT_S_REG, 6, v); if (ret < 0) { rtc_err(rtc->da9052, "Failed to read RTC time : %d\n", ret); return ret; } rtc_tm->tm_year = (v[5] & DA9052_RTC_YEAR) + 100; rtc_tm->tm_mon = (v[4] & DA9052_RTC_MONTH) - 1; rtc_tm->tm_mday = v[3] & DA9052_RTC_DAY; rtc_tm->tm_hour = v[2] & DA9052_RTC_HOUR; rtc_tm->tm_min = v[1] & DA9052_RTC_MIN; rtc_tm->tm_sec = v[0] & DA9052_RTC_SEC; ret = rtc_valid_tm(rtc_tm); if (ret != 0) { rtc_err(rtc->da9052, "rtc_valid_tm failed: %d\n", ret); return ret; } return 0; }
static int da9052_read_alarm(struct da9052_rtc *rtc, struct rtc_time *rtc_tm) { int ret; uint8_t v[5]; ret = da9052_group_read(rtc->da9052, DA9052_ALARM_MI_REG, 5, v); if (ret != 0) { rtc_err(rtc, "Failed to group read ALM: %d\n", ret); return ret; } rtc_tm->tm_year = (v[4] & DA9052_RTC_YEAR) + 100; rtc_tm->tm_mon = (v[3] & DA9052_RTC_MONTH) - 1; rtc_tm->tm_mday = v[2] & DA9052_RTC_DAY; rtc_tm->tm_hour = v[1] & DA9052_RTC_HOUR; rtc_tm->tm_min = v[0] & DA9052_RTC_MIN; ret = rtc_valid_tm(rtc_tm); return ret; }
static int da9052_bat_check_status(struct da9052_battery *bat, int *status) { u8 v[2] = {0, 0}; u8 bat_status; u8 chg_end; int ret; int chg_current; int chg_end_current; bool dcinsel; bool dcindet; bool vbussel; bool vbusdet; bool dc; bool vbus; ret = da9052_group_read(bat->da9052, DA9052_STATUS_A_REG, 2, v); if (ret < 0) return ret; bat_status = v[0]; chg_end = v[1]; dcinsel = bat_status & DA9052_STATUSA_DCINSEL; dcindet = bat_status & DA9052_STATUSA_DCINDET; vbussel = bat_status & DA9052_STATUSA_VBUSSEL; vbusdet = bat_status & DA9052_STATUSA_VBUSDET; dc = dcinsel && dcindet; vbus = vbussel && vbusdet; /* Preference to WALL(DCIN) charger unit */ if (dc || vbus) { bat->charger_type = DA9052_CHARGER; /* If charging end flag is set and Charging current is greater * than charging end limit then battery is charging */ if ((chg_end & DA9052_STATUSB_CHGEND) != 0) { ret = da9052_read_chg_current(bat, &chg_current); if (ret < 0) return ret; ret = da9052_read_chgend_current(bat, &chg_end_current); if (ret < 0) return ret; if (chg_current >= chg_end_current) bat->status = POWER_SUPPLY_STATUS_CHARGING; else bat->status = POWER_SUPPLY_STATUS_NOT_CHARGING; } else { /* If Charging end flag is cleared then battery is * charging */ bat->status = POWER_SUPPLY_STATUS_CHARGING; } } else if (dcindet || vbusdet) { bat->charger_type = DA9052_CHARGER; bat->status = POWER_SUPPLY_STATUS_NOT_CHARGING; } else { bat->charger_type = DA9052_NOCHARGER; bat->status = POWER_SUPPLY_STATUS_DISCHARGING; } if (status != NULL) *status = bat->status; return 0; }