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 2300a1af1d61edae189b0a81bc46386ab37eb3d9d4dAndrew Mortonstatic int 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); 281d1fa24524899b342690f565a3dbf190fb65cc145Jingoo Han pdata = dev_get_platdata(rtc->da9055->dev); 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 2978c32edb57fc68497c719971cc25944af424aaf3aJingoo Han rtc->rtc = devm_rtc_device_register(&pdev->dev, pdev->name, 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"); 305dc9d8887408ac3dfd907b826c5dfdfe953c21a0fAdam Thomson if (alm_irq < 0) 306dc9d8887408ac3dfd907b826c5dfdfe953c21a0fAdam Thomson return alm_irq; 307dc9d8887408ac3dfd907b826c5dfdfe953c21a0fAdam Thomson 3086920d996e3fee4ac5dcb7d34cb290b6f67bb69d0Ashish Jangam ret = devm_request_threaded_irq(&pdev->dev, alm_irq, NULL, 3096920d996e3fee4ac5dcb7d34cb290b6f67bb69d0Ashish Jangam da9055_rtc_alm_irq, 3106920d996e3fee4ac5dcb7d34cb290b6f67bb69d0Ashish Jangam IRQF_TRIGGER_HIGH | IRQF_ONESHOT, 3116920d996e3fee4ac5dcb7d34cb290b6f67bb69d0Ashish Jangam "ALM", rtc); 3126920d996e3fee4ac5dcb7d34cb290b6f67bb69d0Ashish Jangam if (ret != 0) 3136920d996e3fee4ac5dcb7d34cb290b6f67bb69d0Ashish Jangam dev_err(rtc->da9055->dev, "irq registration failed: %d\n", ret); 3146920d996e3fee4ac5dcb7d34cb290b6f67bb69d0Ashish Jangam 3156920d996e3fee4ac5dcb7d34cb290b6f67bb69d0Ashish Jangamerr_rtc: 3166920d996e3fee4ac5dcb7d34cb290b6f67bb69d0Ashish Jangam return ret; 3176920d996e3fee4ac5dcb7d34cb290b6f67bb69d0Ashish Jangam 3186920d996e3fee4ac5dcb7d34cb290b6f67bb69d0Ashish Jangam} 3196920d996e3fee4ac5dcb7d34cb290b6f67bb69d0Ashish Jangam 3206920d996e3fee4ac5dcb7d34cb290b6f67bb69d0Ashish Jangam#ifdef CONFIG_PM 3216920d996e3fee4ac5dcb7d34cb290b6f67bb69d0Ashish Jangam/* Turn off the alarm if it should not be a wake source. */ 3226920d996e3fee4ac5dcb7d34cb290b6f67bb69d0Ashish Jangamstatic int da9055_rtc_suspend(struct device *dev) 3236920d996e3fee4ac5dcb7d34cb290b6f67bb69d0Ashish Jangam{ 3246920d996e3fee4ac5dcb7d34cb290b6f67bb69d0Ashish Jangam struct platform_device *pdev = to_platform_device(dev); 3256920d996e3fee4ac5dcb7d34cb290b6f67bb69d0Ashish Jangam struct da9055_rtc *rtc = dev_get_drvdata(&pdev->dev); 3266920d996e3fee4ac5dcb7d34cb290b6f67bb69d0Ashish Jangam int ret; 3276920d996e3fee4ac5dcb7d34cb290b6f67bb69d0Ashish Jangam 3286920d996e3fee4ac5dcb7d34cb290b6f67bb69d0Ashish Jangam if (!device_may_wakeup(&pdev->dev)) { 3296920d996e3fee4ac5dcb7d34cb290b6f67bb69d0Ashish Jangam /* Disable the ALM IRQ */ 3306920d996e3fee4ac5dcb7d34cb290b6f67bb69d0Ashish Jangam ret = da9055_rtc_enable_alarm(rtc, 0); 3316920d996e3fee4ac5dcb7d34cb290b6f67bb69d0Ashish Jangam if (ret < 0) 3326920d996e3fee4ac5dcb7d34cb290b6f67bb69d0Ashish Jangam dev_err(&pdev->dev, "Failed to disable RTC ALM\n"); 3336920d996e3fee4ac5dcb7d34cb290b6f67bb69d0Ashish Jangam } 3346920d996e3fee4ac5dcb7d34cb290b6f67bb69d0Ashish Jangam 3356920d996e3fee4ac5dcb7d34cb290b6f67bb69d0Ashish Jangam return 0; 3366920d996e3fee4ac5dcb7d34cb290b6f67bb69d0Ashish Jangam} 3376920d996e3fee4ac5dcb7d34cb290b6f67bb69d0Ashish Jangam 3386920d996e3fee4ac5dcb7d34cb290b6f67bb69d0Ashish Jangam/* Enable the alarm if it should be enabled (in case it was disabled to 3396920d996e3fee4ac5dcb7d34cb290b6f67bb69d0Ashish Jangam * prevent use as a wake source). 3406920d996e3fee4ac5dcb7d34cb290b6f67bb69d0Ashish Jangam */ 3416920d996e3fee4ac5dcb7d34cb290b6f67bb69d0Ashish Jangamstatic int da9055_rtc_resume(struct device *dev) 3426920d996e3fee4ac5dcb7d34cb290b6f67bb69d0Ashish Jangam{ 3436920d996e3fee4ac5dcb7d34cb290b6f67bb69d0Ashish Jangam struct platform_device *pdev = to_platform_device(dev); 3446920d996e3fee4ac5dcb7d34cb290b6f67bb69d0Ashish Jangam struct da9055_rtc *rtc = dev_get_drvdata(&pdev->dev); 3456920d996e3fee4ac5dcb7d34cb290b6f67bb69d0Ashish Jangam int ret; 3466920d996e3fee4ac5dcb7d34cb290b6f67bb69d0Ashish Jangam 3476920d996e3fee4ac5dcb7d34cb290b6f67bb69d0Ashish Jangam if (!device_may_wakeup(&pdev->dev)) { 3486920d996e3fee4ac5dcb7d34cb290b6f67bb69d0Ashish Jangam if (rtc->alarm_enable) { 3496920d996e3fee4ac5dcb7d34cb290b6f67bb69d0Ashish Jangam ret = da9055_rtc_enable_alarm(rtc, 1); 3506920d996e3fee4ac5dcb7d34cb290b6f67bb69d0Ashish Jangam if (ret < 0) 3516920d996e3fee4ac5dcb7d34cb290b6f67bb69d0Ashish Jangam dev_err(&pdev->dev, 3526920d996e3fee4ac5dcb7d34cb290b6f67bb69d0Ashish Jangam "Failed to restart RTC ALM\n"); 3536920d996e3fee4ac5dcb7d34cb290b6f67bb69d0Ashish Jangam } 3546920d996e3fee4ac5dcb7d34cb290b6f67bb69d0Ashish Jangam } 3556920d996e3fee4ac5dcb7d34cb290b6f67bb69d0Ashish Jangam 3566920d996e3fee4ac5dcb7d34cb290b6f67bb69d0Ashish Jangam return 0; 3576920d996e3fee4ac5dcb7d34cb290b6f67bb69d0Ashish Jangam} 3586920d996e3fee4ac5dcb7d34cb290b6f67bb69d0Ashish Jangam 3596920d996e3fee4ac5dcb7d34cb290b6f67bb69d0Ashish Jangam/* Unconditionally disable the alarm */ 3606920d996e3fee4ac5dcb7d34cb290b6f67bb69d0Ashish Jangamstatic int da9055_rtc_freeze(struct device *dev) 3616920d996e3fee4ac5dcb7d34cb290b6f67bb69d0Ashish Jangam{ 3626920d996e3fee4ac5dcb7d34cb290b6f67bb69d0Ashish Jangam struct platform_device *pdev = to_platform_device(dev); 3636920d996e3fee4ac5dcb7d34cb290b6f67bb69d0Ashish Jangam struct da9055_rtc *rtc = dev_get_drvdata(&pdev->dev); 3646920d996e3fee4ac5dcb7d34cb290b6f67bb69d0Ashish Jangam int ret; 3656920d996e3fee4ac5dcb7d34cb290b6f67bb69d0Ashish Jangam 3666920d996e3fee4ac5dcb7d34cb290b6f67bb69d0Ashish Jangam ret = da9055_rtc_enable_alarm(rtc, 0); 3676920d996e3fee4ac5dcb7d34cb290b6f67bb69d0Ashish Jangam if (ret < 0) 3686920d996e3fee4ac5dcb7d34cb290b6f67bb69d0Ashish Jangam dev_err(&pdev->dev, "Failed to freeze RTC ALMs\n"); 3696920d996e3fee4ac5dcb7d34cb290b6f67bb69d0Ashish Jangam 3706920d996e3fee4ac5dcb7d34cb290b6f67bb69d0Ashish Jangam return 0; 3716920d996e3fee4ac5dcb7d34cb290b6f67bb69d0Ashish Jangam 3726920d996e3fee4ac5dcb7d34cb290b6f67bb69d0Ashish Jangam} 3736920d996e3fee4ac5dcb7d34cb290b6f67bb69d0Ashish Jangam#else 3746920d996e3fee4ac5dcb7d34cb290b6f67bb69d0Ashish Jangam#define da9055_rtc_suspend NULL 3756920d996e3fee4ac5dcb7d34cb290b6f67bb69d0Ashish Jangam#define da9055_rtc_resume NULL 3766920d996e3fee4ac5dcb7d34cb290b6f67bb69d0Ashish Jangam#define da9055_rtc_freeze NULL 3776920d996e3fee4ac5dcb7d34cb290b6f67bb69d0Ashish Jangam#endif 3786920d996e3fee4ac5dcb7d34cb290b6f67bb69d0Ashish Jangam 3796920d996e3fee4ac5dcb7d34cb290b6f67bb69d0Ashish Jangamstatic const struct dev_pm_ops da9055_rtc_pm_ops = { 3806920d996e3fee4ac5dcb7d34cb290b6f67bb69d0Ashish Jangam .suspend = da9055_rtc_suspend, 3816920d996e3fee4ac5dcb7d34cb290b6f67bb69d0Ashish Jangam .resume = da9055_rtc_resume, 3826920d996e3fee4ac5dcb7d34cb290b6f67bb69d0Ashish Jangam 3836920d996e3fee4ac5dcb7d34cb290b6f67bb69d0Ashish Jangam .freeze = da9055_rtc_freeze, 3846920d996e3fee4ac5dcb7d34cb290b6f67bb69d0Ashish Jangam .thaw = da9055_rtc_resume, 3856920d996e3fee4ac5dcb7d34cb290b6f67bb69d0Ashish Jangam .restore = da9055_rtc_resume, 3866920d996e3fee4ac5dcb7d34cb290b6f67bb69d0Ashish Jangam 3876920d996e3fee4ac5dcb7d34cb290b6f67bb69d0Ashish Jangam .poweroff = da9055_rtc_suspend, 3886920d996e3fee4ac5dcb7d34cb290b6f67bb69d0Ashish Jangam}; 3896920d996e3fee4ac5dcb7d34cb290b6f67bb69d0Ashish Jangam 3906920d996e3fee4ac5dcb7d34cb290b6f67bb69d0Ashish Jangamstatic struct platform_driver da9055_rtc_driver = { 3916920d996e3fee4ac5dcb7d34cb290b6f67bb69d0Ashish Jangam .probe = da9055_rtc_probe, 3926920d996e3fee4ac5dcb7d34cb290b6f67bb69d0Ashish Jangam .driver = { 3936920d996e3fee4ac5dcb7d34cb290b6f67bb69d0Ashish Jangam .name = "da9055-rtc", 3946920d996e3fee4ac5dcb7d34cb290b6f67bb69d0Ashish Jangam .owner = THIS_MODULE, 3956920d996e3fee4ac5dcb7d34cb290b6f67bb69d0Ashish Jangam .pm = &da9055_rtc_pm_ops, 3966920d996e3fee4ac5dcb7d34cb290b6f67bb69d0Ashish Jangam }, 3976920d996e3fee4ac5dcb7d34cb290b6f67bb69d0Ashish Jangam}; 3986920d996e3fee4ac5dcb7d34cb290b6f67bb69d0Ashish Jangam 3996920d996e3fee4ac5dcb7d34cb290b6f67bb69d0Ashish Jangammodule_platform_driver(da9055_rtc_driver); 4006920d996e3fee4ac5dcb7d34cb290b6f67bb69d0Ashish Jangam 4016920d996e3fee4ac5dcb7d34cb290b6f67bb69d0Ashish JangamMODULE_AUTHOR("David Dajun Chen <dchen@diasemi.com>"); 4026920d996e3fee4ac5dcb7d34cb290b6f67bb69d0Ashish JangamMODULE_DESCRIPTION("RTC driver for Dialog DA9055 PMIC"); 4036920d996e3fee4ac5dcb7d34cb290b6f67bb69d0Ashish JangamMODULE_LICENSE("GPL"); 4046920d996e3fee4ac5dcb7d34cb290b6f67bb69d0Ashish JangamMODULE_ALIAS("platform:da9055-rtc"); 405