rtc-da9055.c revision 6920d996e3fee4ac5dcb7d34cb290b6f67bb69d0
16920d996e3fee4ac5dcb7d34cb290b6f67bb69d0Ashish Jangam/*
26920d996e3fee4ac5dcb7d34cb290b6f67bb69d0Ashish Jangam * Real time clock driver for DA9055
36920d996e3fee4ac5dcb7d34cb290b6f67bb69d0Ashish Jangam *
46920d996e3fee4ac5dcb7d34cb290b6f67bb69d0Ashish Jangam * Copyright(c) 2012 Dialog Semiconductor Ltd.
56920d996e3fee4ac5dcb7d34cb290b6f67bb69d0Ashish Jangam *
66920d996e3fee4ac5dcb7d34cb290b6f67bb69d0Ashish Jangam * Author: Dajun Dajun Chen <dajun.chen@diasemi.com>
76920d996e3fee4ac5dcb7d34cb290b6f67bb69d0Ashish Jangam *
86920d996e3fee4ac5dcb7d34cb290b6f67bb69d0Ashish Jangam * This program is free software; you can redistribute it and/or modify
96920d996e3fee4ac5dcb7d34cb290b6f67bb69d0Ashish Jangam * it under the terms of the GNU General Public License as published by
106920d996e3fee4ac5dcb7d34cb290b6f67bb69d0Ashish Jangam * the Free Software Foundation; either version 2 of the License, or
116920d996e3fee4ac5dcb7d34cb290b6f67bb69d0Ashish Jangam * (at your option) any later version.
126920d996e3fee4ac5dcb7d34cb290b6f67bb69d0Ashish Jangam *
136920d996e3fee4ac5dcb7d34cb290b6f67bb69d0Ashish Jangam */
146920d996e3fee4ac5dcb7d34cb290b6f67bb69d0Ashish Jangam
156920d996e3fee4ac5dcb7d34cb290b6f67bb69d0Ashish Jangam#include <linux/module.h>
166920d996e3fee4ac5dcb7d34cb290b6f67bb69d0Ashish Jangam#include <linux/platform_device.h>
176920d996e3fee4ac5dcb7d34cb290b6f67bb69d0Ashish Jangam#include <linux/rtc.h>
186920d996e3fee4ac5dcb7d34cb290b6f67bb69d0Ashish Jangam
196920d996e3fee4ac5dcb7d34cb290b6f67bb69d0Ashish Jangam#include <linux/mfd/da9055/core.h>
206920d996e3fee4ac5dcb7d34cb290b6f67bb69d0Ashish Jangam#include <linux/mfd/da9055/reg.h>
216920d996e3fee4ac5dcb7d34cb290b6f67bb69d0Ashish Jangam#include <linux/mfd/da9055/pdata.h>
226920d996e3fee4ac5dcb7d34cb290b6f67bb69d0Ashish Jangam
236920d996e3fee4ac5dcb7d34cb290b6f67bb69d0Ashish Jangamstruct da9055_rtc {
246920d996e3fee4ac5dcb7d34cb290b6f67bb69d0Ashish Jangam	struct rtc_device *rtc;
256920d996e3fee4ac5dcb7d34cb290b6f67bb69d0Ashish Jangam	struct da9055 *da9055;
266920d996e3fee4ac5dcb7d34cb290b6f67bb69d0Ashish Jangam	int alarm_enable;
276920d996e3fee4ac5dcb7d34cb290b6f67bb69d0Ashish Jangam};
286920d996e3fee4ac5dcb7d34cb290b6f67bb69d0Ashish Jangam
296920d996e3fee4ac5dcb7d34cb290b6f67bb69d0Ashish Jangamstatic int da9055_rtc_enable_alarm(struct da9055_rtc *rtc, bool enable)
306920d996e3fee4ac5dcb7d34cb290b6f67bb69d0Ashish Jangam{
316920d996e3fee4ac5dcb7d34cb290b6f67bb69d0Ashish Jangam	int ret;
326920d996e3fee4ac5dcb7d34cb290b6f67bb69d0Ashish Jangam	if (enable) {
336920d996e3fee4ac5dcb7d34cb290b6f67bb69d0Ashish Jangam		ret = da9055_reg_update(rtc->da9055, DA9055_REG_ALARM_Y,
346920d996e3fee4ac5dcb7d34cb290b6f67bb69d0Ashish Jangam					DA9055_RTC_ALM_EN,
356920d996e3fee4ac5dcb7d34cb290b6f67bb69d0Ashish Jangam					DA9055_RTC_ALM_EN);
366920d996e3fee4ac5dcb7d34cb290b6f67bb69d0Ashish Jangam		if (ret != 0)
376920d996e3fee4ac5dcb7d34cb290b6f67bb69d0Ashish Jangam			dev_err(rtc->da9055->dev, "Failed to enable ALM: %d\n",
386920d996e3fee4ac5dcb7d34cb290b6f67bb69d0Ashish Jangam				ret);
396920d996e3fee4ac5dcb7d34cb290b6f67bb69d0Ashish Jangam		rtc->alarm_enable = 1;
406920d996e3fee4ac5dcb7d34cb290b6f67bb69d0Ashish Jangam	} else {
416920d996e3fee4ac5dcb7d34cb290b6f67bb69d0Ashish Jangam		ret = da9055_reg_update(rtc->da9055, DA9055_REG_ALARM_Y,
426920d996e3fee4ac5dcb7d34cb290b6f67bb69d0Ashish Jangam					DA9055_RTC_ALM_EN, 0);
436920d996e3fee4ac5dcb7d34cb290b6f67bb69d0Ashish Jangam		if (ret != 0)
446920d996e3fee4ac5dcb7d34cb290b6f67bb69d0Ashish Jangam			dev_err(rtc->da9055->dev,
456920d996e3fee4ac5dcb7d34cb290b6f67bb69d0Ashish Jangam				"Failed to disable ALM: %d\n", ret);
466920d996e3fee4ac5dcb7d34cb290b6f67bb69d0Ashish Jangam		rtc->alarm_enable = 0;
476920d996e3fee4ac5dcb7d34cb290b6f67bb69d0Ashish Jangam	}
486920d996e3fee4ac5dcb7d34cb290b6f67bb69d0Ashish Jangam	return ret;
496920d996e3fee4ac5dcb7d34cb290b6f67bb69d0Ashish Jangam}
506920d996e3fee4ac5dcb7d34cb290b6f67bb69d0Ashish Jangam
516920d996e3fee4ac5dcb7d34cb290b6f67bb69d0Ashish Jangamstatic irqreturn_t da9055_rtc_alm_irq(int irq, void *data)
526920d996e3fee4ac5dcb7d34cb290b6f67bb69d0Ashish Jangam{
536920d996e3fee4ac5dcb7d34cb290b6f67bb69d0Ashish Jangam	struct da9055_rtc *rtc = data;
546920d996e3fee4ac5dcb7d34cb290b6f67bb69d0Ashish Jangam
556920d996e3fee4ac5dcb7d34cb290b6f67bb69d0Ashish Jangam	da9055_rtc_enable_alarm(rtc, 0);
566920d996e3fee4ac5dcb7d34cb290b6f67bb69d0Ashish Jangam	rtc_update_irq(rtc->rtc, 1, RTC_IRQF | RTC_AF);
576920d996e3fee4ac5dcb7d34cb290b6f67bb69d0Ashish Jangam
586920d996e3fee4ac5dcb7d34cb290b6f67bb69d0Ashish Jangam	return IRQ_HANDLED;
596920d996e3fee4ac5dcb7d34cb290b6f67bb69d0Ashish Jangam}
606920d996e3fee4ac5dcb7d34cb290b6f67bb69d0Ashish Jangam
616920d996e3fee4ac5dcb7d34cb290b6f67bb69d0Ashish Jangamstatic int da9055_read_alarm(struct da9055 *da9055, struct rtc_time *rtc_tm)
626920d996e3fee4ac5dcb7d34cb290b6f67bb69d0Ashish Jangam{
636920d996e3fee4ac5dcb7d34cb290b6f67bb69d0Ashish Jangam	int ret;
646920d996e3fee4ac5dcb7d34cb290b6f67bb69d0Ashish Jangam	uint8_t v[5];
656920d996e3fee4ac5dcb7d34cb290b6f67bb69d0Ashish Jangam
666920d996e3fee4ac5dcb7d34cb290b6f67bb69d0Ashish Jangam	ret = da9055_group_read(da9055, DA9055_REG_ALARM_MI, 5, v);
676920d996e3fee4ac5dcb7d34cb290b6f67bb69d0Ashish Jangam	if (ret != 0) {
686920d996e3fee4ac5dcb7d34cb290b6f67bb69d0Ashish Jangam		dev_err(da9055->dev, "Failed to group read ALM: %d\n", ret);
696920d996e3fee4ac5dcb7d34cb290b6f67bb69d0Ashish Jangam		return ret;
706920d996e3fee4ac5dcb7d34cb290b6f67bb69d0Ashish Jangam	}
716920d996e3fee4ac5dcb7d34cb290b6f67bb69d0Ashish Jangam
726920d996e3fee4ac5dcb7d34cb290b6f67bb69d0Ashish Jangam	rtc_tm->tm_year = (v[4] & DA9055_RTC_ALM_YEAR) + 100;
736920d996e3fee4ac5dcb7d34cb290b6f67bb69d0Ashish Jangam	rtc_tm->tm_mon  = (v[3] & DA9055_RTC_ALM_MONTH) - 1;
746920d996e3fee4ac5dcb7d34cb290b6f67bb69d0Ashish Jangam	rtc_tm->tm_mday = v[2] & DA9055_RTC_ALM_DAY;
756920d996e3fee4ac5dcb7d34cb290b6f67bb69d0Ashish Jangam	rtc_tm->tm_hour = v[1] & DA9055_RTC_ALM_HOUR;
766920d996e3fee4ac5dcb7d34cb290b6f67bb69d0Ashish Jangam	rtc_tm->tm_min  = v[0] & DA9055_RTC_ALM_MIN;
776920d996e3fee4ac5dcb7d34cb290b6f67bb69d0Ashish Jangam
786920d996e3fee4ac5dcb7d34cb290b6f67bb69d0Ashish Jangam	return rtc_valid_tm(rtc_tm);
796920d996e3fee4ac5dcb7d34cb290b6f67bb69d0Ashish Jangam}
806920d996e3fee4ac5dcb7d34cb290b6f67bb69d0Ashish Jangam
816920d996e3fee4ac5dcb7d34cb290b6f67bb69d0Ashish Jangamstatic int da9055_set_alarm(struct da9055 *da9055, struct rtc_time *rtc_tm)
826920d996e3fee4ac5dcb7d34cb290b6f67bb69d0Ashish Jangam{
836920d996e3fee4ac5dcb7d34cb290b6f67bb69d0Ashish Jangam	int ret;
846920d996e3fee4ac5dcb7d34cb290b6f67bb69d0Ashish Jangam	uint8_t v[2];
856920d996e3fee4ac5dcb7d34cb290b6f67bb69d0Ashish Jangam
866920d996e3fee4ac5dcb7d34cb290b6f67bb69d0Ashish Jangam	rtc_tm->tm_year -= 100;
876920d996e3fee4ac5dcb7d34cb290b6f67bb69d0Ashish Jangam	rtc_tm->tm_mon += 1;
886920d996e3fee4ac5dcb7d34cb290b6f67bb69d0Ashish Jangam
896920d996e3fee4ac5dcb7d34cb290b6f67bb69d0Ashish Jangam	ret = da9055_reg_update(da9055, DA9055_REG_ALARM_MI,
906920d996e3fee4ac5dcb7d34cb290b6f67bb69d0Ashish Jangam				DA9055_RTC_ALM_MIN, rtc_tm->tm_min);
916920d996e3fee4ac5dcb7d34cb290b6f67bb69d0Ashish Jangam	if (ret != 0) {
926920d996e3fee4ac5dcb7d34cb290b6f67bb69d0Ashish Jangam		dev_err(da9055->dev, "Failed to write ALRM MIN: %d\n", ret);
936920d996e3fee4ac5dcb7d34cb290b6f67bb69d0Ashish Jangam		return ret;
946920d996e3fee4ac5dcb7d34cb290b6f67bb69d0Ashish Jangam	}
956920d996e3fee4ac5dcb7d34cb290b6f67bb69d0Ashish Jangam
966920d996e3fee4ac5dcb7d34cb290b6f67bb69d0Ashish Jangam	v[0] = rtc_tm->tm_hour;
976920d996e3fee4ac5dcb7d34cb290b6f67bb69d0Ashish Jangam	v[1] = rtc_tm->tm_mday;
986920d996e3fee4ac5dcb7d34cb290b6f67bb69d0Ashish Jangam
996920d996e3fee4ac5dcb7d34cb290b6f67bb69d0Ashish Jangam	ret = da9055_group_write(da9055, DA9055_REG_ALARM_H, 2, v);
1006920d996e3fee4ac5dcb7d34cb290b6f67bb69d0Ashish Jangam	if (ret < 0)
1016920d996e3fee4ac5dcb7d34cb290b6f67bb69d0Ashish Jangam		return ret;
1026920d996e3fee4ac5dcb7d34cb290b6f67bb69d0Ashish Jangam
1036920d996e3fee4ac5dcb7d34cb290b6f67bb69d0Ashish Jangam	ret = da9055_reg_update(da9055, DA9055_REG_ALARM_MO,
1046920d996e3fee4ac5dcb7d34cb290b6f67bb69d0Ashish Jangam				DA9055_RTC_ALM_MONTH, rtc_tm->tm_mon);
1056920d996e3fee4ac5dcb7d34cb290b6f67bb69d0Ashish Jangam	if (ret < 0)
1066920d996e3fee4ac5dcb7d34cb290b6f67bb69d0Ashish Jangam		dev_err(da9055->dev, "Failed to write ALM Month:%d\n", ret);
1076920d996e3fee4ac5dcb7d34cb290b6f67bb69d0Ashish Jangam
1086920d996e3fee4ac5dcb7d34cb290b6f67bb69d0Ashish Jangam	ret = da9055_reg_update(da9055, DA9055_REG_ALARM_Y,
1096920d996e3fee4ac5dcb7d34cb290b6f67bb69d0Ashish Jangam				DA9055_RTC_ALM_YEAR, rtc_tm->tm_year);
1106920d996e3fee4ac5dcb7d34cb290b6f67bb69d0Ashish Jangam	if (ret < 0)
1116920d996e3fee4ac5dcb7d34cb290b6f67bb69d0Ashish Jangam		dev_err(da9055->dev, "Failed to write ALM Year:%d\n", ret);
1126920d996e3fee4ac5dcb7d34cb290b6f67bb69d0Ashish Jangam
1136920d996e3fee4ac5dcb7d34cb290b6f67bb69d0Ashish Jangam	return ret;
1146920d996e3fee4ac5dcb7d34cb290b6f67bb69d0Ashish Jangam}
1156920d996e3fee4ac5dcb7d34cb290b6f67bb69d0Ashish Jangam
1166920d996e3fee4ac5dcb7d34cb290b6f67bb69d0Ashish Jangamstatic int da9055_rtc_get_alarm_status(struct da9055 *da9055)
1176920d996e3fee4ac5dcb7d34cb290b6f67bb69d0Ashish Jangam{
1186920d996e3fee4ac5dcb7d34cb290b6f67bb69d0Ashish Jangam	int ret;
1196920d996e3fee4ac5dcb7d34cb290b6f67bb69d0Ashish Jangam
1206920d996e3fee4ac5dcb7d34cb290b6f67bb69d0Ashish Jangam	ret = da9055_reg_read(da9055, DA9055_REG_ALARM_Y);
1216920d996e3fee4ac5dcb7d34cb290b6f67bb69d0Ashish Jangam	if (ret < 0) {
1226920d996e3fee4ac5dcb7d34cb290b6f67bb69d0Ashish Jangam		dev_err(da9055->dev, "Failed to read ALM: %d\n", ret);
1236920d996e3fee4ac5dcb7d34cb290b6f67bb69d0Ashish Jangam		return ret;
1246920d996e3fee4ac5dcb7d34cb290b6f67bb69d0Ashish Jangam	}
1256920d996e3fee4ac5dcb7d34cb290b6f67bb69d0Ashish Jangam	ret &= DA9055_RTC_ALM_EN;
1266920d996e3fee4ac5dcb7d34cb290b6f67bb69d0Ashish Jangam	return (ret > 0) ? 1 : 0;
1276920d996e3fee4ac5dcb7d34cb290b6f67bb69d0Ashish Jangam}
1286920d996e3fee4ac5dcb7d34cb290b6f67bb69d0Ashish Jangam
1296920d996e3fee4ac5dcb7d34cb290b6f67bb69d0Ashish Jangamstatic int da9055_rtc_read_time(struct device *dev, struct rtc_time *rtc_tm)
1306920d996e3fee4ac5dcb7d34cb290b6f67bb69d0Ashish Jangam{
1316920d996e3fee4ac5dcb7d34cb290b6f67bb69d0Ashish Jangam	struct da9055_rtc *rtc = dev_get_drvdata(dev);
1326920d996e3fee4ac5dcb7d34cb290b6f67bb69d0Ashish Jangam	uint8_t v[6];
1336920d996e3fee4ac5dcb7d34cb290b6f67bb69d0Ashish Jangam	int ret;
1346920d996e3fee4ac5dcb7d34cb290b6f67bb69d0Ashish Jangam
1356920d996e3fee4ac5dcb7d34cb290b6f67bb69d0Ashish Jangam	ret = da9055_reg_read(rtc->da9055, DA9055_REG_COUNT_S);
1366920d996e3fee4ac5dcb7d34cb290b6f67bb69d0Ashish Jangam	if (ret < 0)
1376920d996e3fee4ac5dcb7d34cb290b6f67bb69d0Ashish Jangam		return ret;
1386920d996e3fee4ac5dcb7d34cb290b6f67bb69d0Ashish Jangam
1396920d996e3fee4ac5dcb7d34cb290b6f67bb69d0Ashish Jangam	/*
1406920d996e3fee4ac5dcb7d34cb290b6f67bb69d0Ashish Jangam	 * Registers are only valid when RTC_READ
1416920d996e3fee4ac5dcb7d34cb290b6f67bb69d0Ashish Jangam	 * status bit is asserted
1426920d996e3fee4ac5dcb7d34cb290b6f67bb69d0Ashish Jangam	 */
1436920d996e3fee4ac5dcb7d34cb290b6f67bb69d0Ashish Jangam	if (!(ret & DA9055_RTC_READ))
1446920d996e3fee4ac5dcb7d34cb290b6f67bb69d0Ashish Jangam		return -EBUSY;
1456920d996e3fee4ac5dcb7d34cb290b6f67bb69d0Ashish Jangam
1466920d996e3fee4ac5dcb7d34cb290b6f67bb69d0Ashish Jangam	ret = da9055_group_read(rtc->da9055, DA9055_REG_COUNT_S, 6, v);
1476920d996e3fee4ac5dcb7d34cb290b6f67bb69d0Ashish Jangam	if (ret < 0) {
1486920d996e3fee4ac5dcb7d34cb290b6f67bb69d0Ashish Jangam		dev_err(rtc->da9055->dev, "Failed to read RTC time : %d\n",
1496920d996e3fee4ac5dcb7d34cb290b6f67bb69d0Ashish Jangam			ret);
1506920d996e3fee4ac5dcb7d34cb290b6f67bb69d0Ashish Jangam		return ret;
1516920d996e3fee4ac5dcb7d34cb290b6f67bb69d0Ashish Jangam	}
1526920d996e3fee4ac5dcb7d34cb290b6f67bb69d0Ashish Jangam
1536920d996e3fee4ac5dcb7d34cb290b6f67bb69d0Ashish Jangam	rtc_tm->tm_year = (v[5] & DA9055_RTC_YEAR) + 100;
1546920d996e3fee4ac5dcb7d34cb290b6f67bb69d0Ashish Jangam	rtc_tm->tm_mon  = (v[4] & DA9055_RTC_MONTH) - 1;
1556920d996e3fee4ac5dcb7d34cb290b6f67bb69d0Ashish Jangam	rtc_tm->tm_mday = v[3] & DA9055_RTC_DAY;
1566920d996e3fee4ac5dcb7d34cb290b6f67bb69d0Ashish Jangam	rtc_tm->tm_hour = v[2] & DA9055_RTC_HOUR;
1576920d996e3fee4ac5dcb7d34cb290b6f67bb69d0Ashish Jangam	rtc_tm->tm_min  = v[1] & DA9055_RTC_MIN;
1586920d996e3fee4ac5dcb7d34cb290b6f67bb69d0Ashish Jangam	rtc_tm->tm_sec  = v[0] & DA9055_RTC_SEC;
1596920d996e3fee4ac5dcb7d34cb290b6f67bb69d0Ashish Jangam
1606920d996e3fee4ac5dcb7d34cb290b6f67bb69d0Ashish Jangam	return rtc_valid_tm(rtc_tm);
1616920d996e3fee4ac5dcb7d34cb290b6f67bb69d0Ashish Jangam}
1626920d996e3fee4ac5dcb7d34cb290b6f67bb69d0Ashish Jangam
1636920d996e3fee4ac5dcb7d34cb290b6f67bb69d0Ashish Jangamstatic int da9055_rtc_set_time(struct device *dev, struct rtc_time *tm)
1646920d996e3fee4ac5dcb7d34cb290b6f67bb69d0Ashish Jangam{
1656920d996e3fee4ac5dcb7d34cb290b6f67bb69d0Ashish Jangam	struct da9055_rtc *rtc;
1666920d996e3fee4ac5dcb7d34cb290b6f67bb69d0Ashish Jangam	uint8_t v[6];
1676920d996e3fee4ac5dcb7d34cb290b6f67bb69d0Ashish Jangam
1686920d996e3fee4ac5dcb7d34cb290b6f67bb69d0Ashish Jangam	rtc = dev_get_drvdata(dev);
1696920d996e3fee4ac5dcb7d34cb290b6f67bb69d0Ashish Jangam
1706920d996e3fee4ac5dcb7d34cb290b6f67bb69d0Ashish Jangam	v[0] = tm->tm_sec;
1716920d996e3fee4ac5dcb7d34cb290b6f67bb69d0Ashish Jangam	v[1] = tm->tm_min;
1726920d996e3fee4ac5dcb7d34cb290b6f67bb69d0Ashish Jangam	v[2] = tm->tm_hour;
1736920d996e3fee4ac5dcb7d34cb290b6f67bb69d0Ashish Jangam	v[3] = tm->tm_mday;
1746920d996e3fee4ac5dcb7d34cb290b6f67bb69d0Ashish Jangam	v[4] = tm->tm_mon + 1;
1756920d996e3fee4ac5dcb7d34cb290b6f67bb69d0Ashish Jangam	v[5] = tm->tm_year - 100;
1766920d996e3fee4ac5dcb7d34cb290b6f67bb69d0Ashish Jangam
1776920d996e3fee4ac5dcb7d34cb290b6f67bb69d0Ashish Jangam	return da9055_group_write(rtc->da9055, DA9055_REG_COUNT_S, 6, v);
1786920d996e3fee4ac5dcb7d34cb290b6f67bb69d0Ashish Jangam}
1796920d996e3fee4ac5dcb7d34cb290b6f67bb69d0Ashish Jangam
1806920d996e3fee4ac5dcb7d34cb290b6f67bb69d0Ashish Jangamstatic int da9055_rtc_read_alarm(struct device *dev, struct rtc_wkalrm *alrm)
1816920d996e3fee4ac5dcb7d34cb290b6f67bb69d0Ashish Jangam{
1826920d996e3fee4ac5dcb7d34cb290b6f67bb69d0Ashish Jangam	int ret;
1836920d996e3fee4ac5dcb7d34cb290b6f67bb69d0Ashish Jangam	struct rtc_time *tm = &alrm->time;
1846920d996e3fee4ac5dcb7d34cb290b6f67bb69d0Ashish Jangam	struct da9055_rtc *rtc = dev_get_drvdata(dev);
1856920d996e3fee4ac5dcb7d34cb290b6f67bb69d0Ashish Jangam
1866920d996e3fee4ac5dcb7d34cb290b6f67bb69d0Ashish Jangam	ret = da9055_read_alarm(rtc->da9055, tm);
1876920d996e3fee4ac5dcb7d34cb290b6f67bb69d0Ashish Jangam
1886920d996e3fee4ac5dcb7d34cb290b6f67bb69d0Ashish Jangam	if (ret)
1896920d996e3fee4ac5dcb7d34cb290b6f67bb69d0Ashish Jangam		return ret;
1906920d996e3fee4ac5dcb7d34cb290b6f67bb69d0Ashish Jangam
1916920d996e3fee4ac5dcb7d34cb290b6f67bb69d0Ashish Jangam	alrm->enabled = da9055_rtc_get_alarm_status(rtc->da9055);
1926920d996e3fee4ac5dcb7d34cb290b6f67bb69d0Ashish Jangam
1936920d996e3fee4ac5dcb7d34cb290b6f67bb69d0Ashish Jangam	return 0;
1946920d996e3fee4ac5dcb7d34cb290b6f67bb69d0Ashish Jangam}
1956920d996e3fee4ac5dcb7d34cb290b6f67bb69d0Ashish Jangam
1966920d996e3fee4ac5dcb7d34cb290b6f67bb69d0Ashish Jangamstatic int da9055_rtc_set_alarm(struct device *dev, struct rtc_wkalrm *alrm)
1976920d996e3fee4ac5dcb7d34cb290b6f67bb69d0Ashish Jangam{
1986920d996e3fee4ac5dcb7d34cb290b6f67bb69d0Ashish Jangam	int ret;
1996920d996e3fee4ac5dcb7d34cb290b6f67bb69d0Ashish Jangam	struct rtc_time *tm = &alrm->time;
2006920d996e3fee4ac5dcb7d34cb290b6f67bb69d0Ashish Jangam	struct da9055_rtc *rtc = dev_get_drvdata(dev);
2016920d996e3fee4ac5dcb7d34cb290b6f67bb69d0Ashish Jangam
2026920d996e3fee4ac5dcb7d34cb290b6f67bb69d0Ashish Jangam	ret = da9055_rtc_enable_alarm(rtc, 0);
2036920d996e3fee4ac5dcb7d34cb290b6f67bb69d0Ashish Jangam	if (ret < 0)
2046920d996e3fee4ac5dcb7d34cb290b6f67bb69d0Ashish Jangam		return ret;
2056920d996e3fee4ac5dcb7d34cb290b6f67bb69d0Ashish Jangam
2066920d996e3fee4ac5dcb7d34cb290b6f67bb69d0Ashish Jangam	ret = da9055_set_alarm(rtc->da9055, tm);
2076920d996e3fee4ac5dcb7d34cb290b6f67bb69d0Ashish Jangam	if (ret)
2086920d996e3fee4ac5dcb7d34cb290b6f67bb69d0Ashish Jangam		return ret;
2096920d996e3fee4ac5dcb7d34cb290b6f67bb69d0Ashish Jangam
2106920d996e3fee4ac5dcb7d34cb290b6f67bb69d0Ashish Jangam	ret = da9055_rtc_enable_alarm(rtc, 1);
2116920d996e3fee4ac5dcb7d34cb290b6f67bb69d0Ashish Jangam
2126920d996e3fee4ac5dcb7d34cb290b6f67bb69d0Ashish Jangam	return ret;
2136920d996e3fee4ac5dcb7d34cb290b6f67bb69d0Ashish Jangam}
2146920d996e3fee4ac5dcb7d34cb290b6f67bb69d0Ashish Jangam
2156920d996e3fee4ac5dcb7d34cb290b6f67bb69d0Ashish Jangamstatic int da9055_rtc_alarm_irq_enable(struct device *dev, unsigned int enabled)
2166920d996e3fee4ac5dcb7d34cb290b6f67bb69d0Ashish Jangam{
2176920d996e3fee4ac5dcb7d34cb290b6f67bb69d0Ashish Jangam	struct da9055_rtc *rtc = dev_get_drvdata(dev);
2186920d996e3fee4ac5dcb7d34cb290b6f67bb69d0Ashish Jangam
2196920d996e3fee4ac5dcb7d34cb290b6f67bb69d0Ashish Jangam	return da9055_rtc_enable_alarm(rtc, enabled);
2206920d996e3fee4ac5dcb7d34cb290b6f67bb69d0Ashish Jangam}
2216920d996e3fee4ac5dcb7d34cb290b6f67bb69d0Ashish Jangam
2226920d996e3fee4ac5dcb7d34cb290b6f67bb69d0Ashish Jangamstatic const struct rtc_class_ops da9055_rtc_ops = {
2236920d996e3fee4ac5dcb7d34cb290b6f67bb69d0Ashish Jangam	.read_time	= da9055_rtc_read_time,
2246920d996e3fee4ac5dcb7d34cb290b6f67bb69d0Ashish Jangam	.set_time	= da9055_rtc_set_time,
2256920d996e3fee4ac5dcb7d34cb290b6f67bb69d0Ashish Jangam	.read_alarm	= da9055_rtc_read_alarm,
2266920d996e3fee4ac5dcb7d34cb290b6f67bb69d0Ashish Jangam	.set_alarm	= da9055_rtc_set_alarm,
2276920d996e3fee4ac5dcb7d34cb290b6f67bb69d0Ashish Jangam	.alarm_irq_enable = da9055_rtc_alarm_irq_enable,
2286920d996e3fee4ac5dcb7d34cb290b6f67bb69d0Ashish Jangam};
2296920d996e3fee4ac5dcb7d34cb290b6f67bb69d0Ashish Jangam
2306920d996e3fee4ac5dcb7d34cb290b6f67bb69d0Ashish Jangamstatic int __init da9055_rtc_device_init(struct da9055 *da9055,
2316920d996e3fee4ac5dcb7d34cb290b6f67bb69d0Ashish Jangam					struct da9055_pdata *pdata)
2326920d996e3fee4ac5dcb7d34cb290b6f67bb69d0Ashish Jangam{
2336920d996e3fee4ac5dcb7d34cb290b6f67bb69d0Ashish Jangam	int ret;
2346920d996e3fee4ac5dcb7d34cb290b6f67bb69d0Ashish Jangam
2356920d996e3fee4ac5dcb7d34cb290b6f67bb69d0Ashish Jangam	/* Enable RTC and the internal Crystal */
2366920d996e3fee4ac5dcb7d34cb290b6f67bb69d0Ashish Jangam	ret = da9055_reg_update(da9055, DA9055_REG_CONTROL_B,
2376920d996e3fee4ac5dcb7d34cb290b6f67bb69d0Ashish Jangam				DA9055_RTC_EN, DA9055_RTC_EN);
2386920d996e3fee4ac5dcb7d34cb290b6f67bb69d0Ashish Jangam	if (ret < 0)
2396920d996e3fee4ac5dcb7d34cb290b6f67bb69d0Ashish Jangam		return ret;
2406920d996e3fee4ac5dcb7d34cb290b6f67bb69d0Ashish Jangam	ret = da9055_reg_update(da9055, DA9055_REG_EN_32K,
2416920d996e3fee4ac5dcb7d34cb290b6f67bb69d0Ashish Jangam				DA9055_CRYSTAL_EN, DA9055_CRYSTAL_EN);
2426920d996e3fee4ac5dcb7d34cb290b6f67bb69d0Ashish Jangam	if (ret < 0)
2436920d996e3fee4ac5dcb7d34cb290b6f67bb69d0Ashish Jangam		return ret;
2446920d996e3fee4ac5dcb7d34cb290b6f67bb69d0Ashish Jangam
2456920d996e3fee4ac5dcb7d34cb290b6f67bb69d0Ashish Jangam	/* Enable RTC in Power Down mode */
2466920d996e3fee4ac5dcb7d34cb290b6f67bb69d0Ashish Jangam	ret = da9055_reg_update(da9055, DA9055_REG_CONTROL_B,
2476920d996e3fee4ac5dcb7d34cb290b6f67bb69d0Ashish Jangam				DA9055_RTC_MODE_PD, DA9055_RTC_MODE_PD);
2486920d996e3fee4ac5dcb7d34cb290b6f67bb69d0Ashish Jangam	if (ret < 0)
2496920d996e3fee4ac5dcb7d34cb290b6f67bb69d0Ashish Jangam		return ret;
2506920d996e3fee4ac5dcb7d34cb290b6f67bb69d0Ashish Jangam
2516920d996e3fee4ac5dcb7d34cb290b6f67bb69d0Ashish Jangam	/* Enable RTC in Reset mode */
2526920d996e3fee4ac5dcb7d34cb290b6f67bb69d0Ashish Jangam	if (pdata && pdata->reset_enable) {
2536920d996e3fee4ac5dcb7d34cb290b6f67bb69d0Ashish Jangam		ret = da9055_reg_update(da9055, DA9055_REG_CONTROL_B,
2546920d996e3fee4ac5dcb7d34cb290b6f67bb69d0Ashish Jangam					DA9055_RTC_MODE_SD,
2556920d996e3fee4ac5dcb7d34cb290b6f67bb69d0Ashish Jangam					DA9055_RTC_MODE_SD <<
2566920d996e3fee4ac5dcb7d34cb290b6f67bb69d0Ashish Jangam					DA9055_RTC_MODE_SD_SHIFT);
2576920d996e3fee4ac5dcb7d34cb290b6f67bb69d0Ashish Jangam		if (ret < 0)
2586920d996e3fee4ac5dcb7d34cb290b6f67bb69d0Ashish Jangam			return ret;
2596920d996e3fee4ac5dcb7d34cb290b6f67bb69d0Ashish Jangam	}
2606920d996e3fee4ac5dcb7d34cb290b6f67bb69d0Ashish Jangam
2616920d996e3fee4ac5dcb7d34cb290b6f67bb69d0Ashish Jangam	/* Disable the RTC TICK ALM */
2626920d996e3fee4ac5dcb7d34cb290b6f67bb69d0Ashish Jangam	ret = da9055_reg_update(da9055, DA9055_REG_ALARM_MO,
2636920d996e3fee4ac5dcb7d34cb290b6f67bb69d0Ashish Jangam				DA9055_RTC_TICK_WAKE_MASK, 0);
2646920d996e3fee4ac5dcb7d34cb290b6f67bb69d0Ashish Jangam	if (ret < 0)
2656920d996e3fee4ac5dcb7d34cb290b6f67bb69d0Ashish Jangam		return ret;
2666920d996e3fee4ac5dcb7d34cb290b6f67bb69d0Ashish Jangam
2676920d996e3fee4ac5dcb7d34cb290b6f67bb69d0Ashish Jangam	return 0;
2686920d996e3fee4ac5dcb7d34cb290b6f67bb69d0Ashish Jangam}
2696920d996e3fee4ac5dcb7d34cb290b6f67bb69d0Ashish Jangam
2706920d996e3fee4ac5dcb7d34cb290b6f67bb69d0Ashish Jangamstatic int da9055_rtc_probe(struct platform_device *pdev)
2716920d996e3fee4ac5dcb7d34cb290b6f67bb69d0Ashish Jangam{
2726920d996e3fee4ac5dcb7d34cb290b6f67bb69d0Ashish Jangam	struct da9055_rtc *rtc;
2736920d996e3fee4ac5dcb7d34cb290b6f67bb69d0Ashish Jangam	struct da9055_pdata *pdata = NULL;
2746920d996e3fee4ac5dcb7d34cb290b6f67bb69d0Ashish Jangam	int ret, alm_irq;
2756920d996e3fee4ac5dcb7d34cb290b6f67bb69d0Ashish Jangam
2766920d996e3fee4ac5dcb7d34cb290b6f67bb69d0Ashish Jangam	rtc = devm_kzalloc(&pdev->dev, sizeof(struct da9055_rtc), GFP_KERNEL);
2776920d996e3fee4ac5dcb7d34cb290b6f67bb69d0Ashish Jangam	if (!rtc)
2786920d996e3fee4ac5dcb7d34cb290b6f67bb69d0Ashish Jangam		return -ENOMEM;
2796920d996e3fee4ac5dcb7d34cb290b6f67bb69d0Ashish Jangam
2806920d996e3fee4ac5dcb7d34cb290b6f67bb69d0Ashish Jangam	rtc->da9055 = dev_get_drvdata(pdev->dev.parent);
2816920d996e3fee4ac5dcb7d34cb290b6f67bb69d0Ashish Jangam	pdata = rtc->da9055->dev->platform_data;
2826920d996e3fee4ac5dcb7d34cb290b6f67bb69d0Ashish Jangam	platform_set_drvdata(pdev, rtc);
2836920d996e3fee4ac5dcb7d34cb290b6f67bb69d0Ashish Jangam
2846920d996e3fee4ac5dcb7d34cb290b6f67bb69d0Ashish Jangam	ret = da9055_rtc_device_init(rtc->da9055, pdata);
2856920d996e3fee4ac5dcb7d34cb290b6f67bb69d0Ashish Jangam	if (ret < 0)
2866920d996e3fee4ac5dcb7d34cb290b6f67bb69d0Ashish Jangam		goto err_rtc;
2876920d996e3fee4ac5dcb7d34cb290b6f67bb69d0Ashish Jangam
2886920d996e3fee4ac5dcb7d34cb290b6f67bb69d0Ashish Jangam	ret = da9055_reg_read(rtc->da9055, DA9055_REG_ALARM_Y);
2896920d996e3fee4ac5dcb7d34cb290b6f67bb69d0Ashish Jangam	if (ret < 0)
2906920d996e3fee4ac5dcb7d34cb290b6f67bb69d0Ashish Jangam		goto err_rtc;
2916920d996e3fee4ac5dcb7d34cb290b6f67bb69d0Ashish Jangam
2926920d996e3fee4ac5dcb7d34cb290b6f67bb69d0Ashish Jangam	if (ret & DA9055_RTC_ALM_EN)
2936920d996e3fee4ac5dcb7d34cb290b6f67bb69d0Ashish Jangam		rtc->alarm_enable = 1;
2946920d996e3fee4ac5dcb7d34cb290b6f67bb69d0Ashish Jangam
2956920d996e3fee4ac5dcb7d34cb290b6f67bb69d0Ashish Jangam	device_init_wakeup(&pdev->dev, 1);
2966920d996e3fee4ac5dcb7d34cb290b6f67bb69d0Ashish Jangam
2976920d996e3fee4ac5dcb7d34cb290b6f67bb69d0Ashish Jangam	rtc->rtc = rtc_device_register(pdev->name, &pdev->dev,
2986920d996e3fee4ac5dcb7d34cb290b6f67bb69d0Ashish Jangam					&da9055_rtc_ops, THIS_MODULE);
2996920d996e3fee4ac5dcb7d34cb290b6f67bb69d0Ashish Jangam	if (IS_ERR(rtc->rtc)) {
3006920d996e3fee4ac5dcb7d34cb290b6f67bb69d0Ashish Jangam		ret = PTR_ERR(rtc->rtc);
3016920d996e3fee4ac5dcb7d34cb290b6f67bb69d0Ashish Jangam		goto err_rtc;
3026920d996e3fee4ac5dcb7d34cb290b6f67bb69d0Ashish Jangam	}
3036920d996e3fee4ac5dcb7d34cb290b6f67bb69d0Ashish Jangam
3046920d996e3fee4ac5dcb7d34cb290b6f67bb69d0Ashish Jangam	alm_irq = platform_get_irq_byname(pdev, "ALM");
3056920d996e3fee4ac5dcb7d34cb290b6f67bb69d0Ashish Jangam	alm_irq = regmap_irq_get_virq(rtc->da9055->irq_data, alm_irq);
3066920d996e3fee4ac5dcb7d34cb290b6f67bb69d0Ashish Jangam	ret = devm_request_threaded_irq(&pdev->dev, alm_irq, NULL,
3076920d996e3fee4ac5dcb7d34cb290b6f67bb69d0Ashish Jangam					da9055_rtc_alm_irq,
3086920d996e3fee4ac5dcb7d34cb290b6f67bb69d0Ashish Jangam					IRQF_TRIGGER_HIGH | IRQF_ONESHOT,
3096920d996e3fee4ac5dcb7d34cb290b6f67bb69d0Ashish Jangam					"ALM", rtc);
3106920d996e3fee4ac5dcb7d34cb290b6f67bb69d0Ashish Jangam	if (ret != 0)
3116920d996e3fee4ac5dcb7d34cb290b6f67bb69d0Ashish Jangam		dev_err(rtc->da9055->dev, "irq registration failed: %d\n", ret);
3126920d996e3fee4ac5dcb7d34cb290b6f67bb69d0Ashish Jangam
3136920d996e3fee4ac5dcb7d34cb290b6f67bb69d0Ashish Jangamerr_rtc:
3146920d996e3fee4ac5dcb7d34cb290b6f67bb69d0Ashish Jangam	return ret;
3156920d996e3fee4ac5dcb7d34cb290b6f67bb69d0Ashish Jangam
3166920d996e3fee4ac5dcb7d34cb290b6f67bb69d0Ashish Jangam}
3176920d996e3fee4ac5dcb7d34cb290b6f67bb69d0Ashish Jangam
3186920d996e3fee4ac5dcb7d34cb290b6f67bb69d0Ashish Jangamstatic int da9055_rtc_remove(struct platform_device *pdev)
3196920d996e3fee4ac5dcb7d34cb290b6f67bb69d0Ashish Jangam{
3206920d996e3fee4ac5dcb7d34cb290b6f67bb69d0Ashish Jangam	struct da9055_rtc *rtc = pdev->dev.platform_data;
3216920d996e3fee4ac5dcb7d34cb290b6f67bb69d0Ashish Jangam
3226920d996e3fee4ac5dcb7d34cb290b6f67bb69d0Ashish Jangam	rtc_device_unregister(rtc->rtc);
3236920d996e3fee4ac5dcb7d34cb290b6f67bb69d0Ashish Jangam	platform_set_drvdata(pdev, NULL);
3246920d996e3fee4ac5dcb7d34cb290b6f67bb69d0Ashish Jangam
3256920d996e3fee4ac5dcb7d34cb290b6f67bb69d0Ashish Jangam	return 0;
3266920d996e3fee4ac5dcb7d34cb290b6f67bb69d0Ashish Jangam}
3276920d996e3fee4ac5dcb7d34cb290b6f67bb69d0Ashish Jangam
3286920d996e3fee4ac5dcb7d34cb290b6f67bb69d0Ashish Jangam#ifdef CONFIG_PM
3296920d996e3fee4ac5dcb7d34cb290b6f67bb69d0Ashish Jangam/* Turn off the alarm if it should not be a wake source. */
3306920d996e3fee4ac5dcb7d34cb290b6f67bb69d0Ashish Jangamstatic int da9055_rtc_suspend(struct device *dev)
3316920d996e3fee4ac5dcb7d34cb290b6f67bb69d0Ashish Jangam{
3326920d996e3fee4ac5dcb7d34cb290b6f67bb69d0Ashish Jangam	struct platform_device *pdev = to_platform_device(dev);
3336920d996e3fee4ac5dcb7d34cb290b6f67bb69d0Ashish Jangam	struct da9055_rtc *rtc = dev_get_drvdata(&pdev->dev);
3346920d996e3fee4ac5dcb7d34cb290b6f67bb69d0Ashish Jangam	int ret;
3356920d996e3fee4ac5dcb7d34cb290b6f67bb69d0Ashish Jangam
3366920d996e3fee4ac5dcb7d34cb290b6f67bb69d0Ashish Jangam	if (!device_may_wakeup(&pdev->dev)) {
3376920d996e3fee4ac5dcb7d34cb290b6f67bb69d0Ashish Jangam		/* Disable the ALM IRQ */
3386920d996e3fee4ac5dcb7d34cb290b6f67bb69d0Ashish Jangam		ret = da9055_rtc_enable_alarm(rtc, 0);
3396920d996e3fee4ac5dcb7d34cb290b6f67bb69d0Ashish Jangam		if (ret < 0)
3406920d996e3fee4ac5dcb7d34cb290b6f67bb69d0Ashish Jangam			dev_err(&pdev->dev, "Failed to disable RTC ALM\n");
3416920d996e3fee4ac5dcb7d34cb290b6f67bb69d0Ashish Jangam	}
3426920d996e3fee4ac5dcb7d34cb290b6f67bb69d0Ashish Jangam
3436920d996e3fee4ac5dcb7d34cb290b6f67bb69d0Ashish Jangam	return 0;
3446920d996e3fee4ac5dcb7d34cb290b6f67bb69d0Ashish Jangam}
3456920d996e3fee4ac5dcb7d34cb290b6f67bb69d0Ashish Jangam
3466920d996e3fee4ac5dcb7d34cb290b6f67bb69d0Ashish Jangam/* Enable the alarm if it should be enabled (in case it was disabled to
3476920d996e3fee4ac5dcb7d34cb290b6f67bb69d0Ashish Jangam * prevent use as a wake source).
3486920d996e3fee4ac5dcb7d34cb290b6f67bb69d0Ashish Jangam */
3496920d996e3fee4ac5dcb7d34cb290b6f67bb69d0Ashish Jangamstatic int da9055_rtc_resume(struct device *dev)
3506920d996e3fee4ac5dcb7d34cb290b6f67bb69d0Ashish Jangam{
3516920d996e3fee4ac5dcb7d34cb290b6f67bb69d0Ashish Jangam	struct platform_device *pdev = to_platform_device(dev);
3526920d996e3fee4ac5dcb7d34cb290b6f67bb69d0Ashish Jangam	struct da9055_rtc *rtc = dev_get_drvdata(&pdev->dev);
3536920d996e3fee4ac5dcb7d34cb290b6f67bb69d0Ashish Jangam	int ret;
3546920d996e3fee4ac5dcb7d34cb290b6f67bb69d0Ashish Jangam
3556920d996e3fee4ac5dcb7d34cb290b6f67bb69d0Ashish Jangam	if (!device_may_wakeup(&pdev->dev)) {
3566920d996e3fee4ac5dcb7d34cb290b6f67bb69d0Ashish Jangam		if (rtc->alarm_enable) {
3576920d996e3fee4ac5dcb7d34cb290b6f67bb69d0Ashish Jangam			ret = da9055_rtc_enable_alarm(rtc, 1);
3586920d996e3fee4ac5dcb7d34cb290b6f67bb69d0Ashish Jangam			if (ret < 0)
3596920d996e3fee4ac5dcb7d34cb290b6f67bb69d0Ashish Jangam				dev_err(&pdev->dev,
3606920d996e3fee4ac5dcb7d34cb290b6f67bb69d0Ashish Jangam					"Failed to restart RTC ALM\n");
3616920d996e3fee4ac5dcb7d34cb290b6f67bb69d0Ashish Jangam		}
3626920d996e3fee4ac5dcb7d34cb290b6f67bb69d0Ashish Jangam	}
3636920d996e3fee4ac5dcb7d34cb290b6f67bb69d0Ashish Jangam
3646920d996e3fee4ac5dcb7d34cb290b6f67bb69d0Ashish Jangam	return 0;
3656920d996e3fee4ac5dcb7d34cb290b6f67bb69d0Ashish Jangam}
3666920d996e3fee4ac5dcb7d34cb290b6f67bb69d0Ashish Jangam
3676920d996e3fee4ac5dcb7d34cb290b6f67bb69d0Ashish Jangam/* Unconditionally disable the alarm */
3686920d996e3fee4ac5dcb7d34cb290b6f67bb69d0Ashish Jangamstatic int da9055_rtc_freeze(struct device *dev)
3696920d996e3fee4ac5dcb7d34cb290b6f67bb69d0Ashish Jangam{
3706920d996e3fee4ac5dcb7d34cb290b6f67bb69d0Ashish Jangam	struct platform_device *pdev = to_platform_device(dev);
3716920d996e3fee4ac5dcb7d34cb290b6f67bb69d0Ashish Jangam	struct da9055_rtc *rtc = dev_get_drvdata(&pdev->dev);
3726920d996e3fee4ac5dcb7d34cb290b6f67bb69d0Ashish Jangam	int ret;
3736920d996e3fee4ac5dcb7d34cb290b6f67bb69d0Ashish Jangam
3746920d996e3fee4ac5dcb7d34cb290b6f67bb69d0Ashish Jangam	ret = da9055_rtc_enable_alarm(rtc, 0);
3756920d996e3fee4ac5dcb7d34cb290b6f67bb69d0Ashish Jangam	if (ret < 0)
3766920d996e3fee4ac5dcb7d34cb290b6f67bb69d0Ashish Jangam		dev_err(&pdev->dev, "Failed to freeze RTC ALMs\n");
3776920d996e3fee4ac5dcb7d34cb290b6f67bb69d0Ashish Jangam
3786920d996e3fee4ac5dcb7d34cb290b6f67bb69d0Ashish Jangam	return 0;
3796920d996e3fee4ac5dcb7d34cb290b6f67bb69d0Ashish Jangam
3806920d996e3fee4ac5dcb7d34cb290b6f67bb69d0Ashish Jangam}
3816920d996e3fee4ac5dcb7d34cb290b6f67bb69d0Ashish Jangam#else
3826920d996e3fee4ac5dcb7d34cb290b6f67bb69d0Ashish Jangam#define da9055_rtc_suspend NULL
3836920d996e3fee4ac5dcb7d34cb290b6f67bb69d0Ashish Jangam#define da9055_rtc_resume NULL
3846920d996e3fee4ac5dcb7d34cb290b6f67bb69d0Ashish Jangam#define da9055_rtc_freeze NULL
3856920d996e3fee4ac5dcb7d34cb290b6f67bb69d0Ashish Jangam#endif
3866920d996e3fee4ac5dcb7d34cb290b6f67bb69d0Ashish Jangam
3876920d996e3fee4ac5dcb7d34cb290b6f67bb69d0Ashish Jangamstatic const struct dev_pm_ops da9055_rtc_pm_ops = {
3886920d996e3fee4ac5dcb7d34cb290b6f67bb69d0Ashish Jangam	.suspend = da9055_rtc_suspend,
3896920d996e3fee4ac5dcb7d34cb290b6f67bb69d0Ashish Jangam	.resume = da9055_rtc_resume,
3906920d996e3fee4ac5dcb7d34cb290b6f67bb69d0Ashish Jangam
3916920d996e3fee4ac5dcb7d34cb290b6f67bb69d0Ashish Jangam	.freeze = da9055_rtc_freeze,
3926920d996e3fee4ac5dcb7d34cb290b6f67bb69d0Ashish Jangam	.thaw = da9055_rtc_resume,
3936920d996e3fee4ac5dcb7d34cb290b6f67bb69d0Ashish Jangam	.restore = da9055_rtc_resume,
3946920d996e3fee4ac5dcb7d34cb290b6f67bb69d0Ashish Jangam
3956920d996e3fee4ac5dcb7d34cb290b6f67bb69d0Ashish Jangam	.poweroff = da9055_rtc_suspend,
3966920d996e3fee4ac5dcb7d34cb290b6f67bb69d0Ashish Jangam};
3976920d996e3fee4ac5dcb7d34cb290b6f67bb69d0Ashish Jangam
3986920d996e3fee4ac5dcb7d34cb290b6f67bb69d0Ashish Jangamstatic struct platform_driver da9055_rtc_driver = {
3996920d996e3fee4ac5dcb7d34cb290b6f67bb69d0Ashish Jangam	.probe  = da9055_rtc_probe,
4006920d996e3fee4ac5dcb7d34cb290b6f67bb69d0Ashish Jangam	.remove = da9055_rtc_remove,
4016920d996e3fee4ac5dcb7d34cb290b6f67bb69d0Ashish Jangam	.driver = {
4026920d996e3fee4ac5dcb7d34cb290b6f67bb69d0Ashish Jangam		.name   = "da9055-rtc",
4036920d996e3fee4ac5dcb7d34cb290b6f67bb69d0Ashish Jangam		.owner  = THIS_MODULE,
4046920d996e3fee4ac5dcb7d34cb290b6f67bb69d0Ashish Jangam		.pm = &da9055_rtc_pm_ops,
4056920d996e3fee4ac5dcb7d34cb290b6f67bb69d0Ashish Jangam	},
4066920d996e3fee4ac5dcb7d34cb290b6f67bb69d0Ashish Jangam};
4076920d996e3fee4ac5dcb7d34cb290b6f67bb69d0Ashish Jangam
4086920d996e3fee4ac5dcb7d34cb290b6f67bb69d0Ashish Jangammodule_platform_driver(da9055_rtc_driver);
4096920d996e3fee4ac5dcb7d34cb290b6f67bb69d0Ashish Jangam
4106920d996e3fee4ac5dcb7d34cb290b6f67bb69d0Ashish JangamMODULE_AUTHOR("David Dajun Chen <dchen@diasemi.com>");
4116920d996e3fee4ac5dcb7d34cb290b6f67bb69d0Ashish JangamMODULE_DESCRIPTION("RTC driver for Dialog DA9055 PMIC");
4126920d996e3fee4ac5dcb7d34cb290b6f67bb69d0Ashish JangamMODULE_LICENSE("GPL");
4136920d996e3fee4ac5dcb7d34cb290b6f67bb69d0Ashish JangamMODULE_ALIAS("platform:da9055-rtc");
414