static int da9055_set_alarm(struct da9055 *da9055, struct rtc_time *rtc_tm) { int ret; uint8_t v[2]; rtc_tm->tm_year -= 100; rtc_tm->tm_mon += 1; ret = da9055_reg_update(da9055, DA9055_REG_ALARM_MI, DA9055_RTC_ALM_MIN, rtc_tm->tm_min); if (ret != 0) { dev_err(da9055->dev, "Failed to write ALRM MIN: %d\n", ret); return ret; } v[0] = rtc_tm->tm_hour; v[1] = rtc_tm->tm_mday; ret = da9055_group_write(da9055, DA9055_REG_ALARM_H, 2, v); if (ret < 0) return ret; ret = da9055_reg_update(da9055, DA9055_REG_ALARM_MO, DA9055_RTC_ALM_MONTH, rtc_tm->tm_mon); if (ret < 0) dev_err(da9055->dev, "Failed to write ALM Month:%d\n", ret); ret = da9055_reg_update(da9055, DA9055_REG_ALARM_Y, DA9055_RTC_ALM_YEAR, rtc_tm->tm_year); if (ret < 0) dev_err(da9055->dev, "Failed to write ALM Year:%d\n", ret); return ret; }
static int da9055_wdt_set_timeout(struct watchdog_device *wdt_dev, unsigned int timeout) { struct da9055_wdt_data *driver_data = watchdog_get_drvdata(wdt_dev); struct da9055 *da9055 = driver_data->da9055; int ret, i; for (i = 0; i < ARRAY_SIZE(da9055_wdt_maps); i++) if (da9055_wdt_maps[i].user_time == timeout) break; if (i == ARRAY_SIZE(da9055_wdt_maps)) ret = -EINVAL; else ret = da9055_reg_update(da9055, DA9055_REG_CONTROL_B, DA9055_TWDSCALE_MASK, da9055_wdt_maps[i].reg_val << DA9055_TWDSCALE_SHIFT); if (ret < 0) { dev_err(da9055->dev, "Failed to update timescale bit, %d\n", ret); return ret; } wdt_dev->timeout = timeout; return 0; }
static int da9055_rtc_enable_alarm(struct da9055_rtc *rtc, bool enable) { int ret; if (enable) { ret = da9055_reg_update(rtc->da9055, DA9055_REG_ALARM_Y, DA9055_RTC_ALM_EN, DA9055_RTC_ALM_EN); if (ret != 0) dev_err(rtc->da9055->dev, "Failed to enable ALM: %d\n", ret); rtc->alarm_enable = 1; } else { ret = da9055_reg_update(rtc->da9055, DA9055_REG_ALARM_Y, DA9055_RTC_ALM_EN, 0); if (ret != 0) dev_err(rtc->da9055->dev, "Failed to disable ALM: %d\n", ret); rtc->alarm_enable = 0; } return ret; }
static int da9055_rtc_device_init(struct da9055 *da9055, struct da9055_pdata *pdata) { int ret; /* Enable RTC and the internal Crystal */ ret = da9055_reg_update(da9055, DA9055_REG_CONTROL_B, DA9055_RTC_EN, DA9055_RTC_EN); if (ret < 0) return ret; ret = da9055_reg_update(da9055, DA9055_REG_EN_32K, DA9055_CRYSTAL_EN, DA9055_CRYSTAL_EN); if (ret < 0) return ret; /* Enable RTC in Power Down mode */ ret = da9055_reg_update(da9055, DA9055_REG_CONTROL_B, DA9055_RTC_MODE_PD, DA9055_RTC_MODE_PD); if (ret < 0) return ret; /* Enable RTC in Reset mode */ if (pdata && pdata->reset_enable) { ret = da9055_reg_update(da9055, DA9055_REG_CONTROL_B, DA9055_RTC_MODE_SD, DA9055_RTC_MODE_SD << DA9055_RTC_MODE_SD_SHIFT); if (ret < 0) return ret; } /* Disable the RTC TICK ALM */ ret = da9055_reg_update(da9055, DA9055_REG_ALARM_MO, DA9055_RTC_TICK_WAKE_MASK, 0); if (ret < 0) return ret; return 0; }
static int da9055_wdt_ping(struct watchdog_device *wdt_dev) { struct da9055_wdt_data *driver_data = watchdog_get_drvdata(wdt_dev); struct da9055 *da9055 = driver_data->da9055; /* * We have a minimum time for watchdog window called TWDMIN. A write * to the watchdog before this elapsed time will cause an error. */ mdelay(DA9055_TWDMIN); /* Reset the watchdog timer */ return da9055_reg_update(da9055, DA9055_REG_CONTROL_E, DA9055_WATCHDOG_MASK, 1); }