Linux Audio

Check our new training course

Loading...
v4.6
 
  1/*
  2 * rtc-rc5t583.c -- RICOH RC5T583 Real Time Clock
  3 *
  4 * Copyright (c) 2012, NVIDIA CORPORATION.  All rights reserved.
  5 * Author: Venu Byravarasu <vbyravarasu@nvidia.com>
  6 *
  7 * This program is free software; you can redistribute it and/or modify it
  8 * under the terms and conditions of the GNU General Public License,
  9 * version 2, as published by the Free Software Foundation.
 10 *
 11 * This program is distributed in the hope it will be useful, but WITHOUT
 12 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
 13 * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for
 14 * more details.
 15 *
 16 * You should have received a copy of the GNU General Public License
 17 * along with this program.  If not, see <http://www.gnu.org/licenses/>. */
 18
 19#include <linux/kernel.h>
 20#include <linux/errno.h>
 21#include <linux/init.h>
 22#include <linux/module.h>
 23#include <linux/types.h>
 24#include <linux/rtc.h>
 25#include <linux/bcd.h>
 26#include <linux/platform_device.h>
 27#include <linux/interrupt.h>
 28#include <linux/mfd/rc5t583.h>
 29
 30struct rc5t583_rtc {
 31	struct rtc_device	*rtc;
 32	/* To store the list of enabled interrupts, during system suspend */
 33	u32 irqen;
 34};
 35
 36/* Total number of RTC registers needed to set time*/
 37#define NUM_TIME_REGS	(RC5T583_RTC_YEAR - RC5T583_RTC_SEC + 1)
 38
 39/* Total number of RTC registers needed to set Y-Alarm*/
 40#define NUM_YAL_REGS	(RC5T583_RTC_AY_YEAR - RC5T583_RTC_AY_MIN + 1)
 41
 42/* Set Y-Alarm interrupt */
 43#define SET_YAL BIT(5)
 44
 45/* Get Y-Alarm interrupt status*/
 46#define GET_YAL_STATUS BIT(3)
 47
 48static int rc5t583_rtc_alarm_irq_enable(struct device *dev, unsigned enabled)
 49{
 50	struct rc5t583 *rc5t583 = dev_get_drvdata(dev->parent);
 51	u8 val;
 52
 53	/* Set Y-Alarm, based on 'enabled' */
 54	val = enabled ? SET_YAL : 0;
 55
 56	return regmap_update_bits(rc5t583->regmap, RC5T583_RTC_CTL1, SET_YAL,
 57		val);
 58}
 59
 60/*
 61 * Gets current rc5t583 RTC time and date parameters.
 62 *
 63 * The RTC's time/alarm representation is not what gmtime(3) requires
 64 * Linux to use:
 65 *
 66 *  - Months are 1..12 vs Linux 0-11
 67 *  - Years are 0..99 vs Linux 1900..N (we assume 21st century)
 68 */
 69static int rc5t583_rtc_read_time(struct device *dev, struct rtc_time *tm)
 70{
 71	struct rc5t583 *rc5t583 = dev_get_drvdata(dev->parent);
 72	u8 rtc_data[NUM_TIME_REGS];
 73	int ret;
 74
 75	ret = regmap_bulk_read(rc5t583->regmap, RC5T583_RTC_SEC, rtc_data,
 76		NUM_TIME_REGS);
 77	if (ret < 0) {
 78		dev_err(dev, "RTC read time failed with err:%d\n", ret);
 79		return ret;
 80	}
 81
 82	tm->tm_sec = bcd2bin(rtc_data[0]);
 83	tm->tm_min = bcd2bin(rtc_data[1]);
 84	tm->tm_hour = bcd2bin(rtc_data[2]);
 85	tm->tm_wday = bcd2bin(rtc_data[3]);
 86	tm->tm_mday = bcd2bin(rtc_data[4]);
 87	tm->tm_mon = bcd2bin(rtc_data[5]) - 1;
 88	tm->tm_year = bcd2bin(rtc_data[6]) + 100;
 89
 90	return ret;
 91}
 92
 93static int rc5t583_rtc_set_time(struct device *dev, struct rtc_time *tm)
 94{
 95	struct rc5t583 *rc5t583 = dev_get_drvdata(dev->parent);
 96	unsigned char rtc_data[NUM_TIME_REGS];
 97	int ret;
 98
 99	rtc_data[0] = bin2bcd(tm->tm_sec);
100	rtc_data[1] = bin2bcd(tm->tm_min);
101	rtc_data[2] = bin2bcd(tm->tm_hour);
102	rtc_data[3] = bin2bcd(tm->tm_wday);
103	rtc_data[4] = bin2bcd(tm->tm_mday);
104	rtc_data[5] = bin2bcd(tm->tm_mon + 1);
105	rtc_data[6] = bin2bcd(tm->tm_year - 100);
106
107	ret = regmap_bulk_write(rc5t583->regmap, RC5T583_RTC_SEC, rtc_data,
108		NUM_TIME_REGS);
109	if (ret < 0) {
110		dev_err(dev, "RTC set time failed with error %d\n", ret);
111		return ret;
112	}
113
114	return ret;
115}
116
117static int rc5t583_rtc_read_alarm(struct device *dev, struct rtc_wkalrm *alm)
118{
119	struct rc5t583 *rc5t583 = dev_get_drvdata(dev->parent);
120	unsigned char alarm_data[NUM_YAL_REGS];
121	u32 interrupt_enable;
122	int ret;
123
124	ret = regmap_bulk_read(rc5t583->regmap, RC5T583_RTC_AY_MIN, alarm_data,
125		NUM_YAL_REGS);
126	if (ret < 0) {
127		dev_err(dev, "rtc_read_alarm error %d\n", ret);
128		return ret;
129	}
130
 
131	alm->time.tm_min = bcd2bin(alarm_data[0]);
132	alm->time.tm_hour = bcd2bin(alarm_data[1]);
133	alm->time.tm_mday = bcd2bin(alarm_data[2]);
134	alm->time.tm_mon = bcd2bin(alarm_data[3]) - 1;
135	alm->time.tm_year = bcd2bin(alarm_data[4]) + 100;
136
137	ret = regmap_read(rc5t583->regmap, RC5T583_RTC_CTL1, &interrupt_enable);
138	if (ret < 0)
139		return ret;
140
141	/* check if YALE is set */
142	if (interrupt_enable & SET_YAL)
143		alm->enabled = 1;
144
145	return ret;
146}
147
148static int rc5t583_rtc_set_alarm(struct device *dev, struct rtc_wkalrm *alm)
149{
150	struct rc5t583 *rc5t583 = dev_get_drvdata(dev->parent);
151	unsigned char alarm_data[NUM_YAL_REGS];
152	int ret;
153
154	ret = rc5t583_rtc_alarm_irq_enable(dev, 0);
155	if (ret)
156		return ret;
157
158	alarm_data[0] = bin2bcd(alm->time.tm_min);
159	alarm_data[1] = bin2bcd(alm->time.tm_hour);
160	alarm_data[2] = bin2bcd(alm->time.tm_mday);
161	alarm_data[3] = bin2bcd(alm->time.tm_mon + 1);
162	alarm_data[4] = bin2bcd(alm->time.tm_year - 100);
163
164	ret = regmap_bulk_write(rc5t583->regmap, RC5T583_RTC_AY_MIN, alarm_data,
165		NUM_YAL_REGS);
166	if (ret) {
167		dev_err(dev, "rtc_set_alarm error %d\n", ret);
168		return ret;
169	}
170
171	if (alm->enabled)
172		ret = rc5t583_rtc_alarm_irq_enable(dev, 1);
173
174	return ret;
175}
176
177static irqreturn_t rc5t583_rtc_interrupt(int irq, void *rtc)
178{
179	struct device *dev = rtc;
180	struct rc5t583 *rc5t583 = dev_get_drvdata(dev->parent);
181	struct rc5t583_rtc *rc5t583_rtc = dev_get_drvdata(dev);
182	unsigned long events = 0;
183	int ret;
184	u32 rtc_reg;
185
186	ret = regmap_read(rc5t583->regmap, RC5T583_RTC_CTL2, &rtc_reg);
187	if (ret < 0)
188		return IRQ_NONE;
189
190	if (rtc_reg & GET_YAL_STATUS) {
191		events = RTC_IRQF | RTC_AF;
192		/* clear pending Y-alarm interrupt bit */
193		rtc_reg &= ~GET_YAL_STATUS;
194	}
195
196	ret = regmap_write(rc5t583->regmap, RC5T583_RTC_CTL2, rtc_reg);
197	if (ret)
198		return IRQ_NONE;
199
200	/* Notify RTC core on event */
201	rtc_update_irq(rc5t583_rtc->rtc, 1, events);
202
203	return IRQ_HANDLED;
204}
205
206static const struct rtc_class_ops rc5t583_rtc_ops = {
207	.read_time	= rc5t583_rtc_read_time,
208	.set_time	= rc5t583_rtc_set_time,
209	.read_alarm	= rc5t583_rtc_read_alarm,
210	.set_alarm	= rc5t583_rtc_set_alarm,
211	.alarm_irq_enable = rc5t583_rtc_alarm_irq_enable,
212};
213
214static int rc5t583_rtc_probe(struct platform_device *pdev)
215{
216	struct rc5t583 *rc5t583 = dev_get_drvdata(pdev->dev.parent);
217	struct rc5t583_rtc *ricoh_rtc;
218	struct rc5t583_platform_data *pmic_plat_data;
219	int ret;
220	int irq;
221
222	ricoh_rtc = devm_kzalloc(&pdev->dev, sizeof(struct rc5t583_rtc),
223			GFP_KERNEL);
224	if (!ricoh_rtc)
225		return -ENOMEM;
226
227	platform_set_drvdata(pdev, ricoh_rtc);
228
229	/* Clear pending interrupts */
230	ret = regmap_write(rc5t583->regmap, RC5T583_RTC_CTL2, 0);
231	if (ret < 0)
232		return ret;
233
234	/* clear RTC Adjust register */
235	ret = regmap_write(rc5t583->regmap, RC5T583_RTC_ADJ, 0);
236	if (ret < 0) {
237		dev_err(&pdev->dev, "unable to program rtc_adjust reg\n");
238		return -EBUSY;
239	}
240
241	pmic_plat_data = dev_get_platdata(rc5t583->dev);
242	irq = pmic_plat_data->irq_base;
243	if (irq <= 0) {
244		dev_warn(&pdev->dev, "Wake up is not possible as irq = %d\n",
245			irq);
246		return ret;
247	}
248
249	irq += RC5T583_IRQ_YALE;
250	ret = devm_request_threaded_irq(&pdev->dev, irq, NULL,
251		rc5t583_rtc_interrupt, IRQF_TRIGGER_LOW,
252		"rtc-rc5t583", &pdev->dev);
253	if (ret < 0) {
254		dev_err(&pdev->dev, "IRQ is not free.\n");
255		return ret;
256	}
257	device_init_wakeup(&pdev->dev, 1);
258
259	ricoh_rtc->rtc = devm_rtc_device_register(&pdev->dev, pdev->name,
260		&rc5t583_rtc_ops, THIS_MODULE);
261	if (IS_ERR(ricoh_rtc->rtc)) {
262		ret = PTR_ERR(ricoh_rtc->rtc);
263		dev_err(&pdev->dev, "RTC device register: err %d\n", ret);
264		return ret;
265	}
266
267	return 0;
268}
269
270/*
271 * Disable rc5t583 RTC interrupts.
272 * Sets status flag to free.
273 */
274static int rc5t583_rtc_remove(struct platform_device *pdev)
275{
276	struct rc5t583_rtc *rc5t583_rtc = platform_get_drvdata(pdev);
277
278	rc5t583_rtc_alarm_irq_enable(&rc5t583_rtc->rtc->dev, 0);
279	return 0;
280}
281
282#ifdef CONFIG_PM_SLEEP
283static int rc5t583_rtc_suspend(struct device *dev)
284{
285	struct rc5t583 *rc5t583 = dev_get_drvdata(dev->parent);
286	struct rc5t583_rtc *rc5t583_rtc = dev_get_drvdata(dev);
287	int ret;
288
289	/* Store current list of enabled interrupts*/
290	ret = regmap_read(rc5t583->regmap, RC5T583_RTC_CTL1,
291		&rc5t583_rtc->irqen);
292	return ret;
293}
294
295static int rc5t583_rtc_resume(struct device *dev)
296{
297	struct rc5t583 *rc5t583 = dev_get_drvdata(dev->parent);
298	struct rc5t583_rtc *rc5t583_rtc = dev_get_drvdata(dev);
299
300	/* Restore list of enabled interrupts before suspend */
301	return regmap_write(rc5t583->regmap, RC5T583_RTC_CTL1,
302		rc5t583_rtc->irqen);
303}
304#endif
305
306static SIMPLE_DEV_PM_OPS(rc5t583_rtc_pm_ops, rc5t583_rtc_suspend,
307			rc5t583_rtc_resume);
308
309static struct platform_driver rc5t583_rtc_driver = {
310	.probe		= rc5t583_rtc_probe,
311	.remove		= rc5t583_rtc_remove,
312	.driver		= {
313		.name	= "rtc-rc5t583",
314		.pm	= &rc5t583_rtc_pm_ops,
315	},
316};
317
318module_platform_driver(rc5t583_rtc_driver);
319MODULE_ALIAS("platform:rtc-rc5t583");
320MODULE_AUTHOR("Venu Byravarasu <vbyravarasu@nvidia.com>");
321MODULE_LICENSE("GPL v2");
v5.9
  1// SPDX-License-Identifier: GPL-2.0-only
  2/*
  3 * rtc-rc5t583.c -- RICOH RC5T583 Real Time Clock
  4 *
  5 * Copyright (c) 2012, NVIDIA CORPORATION.  All rights reserved.
  6 * Author: Venu Byravarasu <vbyravarasu@nvidia.com>
  7 */
 
 
 
 
 
 
 
 
 
 
 
  8
  9#include <linux/kernel.h>
 10#include <linux/errno.h>
 11#include <linux/init.h>
 12#include <linux/module.h>
 13#include <linux/types.h>
 14#include <linux/rtc.h>
 15#include <linux/bcd.h>
 16#include <linux/platform_device.h>
 17#include <linux/interrupt.h>
 18#include <linux/mfd/rc5t583.h>
 19
 20struct rc5t583_rtc {
 21	struct rtc_device	*rtc;
 22	/* To store the list of enabled interrupts, during system suspend */
 23	u32 irqen;
 24};
 25
 26/* Total number of RTC registers needed to set time*/
 27#define NUM_TIME_REGS	(RC5T583_RTC_YEAR - RC5T583_RTC_SEC + 1)
 28
 29/* Total number of RTC registers needed to set Y-Alarm*/
 30#define NUM_YAL_REGS	(RC5T583_RTC_AY_YEAR - RC5T583_RTC_AY_MIN + 1)
 31
 32/* Set Y-Alarm interrupt */
 33#define SET_YAL BIT(5)
 34
 35/* Get Y-Alarm interrupt status*/
 36#define GET_YAL_STATUS BIT(3)
 37
 38static int rc5t583_rtc_alarm_irq_enable(struct device *dev, unsigned enabled)
 39{
 40	struct rc5t583 *rc5t583 = dev_get_drvdata(dev->parent);
 41	u8 val;
 42
 43	/* Set Y-Alarm, based on 'enabled' */
 44	val = enabled ? SET_YAL : 0;
 45
 46	return regmap_update_bits(rc5t583->regmap, RC5T583_RTC_CTL1, SET_YAL,
 47		val);
 48}
 49
 50/*
 51 * Gets current rc5t583 RTC time and date parameters.
 52 *
 53 * The RTC's time/alarm representation is not what gmtime(3) requires
 54 * Linux to use:
 55 *
 56 *  - Months are 1..12 vs Linux 0-11
 57 *  - Years are 0..99 vs Linux 1900..N (we assume 21st century)
 58 */
 59static int rc5t583_rtc_read_time(struct device *dev, struct rtc_time *tm)
 60{
 61	struct rc5t583 *rc5t583 = dev_get_drvdata(dev->parent);
 62	u8 rtc_data[NUM_TIME_REGS];
 63	int ret;
 64
 65	ret = regmap_bulk_read(rc5t583->regmap, RC5T583_RTC_SEC, rtc_data,
 66		NUM_TIME_REGS);
 67	if (ret < 0) {
 68		dev_err(dev, "RTC read time failed with err:%d\n", ret);
 69		return ret;
 70	}
 71
 72	tm->tm_sec = bcd2bin(rtc_data[0]);
 73	tm->tm_min = bcd2bin(rtc_data[1]);
 74	tm->tm_hour = bcd2bin(rtc_data[2]);
 75	tm->tm_wday = bcd2bin(rtc_data[3]);
 76	tm->tm_mday = bcd2bin(rtc_data[4]);
 77	tm->tm_mon = bcd2bin(rtc_data[5]) - 1;
 78	tm->tm_year = bcd2bin(rtc_data[6]) + 100;
 79
 80	return ret;
 81}
 82
 83static int rc5t583_rtc_set_time(struct device *dev, struct rtc_time *tm)
 84{
 85	struct rc5t583 *rc5t583 = dev_get_drvdata(dev->parent);
 86	unsigned char rtc_data[NUM_TIME_REGS];
 87	int ret;
 88
 89	rtc_data[0] = bin2bcd(tm->tm_sec);
 90	rtc_data[1] = bin2bcd(tm->tm_min);
 91	rtc_data[2] = bin2bcd(tm->tm_hour);
 92	rtc_data[3] = bin2bcd(tm->tm_wday);
 93	rtc_data[4] = bin2bcd(tm->tm_mday);
 94	rtc_data[5] = bin2bcd(tm->tm_mon + 1);
 95	rtc_data[6] = bin2bcd(tm->tm_year - 100);
 96
 97	ret = regmap_bulk_write(rc5t583->regmap, RC5T583_RTC_SEC, rtc_data,
 98		NUM_TIME_REGS);
 99	if (ret < 0) {
100		dev_err(dev, "RTC set time failed with error %d\n", ret);
101		return ret;
102	}
103
104	return ret;
105}
106
107static int rc5t583_rtc_read_alarm(struct device *dev, struct rtc_wkalrm *alm)
108{
109	struct rc5t583 *rc5t583 = dev_get_drvdata(dev->parent);
110	unsigned char alarm_data[NUM_YAL_REGS];
111	u32 interrupt_enable;
112	int ret;
113
114	ret = regmap_bulk_read(rc5t583->regmap, RC5T583_RTC_AY_MIN, alarm_data,
115		NUM_YAL_REGS);
116	if (ret < 0) {
117		dev_err(dev, "rtc_read_alarm error %d\n", ret);
118		return ret;
119	}
120
121	alm->time.tm_sec = 0;
122	alm->time.tm_min = bcd2bin(alarm_data[0]);
123	alm->time.tm_hour = bcd2bin(alarm_data[1]);
124	alm->time.tm_mday = bcd2bin(alarm_data[2]);
125	alm->time.tm_mon = bcd2bin(alarm_data[3]) - 1;
126	alm->time.tm_year = bcd2bin(alarm_data[4]) + 100;
127
128	ret = regmap_read(rc5t583->regmap, RC5T583_RTC_CTL1, &interrupt_enable);
129	if (ret < 0)
130		return ret;
131
132	/* check if YALE is set */
133	if (interrupt_enable & SET_YAL)
134		alm->enabled = 1;
135
136	return ret;
137}
138
139static int rc5t583_rtc_set_alarm(struct device *dev, struct rtc_wkalrm *alm)
140{
141	struct rc5t583 *rc5t583 = dev_get_drvdata(dev->parent);
142	unsigned char alarm_data[NUM_YAL_REGS];
143	int ret;
144
145	ret = rc5t583_rtc_alarm_irq_enable(dev, 0);
146	if (ret)
147		return ret;
148
149	alarm_data[0] = bin2bcd(alm->time.tm_min);
150	alarm_data[1] = bin2bcd(alm->time.tm_hour);
151	alarm_data[2] = bin2bcd(alm->time.tm_mday);
152	alarm_data[3] = bin2bcd(alm->time.tm_mon + 1);
153	alarm_data[4] = bin2bcd(alm->time.tm_year - 100);
154
155	ret = regmap_bulk_write(rc5t583->regmap, RC5T583_RTC_AY_MIN, alarm_data,
156		NUM_YAL_REGS);
157	if (ret) {
158		dev_err(dev, "rtc_set_alarm error %d\n", ret);
159		return ret;
160	}
161
162	if (alm->enabled)
163		ret = rc5t583_rtc_alarm_irq_enable(dev, 1);
164
165	return ret;
166}
167
168static irqreturn_t rc5t583_rtc_interrupt(int irq, void *rtc)
169{
170	struct device *dev = rtc;
171	struct rc5t583 *rc5t583 = dev_get_drvdata(dev->parent);
172	struct rc5t583_rtc *rc5t583_rtc = dev_get_drvdata(dev);
173	unsigned long events = 0;
174	int ret;
175	u32 rtc_reg;
176
177	ret = regmap_read(rc5t583->regmap, RC5T583_RTC_CTL2, &rtc_reg);
178	if (ret < 0)
179		return IRQ_NONE;
180
181	if (rtc_reg & GET_YAL_STATUS) {
182		events = RTC_IRQF | RTC_AF;
183		/* clear pending Y-alarm interrupt bit */
184		rtc_reg &= ~GET_YAL_STATUS;
185	}
186
187	ret = regmap_write(rc5t583->regmap, RC5T583_RTC_CTL2, rtc_reg);
188	if (ret)
189		return IRQ_NONE;
190
191	/* Notify RTC core on event */
192	rtc_update_irq(rc5t583_rtc->rtc, 1, events);
193
194	return IRQ_HANDLED;
195}
196
197static const struct rtc_class_ops rc5t583_rtc_ops = {
198	.read_time	= rc5t583_rtc_read_time,
199	.set_time	= rc5t583_rtc_set_time,
200	.read_alarm	= rc5t583_rtc_read_alarm,
201	.set_alarm	= rc5t583_rtc_set_alarm,
202	.alarm_irq_enable = rc5t583_rtc_alarm_irq_enable,
203};
204
205static int rc5t583_rtc_probe(struct platform_device *pdev)
206{
207	struct rc5t583 *rc5t583 = dev_get_drvdata(pdev->dev.parent);
208	struct rc5t583_rtc *ricoh_rtc;
209	struct rc5t583_platform_data *pmic_plat_data;
210	int ret;
211	int irq;
212
213	ricoh_rtc = devm_kzalloc(&pdev->dev, sizeof(struct rc5t583_rtc),
214			GFP_KERNEL);
215	if (!ricoh_rtc)
216		return -ENOMEM;
217
218	platform_set_drvdata(pdev, ricoh_rtc);
219
220	/* Clear pending interrupts */
221	ret = regmap_write(rc5t583->regmap, RC5T583_RTC_CTL2, 0);
222	if (ret < 0)
223		return ret;
224
225	/* clear RTC Adjust register */
226	ret = regmap_write(rc5t583->regmap, RC5T583_RTC_ADJ, 0);
227	if (ret < 0) {
228		dev_err(&pdev->dev, "unable to program rtc_adjust reg\n");
229		return -EBUSY;
230	}
231
232	pmic_plat_data = dev_get_platdata(rc5t583->dev);
233	irq = pmic_plat_data->irq_base;
234	if (irq <= 0) {
235		dev_warn(&pdev->dev, "Wake up is not possible as irq = %d\n",
236			irq);
237		return ret;
238	}
239
240	irq += RC5T583_IRQ_YALE;
241	ret = devm_request_threaded_irq(&pdev->dev, irq, NULL,
242		rc5t583_rtc_interrupt, IRQF_TRIGGER_LOW,
243		"rtc-rc5t583", &pdev->dev);
244	if (ret < 0) {
245		dev_err(&pdev->dev, "IRQ is not free.\n");
246		return ret;
247	}
248	device_init_wakeup(&pdev->dev, 1);
249
250	ricoh_rtc->rtc = devm_rtc_device_register(&pdev->dev, pdev->name,
251		&rc5t583_rtc_ops, THIS_MODULE);
252	if (IS_ERR(ricoh_rtc->rtc)) {
253		ret = PTR_ERR(ricoh_rtc->rtc);
254		dev_err(&pdev->dev, "RTC device register: err %d\n", ret);
255		return ret;
256	}
257
258	return 0;
259}
260
261/*
262 * Disable rc5t583 RTC interrupts.
263 * Sets status flag to free.
264 */
265static int rc5t583_rtc_remove(struct platform_device *pdev)
266{
267	struct rc5t583_rtc *rc5t583_rtc = platform_get_drvdata(pdev);
268
269	rc5t583_rtc_alarm_irq_enable(&rc5t583_rtc->rtc->dev, 0);
270	return 0;
271}
272
273#ifdef CONFIG_PM_SLEEP
274static int rc5t583_rtc_suspend(struct device *dev)
275{
276	struct rc5t583 *rc5t583 = dev_get_drvdata(dev->parent);
277	struct rc5t583_rtc *rc5t583_rtc = dev_get_drvdata(dev);
278	int ret;
279
280	/* Store current list of enabled interrupts*/
281	ret = regmap_read(rc5t583->regmap, RC5T583_RTC_CTL1,
282		&rc5t583_rtc->irqen);
283	return ret;
284}
285
286static int rc5t583_rtc_resume(struct device *dev)
287{
288	struct rc5t583 *rc5t583 = dev_get_drvdata(dev->parent);
289	struct rc5t583_rtc *rc5t583_rtc = dev_get_drvdata(dev);
290
291	/* Restore list of enabled interrupts before suspend */
292	return regmap_write(rc5t583->regmap, RC5T583_RTC_CTL1,
293		rc5t583_rtc->irqen);
294}
295#endif
296
297static SIMPLE_DEV_PM_OPS(rc5t583_rtc_pm_ops, rc5t583_rtc_suspend,
298			rc5t583_rtc_resume);
299
300static struct platform_driver rc5t583_rtc_driver = {
301	.probe		= rc5t583_rtc_probe,
302	.remove		= rc5t583_rtc_remove,
303	.driver		= {
304		.name	= "rtc-rc5t583",
305		.pm	= &rc5t583_rtc_pm_ops,
306	},
307};
308
309module_platform_driver(rc5t583_rtc_driver);
310MODULE_ALIAS("platform:rtc-rc5t583");
311MODULE_AUTHOR("Venu Byravarasu <vbyravarasu@nvidia.com>");
312MODULE_LICENSE("GPL v2");