interface.c 23.8 KB
Newer Older
A
Alessandro Zummo 已提交
1 2 3 4 5 6 7 8 9 10 11 12 13 14
/*
 * RTC subsystem, interface functions
 *
 * Copyright (C) 2005 Tower Technologies
 * Author: Alessandro Zummo <a.zummo@towertech.it>
 *
 * based on arch/arm/common/rtctime.c
 *
 * This program is free software; you can redistribute it and/or modify
 * it under the terms of the GNU General Public License version 2 as
 * published by the Free Software Foundation.
*/

#include <linux/rtc.h>
15
#include <linux/sched.h>
16
#include <linux/module.h>
17
#include <linux/log2.h>
18
#include <linux/workqueue.h>
A
Alessandro Zummo 已提交
19

20 21 22
static int rtc_timer_enqueue(struct rtc_device *rtc, struct rtc_timer *timer);
static void rtc_timer_remove(struct rtc_device *rtc, struct rtc_timer *timer);

23
static int __rtc_read_time(struct rtc_device *rtc, struct rtc_time *tm)
A
Alessandro Zummo 已提交
24 25 26 27 28 29 30 31
{
	int err;
	if (!rtc->ops)
		err = -ENODEV;
	else if (!rtc->ops->read_time)
		err = -EINVAL;
	else {
		memset(tm, 0, sizeof(struct rtc_time));
32
		err = rtc->ops->read_time(rtc->dev.parent, tm);
A
Alessandro Zummo 已提交
33
	}
34 35 36 37 38 39
	return err;
}

int rtc_read_time(struct rtc_device *rtc, struct rtc_time *tm)
{
	int err;
A
Alessandro Zummo 已提交
40

41 42 43 44 45
	err = mutex_lock_interruptible(&rtc->ops_lock);
	if (err)
		return err;

	err = __rtc_read_time(rtc, tm);
A
Alessandro Zummo 已提交
46 47 48 49 50
	mutex_unlock(&rtc->ops_lock);
	return err;
}
EXPORT_SYMBOL_GPL(rtc_read_time);

51
int rtc_set_time(struct rtc_device *rtc, struct rtc_time *tm)
A
Alessandro Zummo 已提交
52 53 54 55 56 57 58 59 60
{
	int err;

	err = rtc_valid_tm(tm);
	if (err != 0)
		return err;

	err = mutex_lock_interruptible(&rtc->ops_lock);
	if (err)
61
		return err;
A
Alessandro Zummo 已提交
62 63 64

	if (!rtc->ops)
		err = -ENODEV;
65
	else if (rtc->ops->set_time)
66
		err = rtc->ops->set_time(rtc->dev.parent, tm);
67 68 69 70 71 72 73
	else if (rtc->ops->set_mmss) {
		unsigned long secs;
		err = rtc_tm_to_time(tm, &secs);
		if (err == 0)
			err = rtc->ops->set_mmss(rtc->dev.parent, secs);
	} else
		err = -EINVAL;
A
Alessandro Zummo 已提交
74

75
	pm_stay_awake(rtc->dev.parent);
A
Alessandro Zummo 已提交
76
	mutex_unlock(&rtc->ops_lock);
77 78
	/* A timer might have just expired */
	schedule_work(&rtc->irqwork);
A
Alessandro Zummo 已提交
79 80 81 82
	return err;
}
EXPORT_SYMBOL_GPL(rtc_set_time);

83
int rtc_set_mmss(struct rtc_device *rtc, unsigned long secs)
A
Alessandro Zummo 已提交
84 85 86 87 88
{
	int err;

	err = mutex_lock_interruptible(&rtc->ops_lock);
	if (err)
89
		return err;
A
Alessandro Zummo 已提交
90 91 92 93

	if (!rtc->ops)
		err = -ENODEV;
	else if (rtc->ops->set_mmss)
94
		err = rtc->ops->set_mmss(rtc->dev.parent, secs);
A
Alessandro Zummo 已提交
95 96 97
	else if (rtc->ops->read_time && rtc->ops->set_time) {
		struct rtc_time new, old;

98
		err = rtc->ops->read_time(rtc->dev.parent, &old);
A
Alessandro Zummo 已提交
99 100 101 102 103 104 105 106 107 108 109
		if (err == 0) {
			rtc_time_to_tm(secs, &new);

			/*
			 * avoid writing when we're going to change the day of
			 * the month. We will retry in the next minute. This
			 * basically means that if the RTC must not drift
			 * by more than 1 minute in 11 minutes.
			 */
			if (!((old.tm_hour == 23 && old.tm_min == 59) ||
				(new.tm_hour == 23 && new.tm_min == 59)))
110
				err = rtc->ops->set_time(rtc->dev.parent,
111
						&new);
A
Alessandro Zummo 已提交
112
		}
113
	} else {
A
Alessandro Zummo 已提交
114
		err = -EINVAL;
115
	}
A
Alessandro Zummo 已提交
116

117
	pm_stay_awake(rtc->dev.parent);
A
Alessandro Zummo 已提交
118
	mutex_unlock(&rtc->ops_lock);
119 120
	/* A timer might have just expired */
	schedule_work(&rtc->irqwork);
A
Alessandro Zummo 已提交
121 122 123 124 125

	return err;
}
EXPORT_SYMBOL_GPL(rtc_set_mmss);

