1 /*
2  * rtc-mrst.c: Driver for Moorestown virtual RTC
3  *
4  * (C) Copyright 2009 Intel Corporation
5  * Author: Jacob Pan (jacob.jun.pan@intel.com)
6  *	   Feng Tang (feng.tang@intel.com)
7  *
8  * This program is free software; you can redistribute it and/or
9  * modify it under the terms of the GNU General Public License
10  * as published by the Free Software Foundation; version 2
11  * of the License.
12  *
13  * Note:
14  * VRTC is emulated by system controller firmware, the real HW
15  * RTC is located in the PMIC device. SCU FW shadows PMIC RTC
16  * in a memory mapped IO space that is visible to the host IA
17  * processor.
18  *
19  * This driver is based upon drivers/rtc/rtc-cmos.c
20  */
21 
22 /*
23  * Note:
24  *  * vRTC only supports binary mode and 24H mode
25  *  * vRTC only support PIE and AIE, no UIE, and its PIE only happens
26  *    at 23:59:59pm everyday, no support for adjustable frequency
27  *  * Alarm function is also limited to hr/min/sec.
28  */
29 
30 #include <linux/mod_devicetable.h>
31 #include <linux/platform_device.h>
32 #include <linux/interrupt.h>
33 #include <linux/spinlock.h>
34 #include <linux/kernel.h>
35 #include <linux/mc146818rtc.h>
36 #include <linux/module.h>
37 #include <linux/init.h>
38 #include <linux/sfi.h>
39 
40 #include <asm/intel_scu_ipc.h>
41 #include <asm/intel-mid.h>
42 #include <asm/intel_mid_vrtc.h>
43 
44 struct mrst_rtc {
45 	struct rtc_device	*rtc;
46 	struct device		*dev;
47 	int			irq;
48 
49 	u8			enabled_wake;
50 	u8			suspend_ctrl;
51 };
52 
53 static const char driver_name[] = "rtc_mrst";
54 
55 #define	RTC_IRQMASK	(RTC_PF | RTC_AF)
56 
is_intr(u8 rtc_intr)57 static inline int is_intr(u8 rtc_intr)
58 {
59 	if (!(rtc_intr & RTC_IRQF))
60 		return 0;
61 	return rtc_intr & RTC_IRQMASK;
62 }
63 
vrtc_is_updating(void)64 static inline unsigned char vrtc_is_updating(void)
65 {
66 	unsigned char uip;
67 	unsigned long flags;
68 
69 	spin_lock_irqsave(&rtc_lock, flags);
70 	uip = (vrtc_cmos_read(RTC_FREQ_SELECT) & RTC_UIP);
71 	spin_unlock_irqrestore(&rtc_lock, flags);
72 	return uip;
73 }
74 
75 /*
76  * rtc_time's year contains the increment over 1900, but vRTC's YEAR
77  * register can't be programmed to value larger than 0x64, so vRTC
78  * driver chose to use 1972 (1970 is UNIX time start point) as the base,
79  * and does the translation at read/write time.
80  *
81  * Why not just use 1970 as the offset? it's because using 1972 will
82  * make it consistent in leap year setting for both vrtc and low-level
83  * physical rtc devices. Then why not use 1960 as the offset? If we use
84  * 1960, for a device's first use, its YEAR register is 0 and the system
85  * year will be parsed as 1960 which is not a valid UNIX time and will
86  * cause many applications to fail mysteriously.
87  */
mrst_read_time(struct device * dev,struct rtc_time * time)88 static int mrst_read_time(struct device *dev, struct rtc_time *time)
89 {
90 	unsigned long flags;
91 
92 	if (vrtc_is_updating())
93 		mdelay(20);
94 
95 	spin_lock_irqsave(&rtc_lock, flags);
96 	time->tm_sec = vrtc_cmos_read(RTC_SECONDS);
97 	time->tm_min = vrtc_cmos_read(RTC_MINUTES);
98 	time->tm_hour = vrtc_cmos_read(RTC_HOURS);
99 	time->tm_mday = vrtc_cmos_read(RTC_DAY_OF_MONTH);
100 	time->tm_mon = vrtc_cmos_read(RTC_MONTH);
101 	time->tm_year = vrtc_cmos_read(RTC_YEAR);
102 	spin_unlock_irqrestore(&rtc_lock, flags);
103 
104 	/* Adjust for the 1972/1900 */
105 	time->tm_year += 72;
106 	time->tm_mon--;
107 	return 0;
108 }
109 
mrst_set_time(struct device * dev,struct rtc_time * time)110 static int mrst_set_time(struct device *dev, struct rtc_time *time)
111 {
112 	int ret;
113 	unsigned long flags;
114 	unsigned char mon, day, hrs, min, sec;
115 	unsigned int yrs;
116 
117 	yrs = time->tm_year;
118 	mon = time->tm_mon + 1;   /* tm_mon starts at zero */
119 	day = time->tm_mday;
120 	hrs = time->tm_hour;
121 	min = time->tm_min;
122 	sec = time->tm_sec;
123 
124 	if (yrs < 72 || yrs > 172)
125 		return -EINVAL;
126 	yrs -= 72;
127 
128 	spin_lock_irqsave(&rtc_lock, flags);
129 
130 	vrtc_cmos_write(yrs, RTC_YEAR);
131 	vrtc_cmos_write(mon, RTC_MONTH);
132 	vrtc_cmos_write(day, RTC_DAY_OF_MONTH);
133 	vrtc_cmos_write(hrs, RTC_HOURS);
134 	vrtc_cmos_write(min, RTC_MINUTES);
135 	vrtc_cmos_write(sec, RTC_SECONDS);
136 
137 	spin_unlock_irqrestore(&rtc_lock, flags);
138 
139 	ret = intel_scu_ipc_simple_command(IPCMSG_VRTC, IPC_CMD_VRTC_SETTIME);
140 	return ret;
141 }
142 
mrst_read_alarm(struct device * dev,struct rtc_wkalrm * t)143 static int mrst_read_alarm(struct device *dev, struct rtc_wkalrm *t)
144 {
145 	struct mrst_rtc	*mrst = dev_get_drvdata(dev);
146 	unsigned char rtc_control;
147 
148 	if (mrst->irq <= 0)
149 		return -EIO;
150 
151 	/* vRTC only supports binary mode */
152 	spin_lock_irq(&rtc_lock);
153 	t->time.tm_sec = vrtc_cmos_read(RTC_SECONDS_ALARM);
154 	t->time.tm_min = vrtc_cmos_read(RTC_MINUTES_ALARM);
155 	t->time.tm_hour = vrtc_cmos_read(RTC_HOURS_ALARM);
156 
157 	rtc_control = vrtc_cmos_read(RTC_CONTROL);
158 	spin_unlock_irq(&rtc_lock);
159 
160 	t->enabled = !!(rtc_control & RTC_AIE);
161 	t->pending = 0;
162 
163 	return 0;
164 }
165 
mrst_checkintr(struct mrst_rtc * mrst,unsigned char rtc_control)166 static void mrst_checkintr(struct mrst_rtc *mrst, unsigned char rtc_control)
167 {
168 	unsigned char	rtc_intr;
169 
170 	/*
171 	 * NOTE after changing RTC_xIE bits we always read INTR_FLAGS;
172 	 * allegedly some older rtcs need that to handle irqs properly
173 	 */
174 	rtc_intr = vrtc_cmos_read(RTC_INTR_FLAGS);
175 	rtc_intr &= (rtc_control & RTC_IRQMASK) | RTC_IRQF;
176 	if (is_intr(rtc_intr))
177 		rtc_update_irq(mrst->rtc, 1, rtc_intr);
178 }
179 
mrst_irq_enable(struct mrst_rtc * mrst,unsigned char mask)180 static void mrst_irq_enable(struct mrst_rtc *mrst, unsigned char mask)
181 {
182 	unsigned char	rtc_control;
183 
184 	/*
185 	 * Flush any pending IRQ status, notably for update irqs,
186 	 * before we enable new IRQs
187 	 */
188 	rtc_control = vrtc_cmos_read(RTC_CONTROL);
189 	mrst_checkintr(mrst, rtc_control);
190 
191 	rtc_control |= mask;
192 	vrtc_cmos_write(rtc_control, RTC_CONTROL);
193 
194 	mrst_checkintr(mrst, rtc_control);
195 }
196 
mrst_irq_disable(struct mrst_rtc * mrst,unsigned char mask)197 static void mrst_irq_disable(struct mrst_rtc *mrst, unsigned char mask)
198 {
199 	unsigned char	rtc_control;
200 
201 	rtc_control = vrtc_cmos_read(RTC_CONTROL);
202 	rtc_control &= ~mask;
203 	vrtc_cmos_write(rtc_control, RTC_CONTROL);
204 	mrst_checkintr(mrst, rtc_control);
205 }
206 
mrst_set_alarm(struct device * dev,struct rtc_wkalrm * t)207 static int mrst_set_alarm(struct device *dev, struct rtc_wkalrm *t)
208 {
209 	struct mrst_rtc	*mrst = dev_get_drvdata(dev);
210 	unsigned char hrs, min, sec;
211 	int ret = 0;
212 
213 	if (!mrst->irq)
214 		return -EIO;
215 
216 	hrs = t->time.tm_hour;
217 	min = t->time.tm_min;
218 	sec = t->time.tm_sec;
219 
220 	spin_lock_irq(&rtc_lock);
221 	/* Next rtc irq must not be from previous alarm setting */
222 	mrst_irq_disable(mrst, RTC_AIE);
223 
224 	/* Update alarm */
225 	vrtc_cmos_write(hrs, RTC_HOURS_ALARM);
226 	vrtc_cmos_write(min, RTC_MINUTES_ALARM);
227 	vrtc_cmos_write(sec, RTC_SECONDS_ALARM);
228 
229 	spin_unlock_irq(&rtc_lock);
230 
231 	ret = intel_scu_ipc_simple_command(IPCMSG_VRTC, IPC_CMD_VRTC_SETALARM);
232 	if (ret)
233 		return ret;
234 
235 	spin_lock_irq(&rtc_lock);
236 	if (t->enabled)
237 		mrst_irq_enable(mrst, RTC_AIE);
238 
239 	spin_unlock_irq(&rtc_lock);
240 
241 	return 0;
242 }
243 
244 /* Currently, the vRTC doesn't support UIE ON/OFF */
mrst_rtc_alarm_irq_enable(struct device * dev,unsigned int enabled)245 static int mrst_rtc_alarm_irq_enable(struct device *dev, unsigned int enabled)
246 {
247 	struct mrst_rtc	*mrst = dev_get_drvdata(dev);
248 	unsigned long	flags;
249 
250 	spin_lock_irqsave(&rtc_lock, flags);
251 	if (enabled)
252 		mrst_irq_enable(mrst, RTC_AIE);
253 	else
254 		mrst_irq_disable(mrst, RTC_AIE);
255 	spin_unlock_irqrestore(&rtc_lock, flags);
256 	return 0;
257 }
258 
259 
260 #if IS_ENABLED(CONFIG_RTC_INTF_PROC)
261 
mrst_procfs(struct device * dev,struct seq_file * seq)262 static int mrst_procfs(struct device *dev, struct seq_file *seq)
263 {
264 	unsigned char	rtc_control, valid;
265 
266 	spin_lock_irq(&rtc_lock);
267 	rtc_control = vrtc_cmos_read(RTC_CONTROL);
268 	valid = vrtc_cmos_read(RTC_VALID);
269 	spin_unlock_irq(&rtc_lock);
270 
271 	seq_printf(seq,
272 		   "periodic_IRQ\t: %s\n"
273 		   "alarm\t\t: %s\n"
274 		   "BCD\t\t: no\n"
275 		   "periodic_freq\t: daily (not adjustable)\n",
276 		   (rtc_control & RTC_PIE) ? "on" : "off",
277 		   (rtc_control & RTC_AIE) ? "on" : "off");
278 
279 	return 0;
280 }
281 
282 #else
283 #define	mrst_procfs	NULL
284 #endif
285 
286 static const struct rtc_class_ops mrst_rtc_ops = {
287 	.read_time	= mrst_read_time,
288 	.set_time	= mrst_set_time,
289 	.read_alarm	= mrst_read_alarm,
290 	.set_alarm	= mrst_set_alarm,
291 	.proc		= mrst_procfs,
292 	.alarm_irq_enable = mrst_rtc_alarm_irq_enable,
293 };
294 
295 static struct mrst_rtc	mrst_rtc;
296 
297 /*
298  * When vRTC IRQ is captured by SCU FW, FW will clear the AIE bit in
299  * Reg B, so no need for this driver to clear it
300  */
mrst_rtc_irq(int irq,void * p)301 static irqreturn_t mrst_rtc_irq(int irq, void *p)
302 {
303 	u8 irqstat;
304 
305 	spin_lock(&rtc_lock);
306 	/* This read will clear all IRQ flags inside Reg C */
307 	irqstat = vrtc_cmos_read(RTC_INTR_FLAGS);
308 	spin_unlock(&rtc_lock);
309 
310 	irqstat &= RTC_IRQMASK | RTC_IRQF;
311 	if (is_intr(irqstat)) {
312 		rtc_update_irq(p, 1, irqstat);
313 		return IRQ_HANDLED;
314 	}
315 	return IRQ_NONE;
316 }
317 
vrtc_mrst_do_probe(struct device * dev,struct resource * iomem,int rtc_irq)318 static int vrtc_mrst_do_probe(struct device *dev, struct resource *iomem,
319 			      int rtc_irq)
320 {
321 	int retval = 0;
322 	unsigned char rtc_control;
323 
324 	/* There can be only one ... */
325 	if (mrst_rtc.dev)
326 		return -EBUSY;
327 
328 	if (!iomem)
329 		return -ENODEV;
330 
331 	iomem = devm_request_mem_region(dev, iomem->start, resource_size(iomem),
332 					driver_name);
333 	if (!iomem) {
334 		dev_dbg(dev, "i/o mem already in use.\n");
335 		return -EBUSY;
336 	}
337 
338 	mrst_rtc.irq = rtc_irq;
339 	mrst_rtc.dev = dev;
340 	dev_set_drvdata(dev, &mrst_rtc);
341 
342 	mrst_rtc.rtc = devm_rtc_allocate_device(dev);
343 	if (IS_ERR(mrst_rtc.rtc))
344 		return PTR_ERR(mrst_rtc.rtc);
345 
346 	mrst_rtc.rtc->ops = &mrst_rtc_ops;
347 
348 	rename_region(iomem, dev_name(&mrst_rtc.rtc->dev));
349 
350 	spin_lock_irq(&rtc_lock);
351 	mrst_irq_disable(&mrst_rtc, RTC_PIE | RTC_AIE);
352 	rtc_control = vrtc_cmos_read(RTC_CONTROL);
353 	spin_unlock_irq(&rtc_lock);
354 
355 	if (!(rtc_control & RTC_24H) || (rtc_control & (RTC_DM_BINARY)))
356 		dev_dbg(dev, "TODO: support more than 24-hr BCD mode\n");
357 
358 	if (rtc_irq) {
359 		retval = devm_request_irq(dev, rtc_irq, mrst_rtc_irq,
360 					  0, dev_name(&mrst_rtc.rtc->dev),
361 					  mrst_rtc.rtc);
362 		if (retval < 0) {
363 			dev_dbg(dev, "IRQ %d is already in use, err %d\n",
364 				rtc_irq, retval);
365 			goto cleanup0;
366 		}
367 	}
368 
369 	retval = rtc_register_device(mrst_rtc.rtc);
370 	if (retval)
371 		goto cleanup0;
372 
373 	dev_dbg(dev, "initialised\n");
374 	return 0;
375 
376 cleanup0:
377 	mrst_rtc.dev = NULL;
378 	dev_err(dev, "rtc-mrst: unable to initialise\n");
379 	return retval;
380 }
381 
rtc_mrst_do_shutdown(void)382 static void rtc_mrst_do_shutdown(void)
383 {
384 	spin_lock_irq(&rtc_lock);
385 	mrst_irq_disable(&mrst_rtc, RTC_IRQMASK);
386 	spin_unlock_irq(&rtc_lock);
387 }
388 
rtc_mrst_do_remove(struct device * dev)389 static void rtc_mrst_do_remove(struct device *dev)
390 {
391 	struct mrst_rtc	*mrst = dev_get_drvdata(dev);
392 
393 	rtc_mrst_do_shutdown();
394 
395 	mrst->rtc = NULL;
396 	mrst->dev = NULL;
397 }
398 
399 #ifdef CONFIG_PM_SLEEP
mrst_suspend(struct device * dev)400 static int mrst_suspend(struct device *dev)
401 {
402 	struct mrst_rtc	*mrst = dev_get_drvdata(dev);
403 	unsigned char	tmp;
404 
405 	/* Only the alarm might be a wakeup event source */
406 	spin_lock_irq(&rtc_lock);
407 	mrst->suspend_ctrl = tmp = vrtc_cmos_read(RTC_CONTROL);
408 	if (tmp & (RTC_PIE | RTC_AIE)) {
409 		unsigned char	mask;
410 
411 		if (device_may_wakeup(dev))
412 			mask = RTC_IRQMASK & ~RTC_AIE;
413 		else
414 			mask = RTC_IRQMASK;
415 		tmp &= ~mask;
416 		vrtc_cmos_write(tmp, RTC_CONTROL);
417 
418 		mrst_checkintr(mrst, tmp);
419 	}
420 	spin_unlock_irq(&rtc_lock);
421 
422 	if (tmp & RTC_AIE) {
423 		mrst->enabled_wake = 1;
424 		enable_irq_wake(mrst->irq);
425 	}
426 
427 	dev_dbg(&mrst_rtc.rtc->dev, "suspend%s, ctrl %02x\n",
428 			(tmp & RTC_AIE) ? ", alarm may wake" : "",
429 			tmp);
430 
431 	return 0;
432 }
433 
434 /*
435  * We want RTC alarms to wake us from the deep power saving state
436  */
mrst_poweroff(struct device * dev)437 static inline int mrst_poweroff(struct device *dev)
438 {
439 	return mrst_suspend(dev);
440 }
441 
mrst_resume(struct device * dev)442 static int mrst_resume(struct device *dev)
443 {
444 	struct mrst_rtc	*mrst = dev_get_drvdata(dev);
445 	unsigned char tmp = mrst->suspend_ctrl;
446 
447 	/* Re-enable any irqs previously active */
448 	if (tmp & RTC_IRQMASK) {
449 		unsigned char	mask;
450 
451 		if (mrst->enabled_wake) {
452 			disable_irq_wake(mrst->irq);
453 			mrst->enabled_wake = 0;
454 		}
455 
456 		spin_lock_irq(&rtc_lock);
457 		do {
458 			vrtc_cmos_write(tmp, RTC_CONTROL);
459 
460 			mask = vrtc_cmos_read(RTC_INTR_FLAGS);
461 			mask &= (tmp & RTC_IRQMASK) | RTC_IRQF;
462 			if (!is_intr(mask))
463 				break;
464 
465 			rtc_update_irq(mrst->rtc, 1, mask);
466 			tmp &= ~RTC_AIE;
467 		} while (mask & RTC_AIE);
468 		spin_unlock_irq(&rtc_lock);
469 	}
470 
471 	dev_dbg(&mrst_rtc.rtc->dev, "resume, ctrl %02x\n", tmp);
472 
473 	return 0;
474 }
475 
476 static SIMPLE_DEV_PM_OPS(mrst_pm_ops, mrst_suspend, mrst_resume);
477 #define MRST_PM_OPS (&mrst_pm_ops)
478 
479 #else
480 #define MRST_PM_OPS NULL
481 
mrst_poweroff(struct device * dev)482 static inline int mrst_poweroff(struct device *dev)
483 {
484 	return -ENOSYS;
485 }
486 
487 #endif
488 
vrtc_mrst_platform_probe(struct platform_device * pdev)489 static int vrtc_mrst_platform_probe(struct platform_device *pdev)
490 {
491 	return vrtc_mrst_do_probe(&pdev->dev,
492 			platform_get_resource(pdev, IORESOURCE_MEM, 0),
493 			platform_get_irq(pdev, 0));
494 }
495 
vrtc_mrst_platform_remove(struct platform_device * pdev)496 static int vrtc_mrst_platform_remove(struct platform_device *pdev)
497 {
498 	rtc_mrst_do_remove(&pdev->dev);
499 	return 0;
500 }
501 
vrtc_mrst_platform_shutdown(struct platform_device * pdev)502 static void vrtc_mrst_platform_shutdown(struct platform_device *pdev)
503 {
504 	if (system_state == SYSTEM_POWER_OFF && !mrst_poweroff(&pdev->dev))
505 		return;
506 
507 	rtc_mrst_do_shutdown();
508 }
509 
510 MODULE_ALIAS("platform:vrtc_mrst");
511 
512 static struct platform_driver vrtc_mrst_platform_driver = {
513 	.probe		= vrtc_mrst_platform_probe,
514 	.remove		= vrtc_mrst_platform_remove,
515 	.shutdown	= vrtc_mrst_platform_shutdown,
516 	.driver = {
517 		.name	= driver_name,
518 		.pm	= MRST_PM_OPS,
519 	}
520 };
521 
522 module_platform_driver(vrtc_mrst_platform_driver);
523 
524 MODULE_AUTHOR("Jacob Pan; Feng Tang");
525 MODULE_DESCRIPTION("Driver for Moorestown virtual RTC");
526 MODULE_LICENSE("GPL");
527