rtc-sa1100.c 9.4 KB
Newer Older
1 2 3 4 5 6 7 8 9 10 11
/*
 * Real Time Clock interface for StrongARM SA1x00 and XScale PXA2xx
 *
 * Copyright (c) 2000 Nils Faerber
 *
 * Based on rtc.c by Paul Gortmaker
 *
 * Original Driver by Nils Faerber <nils@kernelconcepts.de>
 *
 * Modifications from:
 *   CIH <cih@coventive.com>
12
 *   Nicolas Pitre <nico@fluxnic.net>
13 14 15 16 17 18 19 20 21 22 23 24 25
 *   Andrew Christian <andrew.christian@hp.com>
 *
 * Converted to the RTC subsystem and Driver Model
 *   by Richard Purdie <rpurdie@rpsys.net>
 *
 * This program is free software; you can redistribute it and/or
 * modify it under the terms of the GNU General Public License
 * as published by the Free Software Foundation; either version
 * 2 of the License, or (at your option) any later version.
 */

#include <linux/platform_device.h>
#include <linux/module.h>
H
Haojian Zhuang 已提交
26
#include <linux/clk.h>
27 28 29 30
#include <linux/rtc.h>
#include <linux/init.h>
#include <linux/fs.h>
#include <linux/interrupt.h>
31
#include <linux/slab.h>
32
#include <linux/string.h>
H
Haojian Zhuang 已提交
33
#include <linux/of.h>
34
#include <linux/pm.h>
35
#include <linux/bitops.h>
36
#include <linux/io.h>
37

38
#include <mach/hardware.h>
39
#include <mach/irqs.h>
40

41
#if defined(CONFIG_ARCH_PXA) || defined(CONFIG_ARCH_MMP)
42 43 44
#include <mach/regs-rtc.h>
#endif

45
#define RTC_DEF_DIVIDER		(32768 - 1)
46
#define RTC_DEF_TRIM		0
47
#define RTC_FREQ		1024
48

49 50 51 52 53
struct sa1100_rtc {
	spinlock_t		lock;
	int			irq_1hz;
	int			irq_alarm;
	struct rtc_device	*rtc;
H
Haojian Zhuang 已提交
54
	struct clk		*clk;
55
};
56

57
static irqreturn_t sa1100_rtc_interrupt(int irq, void *dev_id)
58
{
59 60
	struct sa1100_rtc *info = dev_get_drvdata(dev_id);
	struct rtc_device *rtc = info->rtc;
61 62 63
	unsigned int rtsr;
	unsigned long events = 0;

64
	spin_lock(&info->lock);
65

66
	rtsr = RTSR;
67
	/* clear interrupt sources */
68
	RTSR = 0;
69 70 71 72 73 74
	/* Fix for a nasty initialization problem the in SA11xx RTSR register.
	 * See also the comments in sa1100_rtc_probe(). */
	if (rtsr & (RTSR_ALE | RTSR_HZE)) {
		/* This is the original code, before there was the if test
		 * above. This code does not clear interrupts that were not
		 * enabled. */
75
		RTSR = (RTSR_AL | RTSR_HZ) & (rtsr >> 2);
76 77 78 79 80 81 82 83
	} else {
		/* For some reason, it is possible to enter this routine
		 * without interruptions enabled, it has been tested with
		 * several units (Bug in SA11xx chip?).
		 *
		 * This situation leads to an infinite "loop" of interrupt
		 * routine calling and as a result the processor seems to
		 * lock on its first call to open(). */
84
		RTSR = RTSR_AL | RTSR_HZ;
85
	}
86 87 88 89

	/* clear alarm interrupt if it has occurred */
	if (rtsr & RTSR_AL)
		rtsr &= ~RTSR_ALE;
90
	RTSR = rtsr & (RTSR_ALE | RTSR_HZE);
91 92 93 94 95 96 97

	/* update irq data & counter */
	if (rtsr & RTSR_AL)
		events |= RTC_AF | RTC_IRQF;
	if (rtsr & RTSR_HZ)
		events |= RTC_UF | RTC_IRQF;

98
	rtc_update_irq(rtc, 1, events);
99

100
	spin_unlock(&info->lock);
101 102 103 104 105 106

	return IRQ_HANDLED;
}

static int sa1100_rtc_open(struct device *dev)
{
107 108
	struct sa1100_rtc *info = dev_get_drvdata(dev);
	struct rtc_device *rtc = info->rtc;
109 110
	int ret;

H
Haojian Zhuang 已提交
111 112 113
	ret = clk_prepare_enable(info->clk);
	if (ret)
		goto fail_clk;
114
	ret = request_irq(info->irq_1hz, sa1100_rtc_interrupt, 0, "rtc 1Hz", dev);
115
	if (ret) {
116
		dev_err(dev, "IRQ %d already in use.\n", info->irq_1hz);
117 118
		goto fail_ui;
	}
119
	ret = request_irq(info->irq_alarm, sa1100_rtc_interrupt, 0, "rtc Alrm", dev);
120
	if (ret) {
121
		dev_err(dev, "IRQ %d already in use.\n", info->irq_alarm);
122 123
		goto fail_ai;
	}
124 125
	rtc->max_user_freq = RTC_FREQ;
	rtc_irq_set_freq(rtc, NULL, RTC_FREQ);
126

127 128 129
	return 0;

 fail_ai:
130
	free_irq(info->irq_1hz, dev);
131
 fail_ui:
H
Haojian Zhuang 已提交
132 133
	clk_disable_unprepare(info->clk);
 fail_clk:
134 135 136 137 138
	return ret;
}

