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