126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236
static int rtc_read_alarm_internal(struct rtc_device *rtc, struct rtc_wkalrm *alarm)
{
	int err;

	err = mutex_lock_interruptible(&rtc->ops_lock);
	if (err)
		return err;

	if (rtc->ops == NULL)
		err = -ENODEV;
	else if (!rtc->ops->read_alarm)
		err = -EINVAL;
	else {
		memset(alarm, 0, sizeof(struct rtc_wkalrm));
		err = rtc->ops->read_alarm(rtc->dev.parent, alarm);
	}

	mutex_unlock(&rtc->ops_lock);
	return err;
}

int __rtc_read_alarm(struct rtc_device *rtc, struct rtc_wkalrm *alarm)
{
	int err;
	struct rtc_time before, now;
	int first_time = 1;
	unsigned long t_now, t_alm;
	enum { none, day, month, year } missing = none;
	unsigned days;

	/* The lower level RTC driver may return -1 in some fields,
	 * creating invalid alarm->time values, for reasons like:
	 *
	 *   - The hardware may not be capable of filling them in;
	 *     many alarms match only on time-of-day fields, not
	 *     day/month/year calendar data.
	 *
	 *   - Some hardware uses illegal values as "wildcard" match
	 *     values, which non-Linux firmware (like a BIOS) may try
	 *     to set up as e.g. "alarm 15 minutes after each hour".
	 *     Linux uses only oneshot alarms.
	 *
	 * When we see that here, we deal with it by using values from
	 * a current RTC timestamp for any missing (-1) values.  The
	 * RTC driver prevents "periodic alarm" modes.
	 *
	 * But this can be racey, because some fields of the RTC timestamp
	 * may have wrapped in the interval since we read the RTC alarm,
	 * which would lead to us inserting inconsistent values in place
	 * of the -1 fields.
	 *
	 * Reading the alarm and timestamp in the reverse sequence
	 * would have the same race condition, and not solve the issue.
	 *
	 * So, we must first read the RTC timestamp,
	 * then read the RTC alarm value,
	 * and then read a second RTC timestamp.
	 *
	 * If any fields of the second timestamp have changed
	 * when compared with the first timestamp, then we know
	 * our timestamp may be inconsistent with that used by
	 * the low-level rtc_read_alarm_internal() function.
	 *
	 * So, when the two timestamps disagree, we just loop and do
	 * the process again to get a fully consistent set of values.
	 *
	 * This could all instead be done in the lower level driver,
	 * but since more than one lower level RTC implementation needs it,
	 * then it's probably best best to do it here instead of there..
	 */

	/* Get the "before" timestamp */
	err = rtc_read_time(rtc, &before);
	if (err < 0)
		return err;
	do {
		if (!first_time)
			memcpy(&before, &now, sizeof(struct rtc_time));
		first_time = 0;

		/* get the RTC alarm values, which may be incomplete */
		err = rtc_read_alarm_internal(rtc, alarm);
		if (err)
			return err;

		/* full-function RTCs won't have such missing fields */
		if (rtc_valid_tm(&alarm->time) == 0)
			return 0;

		/* get the "after" timestamp, to detect wrapped fields */
		err = rtc_read_time(rtc, &now);
		if (err < 0)
			return err;

		/* note that tm_sec is a "don't care" value here: */
	} while (   before.tm_min   != now.tm_min
		 || before.tm_hour  != now.tm_hour
		 || before.tm_mon   != now.tm_mon
		 || before.tm_year  != now.tm_year);

	/* Fill in the missing alarm fields using the timestamp; we
	 * know there's at least one since alarm->time is invalid.
	 */
	if (alarm->time.tm_sec == -1)
		alarm->time.tm_sec = now.tm_sec;
	if (alarm->time.tm_min == -1)
		alarm->time.tm_min = now.tm_min;
	if (alarm->time.tm_hour == -1)
		alarm->time.tm_hour = now.tm_hour;

	/* For simplicity, only support date rollover for now */
237
	if (alarm->time.tm_mday < 1 || alarm->time.tm_mday > 31) {
238 239 240
		alarm->time.tm_mday = now.tm_mday;
		missing = day;
	}
241
	if ((unsigned)alarm->time.tm_mon >= 12) {
242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294
		alarm->time.tm_mon = now.tm_mon;
		if (missing == none)
			missing = month;
	}
	if (alarm->time.tm_year == -1) {
		alarm->time.tm_year = now.tm_year;
		if (missing == none)
			missing = year;
	}

	/* with luck, no rollover is needed */
	rtc_tm_to_time(&now, &t_now);
	rtc_tm_to_time(&alarm->time, &t_alm);
	if (t_now < t_alm)
		goto done;

	switch (missing) {

	/* 24 hour rollover ... if it's now 10am Monday, an alarm that
	 * that will trigger at 5am will do so at 5am Tuesday, which
	 * could also be in the next month or year.  This is a common
	 * case, especially for PCs.
	 */
	case day:
		dev_dbg(&rtc->dev, "alarm rollover: %s\n", "day");
		t_alm += 24 * 60 * 60;
		rtc_time_to_tm(t_alm, &alarm->time);
		break;

	/* Month rollover ... if it's the 31th, an alarm on the 3rd will
	 * be next month.  An alarm matching on the 30th, 29th, or 28th
	 * may end up in the month after that!  Many newer PCs support
	 * this type of alarm.
	 */
	case month:
		dev_dbg(&rtc->dev, "alarm rollover: %s\n", "month");
		do {
			if (alarm->time.tm_mon < 11)
				alarm->time.tm_mon++;
			else {
				alarm->time.tm_mon = 0;
				alarm->time.tm_year++;
			}
			days = rtc_month_days(alarm->time.tm_mon,
					alarm->time.tm_year);
		} while (days < alarm->time.tm_mday);
		break;

	/* Year rollover ... easy except for leap years! */
	case year:
		dev_dbg(&rtc->dev, "alarm rollover: %s\n", "year");
		do {
			alarm->time.tm_year++;
295 296
		} while (!is_leap_year(alarm->time.tm_year + 1900)
			&& rtc_valid_tm(&alarm->time) != 0);
297 298 299 300 301 302 303
		break;

	default:
		dev_warn(&rtc->dev, "alarm rollover not handled\n");
	}

done:
304 305 306 307 308 309 310 311 312 313
	err = rtc_valid_tm(&alarm->time);

	if (err) {
		dev_warn(&rtc->dev, "invalid alarm value: %d-%d-%d %d:%d:%d\n",
			alarm->time.tm_year + 1900, alarm->time.tm_mon + 1,
			alarm->time.tm_mday, alarm->time.tm_hour, alarm->time.tm_min,
			alarm->time.tm_sec);
	}

	return err;
314 315
}