static void sa1100_rtc_release(struct device *dev)
{
139 140 141
	struct sa1100_rtc *info = dev_get_drvdata(dev);

	spin_lock_irq(&info->lock);
142
	RTSR = 0;
143
	spin_unlock_irq(&info->lock);
144

145 146
	free_irq(info->irq_alarm, dev);
	free_irq(info->irq_1hz, dev);
H
Haojian Zhuang 已提交
147
	clk_disable_unprepare(info->clk);
148 149
}

150 151
static int sa1100_rtc_alarm_irq_enable(struct device *dev, unsigned int enabled)
{
152 153 154
	struct sa1100_rtc *info = dev_get_drvdata(dev);

	spin_lock_irq(&info->lock);
155
	if (enabled)
156
		RTSR |= RTSR_ALE;
157
	else
158
		RTSR &= ~RTSR_ALE;
159
	spin_unlock_irq(&info->lock);
160 161 162
	return 0;
}

163 164
static int sa1100_rtc_read_time(struct device *dev, struct rtc_time *tm)
{
165
	rtc_time_to_tm(RCNR, tm);
166 167 168 169 170 171 172 173 174 175
	return 0;
}

static int sa1100_rtc_set_time(struct device *dev, struct rtc_time *tm)
{
	unsigned long time;
	int ret;

	ret = rtc_tm_to_time(tm, &time);
	if (ret == 0)
176
		RCNR = time;
177 178 179 180 181
	return ret;
}

static int sa1100_rtc_read_alarm(struct device *dev, struct rtc_wkalrm *alrm)
{
182
	u32	rtsr;
183

184
	rtsr = RTSR;
185 186
	alrm->enabled = (rtsr & RTSR_ALE) ? 1 : 0;
	alrm->pending = (rtsr & RTSR_AL) ? 1 : 0;
187 188 189 190 191
	return 0;
}

static int sa1100_rtc_set_alarm(struct device *dev, struct rtc_wkalrm *alrm)
{
192
	struct sa1100_rtc *info = dev_get_drvdata(dev);
193
	unsigned long time;
194
	int ret;
195

196
	spin_lock_irq(&info->lock);
197 198 199 200 201 202 203 204 205 206
	ret = rtc_tm_to_time(&alrm->time, &time);
	if (ret != 0)
		goto out;
	RTSR = RTSR & (RTSR_HZE|RTSR_ALE|RTSR_AL);
	RTAR = time;
	if (alrm->enabled)
		RTSR |= RTSR_ALE;
	else
		RTSR &= ~RTSR_ALE;
out:
207
	spin_unlock_irq(&info->lock);
208

209
	return ret;
210 211 212 213
}

static int sa1100_rtc_proc(struct device *dev, struct seq_file *seq)
{
214 215
	seq_printf(seq, "trim/divider\t\t: 0x%08x\n", (u32) RTTR);
	seq_printf(seq, "RTSR\t\t\t: 0x%08x\n", (u32)RTSR);
216 217 218 219

	return 0;
}

220
static const struct rtc_class_ops sa1100_rtc_ops = {
221 222 223 224 225 226 227
	.open = sa1100_rtc_open,
	.release = sa1100_rtc_release,
	.read_time = sa1100_rtc_read_time,
	.set_time = sa1100_rtc_set_time,
	.read_alarm = sa1100_rtc_read_alarm,
	.set_alarm = sa1100_rtc_set_alarm,
	.proc = sa1100_rtc_proc,
228
	.alarm_irq_enable = sa1100_rtc_alarm_irq_enable,
229 230 231 232
};

