rtc-da9052.c revision 3689cd741f627ee49a1a4d5c9aec49e120b6c291
1fef931ff98fe78bea804d9b4c49d410a7a97988cAshish Jangam/* 2fef931ff98fe78bea804d9b4c49d410a7a97988cAshish Jangam * Real time clock driver for DA9052 3fef931ff98fe78bea804d9b4c49d410a7a97988cAshish Jangam * 4fef931ff98fe78bea804d9b4c49d410a7a97988cAshish Jangam * Copyright(c) 2012 Dialog Semiconductor Ltd. 5fef931ff98fe78bea804d9b4c49d410a7a97988cAshish Jangam * 6fef931ff98fe78bea804d9b4c49d410a7a97988cAshish Jangam * Author: Dajun Dajun Chen <dajun.chen@diasemi.com> 7fef931ff98fe78bea804d9b4c49d410a7a97988cAshish Jangam * 8fef931ff98fe78bea804d9b4c49d410a7a97988cAshish Jangam * This program is free software; you can redistribute it and/or modify 9fef931ff98fe78bea804d9b4c49d410a7a97988cAshish Jangam * it under the terms of the GNU General Public License as published by 10fef931ff98fe78bea804d9b4c49d410a7a97988cAshish Jangam * the Free Software Foundation; either version 2 of the License, or 11fef931ff98fe78bea804d9b4c49d410a7a97988cAshish Jangam * (at your option) any later version. 12fef931ff98fe78bea804d9b4c49d410a7a97988cAshish Jangam * 13fef931ff98fe78bea804d9b4c49d410a7a97988cAshish Jangam */ 14fef931ff98fe78bea804d9b4c49d410a7a97988cAshish Jangam 15fef931ff98fe78bea804d9b4c49d410a7a97988cAshish Jangam#include <linux/module.h> 16fef931ff98fe78bea804d9b4c49d410a7a97988cAshish Jangam#include <linux/platform_device.h> 17fef931ff98fe78bea804d9b4c49d410a7a97988cAshish Jangam#include <linux/rtc.h> 18fef931ff98fe78bea804d9b4c49d410a7a97988cAshish Jangam 19fef931ff98fe78bea804d9b4c49d410a7a97988cAshish Jangam#include <linux/mfd/da9052/da9052.h> 20fef931ff98fe78bea804d9b4c49d410a7a97988cAshish Jangam#include <linux/mfd/da9052/reg.h> 21fef931ff98fe78bea804d9b4c49d410a7a97988cAshish Jangam 22fef931ff98fe78bea804d9b4c49d410a7a97988cAshish Jangam#define rtc_err(da9052, fmt, ...) \ 23fef931ff98fe78bea804d9b4c49d410a7a97988cAshish Jangam dev_err(da9052->dev, "%s: " fmt, __func__, ##__VA_ARGS__) 24fef931ff98fe78bea804d9b4c49d410a7a97988cAshish Jangam 25fef931ff98fe78bea804d9b4c49d410a7a97988cAshish Jangamstruct da9052_rtc { 26fef931ff98fe78bea804d9b4c49d410a7a97988cAshish Jangam struct rtc_device *rtc; 27fef931ff98fe78bea804d9b4c49d410a7a97988cAshish Jangam struct da9052 *da9052; 28fef931ff98fe78bea804d9b4c49d410a7a97988cAshish Jangam int irq; 29fef931ff98fe78bea804d9b4c49d410a7a97988cAshish Jangam}; 30fef931ff98fe78bea804d9b4c49d410a7a97988cAshish Jangam 31fef931ff98fe78bea804d9b4c49d410a7a97988cAshish Jangamstatic int da9052_rtc_enable_alarm(struct da9052 *da9052, bool enable) 32fef931ff98fe78bea804d9b4c49d410a7a97988cAshish Jangam{ 33fef931ff98fe78bea804d9b4c49d410a7a97988cAshish Jangam int ret; 34fef931ff98fe78bea804d9b4c49d410a7a97988cAshish Jangam if (enable) { 35fef931ff98fe78bea804d9b4c49d410a7a97988cAshish Jangam ret = da9052_reg_update(da9052, DA9052_ALARM_Y_REG, 36fef931ff98fe78bea804d9b4c49d410a7a97988cAshish Jangam DA9052_ALARM_Y_ALARM_ON, 37fef931ff98fe78bea804d9b4c49d410a7a97988cAshish Jangam DA9052_ALARM_Y_ALARM_ON); 38fef931ff98fe78bea804d9b4c49d410a7a97988cAshish Jangam if (ret != 0) 39fef931ff98fe78bea804d9b4c49d410a7a97988cAshish Jangam rtc_err(da9052, "Failed to enable ALM: %d\n", ret); 40fef931ff98fe78bea804d9b4c49d410a7a97988cAshish Jangam } else { 41fef931ff98fe78bea804d9b4c49d410a7a97988cAshish Jangam ret = da9052_reg_update(da9052, DA9052_ALARM_Y_REG, 42fef931ff98fe78bea804d9b4c49d410a7a97988cAshish Jangam DA9052_ALARM_Y_ALARM_ON, 0); 43fef931ff98fe78bea804d9b4c49d410a7a97988cAshish Jangam if (ret != 0) 44fef931ff98fe78bea804d9b4c49d410a7a97988cAshish Jangam rtc_err(da9052, "Write error: %d\n", ret); 45fef931ff98fe78bea804d9b4c49d410a7a97988cAshish Jangam } 46fef931ff98fe78bea804d9b4c49d410a7a97988cAshish Jangam return ret; 47fef931ff98fe78bea804d9b4c49d410a7a97988cAshish Jangam} 48fef931ff98fe78bea804d9b4c49d410a7a97988cAshish Jangam 49fef931ff98fe78bea804d9b4c49d410a7a97988cAshish Jangamstatic irqreturn_t da9052_rtc_irq(int irq, void *data) 50fef931ff98fe78bea804d9b4c49d410a7a97988cAshish Jangam{ 51fef931ff98fe78bea804d9b4c49d410a7a97988cAshish Jangam struct da9052_rtc *rtc = data; 52fef931ff98fe78bea804d9b4c49d410a7a97988cAshish Jangam int ret; 53fef931ff98fe78bea804d9b4c49d410a7a97988cAshish Jangam 54fef931ff98fe78bea804d9b4c49d410a7a97988cAshish Jangam ret = da9052_reg_read(rtc->da9052, DA9052_ALARM_MI_REG); 55fef931ff98fe78bea804d9b4c49d410a7a97988cAshish Jangam if (ret < 0) { 56fef931ff98fe78bea804d9b4c49d410a7a97988cAshish Jangam rtc_err(rtc->da9052, "Read error: %d\n", ret); 57fef931ff98fe78bea804d9b4c49d410a7a97988cAshish Jangam return IRQ_NONE; 58fef931ff98fe78bea804d9b4c49d410a7a97988cAshish Jangam } 59fef931ff98fe78bea804d9b4c49d410a7a97988cAshish Jangam 60fef931ff98fe78bea804d9b4c49d410a7a97988cAshish Jangam if (ret & DA9052_ALARMMI_ALARMTYPE) { 61fef931ff98fe78bea804d9b4c49d410a7a97988cAshish Jangam da9052_rtc_enable_alarm(rtc->da9052, 0); 62fef931ff98fe78bea804d9b4c49d410a7a97988cAshish Jangam rtc_update_irq(rtc->rtc, 1, RTC_IRQF | RTC_AF); 63fef931ff98fe78bea804d9b4c49d410a7a97988cAshish Jangam } else 64fef931ff98fe78bea804d9b4c49d410a7a97988cAshish Jangam rtc_update_irq(rtc->rtc, 1, RTC_IRQF | RTC_PF); 65fef931ff98fe78bea804d9b4c49d410a7a97988cAshish Jangam 66fef931ff98fe78bea804d9b4c49d410a7a97988cAshish Jangam return IRQ_HANDLED; 67fef931ff98fe78bea804d9b4c49d410a7a97988cAshish Jangam} 68fef931ff98fe78bea804d9b4c49d410a7a97988cAshish Jangam 69fef931ff98fe78bea804d9b4c49d410a7a97988cAshish Jangamstatic int da9052_read_alarm(struct da9052 *da9052, struct rtc_time *rtc_tm) 70fef931ff98fe78bea804d9b4c49d410a7a97988cAshish Jangam{ 71fef931ff98fe78bea804d9b4c49d410a7a97988cAshish Jangam int ret; 72fef931ff98fe78bea804d9b4c49d410a7a97988cAshish Jangam uint8_t v[5]; 73fef931ff98fe78bea804d9b4c49d410a7a97988cAshish Jangam 74fef931ff98fe78bea804d9b4c49d410a7a97988cAshish Jangam ret = da9052_group_read(da9052, DA9052_ALARM_MI_REG, 5, v); 75fef931ff98fe78bea804d9b4c49d410a7a97988cAshish Jangam if (ret != 0) { 76fef931ff98fe78bea804d9b4c49d410a7a97988cAshish Jangam rtc_err(da9052, "Failed to group read ALM: %d\n", ret); 77fef931ff98fe78bea804d9b4c49d410a7a97988cAshish Jangam return ret; 78fef931ff98fe78bea804d9b4c49d410a7a97988cAshish Jangam } 79fef931ff98fe78bea804d9b4c49d410a7a97988cAshish Jangam 80fef931ff98fe78bea804d9b4c49d410a7a97988cAshish Jangam rtc_tm->tm_year = (v[4] & DA9052_RTC_YEAR) + 100; 81fef931ff98fe78bea804d9b4c49d410a7a97988cAshish Jangam rtc_tm->tm_mon = (v[3] & DA9052_RTC_MONTH) - 1; 82fef931ff98fe78bea804d9b4c49d410a7a97988cAshish Jangam rtc_tm->tm_mday = v[2] & DA9052_RTC_DAY; 83fef931ff98fe78bea804d9b4c49d410a7a97988cAshish Jangam rtc_tm->tm_hour = v[1] & DA9052_RTC_HOUR; 84fef931ff98fe78bea804d9b4c49d410a7a97988cAshish Jangam rtc_tm->tm_min = v[0] & DA9052_RTC_MIN; 85fef931ff98fe78bea804d9b4c49d410a7a97988cAshish Jangam 86fef931ff98fe78bea804d9b4c49d410a7a97988cAshish Jangam ret = rtc_valid_tm(rtc_tm); 87fef931ff98fe78bea804d9b4c49d410a7a97988cAshish Jangam if (ret != 0) 88fef931ff98fe78bea804d9b4c49d410a7a97988cAshish Jangam return ret; 89fef931ff98fe78bea804d9b4c49d410a7a97988cAshish Jangam return ret; 90fef931ff98fe78bea804d9b4c49d410a7a97988cAshish Jangam} 91fef931ff98fe78bea804d9b4c49d410a7a97988cAshish Jangam 92fef931ff98fe78bea804d9b4c49d410a7a97988cAshish Jangamstatic int da9052_set_alarm(struct da9052 *da9052, struct rtc_time *rtc_tm) 93fef931ff98fe78bea804d9b4c49d410a7a97988cAshish Jangam{ 94fef931ff98fe78bea804d9b4c49d410a7a97988cAshish Jangam int ret; 95fef931ff98fe78bea804d9b4c49d410a7a97988cAshish Jangam uint8_t v[3]; 96fef931ff98fe78bea804d9b4c49d410a7a97988cAshish Jangam 97fef931ff98fe78bea804d9b4c49d410a7a97988cAshish Jangam rtc_tm->tm_year -= 100; 98fef931ff98fe78bea804d9b4c49d410a7a97988cAshish Jangam rtc_tm->tm_mon += 1; 99fef931ff98fe78bea804d9b4c49d410a7a97988cAshish Jangam 100fef931ff98fe78bea804d9b4c49d410a7a97988cAshish Jangam ret = da9052_reg_update(da9052, DA9052_ALARM_MI_REG, 101fef931ff98fe78bea804d9b4c49d410a7a97988cAshish Jangam DA9052_RTC_MIN, rtc_tm->tm_min); 102fef931ff98fe78bea804d9b4c49d410a7a97988cAshish Jangam if (ret != 0) { 103fef931ff98fe78bea804d9b4c49d410a7a97988cAshish Jangam rtc_err(da9052, "Failed to write ALRM MIN: %d\n", ret); 104fef931ff98fe78bea804d9b4c49d410a7a97988cAshish Jangam return ret; 105fef931ff98fe78bea804d9b4c49d410a7a97988cAshish Jangam } 106fef931ff98fe78bea804d9b4c49d410a7a97988cAshish Jangam 107fef931ff98fe78bea804d9b4c49d410a7a97988cAshish Jangam v[0] = rtc_tm->tm_hour; 108fef931ff98fe78bea804d9b4c49d410a7a97988cAshish Jangam v[1] = rtc_tm->tm_mday; 109fef931ff98fe78bea804d9b4c49d410a7a97988cAshish Jangam v[2] = rtc_tm->tm_mon; 110fef931ff98fe78bea804d9b4c49d410a7a97988cAshish Jangam 111fef931ff98fe78bea804d9b4c49d410a7a97988cAshish Jangam ret = da9052_group_write(da9052, DA9052_ALARM_H_REG, 3, v); 112fef931ff98fe78bea804d9b4c49d410a7a97988cAshish Jangam if (ret < 0) 113fef931ff98fe78bea804d9b4c49d410a7a97988cAshish Jangam return ret; 114fef931ff98fe78bea804d9b4c49d410a7a97988cAshish Jangam 115fef931ff98fe78bea804d9b4c49d410a7a97988cAshish Jangam ret = da9052_reg_update(da9052, DA9052_ALARM_Y_REG, 116fef931ff98fe78bea804d9b4c49d410a7a97988cAshish Jangam DA9052_RTC_YEAR, rtc_tm->tm_year); 117fef931ff98fe78bea804d9b4c49d410a7a97988cAshish Jangam if (ret != 0) 118fef931ff98fe78bea804d9b4c49d410a7a97988cAshish Jangam rtc_err(da9052, "Failed to write ALRM YEAR: %d\n", ret); 119fef931ff98fe78bea804d9b4c49d410a7a97988cAshish Jangam 120fef931ff98fe78bea804d9b4c49d410a7a97988cAshish Jangam return ret; 121fef931ff98fe78bea804d9b4c49d410a7a97988cAshish Jangam} 122fef931ff98fe78bea804d9b4c49d410a7a97988cAshish Jangam 123fef931ff98fe78bea804d9b4c49d410a7a97988cAshish Jangamstatic int da9052_rtc_get_alarm_status(struct da9052 *da9052) 124fef931ff98fe78bea804d9b4c49d410a7a97988cAshish Jangam{ 125fef931ff98fe78bea804d9b4c49d410a7a97988cAshish Jangam int ret; 126fef931ff98fe78bea804d9b4c49d410a7a97988cAshish Jangam 127fef931ff98fe78bea804d9b4c49d410a7a97988cAshish Jangam ret = da9052_reg_read(da9052, DA9052_ALARM_Y_REG); 128fef931ff98fe78bea804d9b4c49d410a7a97988cAshish Jangam if (ret < 0) { 129fef931ff98fe78bea804d9b4c49d410a7a97988cAshish Jangam rtc_err(da9052, "Failed to read ALM: %d\n", ret); 130fef931ff98fe78bea804d9b4c49d410a7a97988cAshish Jangam return ret; 131fef931ff98fe78bea804d9b4c49d410a7a97988cAshish Jangam } 132fef931ff98fe78bea804d9b4c49d410a7a97988cAshish Jangam ret &= DA9052_ALARM_Y_ALARM_ON; 133fef931ff98fe78bea804d9b4c49d410a7a97988cAshish Jangam return (ret > 0) ? 1 : 0; 134fef931ff98fe78bea804d9b4c49d410a7a97988cAshish Jangam} 135fef931ff98fe78bea804d9b4c49d410a7a97988cAshish Jangam 136fef931ff98fe78bea804d9b4c49d410a7a97988cAshish Jangamstatic int da9052_rtc_read_time(struct device *dev, struct rtc_time *rtc_tm) 137fef931ff98fe78bea804d9b4c49d410a7a97988cAshish Jangam{ 138fef931ff98fe78bea804d9b4c49d410a7a97988cAshish Jangam struct da9052_rtc *rtc = dev_get_drvdata(dev); 139fef931ff98fe78bea804d9b4c49d410a7a97988cAshish Jangam uint8_t v[6]; 140fef931ff98fe78bea804d9b4c49d410a7a97988cAshish Jangam int ret; 141fef931ff98fe78bea804d9b4c49d410a7a97988cAshish Jangam 142fef931ff98fe78bea804d9b4c49d410a7a97988cAshish Jangam ret = da9052_group_read(rtc->da9052, DA9052_COUNT_S_REG, 6, v); 143fef931ff98fe78bea804d9b4c49d410a7a97988cAshish Jangam if (ret < 0) { 144fef931ff98fe78bea804d9b4c49d410a7a97988cAshish Jangam rtc_err(rtc->da9052, "Failed to read RTC time : %d\n", ret); 145fef931ff98fe78bea804d9b4c49d410a7a97988cAshish Jangam return ret; 146fef931ff98fe78bea804d9b4c49d410a7a97988cAshish Jangam } 147fef931ff98fe78bea804d9b4c49d410a7a97988cAshish Jangam 148fef931ff98fe78bea804d9b4c49d410a7a97988cAshish Jangam rtc_tm->tm_year = (v[5] & DA9052_RTC_YEAR) + 100; 149fef931ff98fe78bea804d9b4c49d410a7a97988cAshish Jangam rtc_tm->tm_mon = (v[4] & DA9052_RTC_MONTH) - 1; 150fef931ff98fe78bea804d9b4c49d410a7a97988cAshish Jangam rtc_tm->tm_mday = v[3] & DA9052_RTC_DAY; 151fef931ff98fe78bea804d9b4c49d410a7a97988cAshish Jangam rtc_tm->tm_hour = v[2] & DA9052_RTC_HOUR; 152fef931ff98fe78bea804d9b4c49d410a7a97988cAshish Jangam rtc_tm->tm_min = v[1] & DA9052_RTC_MIN; 153fef931ff98fe78bea804d9b4c49d410a7a97988cAshish Jangam rtc_tm->tm_sec = v[0] & DA9052_RTC_SEC; 154fef931ff98fe78bea804d9b4c49d410a7a97988cAshish Jangam 155fef931ff98fe78bea804d9b4c49d410a7a97988cAshish Jangam ret = rtc_valid_tm(rtc_tm); 156fef931ff98fe78bea804d9b4c49d410a7a97988cAshish Jangam if (ret != 0) { 157fef931ff98fe78bea804d9b4c49d410a7a97988cAshish Jangam rtc_err(rtc->da9052, "rtc_valid_tm failed: %d\n", ret); 158fef931ff98fe78bea804d9b4c49d410a7a97988cAshish Jangam return ret; 159fef931ff98fe78bea804d9b4c49d410a7a97988cAshish Jangam } 160fef931ff98fe78bea804d9b4c49d410a7a97988cAshish Jangam 161fef931ff98fe78bea804d9b4c49d410a7a97988cAshish Jangam return 0; 162fef931ff98fe78bea804d9b4c49d410a7a97988cAshish Jangam} 163fef931ff98fe78bea804d9b4c49d410a7a97988cAshish Jangam 164fef931ff98fe78bea804d9b4c49d410a7a97988cAshish Jangamstatic int da9052_rtc_set_time(struct device *dev, struct rtc_time *tm) 165fef931ff98fe78bea804d9b4c49d410a7a97988cAshish Jangam{ 166fef931ff98fe78bea804d9b4c49d410a7a97988cAshish Jangam struct da9052_rtc *rtc; 167fef931ff98fe78bea804d9b4c49d410a7a97988cAshish Jangam uint8_t v[6]; 168fef931ff98fe78bea804d9b4c49d410a7a97988cAshish Jangam 169fef931ff98fe78bea804d9b4c49d410a7a97988cAshish Jangam rtc = dev_get_drvdata(dev); 170fef931ff98fe78bea804d9b4c49d410a7a97988cAshish Jangam 171fef931ff98fe78bea804d9b4c49d410a7a97988cAshish Jangam v[0] = tm->tm_sec; 172fef931ff98fe78bea804d9b4c49d410a7a97988cAshish Jangam v[1] = tm->tm_min; 173fef931ff98fe78bea804d9b4c49d410a7a97988cAshish Jangam v[2] = tm->tm_hour; 174fef931ff98fe78bea804d9b4c49d410a7a97988cAshish Jangam v[3] = tm->tm_mday; 175fef931ff98fe78bea804d9b4c49d410a7a97988cAshish Jangam v[4] = tm->tm_mon + 1; 176fef931ff98fe78bea804d9b4c49d410a7a97988cAshish Jangam v[5] = tm->tm_year - 100; 177fef931ff98fe78bea804d9b4c49d410a7a97988cAshish Jangam 178fef931ff98fe78bea804d9b4c49d410a7a97988cAshish Jangam return da9052_group_write(rtc->da9052, DA9052_COUNT_S_REG, 6, v); 179fef931ff98fe78bea804d9b4c49d410a7a97988cAshish Jangam} 180fef931ff98fe78bea804d9b4c49d410a7a97988cAshish Jangam 181fef931ff98fe78bea804d9b4c49d410a7a97988cAshish Jangamstatic int da9052_rtc_read_alarm(struct device *dev, struct rtc_wkalrm *alrm) 182fef931ff98fe78bea804d9b4c49d410a7a97988cAshish Jangam{ 183fef931ff98fe78bea804d9b4c49d410a7a97988cAshish Jangam int ret; 184fef931ff98fe78bea804d9b4c49d410a7a97988cAshish Jangam struct rtc_time *tm = &alrm->time; 185fef931ff98fe78bea804d9b4c49d410a7a97988cAshish Jangam struct da9052_rtc *rtc = dev_get_drvdata(dev); 186fef931ff98fe78bea804d9b4c49d410a7a97988cAshish Jangam 187fef931ff98fe78bea804d9b4c49d410a7a97988cAshish Jangam ret = da9052_read_alarm(rtc->da9052, tm); 188fef931ff98fe78bea804d9b4c49d410a7a97988cAshish Jangam 189fef931ff98fe78bea804d9b4c49d410a7a97988cAshish Jangam if (ret) 190fef931ff98fe78bea804d9b4c49d410a7a97988cAshish Jangam return ret; 191fef931ff98fe78bea804d9b4c49d410a7a97988cAshish Jangam 192fef931ff98fe78bea804d9b4c49d410a7a97988cAshish Jangam alrm->enabled = da9052_rtc_get_alarm_status(rtc->da9052); 193fef931ff98fe78bea804d9b4c49d410a7a97988cAshish Jangam 194fef931ff98fe78bea804d9b4c49d410a7a97988cAshish Jangam return 0; 195fef931ff98fe78bea804d9b4c49d410a7a97988cAshish Jangam} 196fef931ff98fe78bea804d9b4c49d410a7a97988cAshish Jangam 197fef931ff98fe78bea804d9b4c49d410a7a97988cAshish Jangamstatic int da9052_rtc_set_alarm(struct device *dev, struct rtc_wkalrm *alrm) 198fef931ff98fe78bea804d9b4c49d410a7a97988cAshish Jangam{ 199fef931ff98fe78bea804d9b4c49d410a7a97988cAshish Jangam int ret; 200fef931ff98fe78bea804d9b4c49d410a7a97988cAshish Jangam struct rtc_time *tm = &alrm->time; 201fef931ff98fe78bea804d9b4c49d410a7a97988cAshish Jangam struct da9052_rtc *rtc = dev_get_drvdata(dev); 202fef931ff98fe78bea804d9b4c49d410a7a97988cAshish Jangam 203fef931ff98fe78bea804d9b4c49d410a7a97988cAshish Jangam ret = da9052_rtc_enable_alarm(rtc->da9052, 0); 204fef931ff98fe78bea804d9b4c49d410a7a97988cAshish Jangam if (ret < 0) 205fef931ff98fe78bea804d9b4c49d410a7a97988cAshish Jangam return ret; 206fef931ff98fe78bea804d9b4c49d410a7a97988cAshish Jangam 207fef931ff98fe78bea804d9b4c49d410a7a97988cAshish Jangam ret = da9052_set_alarm(rtc->da9052, tm); 208fef931ff98fe78bea804d9b4c49d410a7a97988cAshish Jangam if (ret) 209fef931ff98fe78bea804d9b4c49d410a7a97988cAshish Jangam return ret; 210fef931ff98fe78bea804d9b4c49d410a7a97988cAshish Jangam 211fef931ff98fe78bea804d9b4c49d410a7a97988cAshish Jangam ret = da9052_rtc_enable_alarm(rtc->da9052, 1); 212fef931ff98fe78bea804d9b4c49d410a7a97988cAshish Jangam 213fef931ff98fe78bea804d9b4c49d410a7a97988cAshish Jangam return ret; 214fef931ff98fe78bea804d9b4c49d410a7a97988cAshish Jangam} 215fef931ff98fe78bea804d9b4c49d410a7a97988cAshish Jangam 216fef931ff98fe78bea804d9b4c49d410a7a97988cAshish Jangamstatic int da9052_rtc_alarm_irq_enable(struct device *dev, unsigned int enabled) 217fef931ff98fe78bea804d9b4c49d410a7a97988cAshish Jangam{ 218fef931ff98fe78bea804d9b4c49d410a7a97988cAshish Jangam struct da9052_rtc *rtc = dev_get_drvdata(dev); 219fef931ff98fe78bea804d9b4c49d410a7a97988cAshish Jangam 220fef931ff98fe78bea804d9b4c49d410a7a97988cAshish Jangam return da9052_rtc_enable_alarm(rtc->da9052, enabled); 221fef931ff98fe78bea804d9b4c49d410a7a97988cAshish Jangam} 222fef931ff98fe78bea804d9b4c49d410a7a97988cAshish Jangam 223fef931ff98fe78bea804d9b4c49d410a7a97988cAshish Jangamstatic const struct rtc_class_ops da9052_rtc_ops = { 224fef931ff98fe78bea804d9b4c49d410a7a97988cAshish Jangam .read_time = da9052_rtc_read_time, 225fef931ff98fe78bea804d9b4c49d410a7a97988cAshish Jangam .set_time = da9052_rtc_set_time, 226fef931ff98fe78bea804d9b4c49d410a7a97988cAshish Jangam .read_alarm = da9052_rtc_read_alarm, 227fef931ff98fe78bea804d9b4c49d410a7a97988cAshish Jangam .set_alarm = da9052_rtc_set_alarm, 228fef931ff98fe78bea804d9b4c49d410a7a97988cAshish Jangam .alarm_irq_enable = da9052_rtc_alarm_irq_enable, 229fef931ff98fe78bea804d9b4c49d410a7a97988cAshish Jangam}; 230fef931ff98fe78bea804d9b4c49d410a7a97988cAshish Jangam 2315a167f4543e45d45c5672a5cd6cb8ba5ddf4f3eaGreg Kroah-Hartmanstatic int da9052_rtc_probe(struct platform_device *pdev) 232fef931ff98fe78bea804d9b4c49d410a7a97988cAshish Jangam{ 233fef931ff98fe78bea804d9b4c49d410a7a97988cAshish Jangam struct da9052_rtc *rtc; 234fef931ff98fe78bea804d9b4c49d410a7a97988cAshish Jangam int ret; 235fef931ff98fe78bea804d9b4c49d410a7a97988cAshish Jangam 236fef931ff98fe78bea804d9b4c49d410a7a97988cAshish Jangam rtc = devm_kzalloc(&pdev->dev, sizeof(struct da9052_rtc), GFP_KERNEL); 237fef931ff98fe78bea804d9b4c49d410a7a97988cAshish Jangam if (!rtc) 238fef931ff98fe78bea804d9b4c49d410a7a97988cAshish Jangam return -ENOMEM; 239fef931ff98fe78bea804d9b4c49d410a7a97988cAshish Jangam 240fef931ff98fe78bea804d9b4c49d410a7a97988cAshish Jangam rtc->da9052 = dev_get_drvdata(pdev->dev.parent); 241fef931ff98fe78bea804d9b4c49d410a7a97988cAshish Jangam platform_set_drvdata(pdev, rtc); 242925e8ea6bca2c9a590565634b27768d7042e089fAshish Jangam rtc->irq = DA9052_IRQ_ALARM; 243925e8ea6bca2c9a590565634b27768d7042e089fAshish Jangam ret = da9052_request_irq(rtc->da9052, rtc->irq, "ALM", 244925e8ea6bca2c9a590565634b27768d7042e089fAshish Jangam da9052_rtc_irq, rtc); 245fef931ff98fe78bea804d9b4c49d410a7a97988cAshish Jangam if (ret != 0) { 246fef931ff98fe78bea804d9b4c49d410a7a97988cAshish Jangam rtc_err(rtc->da9052, "irq registration failed: %d\n", ret); 247007def046711479f3d19bec4016b65fd73deed6cDevendra Naga return ret; 248fef931ff98fe78bea804d9b4c49d410a7a97988cAshish Jangam } 249fef931ff98fe78bea804d9b4c49d410a7a97988cAshish Jangam 2503689cd741f627ee49a1a4d5c9aec49e120b6c291Jingoo Han rtc->rtc = devm_rtc_device_register(&pdev->dev, pdev->name, 251fef931ff98fe78bea804d9b4c49d410a7a97988cAshish Jangam &da9052_rtc_ops, THIS_MODULE); 25227239a1498f85c16306fdc614658d0bc1ee685efJingoo Han if (IS_ERR(rtc->rtc)) 25327239a1498f85c16306fdc614658d0bc1ee685efJingoo Han return PTR_ERR(rtc->rtc); 254fef931ff98fe78bea804d9b4c49d410a7a97988cAshish Jangam 255fef931ff98fe78bea804d9b4c49d410a7a97988cAshish Jangam return 0; 256fef931ff98fe78bea804d9b4c49d410a7a97988cAshish Jangam} 257fef931ff98fe78bea804d9b4c49d410a7a97988cAshish Jangam 2585a167f4543e45d45c5672a5cd6cb8ba5ddf4f3eaGreg Kroah-Hartmanstatic int da9052_rtc_remove(struct platform_device *pdev) 259fef931ff98fe78bea804d9b4c49d410a7a97988cAshish Jangam{ 260fef931ff98fe78bea804d9b4c49d410a7a97988cAshish Jangam platform_set_drvdata(pdev, NULL); 261fef931ff98fe78bea804d9b4c49d410a7a97988cAshish Jangam 262fef931ff98fe78bea804d9b4c49d410a7a97988cAshish Jangam return 0; 263fef931ff98fe78bea804d9b4c49d410a7a97988cAshish Jangam} 264fef931ff98fe78bea804d9b4c49d410a7a97988cAshish Jangam 265fef931ff98fe78bea804d9b4c49d410a7a97988cAshish Jangamstatic struct platform_driver da9052_rtc_driver = { 266fef931ff98fe78bea804d9b4c49d410a7a97988cAshish Jangam .probe = da9052_rtc_probe, 2675a167f4543e45d45c5672a5cd6cb8ba5ddf4f3eaGreg Kroah-Hartman .remove = da9052_rtc_remove, 268fef931ff98fe78bea804d9b4c49d410a7a97988cAshish Jangam .driver = { 269fef931ff98fe78bea804d9b4c49d410a7a97988cAshish Jangam .name = "da9052-rtc", 270fef931ff98fe78bea804d9b4c49d410a7a97988cAshish Jangam .owner = THIS_MODULE, 271fef931ff98fe78bea804d9b4c49d410a7a97988cAshish Jangam }, 272fef931ff98fe78bea804d9b4c49d410a7a97988cAshish Jangam}; 273fef931ff98fe78bea804d9b4c49d410a7a97988cAshish Jangam 274fef931ff98fe78bea804d9b4c49d410a7a97988cAshish Jangammodule_platform_driver(da9052_rtc_driver); 275fef931ff98fe78bea804d9b4c49d410a7a97988cAshish Jangam 276fef931ff98fe78bea804d9b4c49d410a7a97988cAshish JangamMODULE_AUTHOR("David Dajun Chen <dchen@diasemi.com>"); 277fef931ff98fe78bea804d9b4c49d410a7a97988cAshish JangamMODULE_DESCRIPTION("RTC driver for Dialog DA9052 PMIC"); 278fef931ff98fe78bea804d9b4c49d410a7a97988cAshish JangamMODULE_LICENSE("GPL"); 279fef931ff98fe78bea804d9b4c49d410a7a97988cAshish JangamMODULE_ALIAS("platform:da9052-rtc"); 280