316
int rtc_read_alarm(struct rtc_device *rtc, struct rtc_wkalrm *alarm)
A
Alessandro Zummo 已提交
317 318 319 320 321
{
	int err;

	err = mutex_lock_interruptible(&rtc->ops_lock);
	if (err)
322
		return err;
323 324 325 326 327 328 329
	if (rtc->ops == NULL)
		err = -ENODEV;
	else if (!rtc->ops->read_alarm)
		err = -EINVAL;
	else {
		memset(alarm, 0, sizeof(struct rtc_wkalrm));
		alarm->enabled = rtc->aie_timer.enabled;
330
		alarm->time = rtc_ktime_to_tm(rtc->aie_timer.node.expires);
331
	}
A
Alessandro Zummo 已提交
332
	mutex_unlock(&rtc->ops_lock);
333

334
	return err;
A
Alessandro Zummo 已提交
335
}
336
EXPORT_SYMBOL_GPL(rtc_read_alarm);
337

338
static int __rtc_set_alarm(struct rtc_device *rtc, struct rtc_wkalrm *alarm)
339
{
340 341
	struct rtc_time tm;
	long now, scheduled;
342 343
	int err;

344 345
	err = rtc_valid_tm(&alarm->time);
	if (err)
346
		return err;
347
	rtc_tm_to_time(&alarm->time, &scheduled);
348

349 350
	/* Make sure we're not setting alarms in the past */
	err = __rtc_read_time(rtc, &tm);
351 352
	if (err)
		return err;
353 354 355 356 357 358 359 360
	rtc_tm_to_time(&tm, &now);
	if (scheduled <= now)
		return -ETIME;
	/*
	 * XXX - We just checked to make sure the alarm time is not
	 * in the past, but there is still a race window where if
	 * the is alarm set for the next second and the second ticks
	 * over right here, before we set the alarm.
361 362
	 */

363 364 365 366 367 368 369 370
	if (!rtc->ops)
		err = -ENODEV;
	else if (!rtc->ops->set_alarm)
		err = -EINVAL;
	else
		err = rtc->ops->set_alarm(rtc->dev.parent, alarm);

	return err;
371
}
A
Alessandro Zummo 已提交
372

