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