static int sa1100_rtc_probe(struct platform_device *pdev)
{
233
	struct rtc_device *rtc;
234 235 236 237 238 239 240 241 242 243 244
	struct sa1100_rtc *info;
	int irq_1hz, irq_alarm, ret = 0;

	irq_1hz = platform_get_irq_byname(pdev, "rtc 1Hz");
	irq_alarm = platform_get_irq_byname(pdev, "rtc alarm");
	if (irq_1hz < 0 || irq_alarm < 0)
		return -ENODEV;

	info = kzalloc(sizeof(struct sa1100_rtc), GFP_KERNEL);
	if (!info)
		return -ENOMEM;
H
Haojian Zhuang 已提交
245 246 247 248 249 250
	info->clk = clk_get(&pdev->dev, NULL);
	if (IS_ERR(info->clk)) {
		dev_err(&pdev->dev, "failed to find rtc clock source\n");
		ret = PTR_ERR(info->clk);
		goto err_clk;
	}
251 252 253 254
	info->irq_1hz = irq_1hz;
	info->irq_alarm = irq_alarm;
	spin_lock_init(&info->lock);
	platform_set_drvdata(pdev, info);
255 256 257 258 259 260 261 262

	/*
	 * According to the manual we should be able to let RTTR be zero
	 * and then a default diviser for a 32.768KHz clock is used.
	 * Apparently this doesn't work, at least for my SA1110 rev 5.
	 * If the clock divider is uninitialized then reset it to the
	 * default value to get the 1Hz clock.
	 */
263 264 265 266
	if (RTTR == 0) {
		RTTR = RTC_DEF_DIVIDER + (RTC_DEF_TRIM << 16);
		dev_warn(&pdev->dev, "warning: "
			"initializing default clock divider/trim value\n");
267
		/* The current RTC value probably doesn't make sense either */
268
		RCNR = 0;
269 270
	}

271 272
	device_init_wakeup(&pdev->dev, 1);

273 274 275
	rtc = rtc_device_register(pdev->name, &pdev->dev, &sa1100_rtc_ops,
		THIS_MODULE);

276 277 278 279 280
	if (IS_ERR(rtc)) {
		ret = PTR_ERR(rtc);
		goto err_dev;
	}
	info->rtc = rtc;
281

282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303
	/* Fix for a nasty initialization problem the in SA11xx RTSR register.
	 * See also the comments in sa1100_rtc_interrupt().
	 *
	 * Sometimes bit 1 of the RTSR (RTSR_HZ) will wake up 1, which means an
	 * interrupt pending, even though interrupts were never enabled.
	 * In this case, this bit it must be reset before enabling
	 * interruptions to avoid a nonexistent interrupt to occur.
	 *
	 * In principle, the same problem would apply to bit 0, although it has
	 * never been observed to happen.
	 *
	 * This issue is addressed both here and in sa1100_rtc_interrupt().
	 * If the issue is not addressed here, in the times when the processor
	 * wakes up with the bit set there will be one spurious interrupt.
	 *
	 * The issue is also dealt with in sa1100_rtc_interrupt() to be on the
	 * safe side, once the condition that lead to this strange
	 * initialization is unknown and could in principle happen during
	 * normal processing.
	 *
	 * Notice that clearing bit 1 and 0 is accomplished by writting ONES to
	 * the corresponding bits in RTSR. */
304
	RTSR = RTSR_AL | RTSR_HZ;
305

306
	return 0;
307 308
err_dev:
	platform_set_drvdata(pdev, NULL);
H
Haojian Zhuang 已提交
309 310
	clk_put(info->clk);
err_clk:
311 312
	kfree(info);
	return ret;
313 314 315 316
}

static int sa1100_rtc_remove(struct platform_device *pdev)
{
317
	struct sa1100_rtc *info = platform_get_drvdata(pdev);
318

319 320
	if (info) {
		rtc_device_unregister(info->rtc);
H
Haojian Zhuang 已提交
321
		clk_put(info->clk);
322 323 324
		platform_set_drvdata(pdev, NULL);
		kfree(info);
	}
325 326 327 328

	return 0;
}

329
#ifdef CONFIG_PM
330
static int sa1100_rtc_suspend(struct device *dev)
331
{
332
	struct sa1100_rtc *info = dev_get_drvdata(dev);
333
	if (device_may_wakeup(dev))
334
		enable_irq_wake(info->irq_alarm);
335 336 337
	return 0;
}

338
static int sa1100_rtc_resume(struct device *dev)
339
{
340
	struct sa1100_rtc *info = dev_get_drvdata(dev);
341
	if (device_may_wakeup(dev))
342
		disable_irq_wake(info->irq_alarm);
343 344
	return 0;
}
345

346
static const struct dev_pm_ops sa1100_rtc_pm_ops = {
347 348 349
	.suspend	= sa1100_rtc_suspend,
	.resume		= sa1100_rtc_resume,
};
350 351
#endif

352
#ifdef CONFIG_OF
H
Haojian Zhuang 已提交
353 354 355 356 357 358
static struct of_device_id sa1100_rtc_dt_ids[] = {
	{ .compatible = "mrvl,sa1100-rtc", },
	{ .compatible = "mrvl,mmp-rtc", },
	{}
};
MODULE_DEVICE_TABLE(of, sa1100_rtc_dt_ids);
359
#endif
H
Haojian Zhuang 已提交
360

361 362 363 364
static struct platform_driver sa1100_rtc_driver = {
	.probe		= sa1100_rtc_probe,
	.remove		= sa1100_rtc_remove,
	.driver		= {
365 366 367 368
		.name	= "sa1100-rtc",
#ifdef CONFIG_PM
		.pm	= &sa1100_rtc_pm_ops,
#endif
369
		.of_match_table = of_match_ptr(sa1100_rtc_dt_ids),
370 371 372
	},
};

373
module_platform_driver(sa1100_rtc_driver);
374 375 376 377

MODULE_AUTHOR("Richard Purdie <rpurdie@rpsys.net>");
MODULE_DESCRIPTION("SA11x0/PXA2xx Realtime Clock Driver (RTC)");
MODULE_LICENSE("GPL");
378
MODULE_ALIAS("platform:sa1100-rtc");