373
int rtc_set_alarm(struct rtc_device *rtc, struct rtc_wkalrm *alarm)
A
Alessandro Zummo 已提交
374 375 376
{
	int err;

377 378 379 380
	err = rtc_valid_tm(&alarm->time);
	if (err != 0)
		return err;

A
Alessandro Zummo 已提交
381 382
	err = mutex_lock_interruptible(&rtc->ops_lock);
	if (err)
383
		return err;
384
	if (rtc->aie_timer.enabled)
T
Thomas Gleixner 已提交
385
		rtc_timer_remove(rtc, &rtc->aie_timer);
386

387 388
	rtc->aie_timer.node.expires = rtc_tm_to_ktime(alarm->time);
	rtc->aie_timer.period = ktime_set(0, 0);
389
	if (alarm->enabled)
390
		err = rtc_timer_enqueue(rtc, &rtc->aie_timer);
391

A
Alessandro Zummo 已提交
392
	mutex_unlock(&rtc->ops_lock);
393
	return err;
A
Alessandro Zummo 已提交
394 395 396
}
EXPORT_SYMBOL_GPL(rtc_set_alarm);

397 398 399 400
/* Called once per device from rtc_device_register */
int rtc_initialize_alarm(struct rtc_device *rtc, struct rtc_wkalrm *alarm)
{
	int err;
401
	struct rtc_time now;
402 403 404 405 406

	err = rtc_valid_tm(&alarm->time);
	if (err != 0)
		return err;

407 408 409 410
	err = rtc_read_time(rtc, &now);
	if (err)
		return err;

411 412 413 414 415 416
	err = mutex_lock_interruptible(&rtc->ops_lock);
	if (err)
		return err;

	rtc->aie_timer.node.expires = rtc_tm_to_ktime(alarm->time);
	rtc->aie_timer.period = ktime_set(0, 0);
417 418 419 420 421

	/* Alarm has to be enabled & in the futrure for us to enqueue it */
	if (alarm->enabled && (rtc_tm_to_ktime(now).tv64 <
			 rtc->aie_timer.node.expires.tv64)) {

422 423 424 425 426 427 428 429 430 431
		rtc->aie_timer.enabled = 1;
		timerqueue_add(&rtc->timerqueue, &rtc->aie_timer.node);
	}
	mutex_unlock(&rtc->ops_lock);
	return err;
}
EXPORT_SYMBOL_GPL(rtc_initialize_alarm);



432 433 434 435 436 437
int rtc_alarm_irq_enable(struct rtc_device *rtc, unsigned int enabled)
{
	int err = mutex_lock_interruptible(&rtc->ops_lock);
	if (err)
		return err;

438
	if (rtc->aie_timer.enabled != enabled) {
439 440 441
		if (enabled)
			err = rtc_timer_enqueue(rtc, &rtc->aie_timer);
		else
T
Thomas Gleixner 已提交
442
			rtc_timer_remove(rtc, &rtc->aie_timer);
443 444
	}

445
	if (err)
446 447
		/* nothing */;
	else if (!rtc->ops)
448 449 450 451 452 453 454 455 456 457 458 459 460 461 462 463 464
		err = -ENODEV;
	else if (!rtc->ops->alarm_irq_enable)
		err = -EINVAL;
	else
		err = rtc->ops->alarm_irq_enable(rtc->dev.parent, enabled);

	mutex_unlock(&rtc->ops_lock);
	return err;
}
EXPORT_SYMBOL_GPL(rtc_alarm_irq_enable);

int rtc_update_irq_enable(struct rtc_device *rtc, unsigned int enabled)
{
	int err = mutex_lock_interruptible(&rtc->ops_lock);
	if (err)
		return err;

465 466 467 468 469 470
#ifdef CONFIG_RTC_INTF_DEV_UIE_EMUL
	if (enabled == 0 && rtc->uie_irq_active) {
		mutex_unlock(&rtc->ops_lock);
		return rtc_dev_update_irq_enable_emul(rtc, 0);
	}
#endif
471 472 473 474
	/* make sure we're changing state */
	if (rtc->uie_rtctimer.enabled == enabled)
		goto out;

475 476 477 478 479
	if (rtc->uie_unsupported) {
		err = -EINVAL;
		goto out;
	}

480 481 482 483 484 485 486 487 488
	if (enabled) {
		struct rtc_time tm;
		ktime_t now, onesec;

		__rtc_read_time(rtc, &tm);
		onesec = ktime_set(1, 0);
		now = rtc_tm_to_ktime(tm);
		rtc->uie_rtctimer.node.expires = ktime_add(now, onesec);
		rtc->uie_rtctimer.period = ktime_set(1, 0);
489 490
		err = rtc_timer_enqueue(rtc, &rtc->uie_rtctimer);
	} else
T
Thomas Gleixner 已提交
491
		rtc_timer_remove(rtc, &rtc->uie_rtctimer);
492

493
out:
494
	mutex_unlock(&rtc->ops_lock);
495 496 497 498 499 500 501 502 503 504
#ifdef CONFIG_RTC_INTF_DEV_UIE_EMUL
	/*
	 * Enable emulation if the driver did not provide
	 * the update_irq_enable function pointer or if returned
	 * -EINVAL to signal that it has been configured without
	 * interrupts or that are not available at the moment.
	 */
	if (err == -EINVAL)
		err = rtc_dev_update_irq_enable_emul(rtc, enabled);
#endif
505
	return err;
506

507 508 509
}
EXPORT_SYMBOL_GPL(rtc_update_irq_enable);

