blob: 9ae0db2a5de422ad3f375ece96c676147072941d [file] [log] [blame]
xjb04a4022021-11-25 15:01:52 +08001// SPDX-License-Identifier: GPL-2.0
2/*
3 * Copyright (C) 2020 MediaTek Inc.
4 * Author: Andrew Yang <andrew.yang@mediatek.com>
5 */
6
7#include <linux/delay.h>
8#include <linux/init.h>
9#include <linux/module.h>
10#include <linux/regmap.h>
11#include <linux/rtc.h>
12#include <linux/irqdomain.h>
13#include <linux/platform_device.h>
14#include <linux/of_address.h>
15#include <linux/of_device.h>
16#include <linux/of_irq.h>
17#include <linux/io.h>
18#include <linux/mfd/mt6330/registers.h>
19#include <linux/mfd/mt6330/core.h>
20#include <linux/nvmem-provider.h>
21
22
23#define RTC_BBPU 0x0000
24#define RTC_BBPU_CBUSY BIT(6)
25
26#define RTC_WRTGR_MT6330 0x3a
27
28#define RTC_IRQ_STA 0x0002
29#define RTC_IRQ_STA_AL BIT(0)
30#define RTC_IRQ_STA_LP BIT(3)
31
32#define RTC_IRQ_EN 0x0004
33#define RTC_IRQ_EN_AL BIT(0)
34#define RTC_IRQ_EN_ONESHOT BIT(2)
35#define RTC_IRQ_EN_LP BIT(3)
36#define RTC_IRQ_EN_ONESHOT_AL (RTC_IRQ_EN_ONESHOT | RTC_IRQ_EN_AL)
37
38#define RTC_TC_SEC_MASK 0x3f
39#define RTC_TC_MIN_MASK 0x3f
40#define RTC_TC_HOU_MASK 0x1f
41#define RTC_TC_DOM_MASK 0x1f
42#define RTC_TC_DOW_MASK 0x7
43#define RTC_TC_MTH_MASK 0xf
44#define RTC_TC_YEA_MASK 0x7f
45
46#define RTC_AL_SEC_MASK 0x003f
47#define RTC_AL_MIN_MASK 0x003f
48#define RTC_AL_HOU_MASK 0x001f
49#define RTC_AL_DOM_MASK 0x001f
50#define RTC_AL_DOW_MASK 0x0007
51#define RTC_AL_MTH_MASK 0x000f
52#define RTC_AL_YEA_MASK 0x007f
53
54#define RTC_AL_MASK 0x0008
55#define RTC_AL_MASK_DOW BIT(4)
56
57#define RTC_TC_SEC 0x000a
58/* Min, Hour, Dom... register offset to RTC_TC_SEC */
59#define RTC_OFFSET_SEC 0
60#define RTC_OFFSET_MIN 1
61#define RTC_OFFSET_HOUR 2
62#define RTC_OFFSET_DOM 3
63#define RTC_OFFSET_DOW 4
64#define RTC_OFFSET_MTH 5
65#define RTC_OFFSET_YEAR 6
66#define RTC_OFFSET_COUNT 7
67
68#define RTC_AL_SEC 0x0018
69#define RTC_AL_HOU_L 0x001c
70#define RTC_AL_HOU_H 0x001d
71#define RTC_AL_MTH_L 0x0022
72#define RTC_AL_MTH_H 0x0023
73
74#define RTC_AL_SEC_MASK 0x003f
75#define RTC_AL_MIN_MASK 0x003f
76#define RTC_AL_HOU_MASK 0x001f
77#define RTC_AL_DOM_MASK 0x001f
78#define RTC_AL_DOW_MASK 0x0007
79#define RTC_AL_MTH_MASK 0x000f
80#define RTC_AL_YEA_MASK 0x007f
81
xj79176bd2022-05-26 14:45:57 +080082#define RTC_PDN1 0x002c
83#define RTC_PDN1_PWRON_TIME BIT(7)
84
xjb04a4022021-11-25 15:01:52 +080085#define RTC_PDN2 0x002e
86#define RTC_PDN2_PWRON_ALARM BIT(4)
87
xj79176bd2022-05-26 14:45:57 +080088#define RTC_SPAR0 0x0030
89
90#define RTC_SPAR1 0x0032
91
xjb04a4022021-11-25 15:01:52 +080092#define RTC_SPAR0_L 0x0030
93#define RTC_INT_CNT_L 0x0040
94
95#define RTC_MIN_YEAR 1968
96#define RTC_BASE_YEAR 1900
97#define RTC_NUM_YEARS 128
98#define RTC_MIN_YEAR_OFFSET (RTC_MIN_YEAR - RTC_BASE_YEAR)
99
xj79176bd2022-05-26 14:45:57 +0800100#define RTC_PWRON_YEA RTC_PDN2
101#define RTC_PWRON_YEA_MASK 0x7f00
102#define RTC_PWRON_YEA_SHIFT 8
103
104#define RTC_PWRON_MTH RTC_PDN2
105#define RTC_PWRON_MTH_MASK 0x000f
106#define RTC_PWRON_MTH_SHIFT 0
107
108#define RTC_PWRON_SEC RTC_SPAR0
109#define RTC_PWRON_SEC_MASK 0x003f
110#define RTC_PWRON_SEC_SHIFT 0
111
112#define RTC_PWRON_MIN RTC_SPAR1
113#define RTC_PWRON_MIN_MASK 0x003f
114#define RTC_PWRON_MIN_SHIFT 0
115
116#define RTC_PWRON_HOU RTC_SPAR1
117#define RTC_PWRON_HOU_MASK 0x07c0
118#define RTC_PWRON_HOU_SHIFT 6
119
120#define RTC_PWRON_DOM RTC_SPAR1
121#define RTC_PWRON_DOM_MASK 0xf800
122#define RTC_PWRON_DOM_SHIFT 11
123
xjb04a4022021-11-25 15:01:52 +0800124#define SPARE_REG_WIDTH 1
125
lh0d3f4db2022-09-17 00:16:39 -0700126/* Set alarm time */
127#define RTC_POFF_ALM_SET _IOW('p', 0x15, struct rtc_time)
xj79176bd2022-05-26 14:45:57 +0800128
xjb04a4022021-11-25 15:01:52 +0800129enum mtk_rtc_spare_enum {
130 SPARE_AL_HOU,
131 SPARE_AL_MTH,
132 SPARE_SPAR0,
133 SPARE_RG_MAX,
134};
135
xj79176bd2022-05-26 14:45:57 +0800136enum rtc_reg_set {
137 RTC_REG,
138 RTC_MASK,
139 RTC_SHIFT
140};
141
xjb04a4022021-11-25 15:01:52 +0800142enum rtc_eosc_cali_td {
143 EOSC_CALI_TD_01_SEC = 0x3,
144 EOSC_CALI_TD_02_SEC,
145 EOSC_CALI_TD_04_SEC,
146 EOSC_CALI_TD_08_SEC,
147 EOSC_CALI_TD_16_SEC,
148};
149
150enum cali_field_enum {
151 RTC_EOSC32_CK_PDN,
152 EOSC_CALI_TD,
153 CALI_FILED_MAX
154};
155
156enum {
157 RTC_STATE_INIT,
158 RTC_STATE_R,
159 RTC_STATE_W,
160 RTC_STATE_WT,
161};
162
163struct mtk_rtc_compatible {
164 u32 wrtgr_addr;
165 const struct reg_field *spare_reg_fields;
166 const struct reg_field *cali_reg_fields;
167};
168
169struct mt6330_rtc {
170 struct device *dev;
171 struct rtc_device *rtc_dev;
172 struct mutex lock;
173 struct regmap *regmap;
174 int irq;
175 u32 addr_base;
176 const struct mtk_rtc_compatible *dev_comp;
177 struct regmap_field *spare[SPARE_RG_MAX];
178 struct regmap_field *cali[CALI_FILED_MAX];
179 bool cali_is_supported;
jb.qi874ed622022-11-17 17:45:27 -0800180 ktime_t wakeup_time; //jb.qi change for rtc resume API on 2022.11.18 start
xjb04a4022021-11-25 15:01:52 +0800181};
182
jb.qi874ed622022-11-17 17:45:27 -0800183bool wakeup_by_rtc; //jb.qi change for rtc resume API on 2022.11.18 start
184#define RTC_WAKEUP_THRESHOLD 500000000 // 500ms jb.qi change for rtc resume API on 2022.11.18 start
185
xjb04a4022021-11-25 15:01:52 +0800186static int mtk_rtc_write_trigger(struct mt6330_rtc *rtc);
187
xj79176bd2022-05-26 14:45:57 +0800188static u16 rtc_pwron_reg[RTC_OFFSET_COUNT][3] = {
189 {RTC_PWRON_SEC, RTC_PWRON_SEC_MASK, RTC_PWRON_SEC_SHIFT},
190 {RTC_PWRON_MIN, RTC_PWRON_MIN_MASK, RTC_PWRON_MIN_SHIFT},
191 {RTC_PWRON_HOU, RTC_PWRON_HOU_MASK, RTC_PWRON_HOU_SHIFT},
192 {RTC_PWRON_DOM, RTC_PWRON_DOM_MASK, RTC_PWRON_DOM_SHIFT},
193 {0, 0, 0},
194 {RTC_PWRON_MTH, RTC_PWRON_MTH_MASK, RTC_PWRON_MTH_SHIFT},
195 {RTC_PWRON_YEA, RTC_PWRON_YEA_MASK, RTC_PWRON_YEA_SHIFT},
196};
197
xjb04a4022021-11-25 15:01:52 +0800198static const struct reg_field mt6330_cali_reg_fields[CALI_FILED_MAX] = {
199 [RTC_EOSC32_CK_PDN] = REG_FIELD(MT6330_SCK_TOP_CKPDN_CON0_L, 2, 2),
200 [EOSC_CALI_TD] = REG_FIELD(MT6330_RTC_AL_DOW_L, 8, 10),
201};
202
203static const struct reg_field mtk_rtc_spare_reg_fields[SPARE_RG_MAX] = {
204 [SPARE_AL_HOU] = REG_FIELD(RTC_AL_HOU_H, 0, 7),
205 [SPARE_AL_MTH] = REG_FIELD(RTC_AL_MTH_H, 0, 7),
206 [SPARE_SPAR0] = REG_FIELD(RTC_SPAR0_L, 0, 7),
207};
208
209static const struct mtk_rtc_compatible mt6330_rtc_compat = {
210 .wrtgr_addr = RTC_WRTGR_MT6330,
211 .spare_reg_fields = mtk_rtc_spare_reg_fields,
212 .cali_reg_fields = mt6330_cali_reg_fields,
213};
214
215static const struct of_device_id mt6330_rtc_of_match[] = {
216 { .compatible = "mediatek,mt6330-rtc",
217 .data = (void *)&mt6330_rtc_compat, },
218 {}
219};
220MODULE_DEVICE_TABLE(of, mt6330_rtc_of_match);
221
222static int rtc_eosc_cali_td;
223module_param(rtc_eosc_cali_td, int, 0644);
224
225int rtc_state = RTC_STATE_INIT;
226
227static int mtk_rtc_write_lock(struct regmap *map, int lock)
228{
229 int ret;
230 unsigned int tmp, orig = 0;
231
232 ret = regmap_read(map, MT6330_SCK_TOP_CON0_H, &orig);
233 if (ret != 0)
234 return ret;
235
236 tmp = orig & (~0x01);
237 tmp |= lock & 0x01;
238 if (tmp != orig)
239 ret = regmap_write(map, MT6330_SCK_TOP_CON0_H, tmp);
240
241 return ret;
242}
243
244static int rtc_bulk_read(struct mt6330_rtc *rtc, unsigned int reg,
245 void *val, size_t val_count)
246{
247 int ret;
248
249 if ((reg >= rtc->addr_base + RTC_BBPU) && (reg <= rtc->addr_base + RTC_INT_CNT_L)) {
250 if (rtc_state == RTC_STATE_INIT || rtc_state == RTC_STATE_WT) {
251 ret = mtk_rtc_write_lock(rtc->regmap, 1);
252 if (ret != 0)
253 return ret;
254 } else if (rtc_state == RTC_STATE_W) {
255 // Trigger pending write before read
256 mtk_rtc_write_trigger(rtc);
257 ret = mtk_rtc_write_lock(rtc->regmap, 1);
258 if (ret != 0)
259 return ret;
260 }
261 // else, should be already locked, don't need to lock again.
262 rtc_state = RTC_STATE_R;
263 }
264 // else, not access RTC register
265
266 ret = regmap_bulk_read(rtc->regmap, reg, val, val_count);
267
268 return ret;
269}
270
271static int rtc_bulk_write(struct mt6330_rtc *rtc, unsigned int reg,
272 const void *val, size_t val_count)
273{
274 int ret;
275
276 if ((reg >= rtc->addr_base + RTC_BBPU) && (reg <= rtc->addr_base + RTC_INT_CNT_L)) {
277 if (reg == rtc->addr_base + rtc->dev_comp->wrtgr_addr) {
278 if (rtc_state == RTC_STATE_INIT || rtc_state == RTC_STATE_R ||
279 rtc_state == RTC_STATE_WT)
280 return 0; // nothing to write
281 ret = mtk_rtc_write_lock(rtc->regmap, 0);
282 if (ret != 0)
283 return ret;
284 rtc_state = RTC_STATE_WT;
285 } else {
286 if (rtc_state == RTC_STATE_INIT) {
287 // lock writing path first to clear any unexpected writing data
288 ret = mtk_rtc_write_lock(rtc->regmap, 1);
289 if (ret != 0)
290 return ret;
291 ret = mtk_rtc_write_lock(rtc->regmap, 0);
292 if (ret != 0)
293 return ret;
294 } else if (rtc_state == RTC_STATE_R) {
295 ret = mtk_rtc_write_lock(rtc->regmap, 0);
296 if (ret != 0)
297 return ret;
298 }
299 // else, should be already unlocked, don't need to unlock again.
300 rtc_state = RTC_STATE_W;
301 }
302 }
303 // else, not access RTC register
304
lh0d3f4db2022-09-17 00:16:39 -0700305 ret = regmap_bulk_write(rtc->regmap, reg, val, val_count);
xjb04a4022021-11-25 15:01:52 +0800306
307 if (reg == rtc->addr_base + rtc->dev_comp->wrtgr_addr) {
308 // need 1 ms delay to make sure write completely
309 mdelay(1);
310 }
311
312 return ret;
313}
314
315static int rtc_write(struct mt6330_rtc *rtc, unsigned int reg,
316 unsigned int val)
317{
318 rtc_bulk_write(rtc, reg, &val, 2);
319 return 0;
320}
321
322static int rtc_read(struct mt6330_rtc *rtc, unsigned int reg,
323 unsigned int *val)
324{
325 rtc_bulk_read(rtc, reg, val, 2);
326 return 0;
327}
328
329static int rtc_field_read(struct mt6330_rtc *rtc, const struct reg_field *field, unsigned int *val)
330{
331 int ret;
332 unsigned int reg_val = 0;
333 unsigned int mask;
334 unsigned int shift;
335
336 mask = GENMASK(field->msb, field->lsb);
337 shift = field->lsb;
338
339 ret = rtc_read(rtc, field->reg, &reg_val);
340 if (ret != 0)
341 return ret;
342
343 reg_val &= mask;
344 reg_val >>= shift;
345 *val = reg_val;
346
347 return ret;
348}
349
350static int rtc_update_bits(struct mt6330_rtc *rtc, unsigned int reg,
351 unsigned int mask, unsigned int val)
352{
353 int ret;
354 unsigned int tmp, orig = 0;
355
356 ret = rtc_read(rtc, reg, &orig);
357 if (ret != 0)
358 return ret;
359
360 tmp = orig & ~mask;
361 tmp |= val & mask;
362 if (tmp != orig)
363 ret = rtc_write(rtc, reg, tmp);
364
365 return ret;
366}
367
368static int rtc_field_write(struct mt6330_rtc *rtc, const struct reg_field *field, unsigned int val)
369{
370 unsigned int mask;
371 unsigned int shift;
372
373 mask = GENMASK(field->msb, field->lsb);
374 shift = field->lsb;
375
376 rtc_update_bits(rtc, field->reg, mask, val << shift);
377 return 0;
378}
379
380static int mtk_rtc_write_trigger(struct mt6330_rtc *rtc)
381{
382 unsigned long timeout = jiffies + HZ;
383 int ret;
384 u32 data = 0;
385
386 ret = rtc_write(rtc,
387 rtc->addr_base + rtc->dev_comp->wrtgr_addr, 1);
388 if (ret < 0)
389 return ret;
390
391 while (1) {
392 ret = rtc_read(rtc, rtc->addr_base + RTC_BBPU,
393 &data);
394 if (ret < 0)
395 break;
396 if (!(data & RTC_BBPU_CBUSY))
397 break;
398 if (time_after(jiffies, timeout)) {
399 ret = -ETIMEDOUT;
400 break;
401 }
402 cpu_relax();
403 }
404
405 return ret;
406}
407
408static int rtc_nvram_read(void *priv, unsigned int offset, void *val,
409 size_t bytes)
410{
411 struct mt6330_rtc *rtc = dev_get_drvdata(priv);
412 unsigned int ival;
413 int ret;
414 u8 *buf = val;
415
416 mutex_lock(&rtc->lock);
417
418 for (; bytes; bytes--) {
419 ret = rtc_field_read(rtc, &rtc->dev_comp->spare_reg_fields[offset++], &ival);
420 if (ret)
421 goto out;
422 *buf++ = (u8)ival;
423 }
424out:
425 mutex_unlock(&rtc->lock);
426 return ret;
427}
428
429static int rtc_nvram_write(void *priv, unsigned int offset, void *val,
430 size_t bytes)
431{
432 struct mt6330_rtc *rtc = dev_get_drvdata(priv);
433 unsigned int ival;
434 int ret;
435 u8 *buf = val;
436
437 mutex_lock(&rtc->lock);
438
439 for (; bytes; bytes--) {
440 ival = *buf++;
441 ret = rtc_field_write(rtc, &rtc->dev_comp->spare_reg_fields[offset++], ival);
442 if (ret)
443 goto out;
444 }
445 mtk_rtc_write_trigger(rtc);
446out:
447 mutex_unlock(&rtc->lock);
448 return ret;
449}
450
451static irqreturn_t mtk_rtc_irq_handler_thread(int irq, void *data)
452{
453 struct mt6330_rtc *rtc = data;
454 u32 irqsta = 0, irqen;
455 int ret;
456
457 ret = rtc_read(rtc, rtc->addr_base + RTC_IRQ_STA, &irqsta);
458 if ((ret >= 0) && (irqsta & RTC_IRQ_STA_AL)) {
459 rtc_update_irq(rtc->rtc_dev, 1, RTC_IRQF | RTC_AF);
460 irqen = irqsta & ~RTC_IRQ_EN_AL;
461 mutex_lock(&rtc->lock);
462 if (rtc_write(rtc, rtc->addr_base + RTC_IRQ_EN,
463 irqen) == 0)
464 mtk_rtc_write_trigger(rtc);
465 mutex_unlock(&rtc->lock);
jb.qi874ed622022-11-17 17:45:27 -0800466 /*jb.qi change for rtc resume API on 2022.11.18 start*/
467 dev_err(rtc->dev, "%s\n", __func__);
468 wakeup_by_rtc = false;
469 rtc->wakeup_time = ktime_get();
470 /*jb.qi change for rtc resume API on 2022.11.18 end*/
xjb04a4022021-11-25 15:01:52 +0800471 return IRQ_HANDLED;
472 }
473
474 return IRQ_NONE;
475}
476
477static int __mtk_rtc_read_time(struct mt6330_rtc *rtc,
478 struct rtc_time *tm, int *sec)
479{
480 int ret;
481 u16 data[RTC_OFFSET_COUNT] = { 0 };
482
483 mutex_lock(&rtc->lock);
484 ret = rtc_bulk_read(rtc, rtc->addr_base + RTC_TC_SEC,
485 data, RTC_OFFSET_COUNT * 2);
486 if (ret < 0)
487 goto exit;
488
489 tm->tm_sec = data[RTC_OFFSET_SEC] & RTC_TC_SEC_MASK;
490 tm->tm_min = data[RTC_OFFSET_MIN] & RTC_TC_MIN_MASK;
491 tm->tm_hour = data[RTC_OFFSET_HOUR] & RTC_TC_HOU_MASK;
492 tm->tm_mday = data[RTC_OFFSET_DOM] & RTC_TC_DOM_MASK;
493 tm->tm_mon = data[RTC_OFFSET_MTH] & RTC_TC_MTH_MASK;
494 tm->tm_year = data[RTC_OFFSET_YEAR] & RTC_TC_YEA_MASK;
495
496 ret = rtc_read(rtc, rtc->addr_base + RTC_TC_SEC, sec);
497 *sec &= RTC_TC_SEC_MASK;
498exit:
499 mutex_unlock(&rtc->lock);
500 return ret;
501}
502
xj79176bd2022-05-26 14:45:57 +0800503static void mtk_rtc_set_pwron_time(struct mt6330_rtc *rtc, struct rtc_time *tm)
504{
505 u32 data[RTC_OFFSET_COUNT];
506 int ret, i;
507
508 data[RTC_OFFSET_SEC] =
509 ((tm->tm_sec << RTC_PWRON_SEC_SHIFT) & RTC_PWRON_SEC_MASK);
510 data[RTC_OFFSET_MIN] =
511 ((tm->tm_min << RTC_PWRON_MIN_SHIFT) & RTC_PWRON_MIN_MASK);
512 data[RTC_OFFSET_HOUR] =
513 ((tm->tm_hour << RTC_PWRON_HOU_SHIFT) & RTC_PWRON_HOU_MASK);
514 data[RTC_OFFSET_DOM] =
515 ((tm->tm_mday << RTC_PWRON_DOM_SHIFT) & RTC_PWRON_DOM_MASK);
516 data[RTC_OFFSET_MTH] =
517 ((tm->tm_mon << RTC_PWRON_MTH_SHIFT) & RTC_PWRON_MTH_MASK);
518 data[RTC_OFFSET_YEAR] =
519 ((tm->tm_year << RTC_PWRON_YEA_SHIFT) & RTC_PWRON_YEA_MASK);
520
521 printk_deferred(" %s set PWRON_SEC %x\n", __func__, data[RTC_OFFSET_SEC]);
522
523 for (i = RTC_OFFSET_SEC; i < RTC_OFFSET_COUNT; i++) {
524 if (i == RTC_OFFSET_DOW)
525 continue;
526 ret = rtc_update_bits(rtc,
527 rtc->addr_base + rtc_pwron_reg[i][RTC_REG],
528 rtc_pwron_reg[i][RTC_MASK],
529 data[i]);
530
531 if (ret < 0)
532 goto exit;
533 mtk_rtc_write_trigger(rtc);
534 }
535
536 if (ret < 0)
537 goto exit;
538
539 return;
540
541exit:
542 dev_err(rtc->dev, "%s error\n", __func__);
543 printk_deferred("%s error\n", __func__);
544
545}
546
547void mtk_rtc_save_pwron_time(struct mt6330_rtc *rtc,
548 bool enable, struct rtc_time *tm)
549{
550 u32 pdn1 = 0;
551 int ret;
552
553 /* set power on time */
554 mtk_rtc_set_pwron_time(rtc, tm);
555
556 /* update power on alarm related flags */
557 if (enable)
558 pdn1 = RTC_PDN1_PWRON_TIME;
559
560 ret = rtc_update_bits(rtc,
561 rtc->addr_base + RTC_PDN1,
562 RTC_PDN1_PWRON_TIME,
563 pdn1);
564
565 mtk_rtc_write_trigger(rtc);
566
567 if (ret < 0)
568 goto exit;
569
570// mtk_rtc_write_trigger(rtc);
571
572 return;
573
574exit:
575 dev_err(rtc->dev, "%s error\n", __func__);
576}
577
xjb04a4022021-11-25 15:01:52 +0800578static int mtk_rtc_read_time(struct device *dev, struct rtc_time *tm)
579{
580 time64_t time;
581 struct mt6330_rtc *rtc = dev_get_drvdata(dev);
582 int days, sec, ret;
583
584 do {
585 ret = __mtk_rtc_read_time(rtc, tm, &sec);
586 if (ret < 0)
587 goto exit;
588 } while (sec < tm->tm_sec);
589
590 /* HW register use 7 bits to store year data, minus
591 * RTC_MIN_YEAR_OFFSET before write year data to register, and plus
592 * RTC_MIN_YEAR_OFFSET back after read year from register
593 */
594 tm->tm_year += RTC_MIN_YEAR_OFFSET;
595
596 /* HW register start mon from one, but tm_mon start from zero. */
597 tm->tm_mon--;
598 time = rtc_tm_to_time64(tm);
599
600 /* rtc_tm_to_time64 covert Gregorian date to seconds since
601 * 01-01-1970 00:00:00, and this date is Thursday.
602 */
603 days = div_s64(time, 86400);
604 tm->tm_wday = (days + 4) % 7;
605
606exit:
607 return ret;
608}
609
610static int mtk_rtc_set_time(struct device *dev, struct rtc_time *tm)
611{
612 struct mt6330_rtc *rtc = dev_get_drvdata(dev);
613 int ret;
614 u16 data[RTC_OFFSET_COUNT];
615
616 if (tm->tm_year > 195) {
617 dev_err(rtc->dev, "%s: invalid year %04d > 2095\n",
618 __func__, tm->tm_year + RTC_BASE_YEAR);
619 return -EINVAL;
620 }
621
622 tm->tm_year -= RTC_MIN_YEAR_OFFSET;
623 tm->tm_mon++;
624
625 data[RTC_OFFSET_SEC] = tm->tm_sec;
626 data[RTC_OFFSET_MIN] = tm->tm_min;
627 data[RTC_OFFSET_HOUR] = tm->tm_hour;
628 data[RTC_OFFSET_DOM] = tm->tm_mday;
629 data[RTC_OFFSET_MTH] = tm->tm_mon;
630 data[RTC_OFFSET_YEAR] = tm->tm_year;
631
632 mutex_lock(&rtc->lock);
633 ret = rtc_bulk_write(rtc, rtc->addr_base + RTC_TC_SEC,
634 data, RTC_OFFSET_COUNT * 2);
635 if (ret < 0)
636 goto exit;
637
638 /* Time register write to hardware after call trigger function */
639 ret = mtk_rtc_write_trigger(rtc);
640
641exit:
642 mutex_unlock(&rtc->lock);
643 return ret;
644}
645
646static int mtk_rtc_read_alarm(struct device *dev, struct rtc_wkalrm *alm)
647{
648 struct rtc_time *tm = &alm->time;
649 struct mt6330_rtc *rtc = dev_get_drvdata(dev);
650 u32 irqen = 0, pdn2 = 0;
651 int ret;
652 u16 data[RTC_OFFSET_COUNT] = { 0 };
653
654 mutex_lock(&rtc->lock);
655 ret = rtc_read(rtc, rtc->addr_base + RTC_IRQ_EN, &irqen);
656 if (ret < 0)
657 goto err_exit;
658 ret = rtc_read(rtc, rtc->addr_base + RTC_PDN2, &pdn2);
659 if (ret < 0)
660 goto err_exit;
661
662 ret = rtc_bulk_read(rtc, rtc->addr_base + RTC_AL_SEC,
663 data, RTC_OFFSET_COUNT * 2);
664 if (ret < 0)
665 goto err_exit;
666
667 alm->enabled = !!(irqen & RTC_IRQ_EN_AL);
668 alm->pending = !!(pdn2 & RTC_PDN2_PWRON_ALARM);
669 mutex_unlock(&rtc->lock);
670
671 tm->tm_sec = data[RTC_OFFSET_SEC] & RTC_AL_SEC_MASK;
672 tm->tm_min = data[RTC_OFFSET_MIN] & RTC_AL_MIN_MASK;
673 tm->tm_hour = data[RTC_OFFSET_HOUR] & RTC_AL_HOU_MASK;
674 tm->tm_mday = data[RTC_OFFSET_DOM] & RTC_AL_DOM_MASK;
675 tm->tm_mon = data[RTC_OFFSET_MTH] & RTC_AL_MTH_MASK;
676 tm->tm_year = data[RTC_OFFSET_YEAR] & RTC_AL_YEA_MASK;
677
678 tm->tm_year += RTC_MIN_YEAR_OFFSET;
679 tm->tm_mon--;
680
681 return 0;
682err_exit:
683 mutex_unlock(&rtc->lock);
684 return ret;
685}
686
687static int mtk_rtc_set_alarm(struct device *dev, struct rtc_wkalrm *alm)
688{
689 struct rtc_time *tm = &alm->time;
690 struct mt6330_rtc *rtc = dev_get_drvdata(dev);
691 int ret;
692 u16 data[RTC_OFFSET_COUNT] = { 0 };
xj79176bd2022-05-26 14:45:57 +0800693 ktime_t target;
694
695 printk_deferred(" %s set %d\n", __func__, alm->enabled);
696
697 if (alm->enabled == 1) {
698 /* Add one more second to postpone wake time. */
699 target = rtc_tm_to_ktime(*tm);
700 target = ktime_add_ns(target, NSEC_PER_SEC);
701 *tm = rtc_ktime_to_tm(target);
702 }
xjb04a4022021-11-25 15:01:52 +0800703
704 if (tm->tm_year > 195) {
705 dev_err(rtc->dev, "%s: invalid year %04d > 2095\n",
706 __func__, tm->tm_year + RTC_BASE_YEAR);
707 return -EINVAL;
708 }
709
710 tm->tm_year -= RTC_MIN_YEAR_OFFSET;
711 tm->tm_mon++;
712
713 mutex_lock(&rtc->lock);
xj79176bd2022-05-26 14:45:57 +0800714
715 switch (alm->enabled) {
716 case 3:
717 /* enable power-on alarm with logo */
718 mtk_rtc_save_pwron_time(rtc, true, tm);
719 break;
720 case 4:
721 /* disable power-on alarm */
722 mtk_rtc_save_pwron_time(rtc, false, tm);
723 break;
724 default:
725 break;
726 }
727
728 ret = rtc_update_bits(rtc,
729 rtc->addr_base + RTC_PDN2,
730 RTC_PDN2_PWRON_ALARM,
731 0);
732
733 if (ret < 0)
734 goto exit;
735 mtk_rtc_write_trigger(rtc);
736
xjb04a4022021-11-25 15:01:52 +0800737 ret = rtc_bulk_read(rtc, rtc->addr_base + RTC_AL_SEC,
738 data, RTC_OFFSET_COUNT * 2);
739 if (ret < 0)
740 goto exit;
741
742 data[RTC_OFFSET_SEC] = ((data[RTC_OFFSET_SEC] & ~(RTC_AL_SEC_MASK)) |
743 (tm->tm_sec & RTC_AL_SEC_MASK));
744 data[RTC_OFFSET_MIN] = ((data[RTC_OFFSET_MIN] & ~(RTC_AL_MIN_MASK)) |
745 (tm->tm_min & RTC_AL_MIN_MASK));
746 data[RTC_OFFSET_HOUR] = ((data[RTC_OFFSET_HOUR] & ~(RTC_AL_HOU_MASK)) |
747 (tm->tm_hour & RTC_AL_HOU_MASK));
748 data[RTC_OFFSET_DOM] = ((data[RTC_OFFSET_DOM] & ~(RTC_AL_DOM_MASK)) |
749 (tm->tm_mday & RTC_AL_DOM_MASK));
750 data[RTC_OFFSET_MTH] = ((data[RTC_OFFSET_MTH] & ~(RTC_AL_MTH_MASK)) |
751 (tm->tm_mon & RTC_AL_MTH_MASK));
752 data[RTC_OFFSET_YEAR] = ((data[RTC_OFFSET_YEAR] & ~(RTC_AL_YEA_MASK)) |
753 (tm->tm_year & RTC_AL_YEA_MASK));
754
xj79176bd2022-05-26 14:45:57 +0800755 printk_deferred(" %s set AL_SEC %x\n", __func__, data[RTC_OFFSET_SEC]);
756
xjb04a4022021-11-25 15:01:52 +0800757 if (alm->enabled) {
758 ret = rtc_bulk_read(rtc, rtc->addr_base + RTC_AL_SEC,
759 data, RTC_OFFSET_COUNT * 2);
760 if (ret < 0)
761 goto exit;
762 data[RTC_OFFSET_SEC] =
763 ((data[RTC_OFFSET_SEC] & ~(RTC_AL_SEC_MASK)) |
764 (tm->tm_sec & RTC_AL_SEC_MASK));
765 data[RTC_OFFSET_MIN] =
766 ((data[RTC_OFFSET_MIN] & ~(RTC_AL_MIN_MASK)) |
767 (tm->tm_min & RTC_AL_MIN_MASK));
768 data[RTC_OFFSET_HOUR] =
769 ((data[RTC_OFFSET_HOUR] & ~(RTC_AL_HOU_MASK)) |
770 (tm->tm_hour & RTC_AL_HOU_MASK));
771 data[RTC_OFFSET_DOM] =
772 ((data[RTC_OFFSET_DOM] & ~(RTC_AL_DOM_MASK)) |
773 (tm->tm_mday & RTC_AL_DOM_MASK));
774 data[RTC_OFFSET_MTH] =
775 ((data[RTC_OFFSET_MTH] & ~(RTC_AL_MTH_MASK)) |
776 (tm->tm_mon & RTC_AL_MTH_MASK));
777 data[RTC_OFFSET_YEAR] =
778 ((data[RTC_OFFSET_YEAR] & ~(RTC_AL_YEA_MASK)) |
779 (tm->tm_year & RTC_AL_YEA_MASK));
780 ret = rtc_bulk_write(rtc,
781 rtc->addr_base + RTC_AL_SEC,
782 data, RTC_OFFSET_COUNT * 2);
783 if (ret < 0)
784 goto exit;
785 ret = rtc_write(rtc, rtc->addr_base + RTC_AL_MASK,
786 RTC_AL_MASK_DOW);
787 if (ret < 0)
788 goto exit;
789 ret = rtc_update_bits(rtc,
790 rtc->addr_base + RTC_IRQ_EN,
791 RTC_IRQ_EN_ONESHOT_AL,
792 RTC_IRQ_EN_ONESHOT_AL);
793 if (ret < 0)
794 goto exit;
795 } else {
796 ret = rtc_update_bits(rtc,
797 rtc->addr_base + RTC_IRQ_EN,
798 RTC_IRQ_EN_ONESHOT_AL, 0);
799 if (ret < 0)
800 goto exit;
801 }
802
803 /* All alarm time register write to hardware after calling
804 * mtk_rtc_write_trigger. This can avoid race condition if alarm
805 * occur happen during writing alarm time register.
806 */
807 ret = mtk_rtc_write_trigger(rtc);
808exit:
809 mutex_unlock(&rtc->lock);
810 return ret;
811}
812
xj79176bd2022-05-26 14:45:57 +0800813int alarm_set_power_on(struct device *dev, struct rtc_wkalrm *alm)
814{
815 int err = 0;
816 struct rtc_time tm;
817 time64_t now, scheduled;
818
819 err = rtc_valid_tm(&alm->time);
820 if (err != 0)
821 return err;
822 scheduled = rtc_tm_to_time64(&alm->time);
823
824 err = mtk_rtc_read_time(dev, &tm);
825 if (err != 0)
826 return err;
827 now = rtc_tm_to_time64(&tm);
828
829 if (scheduled <= now)
830 alm->enabled = 4;
831 else
832 alm->enabled = 3;
833
834 mtk_rtc_set_alarm(dev, alm);
835
836 return err;
837}
838
xj01912a72022-09-17 15:59:22 +0800839static int mtk_rtc_ioctl(struct device *dev,
840 unsigned int cmd, unsigned long arg)
xj79176bd2022-05-26 14:45:57 +0800841{
842 void __user *uarg = (void __user *) arg;
843 int err = 0;
844 struct rtc_wkalrm alm;
845
846 switch (cmd) {
847 case RTC_POFF_ALM_SET:
848 if (copy_from_user(&alm.time, uarg, sizeof(alm.time)))
849 return -EFAULT;
850 err = alarm_set_power_on(dev, &alm);
851 break;
852 default:
853 err = -EINVAL;
854 break;
855 }
856
857 return err;
858}
859
xjb04a4022021-11-25 15:01:52 +0800860static const struct rtc_class_ops mtk_rtc_ops = {
xj79176bd2022-05-26 14:45:57 +0800861 .ioctl = mtk_rtc_ioctl,
xjb04a4022021-11-25 15:01:52 +0800862 .read_time = mtk_rtc_read_time,
863 .set_time = mtk_rtc_set_time,
864 .read_alarm = mtk_rtc_read_alarm,
865 .set_alarm = mtk_rtc_set_alarm,
866};
867
868static void mtk_rtc_enable_k_eosc(struct device *dev)
869{
870 struct mt6330_rtc *rtc = dev_get_drvdata(dev);
871 u32 td;
872
873 if (!rtc->cali_is_supported)
874 return;
875
876 /* Truning on eosc cali mode clock */
877 rtc_field_write(rtc, &rtc->dev_comp->cali_reg_fields[RTC_EOSC32_CK_PDN], 0);
878
879 if (rtc_eosc_cali_td) {
880 dev_notice(dev, "%s: rtc_eosc_cali_td = %d\n",
881 __func__, rtc_eosc_cali_td);
882 switch (rtc_eosc_cali_td) {
883 case 1:
884 td = EOSC_CALI_TD_01_SEC;
885 break;
886 case 2:
887 td = EOSC_CALI_TD_02_SEC;
888 break;
889 case 4:
890 td = EOSC_CALI_TD_04_SEC;
891 break;
892 case 16:
893 td = EOSC_CALI_TD_16_SEC;
894 break;
895 default:
896 td = EOSC_CALI_TD_08_SEC;
897 break;
898 }
899 rtc_field_write(rtc, &rtc->dev_comp->cali_reg_fields[EOSC_CALI_TD], td);
900 }
901}
902
903static void mtk_rtc_shutdown(struct platform_device *pdev)
904{
905 mtk_rtc_enable_k_eosc(&pdev->dev);
906}
907
908static int mtk_rtc_config_eosc_cali(struct device *dev)
909{
910 struct mt6330_rtc *rtc = dev_get_drvdata(dev);
911 int i;
912
913 for (i = 0; i < CALI_FILED_MAX; i++) {
914 rtc->cali[i] = devm_regmap_field_alloc(dev, rtc->regmap,
915 rtc->dev_comp->cali_reg_fields[i]);
916 if (IS_ERR(rtc->cali[i])) {
917 dev_err(rtc->dev, "cali regmap field[%d] err= %ld\n",
918 i, PTR_ERR(rtc->cali[i]));
919 return PTR_ERR(rtc->cali[i]);
920 }
921 }
922 rtc->cali_is_supported = true;
923
924 return 0;
925}
926
927static int mtk_rtc_set_spare(struct device *dev)
928{
929 struct mt6330_rtc *rtc = dev_get_drvdata(dev);
930 struct reg_field tmp[SPARE_RG_MAX];
931 int i, ret;
932 struct nvmem_config nvmem_cfg = {
933 .name = "mtk_rtc_nvmem",
934 .word_size = SPARE_REG_WIDTH,
935 .stride = 1,
936 .size = SPARE_RG_MAX * SPARE_REG_WIDTH,
937 .reg_read = rtc_nvram_read,
938 .reg_write = rtc_nvram_write,
939 .priv = dev,
940 };
941
942 memcpy(tmp, rtc->dev_comp->spare_reg_fields, sizeof(tmp));
943
944 for (i = 0; i < SPARE_RG_MAX; i++) {
945 tmp[i].reg += rtc->addr_base;
946 rtc->spare[i] = devm_regmap_field_alloc(rtc->dev,
947 rtc->regmap,
948 tmp[i]);
949 if (IS_ERR(rtc->spare[i])) {
950 dev_err(rtc->dev, "spare regmap field[%d] err= %ld\n",
951 i, PTR_ERR(rtc->spare[i]));
952 return PTR_ERR(rtc->spare[i]);
953 }
954 }
955
956 ret = rtc_nvmem_register(rtc->rtc_dev, &nvmem_cfg);
957 if (ret)
958 dev_err(rtc->dev, "nvmem register failed\n");
959
960 return ret;
961}
962
963static int mtk_rtc_probe(struct platform_device *pdev)
964{
965 struct resource *res;
966 struct mt6330_chip *mt6330_chip = dev_get_drvdata(pdev->dev.parent);
967 struct mt6330_rtc *rtc;
968 const struct of_device_id *of_id;
969 int ret;
970
971 rtc = devm_kzalloc(&pdev->dev, sizeof(struct mt6330_rtc), GFP_KERNEL);
972 if (!rtc)
973 return -ENOMEM;
974
975 res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
976 rtc->addr_base = res->start;
977
978 of_id = of_match_device(mt6330_rtc_of_match, &pdev->dev);
979 if (!of_id) {
980 dev_err(&pdev->dev, "Failed to probe of_node\n");
981 return -EINVAL;
982 }
983 rtc->dev_comp = of_id->data;
984
985 rtc->irq = platform_get_irq(pdev, 0);
986 if (rtc->irq < 0)
987 return rtc->irq;
988
989 rtc->regmap = mt6330_chip->regmap;
990 rtc->dev = &pdev->dev;
991 mutex_init(&rtc->lock);
992
993 platform_set_drvdata(pdev, rtc);
994
995 rtc->rtc_dev = devm_rtc_allocate_device(rtc->dev);
996 if (IS_ERR(rtc->rtc_dev))
997 return PTR_ERR(rtc->rtc_dev);
998
999 ret = request_threaded_irq(rtc->irq, NULL,
1000 mtk_rtc_irq_handler_thread,
1001 IRQF_ONESHOT | IRQF_TRIGGER_HIGH,
1002 "mt6330-rtc", rtc);
1003 if (ret) {
1004 dev_err(&pdev->dev, "Failed to request alarm IRQ: %d: %d\n",
1005 rtc->irq, ret);
1006 goto out_dispose_irq;
1007 }
1008
1009 device_init_wakeup(&pdev->dev, 1);
1010
1011 rtc->rtc_dev->ops = &mtk_rtc_ops;
1012
1013 ret = rtc_register_device(rtc->rtc_dev);
1014 if (ret) {
1015 dev_err(&pdev->dev, "register rtc device failed\n");
1016 goto out_free_irq;
1017 }
1018
1019 if (rtc->dev_comp->spare_reg_fields)
1020 if (mtk_rtc_set_spare(&pdev->dev))
1021 dev_err(&pdev->dev, "spare is not supported\n");
1022
1023 if (rtc->dev_comp->cali_reg_fields)
1024 if (mtk_rtc_config_eosc_cali(&pdev->dev))
1025 dev_err(&pdev->dev, "config eosc cali failed\n");
jb.qi874ed622022-11-17 17:45:27 -08001026 /*jb.qi change for rtc resume API on 2022.11.18 start*/
1027 rtc->wakeup_time = ktime_get();
1028 wakeup_by_rtc = false;
1029 /*jb.qi change for rtc resume API on 2022.11.18 end*/
xjb04a4022021-11-25 15:01:52 +08001030
1031 return 0;
1032
1033out_free_irq:
1034 free_irq(rtc->irq, rtc->rtc_dev);
1035out_dispose_irq:
1036 irq_dispose_mapping(rtc->irq);
1037 return ret;
1038}
1039
1040static int mtk_rtc_remove(struct platform_device *pdev)
1041{
1042 struct mt6330_rtc *rtc = platform_get_drvdata(pdev);
1043
1044 free_irq(rtc->irq, rtc->rtc_dev);
1045 irq_dispose_mapping(rtc->irq);
1046
1047 return 0;
1048}
1049
1050#ifdef CONFIG_PM_SLEEP
jb.qi874ed622022-11-17 17:45:27 -08001051/*jb.qi change for rtc resume API on 2022.11.18 start*/
1052bool isWakeupByRTC(void)
1053{
1054 return wakeup_by_rtc;
1055}
1056/*jb.qi change for rtc resume API on 2022.11.18 start*/
xjb04a4022021-11-25 15:01:52 +08001057static int mt6330_rtc_suspend(struct device *dev)
1058{
1059 struct mt6330_rtc *rtc = dev_get_drvdata(dev);
1060
1061 if (device_may_wakeup(dev))
1062 enable_irq_wake(rtc->irq);
1063
jb.qi874ed622022-11-17 17:45:27 -08001064 wakeup_by_rtc = false; //jb.qi change for rtc resume API on 2022.11.18
1065
xjb04a4022021-11-25 15:01:52 +08001066 return 0;
1067}
1068
1069static int mt6330_rtc_resume(struct device *dev)
1070{
1071 struct mt6330_rtc *rtc = dev_get_drvdata(dev);
jb.qi874ed622022-11-17 17:45:27 -08001072 ktime_t temp; //jb.qi change for rtc resume API on 2022.11.18
1073
xjb04a4022021-11-25 15:01:52 +08001074 if (device_may_wakeup(dev))
1075 disable_irq_wake(rtc->irq);
jb.qi874ed622022-11-17 17:45:27 -08001076 /*jb.qi change for rtc resume API on 2022.11.18 start*/
1077 temp = ktime_get();
xjb04a4022021-11-25 15:01:52 +08001078
jb.qi874ed622022-11-17 17:45:27 -08001079 wakeup_by_rtc = false;
1080 if((temp - rtc->wakeup_time) < RTC_WAKEUP_THRESHOLD)
1081 wakeup_by_rtc = true;
1082
1083 dev_info(dev, "%s: wakeup time:%lld, resume_time %lld wakeup_by_rtc %d\n", __func__, rtc->wakeup_time, temp, wakeup_by_rtc);
1084 /*jb.qi change for rtc resume API on 2022.11.18 end*/
xjb04a4022021-11-25 15:01:52 +08001085 return 0;
1086}
1087#endif
1088
1089static SIMPLE_DEV_PM_OPS(mt6330_pm_ops, mt6330_rtc_suspend,
1090 mt6330_rtc_resume);
1091
1092static struct platform_driver mtk_rtc_driver = {
1093 .driver = {
1094 .name = "mt6330-rtc",
1095 .of_match_table = mt6330_rtc_of_match,
1096 .pm = &mt6330_pm_ops,
1097 },
1098 .probe = mtk_rtc_probe,
1099 .remove = mtk_rtc_remove,
1100 .shutdown = mtk_rtc_shutdown,
1101};
1102
1103module_platform_driver(mtk_rtc_driver);
1104
1105MODULE_LICENSE("GPL v2");
1106MODULE_AUTHOR("Andrew Yang <andrew.yang@mediatek.com>");
1107MODULE_DESCRIPTION("RTC Driver for MediaTek MT6330 PMIC");