static void max77686_rtc_disable_wtsr(struct max77686_rtc_info *info) { int ret; dev_info(info->dev, "%s: disable WTSR\n", __func__); max77686_rtc_update(info, MAX77686_RTC_READ); ret = max77686_update_reg(info->rtc, MAX77686_WTSR_SMPL_CNTL, 0, WTSR_EN_MASK); if (ret < 0) { dev_err(info->dev, "%s: fail to update WTSR reg(%d)\n", __func__, ret); return; } max77686_rtc_update(info, MAX77686_RTC_WRITE); }
static int __devinit max77686_rtc_init_reg(struct max77686_rtc_info *info, struct max77686_platform_data *pdata) { u8 data[2], update0, cntl; int ret; max77686_rtc_update(info, MAX77686_RTC_READ); ret = max77686_read_reg(info->rtc, MAX77686_RTC_CONTROL, &cntl); if (ret < 0) { dev_err(info->dev, "%s: fail to read control reg(%d)\n", __func__, ret); return ret; } ret = max77686_read_reg(info->rtc, MAX77686_RTC_UPDATE0, &update0); if (ret < 0) { dev_err(info->dev, "%s: fail to read update0 reg(%d)\n", __func__, ret); return ret; } info->update0_reg = update0 & ~(RTC_UDR_MASK | RTC_RBUDR_MASK); /* If the value of CONTROL register is 0, RTC registers were reset */ if (cntl == MODEL24_MASK) return 0; /* Set RTC control register : Binary mode, 24hour mode */ data[0] = BCD_EN_MASK | MODEL24_MASK; data[1] = MODEL24_MASK; ret = max77686_bulk_write(info->rtc, MAX77686_RTC_CONTROLM, 2, data); if (ret < 0) { dev_err(info->dev, "%s: fail to write controlm reg(%d)\n", __func__, ret); return ret; } ret = max77686_rtc_update(info, MAX77686_RTC_WRITE); if (ret < 0) return ret; if (pdata->init_time) { dev_info(info->dev, "%s: initialize RTC time\n", __func__); ret = max77686_rtc_set_time(info->dev, pdata->init_time); } return ret; }
static int max77686_rtc_set_time(struct device *dev, struct rtc_time *tm) { struct max77686_rtc_info *info = dev_get_drvdata(dev); u8 data[NR_RTC_CNT_REGS]; int ret; ret = max77686_rtc_tm_to_data(tm, data); if (ret < 0) return ret; dev_dbg(info->dev, "%s: %d-%02d-%02d %02d:%02d:%02d(0x%02x)\n", __func__, data[RTC_YEAR] + 2000, data[RTC_MONTH], data[RTC_DATE], data[RTC_HOUR], data[RTC_MIN], data[RTC_SEC], data[RTC_WEEKDAY]); mutex_lock(&info->lock); ret = max77686_bulk_write(info->rtc, MAX77686_RTC_SEC, NR_RTC_CNT_REGS, data); if (ret < 0) { dev_err(info->dev, "%s: fail to write time reg(%d)\n", __func__, ret); goto out; } ret = max77686_rtc_update(info, MAX77686_RTC_WRITE); out: mutex_unlock(&info->lock); return ret; }
static void __devinit max77686_rtc_enable_wtsr_smpl(struct max77686_rtc_info *info, struct max77686_platform_data *pdata) { u8 val; int ret; val = (pdata->wtsr_smpl->wtsr_en << WTSR_EN_SHIFT) | (pdata->wtsr_smpl->smpl_en << SMPL_EN_SHIFT) | WTSR_TIMER_BITS(pdata->wtsr_smpl->wtsr_timer_val) | SMPL_TIMER_BITS(pdata->wtsr_smpl->smpl_timer_val); dev_info(info->dev, "%s: WTSR: %s, SMPL: %s\n", __func__, pdata->wtsr_smpl->wtsr_en ? "enable" : "disable", pdata->wtsr_smpl->smpl_en ? "enable" : "disable"); ret = max77686_write_reg(info->rtc, MAX77686_WTSR_SMPL_CNTL, val); if (ret < 0) { dev_err(info->dev, "%s: fail to write WTSR/SMPL reg(%d)\n", __func__, ret); return; } info->wtsr_en = pdata->wtsr_smpl->wtsr_en; max77686_rtc_update(info, MAX77686_RTC_WRITE); }
static int max77686_rtc_set_alarm(struct device *dev, struct rtc_wkalrm *alrm) { struct max77686_rtc_info *info = dev_get_drvdata(dev); u8 data[RTC_NR_TIME]; int ret; ret = max77686_rtc_tm_to_data(&alrm->time, data); if (ret < 0) return ret; mutex_lock(&info->lock); ret = max77686_rtc_stop_alarm(info); if (ret < 0) goto out; ret = regmap_bulk_write(info->max77686->rtc_regmap, MAX77686_ALARM1_SEC, data, RTC_NR_TIME); if (ret < 0) { dev_err(info->dev, "%s: fail to write alarm reg(%d)\n", __func__, ret); goto out; } ret = max77686_rtc_update(info, MAX77686_RTC_WRITE); if (ret < 0) goto out; if (alrm->enabled) ret = max77686_rtc_start_alarm(info); out: mutex_unlock(&info->lock); return ret; }
static int max77686_rtc_set_time(struct device *dev, struct rtc_time *tm) { struct max77686_rtc_info *info = dev_get_drvdata(dev); u8 data[RTC_NR_TIME]; int ret; ret = max77686_rtc_tm_to_data(tm, data); if (ret < 0) return ret; mutex_lock(&info->lock); ret = regmap_bulk_write(info->max77686->rtc_regmap, MAX77686_RTC_SEC, data, RTC_NR_TIME); if (ret < 0) { dev_err(info->dev, "%s: fail to write time reg(%d)\n", __func__, ret); goto out; } ret = max77686_rtc_update(info, MAX77686_RTC_WRITE); out: mutex_unlock(&info->lock); return ret; }
static int max77686_rtc_read_time(struct device *dev, struct rtc_time *tm) { struct max77686_rtc_info *info = dev_get_drvdata(dev); u8 data[RTC_NR_TIME]; int ret; mutex_lock(&info->lock); ret = max77686_rtc_update(info, MAX77686_RTC_READ); if (ret < 0) goto out; ret = regmap_bulk_read(info->max77686->rtc_regmap, MAX77686_RTC_SEC, data, RTC_NR_TIME); if (ret < 0) { dev_err(info->dev, "%s: fail to read time reg(%d)\n", __func__, ret); goto out; } max77686_rtc_data_to_tm(data, tm, info->rtc_24hr_mode); ret = rtc_valid_tm(tm); out: mutex_unlock(&info->lock); return ret; }
static int max77686_rtc_start_alarm(struct max77686_rtc_info *info) { u8 data[RTC_NR_TIME]; int ret; struct rtc_time tm; if (!mutex_is_locked(&info->lock)) dev_warn(info->dev, "%s: should have mutex locked\n", __func__); ret = max77686_rtc_update(info, MAX77686_RTC_READ); if (ret < 0) goto out; ret = regmap_bulk_read(info->max77686->rtc_regmap, MAX77686_ALARM1_SEC, data, RTC_NR_TIME); if (ret < 0) { dev_err(info->dev, "%s: fail to read alarm reg(%d)\n", __func__, ret); goto out; } max77686_rtc_data_to_tm(data, &tm, info->rtc_24hr_mode); data[RTC_SEC] |= (1 << ALARM_ENABLE_SHIFT); data[RTC_MIN] |= (1 << ALARM_ENABLE_SHIFT); data[RTC_HOUR] |= (1 << ALARM_ENABLE_SHIFT); data[RTC_WEEKDAY] &= ~ALARM_ENABLE_MASK; if (data[RTC_MONTH] & 0xf) data[RTC_MONTH] |= (1 << ALARM_ENABLE_SHIFT); if (data[RTC_YEAR] & 0x7f) data[RTC_YEAR] |= (1 << ALARM_ENABLE_SHIFT); if (data[RTC_DATE] & 0x1f) data[RTC_DATE] |= (1 << ALARM_ENABLE_SHIFT); ret = regmap_bulk_write(info->max77686->rtc_regmap, MAX77686_ALARM1_SEC, data, RTC_NR_TIME); if (ret < 0) { dev_err(info->dev, "%s: fail to write alarm reg(%d)\n", __func__, ret); goto out; } ret = max77686_rtc_update(info, MAX77686_RTC_WRITE); out: return ret; }
static int max77686_rtc_stop_alarm(struct max77686_rtc_info *info) { u8 data[RTC_NR_TIME]; int ret, i; struct rtc_time tm; if (!mutex_is_locked(&info->lock)) dev_warn(info->dev, "%s: should have mutex locked\n", __func__); ret = max77686_rtc_update(info, MAX77686_RTC_READ); if (ret < 0) goto out; ret = regmap_bulk_read(info->max77686->rtc_regmap, MAX77686_ALARM1_SEC, data, RTC_NR_TIME); if (ret < 0) { dev_err(info->dev, "%s: fail to read alarm reg(%d)\n", __func__, ret); goto out; } max77686_rtc_data_to_tm(data, &tm, info->rtc_24hr_mode); for (i = 0; i < RTC_NR_TIME; i++) data[i] &= ~ALARM_ENABLE_MASK; ret = regmap_bulk_write(info->max77686->rtc_regmap, MAX77686_ALARM1_SEC, data, RTC_NR_TIME); if (ret < 0) { dev_err(info->dev, "%s: fail to write alarm reg(%d)\n", __func__, ret); goto out; } ret = max77686_rtc_update(info, MAX77686_RTC_WRITE); out: return ret; }
static int max77686_rtc_read_alarm(struct device *dev, struct rtc_wkalrm *alrm) { struct max77686_rtc_info *info = dev_get_drvdata(dev); u8 data[RTC_NR_TIME]; unsigned int val; int i, ret; mutex_lock(&info->lock); ret = max77686_rtc_update(info, MAX77686_RTC_READ); if (ret < 0) goto out; ret = regmap_bulk_read(info->max77686->rtc_regmap, MAX77686_ALARM1_SEC, data, RTC_NR_TIME); if (ret < 0) { dev_err(info->dev, "%s:%d fail to read alarm reg(%d)\n", __func__, __LINE__, ret); goto out; } max77686_rtc_data_to_tm(data, &alrm->time, info->rtc_24hr_mode); alrm->enabled = 0; for (i = 0; i < RTC_NR_TIME; i++) { if (data[i] & ALARM_ENABLE_MASK) { alrm->enabled = 1; break; } } alrm->pending = 0; ret = regmap_read(info->max77686->regmap, MAX77686_REG_STATUS2, &val); if (ret < 0) { dev_err(info->dev, "%s:%d fail to read status2 reg(%d)\n", __func__, __LINE__, ret); goto out; } if (val & (1 << 4)) /* RTCA1 */ alrm->pending = 1; out: mutex_unlock(&info->lock); return 0; }
static int max77686_rtc_read_alarm(struct device *dev, struct rtc_wkalrm *alrm) { struct max77686_rtc_info *info = dev_get_drvdata(dev); u8 data[NR_RTC_CNT_REGS], val; int ret; mutex_lock(&info->lock); ret = max77686_rtc_update(info, MAX77686_RTC_READ); if (ret < 0) goto out; ret = max77686_bulk_read(info->rtc, MAX77686_ALARM1_SEC, NR_RTC_CNT_REGS, data); if (ret < 0) { dev_err(info->dev, "%s:%d fail to read alarm reg(%d)\n", __func__, __LINE__, ret); goto out; } max77686_rtc_data_to_tm(data, &alrm->time); dev_dbg(info->dev, "%s: %d-%02d-%02d %02d:%02d:%02d(%d)\n", __func__, alrm->time.tm_year + 1900, alrm->time.tm_mon + 1, alrm->time.tm_mday, alrm->time.tm_hour, alrm->time.tm_min, alrm->time.tm_sec, alrm->time.tm_wday); alrm->enabled = info->alarm_enabled; alrm->pending = 0; ret = max77686_read_reg(info->max77686->i2c, MAX77686_REG_STATUS2, &val); if (ret < 0) { dev_err(info->dev, "%s:%d fail to read status1 reg(%d)\n", __func__, __LINE__, ret); goto out; } if (val & STATUS2_RTCA1_MASK) alrm->pending = 1; out: mutex_unlock(&info->lock); return ret; }
static int max77686_rtc_init_reg(struct max77686_rtc_info *info) { u8 data[2]; int ret; /* Set RTC control register : Binary mode, 24hour mdoe */ data[0] = (1 << BCD_EN_SHIFT) | (1 << MODEL24_SHIFT); data[1] = (0 << BCD_EN_SHIFT) | (1 << MODEL24_SHIFT); info->rtc_24hr_mode = 1; ret = regmap_bulk_write(info->max77686->rtc_regmap, MAX77686_RTC_CONTROLM, data, 2); if (ret < 0) { dev_err(info->dev, "%s: fail to write controlm reg(%d)\n", __func__, ret); return ret; } ret = max77686_rtc_update(info, MAX77686_RTC_WRITE); return ret; }
static int max77686_rtc_set_alarm(struct device *dev, struct rtc_wkalrm *alrm) { struct max77686_rtc_info *info = dev_get_drvdata(dev); u8 data[NR_RTC_CNT_REGS]; int ret, i; mutex_lock(&info->lock); ret = max77686_rtc_tm_to_data(&alrm->time, data); if (ret < 0) goto out; dev_dbg(info->dev, "%s: %d-%02d-%02d %02d:%02d:%02d(0x%02x)\n", __func__, data[RTC_YEAR] + 2000, data[RTC_MONTH], data[RTC_DATE], data[RTC_HOUR], data[RTC_MIN], data[RTC_SEC], data[RTC_WEEKDAY]); for (i = 0; i < NR_RTC_CNT_REGS; i++) data[i] |= ALARM_ENABLE_MASK; ret = max77686_bulk_write(info->rtc, MAX77686_ALARM1_SEC, NR_RTC_CNT_REGS, data); if (ret < 0) { dev_err(info->dev, "%s: fail to write alarm reg(%d)\n", __func__, ret); goto out; } ret = max77686_rtc_update(info, MAX77686_RTC_WRITE); if (ret < 0) goto out; ret = max77686_rtc_set_alarm_enable(info, alrm->enabled); out: mutex_unlock(&info->lock); return ret; }