510

511
/**
512 513 514 515
 * rtc_handle_legacy_irq - AIE, UIE and PIE event hook
 * @rtc: pointer to the rtc device
 *
 * This function is called when an AIE, UIE or PIE mode interrupt
L
Lucas De Marchi 已提交
516
 * has occurred (or been emulated).
517 518
 *
 * Triggers the registered irq_task function callback.
519
 */
520
void rtc_handle_legacy_irq(struct rtc_device *rtc, int num, int mode)
A
Alessandro Zummo 已提交
521
{
522 523
	unsigned long flags;

524
	/* mark one irq of the appropriate mode */
525
	spin_lock_irqsave(&rtc->irq_lock, flags);
526
	rtc->irq_data = (rtc->irq_data + (num << 8)) | (RTC_IRQF|mode);
527
	spin_unlock_irqrestore(&rtc->irq_lock, flags);
A
Alessandro Zummo 已提交
528

529
	/* call the task func */
530
	spin_lock_irqsave(&rtc->irq_task_lock, flags);
A
Alessandro Zummo 已提交
531 532
	if (rtc->irq_task)
		rtc->irq_task->func(rtc->irq_task->private_data);
533
	spin_unlock_irqrestore(&rtc->irq_task_lock, flags);
A
Alessandro Zummo 已提交
534 535 536 537

	wake_up_interruptible(&rtc->irq_queue);
	kill_fasync(&rtc->async_queue, SIGIO, POLL_IN);
}
538 539 540 541 542 543 544 545 546 547 548 549 550 551 552 553 554 555 556 557 558 559 560 561 562 563 564 565 566 567 568 569 570 571 572 573 574 575 576 577 578 579 580 581 582 583 584 585 586 587 588 589 590 591 592 593 594 595 596 597 598


/**
 * rtc_aie_update_irq - AIE mode rtctimer hook
 * @private: pointer to the rtc_device
 *
 * This functions is called when the aie_timer expires.
 */
void rtc_aie_update_irq(void *private)
{
	struct rtc_device *rtc = (struct rtc_device *)private;
	rtc_handle_legacy_irq(rtc, 1, RTC_AF);
}


/**
 * rtc_uie_update_irq - UIE mode rtctimer hook
 * @private: pointer to the rtc_device
 *
 * This functions is called when the uie_timer expires.
 */
void rtc_uie_update_irq(void *private)
{
	struct rtc_device *rtc = (struct rtc_device *)private;
	rtc_handle_legacy_irq(rtc, 1,  RTC_UF);
}


/**
 * rtc_pie_update_irq - PIE mode hrtimer hook
 * @timer: pointer to the pie mode hrtimer
 *
 * This function is used to emulate PIE mode interrupts
 * using an hrtimer. This function is called when the periodic
 * hrtimer expires.
 */
enum hrtimer_restart rtc_pie_update_irq(struct hrtimer *timer)
{
	struct rtc_device *rtc;
	ktime_t period;
	int count;
	rtc = container_of(timer, struct rtc_device, pie_timer);

	period = ktime_set(0, NSEC_PER_SEC/rtc->irq_freq);
	count = hrtimer_forward_now(timer, period);

	rtc_handle_legacy_irq(rtc, count, RTC_PF);

	return HRTIMER_RESTART;
}

/**
 * rtc_update_irq - Triggered when a RTC interrupt occurs.
 * @rtc: the rtc device
 * @num: how many irqs are being reported (usually one)
 * @events: mask of RTC_IRQF with one or more of RTC_PF, RTC_AF, RTC_UF
 * Context: any
 */
void rtc_update_irq(struct rtc_device *rtc,
		unsigned long num, unsigned long events)
{
599 600 601
	if (unlikely(IS_ERR_OR_NULL(rtc)))
		return;

602
	pm_stay_awake(rtc->dev.parent);
603 604
	schedule_work(&rtc->irqwork);
}
A
Alessandro Zummo 已提交
605 606
EXPORT_SYMBOL_GPL(rtc_update_irq);

607
static int __rtc_match(struct device *dev, const void *data)
D
Dave Young 已提交
608
{
609
	const char *name = data;
D
Dave Young 已提交
610

611
	if (strcmp(dev_name(dev), name) == 0)
D
Dave Young 已提交
612 613 614 615
		return 1;
	return 0;
}

616
struct rtc_device *rtc_class_open(const char *name)
A
Alessandro Zummo 已提交
617
{
618
	struct device *dev;
619
	struct rtc_device *rtc = NULL;
A
Alessandro Zummo 已提交
620

621
	dev = class_find_device(rtc_class, NULL, name, __rtc_match);
D
Dave Young 已提交
622 623
	if (dev)
		rtc = to_rtc_device(dev);
A
Alessandro Zummo 已提交
624

625 626
	if (rtc) {
		if (!try_module_get(rtc->owner)) {
627
			put_device(dev);
628 629
			rtc = NULL;
		}
A
Alessandro Zummo 已提交
630 631
	}

632
	return rtc;
A
Alessandro Zummo 已提交
633 634 635
}
EXPORT_SYMBOL_GPL(rtc_class_open);

636
void rtc_class_close(struct rtc_device *rtc)
A
Alessandro Zummo 已提交
637
{
638
	module_put(rtc->owner);
639
	put_device(&rtc->dev);
A
Alessandro Zummo 已提交
640 641 642
}
EXPORT_SYMBOL_GPL(rtc_class_close);

643
int rtc_irq_register(struct rtc_device *rtc, struct rtc_task *task)
A
Alessandro Zummo 已提交
644 645 646 647 648 649
{
	int retval = -EBUSY;

	if (task == NULL || task->func == NULL)
		return -EINVAL;

A
Alessandro Zummo 已提交
650
	/* Cannot register while the char dev is in use */
651
	if (test_and_set_bit_lock(RTC_DEV_BUSY, &rtc->flags))
A
Alessandro Zummo 已提交
652 653
		return -EBUSY;

654
	spin_lock_irq(&rtc->irq_task_lock);
A
Alessandro Zummo 已提交
655 656 657 658
	if (rtc->irq_task == NULL) {
		rtc->irq_task = task;
		retval = 0;
	}
659
	spin_unlock_irq(&rtc->irq_task_lock);
A
Alessandro Zummo 已提交
660

661
	clear_bit_unlock(RTC_DEV_BUSY, &rtc->flags);
A
Alessandro Zummo 已提交
662

A
Alessandro Zummo 已提交
663 664 665 666
	return retval;
}
EXPORT_SYMBOL_GPL(rtc_irq_register);

667
void rtc_irq_unregister(struct rtc_device *rtc, struct rtc_task *task)
A
Alessandro Zummo 已提交
668
{
669
	spin_lock_irq(&rtc->irq_task_lock);
A
Alessandro Zummo 已提交
670 671
	if (rtc->irq_task == task)
		rtc->irq_task = NULL;
672
	spin_unlock_irq(&rtc->irq_task_lock);
A
Alessandro Zummo 已提交
673 674 675
}
EXPORT_SYMBOL_GPL(rtc_irq_unregister);

T
Thomas Gleixner 已提交
676 677 678 679 680 681 682 683 684 685 686 687 688 689 690 691 692 693 694 695 696 697 698
static int rtc_update_hrtimer(struct rtc_device *rtc, int enabled)
{
	/*
	 * We always cancel the timer here first, because otherwise
	 * we could run into BUG_ON(timer->state != HRTIMER_STATE_CALLBACK);
	 * when we manage to start the timer before the callback
	 * returns HRTIMER_RESTART.
	 *
	 * We cannot use hrtimer_cancel() here as a running callback
	 * could be blocked on rtc->irq_task_lock and hrtimer_cancel()
	 * would spin forever.
	 */
	if (hrtimer_try_to_cancel(&rtc->pie_timer) < 0)
		return -1;

	if (enabled) {
		ktime_t period = ktime_set(0, NSEC_PER_SEC / rtc->irq_freq);

		hrtimer_start(&rtc->pie_timer, period, HRTIMER_MODE_REL);
	}
	return 0;
}

699 700 701 702 703 704 705 706 707 708
/**
 * rtc_irq_set_state - enable/disable 2^N Hz periodic IRQs
 * @rtc: the rtc device
 * @task: currently registered with rtc_irq_register()
 * @enabled: true to enable periodic IRQs
 * Context: any
 *
 * Note that rtc_irq_set_freq() should previously have been used to
 * specify the desired frequency of periodic IRQ task->func() callbacks.
 */
709
int rtc_irq_set_state(struct rtc_device *rtc, struct rtc_task *task, int enabled)
A
Alessandro Zummo 已提交
710 711 712 713
{
	int err = 0;
	unsigned long flags;

T
Thomas Gleixner 已提交
714
retry:
A
Alessandro Zummo 已提交
715
	spin_lock_irqsave(&rtc->irq_task_lock, flags);
A
Alessandro Zummo 已提交
716 717
	if (rtc->irq_task != NULL && task == NULL)
		err = -EBUSY;
718
	else if (rtc->irq_task != task)
A
Alessandro Zummo 已提交
719
		err = -EACCES;
720
	else {
T
Thomas Gleixner 已提交
721 722 723 724 725 726
		if (rtc_update_hrtimer(rtc, enabled) < 0) {
			spin_unlock_irqrestore(&rtc->irq_task_lock, flags);
			cpu_relax();
			goto retry;
		}
		rtc->pie_enabled = enabled;
727 728
	}
	spin_unlock_irqrestore(&rtc->irq_task_lock, flags);
A
Alessandro Zummo 已提交
729 730 731 732
	return err;
}
EXPORT_SYMBOL_GPL(rtc_irq_set_state);

733 734 735 736 737 738 739 740 741 742
/**
 * rtc_irq_set_freq - set 2^N Hz periodic IRQ frequency for IRQ
 * @rtc: the rtc device
 * @task: currently registered with rtc_irq_register()
 * @freq: positive frequency with which task->func() will be called
 * Context: any
 *
 * Note that rtc_irq_set_state() is used to enable or disable the
 * periodic IRQs.
 */
743
int rtc_irq_set_freq(struct rtc_device *rtc, struct rtc_task *task, int freq)
A
Alessandro Zummo 已提交
744
{
745
	int err = 0;
A
Alessandro Zummo 已提交
746 747
	unsigned long flags;

T
Thomas Gleixner 已提交
748
	if (freq <= 0 || freq > RTC_MAX_FREQ)
749
		return -EINVAL;
T
Thomas Gleixner 已提交
750
retry:
A
Alessandro Zummo 已提交
751
	spin_lock_irqsave(&rtc->irq_task_lock, flags);
A
Alessandro Zummo 已提交
752 753
	if (rtc->irq_task != NULL && task == NULL)
		err = -EBUSY;
754
	else if (rtc->irq_task != task)
A
Alessandro Zummo 已提交
755
		err = -EACCES;
756
	else {
757
		rtc->irq_freq = freq;
T
Thomas Gleixner 已提交
758 759 760 761
		if (rtc->pie_enabled && rtc_update_hrtimer(rtc, 1) < 0) {
			spin_unlock_irqrestore(&rtc->irq_task_lock, flags);
			cpu_relax();
			goto retry;
762
		}
A
Alessandro Zummo 已提交
763
	}
764
	spin_unlock_irqrestore(&rtc->irq_task_lock, flags);
A
Alessandro Zummo 已提交
765 766
	return err;
}
767
EXPORT_SYMBOL_GPL(rtc_irq_set_freq);
768 769

/**
T
Thomas Gleixner 已提交
770
 * rtc_timer_enqueue - Adds a rtc_timer to the rtc_device timerqueue
771 772 773 774 775 776
 * @rtc rtc device
 * @timer timer being added.
 *
 * Enqueues a timer onto the rtc devices timerqueue and sets
 * the next alarm event appropriately.
 *
777 778
 * Sets the enabled bit on the added timer.
 *
779 780
 * Must hold ops_lock for proper serialization of timerqueue
 */
781
static int rtc_timer_enqueue(struct rtc_device *rtc, struct rtc_timer *timer)
782
{
783
	timer->enabled = 1;
784 785 786 787 788 789 790
	timerqueue_add(&rtc->timerqueue, &timer->node);
	if (&timer->node == timerqueue_getnext(&rtc->timerqueue)) {
		struct rtc_wkalrm alarm;
		int err;
		alarm.time = rtc_ktime_to_tm(timer->node.expires);
		alarm.enabled = 1;
		err = __rtc_set_alarm(rtc, &alarm);
791 792
		if (err == -ETIME) {
			pm_stay_awake(rtc->dev.parent);
793
			schedule_work(&rtc->irqwork);
794
		} else if (err) {
795 796 797 798
			timerqueue_del(&rtc->timerqueue, &timer->node);
			timer->enabled = 0;
			return err;
		}
799
	}
800
	return 0;
801 802
}

803 804 805 806 807 808 809 810
static void rtc_alarm_disable(struct rtc_device *rtc)
{
	if (!rtc->ops || !rtc->ops->alarm_irq_enable)
		return;

	rtc->ops->alarm_irq_enable(rtc->dev.parent, false);
}

811
/**
T
Thomas Gleixner 已提交
812
 * rtc_timer_remove - Removes a rtc_timer from the rtc_device timerqueue
813 814 815 816 817 818
 * @rtc rtc device
 * @timer timer being removed.
 *
 * Removes a timer onto the rtc devices timerqueue and sets
 * the next alarm event appropriately.
 *
819 820
 * Clears the enabled bit on the removed timer.
 *
821 822
 * Must hold ops_lock for proper serialization of timerqueue
 */
823
static void rtc_timer_remove(struct rtc_device *rtc, struct rtc_timer *timer)
824 825 826
{
	struct timerqueue_node *next = timerqueue_getnext(&rtc->timerqueue);
	timerqueue_del(&rtc->timerqueue, &timer->node);
827
	timer->enabled = 0;
828 829 830 831
	if (next == &timer->node) {
		struct rtc_wkalrm alarm;
		int err;
		next = timerqueue_getnext(&rtc->timerqueue);
832 833
		if (!next) {
			rtc_alarm_disable(rtc);
834
			return;
835
		}
836 837 838
		alarm.time = rtc_ktime_to_tm(next->expires);
		alarm.enabled = 1;
		err = __rtc_set_alarm(rtc, &alarm);
839 840
		if (err == -ETIME) {
			pm_stay_awake(rtc->dev.parent);
841
			schedule_work(&rtc->irqwork);
842
		}
843 844 845 846
	}
}

/**
T
Thomas Gleixner 已提交
847
 * rtc_timer_do_work - Expires rtc timers
848 849 850 851 852 853 854 855
 * @rtc rtc device
 * @timer timer being removed.
 *
 * Expires rtc timers. Reprograms next alarm event if needed.
 * Called via worktask.
 *
 * Serializes access to timerqueue via ops_lock mutex
 */
T
Thomas Gleixner 已提交
856
void rtc_timer_do_work(struct work_struct *work)
857 858 859 860 861 862 863 864 865 866 867 868 869 870 871 872 873 874 875 876 877 878 879 880 881 882 883 884 885 886 887 888 889 890 891 892 893 894 895 896 897 898
{
	struct rtc_timer *timer;
	struct timerqueue_node *next;
	ktime_t now;
	struct rtc_time tm;

	struct rtc_device *rtc =
		container_of(work, struct rtc_device, irqwork);

	mutex_lock(&rtc->ops_lock);
again:
	__rtc_read_time(rtc, &tm);
	now = rtc_tm_to_ktime(tm);
	while ((next = timerqueue_getnext(&rtc->timerqueue))) {
		if (next->expires.tv64 > now.tv64)
			break;

		/* expire timer */
		timer = container_of(next, struct rtc_timer, node);
		timerqueue_del(&rtc->timerqueue, &timer->node);
		timer->enabled = 0;
		if (timer->task.func)
			timer->task.func(timer->task.private_data);

		/* Re-add/fwd periodic timers */
		if (ktime_to_ns(timer->period)) {
			timer->node.expires = ktime_add(timer->node.expires,
							timer->period);
			timer->enabled = 1;
			timerqueue_add(&rtc->timerqueue, &timer->node);
		}
	}

	/* Set next alarm */
	if (next) {
		struct rtc_wkalrm alarm;
		int err;
		alarm.time = rtc_ktime_to_tm(next->expires);
		alarm.enabled = 1;
		err = __rtc_set_alarm(rtc, &alarm);
		if (err == -ETIME)
			goto again;
899 900
	} else
		rtc_alarm_disable(rtc);
901

902
	pm_relax(rtc->dev.parent);
903 904 905 906
	mutex_unlock(&rtc->ops_lock);
}


T
Thomas Gleixner 已提交
907
/* rtc_timer_init - Initializes an rtc_timer
908 909 910 911 912 913
 * @timer: timer to be intiialized
 * @f: function pointer to be called when timer fires
 * @data: private data passed to function pointer
 *
 * Kernel interface to initializing an rtc_timer.
 */
914
void rtc_timer_init(struct rtc_timer *timer, void (*f)(void *p), void *data)
915 916 917 918 919 920 921
{
	timerqueue_init(&timer->node);
	timer->enabled = 0;
	timer->task.func = f;
	timer->task.private_data = data;
}

T
Thomas Gleixner 已提交
922
/* rtc_timer_start - Sets an rtc_timer to fire in the future
923 924 925 926 927 928 929
 * @ rtc: rtc device to be used
 * @ timer: timer being set
 * @ expires: time at which to expire the timer
 * @ period: period that the timer will recur
 *
 * Kernel interface to set an rtc_timer
 */
930
int rtc_timer_start(struct rtc_device *rtc, struct rtc_timer *timer,
931 932 933 934 935
			ktime_t expires, ktime_t period)
{
	int ret = 0;
	mutex_lock(&rtc->ops_lock);
	if (timer->enabled)
T
Thomas Gleixner 已提交
936
		rtc_timer_remove(rtc, timer);
937 938 939 940

	timer->node.expires = expires;
	timer->period = period;

941
	ret = rtc_timer_enqueue(rtc, timer);
942 943 944 945 946

	mutex_unlock(&rtc->ops_lock);
	return ret;
}

T
Thomas Gleixner 已提交
947
/* rtc_timer_cancel - Stops an rtc_timer
948 949 950 951 952
 * @ rtc: rtc device to be used
 * @ timer: timer being set
 *
 * Kernel interface to cancel an rtc_timer
 */
953
int rtc_timer_cancel(struct rtc_device *rtc, struct rtc_timer *timer)
954 955 956 957
{
	int ret = 0;
	mutex_lock(&rtc->ops_lock);
	if (timer->enabled)
T
Thomas Gleixner 已提交
958
		rtc_timer_remove(rtc, timer);
959 960 961 962 963
	mutex_unlock(&rtc->ops_lock);
	return ret;
}