blob: 8190779f5c64140c376a971ad10b9cabcf74a9b0 [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
xjd0aa0a12022-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
xjd0aa0a12022-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
xjd0aa0a12022-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
lh58829c42022-09-17 00:16:39 -0700126/* Set alarm time */
127#define RTC_POFF_ALM_SET _IOW('p', 0x15, struct rtc_time)
xjd0aa0a12022-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
xjd0aa0a12022-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;
180};
181
182static int mtk_rtc_write_trigger(struct mt6330_rtc *rtc);
183
xjd0aa0a12022-05-26 14:45:57 +0800184static u16 rtc_pwron_reg[RTC_OFFSET_COUNT][3] = {
185 {RTC_PWRON_SEC, RTC_PWRON_SEC_MASK, RTC_PWRON_SEC_SHIFT},
186 {RTC_PWRON_MIN, RTC_PWRON_MIN_MASK, RTC_PWRON_MIN_SHIFT},
187 {RTC_PWRON_HOU, RTC_PWRON_HOU_MASK, RTC_PWRON_HOU_SHIFT},
188 {RTC_PWRON_DOM, RTC_PWRON_DOM_MASK, RTC_PWRON_DOM_SHIFT},
189 {0, 0, 0},
190 {RTC_PWRON_MTH, RTC_PWRON_MTH_MASK, RTC_PWRON_MTH_SHIFT},
191 {RTC_PWRON_YEA, RTC_PWRON_YEA_MASK, RTC_PWRON_YEA_SHIFT},
192};
193
xjb04a4022021-11-25 15:01:52 +0800194static const struct reg_field mt6330_cali_reg_fields[CALI_FILED_MAX] = {
195 [RTC_EOSC32_CK_PDN] = REG_FIELD(MT6330_SCK_TOP_CKPDN_CON0_L, 2, 2),
196 [EOSC_CALI_TD] = REG_FIELD(MT6330_RTC_AL_DOW_L, 8, 10),
197};
198
199static const struct reg_field mtk_rtc_spare_reg_fields[SPARE_RG_MAX] = {
200 [SPARE_AL_HOU] = REG_FIELD(RTC_AL_HOU_H, 0, 7),
201 [SPARE_AL_MTH] = REG_FIELD(RTC_AL_MTH_H, 0, 7),
202 [SPARE_SPAR0] = REG_FIELD(RTC_SPAR0_L, 0, 7),
203};
204
205static const struct mtk_rtc_compatible mt6330_rtc_compat = {
206 .wrtgr_addr = RTC_WRTGR_MT6330,
207 .spare_reg_fields = mtk_rtc_spare_reg_fields,
208 .cali_reg_fields = mt6330_cali_reg_fields,
209};
210
211static const struct of_device_id mt6330_rtc_of_match[] = {
212 { .compatible = "mediatek,mt6330-rtc",
213 .data = (void *)&mt6330_rtc_compat, },
214 {}
215};
216MODULE_DEVICE_TABLE(of, mt6330_rtc_of_match);
217
218static int rtc_eosc_cali_td;
219module_param(rtc_eosc_cali_td, int, 0644);
220
221int rtc_state = RTC_STATE_INIT;
222
223static int mtk_rtc_write_lock(struct regmap *map, int lock)
224{
225 int ret;
226 unsigned int tmp, orig = 0;
227
228 ret = regmap_read(map, MT6330_SCK_TOP_CON0_H, &orig);
229 if (ret != 0)
230 return ret;
231
232 tmp = orig & (~0x01);
233 tmp |= lock & 0x01;
234 if (tmp != orig)
235 ret = regmap_write(map, MT6330_SCK_TOP_CON0_H, tmp);
236
237 return ret;
238}
239
240static int rtc_bulk_read(struct mt6330_rtc *rtc, unsigned int reg,
241 void *val, size_t val_count)
242{
243 int ret;
244
245 if ((reg >= rtc->addr_base + RTC_BBPU) && (reg <= rtc->addr_base + RTC_INT_CNT_L)) {
246 if (rtc_state == RTC_STATE_INIT || rtc_state == RTC_STATE_WT) {
247 ret = mtk_rtc_write_lock(rtc->regmap, 1);
248 if (ret != 0)
249 return ret;
250 } else if (rtc_state == RTC_STATE_W) {
251 // Trigger pending write before read
252 mtk_rtc_write_trigger(rtc);
253 ret = mtk_rtc_write_lock(rtc->regmap, 1);
254 if (ret != 0)
255 return ret;
256 }
257 // else, should be already locked, don't need to lock again.
258 rtc_state = RTC_STATE_R;
259 }
260 // else, not access RTC register
261
262 ret = regmap_bulk_read(rtc->regmap, reg, val, val_count);
263
264 return ret;
265}
266
267static int rtc_bulk_write(struct mt6330_rtc *rtc, unsigned int reg,
268 const void *val, size_t val_count)
269{
270 int ret;
271
272 if ((reg >= rtc->addr_base + RTC_BBPU) && (reg <= rtc->addr_base + RTC_INT_CNT_L)) {
273 if (reg == rtc->addr_base + rtc->dev_comp->wrtgr_addr) {
274 if (rtc_state == RTC_STATE_INIT || rtc_state == RTC_STATE_R ||
275 rtc_state == RTC_STATE_WT)
276 return 0; // nothing to write
277 ret = mtk_rtc_write_lock(rtc->regmap, 0);
278 if (ret != 0)
279 return ret;
280 rtc_state = RTC_STATE_WT;
281 } else {
282 if (rtc_state == RTC_STATE_INIT) {
283 // lock writing path first to clear any unexpected writing data
284 ret = mtk_rtc_write_lock(rtc->regmap, 1);
285 if (ret != 0)
286 return ret;
287 ret = mtk_rtc_write_lock(rtc->regmap, 0);
288 if (ret != 0)
289 return ret;
290 } else if (rtc_state == RTC_STATE_R) {
291 ret = mtk_rtc_write_lock(rtc->regmap, 0);
292 if (ret != 0)
293 return ret;
294 }
295 // else, should be already unlocked, don't need to unlock again.
296 rtc_state = RTC_STATE_W;
297 }
298 }
299 // else, not access RTC register
300
lh58829c42022-09-17 00:16:39 -0700301 ret = regmap_bulk_write(rtc->regmap, reg, val, val_count);
xjb04a4022021-11-25 15:01:52 +0800302
303 if (reg == rtc->addr_base + rtc->dev_comp->wrtgr_addr) {
304 // need 1 ms delay to make sure write completely
305 mdelay(1);
306 }
307
308 return ret;
309}
310
311static int rtc_write(struct mt6330_rtc *rtc, unsigned int reg,
312 unsigned int val)
313{
314 rtc_bulk_write(rtc, reg, &val, 2);
315 return 0;
316}
317
318static int rtc_read(struct mt6330_rtc *rtc, unsigned int reg,
319 unsigned int *val)
320{
321 rtc_bulk_read(rtc, reg, val, 2);
322 return 0;
323}
324
325static int rtc_field_read(struct mt6330_rtc *rtc, const struct reg_field *field, unsigned int *val)
326{
327 int ret;
328 unsigned int reg_val = 0;
329 unsigned int mask;
330 unsigned int shift;
331
332 mask = GENMASK(field->msb, field->lsb);
333 shift = field->lsb;
334
335 ret = rtc_read(rtc, field->reg, &reg_val);
336 if (ret != 0)
337 return ret;
338
339 reg_val &= mask;
340 reg_val >>= shift;
341 *val = reg_val;
342
343 return ret;
344}
345
346static int rtc_update_bits(struct mt6330_rtc *rtc, unsigned int reg,
347 unsigned int mask, unsigned int val)
348{
349 int ret;
350 unsigned int tmp, orig = 0;
351
352 ret = rtc_read(rtc, reg, &orig);
353 if (ret != 0)
354 return ret;
355
356 tmp = orig & ~mask;
357 tmp |= val & mask;
358 if (tmp != orig)
359 ret = rtc_write(rtc, reg, tmp);
360
361 return ret;
362}
363
364static int rtc_field_write(struct mt6330_rtc *rtc, const struct reg_field *field, unsigned int val)
365{
366 unsigned int mask;
367 unsigned int shift;
368
369 mask = GENMASK(field->msb, field->lsb);
370 shift = field->lsb;
371
372 rtc_update_bits(rtc, field->reg, mask, val << shift);
373 return 0;
374}
375
376static int mtk_rtc_write_trigger(struct mt6330_rtc *rtc)
377{
378 unsigned long timeout = jiffies + HZ;
379 int ret;
380 u32 data = 0;
381
382 ret = rtc_write(rtc,
383 rtc->addr_base + rtc->dev_comp->wrtgr_addr, 1);
384 if (ret < 0)
385 return ret;
386
387 while (1) {
388 ret = rtc_read(rtc, rtc->addr_base + RTC_BBPU,
389 &data);
390 if (ret < 0)
391 break;
392 if (!(data & RTC_BBPU_CBUSY))
393 break;
394 if (time_after(jiffies, timeout)) {
395 ret = -ETIMEDOUT;
396 break;
397 }
398 cpu_relax();
399 }
400
401 return ret;
402}
403
404static int rtc_nvram_read(void *priv, unsigned int offset, void *val,
405 size_t bytes)
406{
407 struct mt6330_rtc *rtc = dev_get_drvdata(priv);
408 unsigned int ival;
409 int ret;
410 u8 *buf = val;
411
412 mutex_lock(&rtc->lock);
413
414 for (; bytes; bytes--) {
415 ret = rtc_field_read(rtc, &rtc->dev_comp->spare_reg_fields[offset++], &ival);
416 if (ret)
417 goto out;
418 *buf++ = (u8)ival;
419 }
420out:
421 mutex_unlock(&rtc->lock);
422 return ret;
423}
424
425static int rtc_nvram_write(void *priv, unsigned int offset, void *val,
426 size_t bytes)
427{
428 struct mt6330_rtc *rtc = dev_get_drvdata(priv);
429 unsigned int ival;
430 int ret;
431 u8 *buf = val;
432
433 mutex_lock(&rtc->lock);
434
435 for (; bytes; bytes--) {
436 ival = *buf++;
437 ret = rtc_field_write(rtc, &rtc->dev_comp->spare_reg_fields[offset++], ival);
438 if (ret)
439 goto out;
440 }
441 mtk_rtc_write_trigger(rtc);
442out:
443 mutex_unlock(&rtc->lock);
444 return ret;
445}
446
447static irqreturn_t mtk_rtc_irq_handler_thread(int irq, void *data)
448{
449 struct mt6330_rtc *rtc = data;
450 u32 irqsta = 0, irqen;
451 int ret;
452
453 ret = rtc_read(rtc, rtc->addr_base + RTC_IRQ_STA, &irqsta);
454 if ((ret >= 0) && (irqsta & RTC_IRQ_STA_AL)) {
455 rtc_update_irq(rtc->rtc_dev, 1, RTC_IRQF | RTC_AF);
456 irqen = irqsta & ~RTC_IRQ_EN_AL;
457 mutex_lock(&rtc->lock);
458 if (rtc_write(rtc, rtc->addr_base + RTC_IRQ_EN,
459 irqen) == 0)
460 mtk_rtc_write_trigger(rtc);
461 mutex_unlock(&rtc->lock);
462
463 return IRQ_HANDLED;
464 }
465
466 return IRQ_NONE;
467}
468
469static int __mtk_rtc_read_time(struct mt6330_rtc *rtc,
470 struct rtc_time *tm, int *sec)
471{
472 int ret;
473 u16 data[RTC_OFFSET_COUNT] = { 0 };
474
475 mutex_lock(&rtc->lock);
476 ret = rtc_bulk_read(rtc, rtc->addr_base + RTC_TC_SEC,
477 data, RTC_OFFSET_COUNT * 2);
478 if (ret < 0)
479 goto exit;
480
481 tm->tm_sec = data[RTC_OFFSET_SEC] & RTC_TC_SEC_MASK;
482 tm->tm_min = data[RTC_OFFSET_MIN] & RTC_TC_MIN_MASK;
483 tm->tm_hour = data[RTC_OFFSET_HOUR] & RTC_TC_HOU_MASK;
484 tm->tm_mday = data[RTC_OFFSET_DOM] & RTC_TC_DOM_MASK;
485 tm->tm_mon = data[RTC_OFFSET_MTH] & RTC_TC_MTH_MASK;
486 tm->tm_year = data[RTC_OFFSET_YEAR] & RTC_TC_YEA_MASK;
487
488 ret = rtc_read(rtc, rtc->addr_base + RTC_TC_SEC, sec);
489 *sec &= RTC_TC_SEC_MASK;
490exit:
491 mutex_unlock(&rtc->lock);
492 return ret;
493}
494
xjd0aa0a12022-05-26 14:45:57 +0800495static void mtk_rtc_set_pwron_time(struct mt6330_rtc *rtc, struct rtc_time *tm)
496{
497 u32 data[RTC_OFFSET_COUNT];
498 int ret, i;
499
500 data[RTC_OFFSET_SEC] =
501 ((tm->tm_sec << RTC_PWRON_SEC_SHIFT) & RTC_PWRON_SEC_MASK);
502 data[RTC_OFFSET_MIN] =
503 ((tm->tm_min << RTC_PWRON_MIN_SHIFT) & RTC_PWRON_MIN_MASK);
504 data[RTC_OFFSET_HOUR] =
505 ((tm->tm_hour << RTC_PWRON_HOU_SHIFT) & RTC_PWRON_HOU_MASK);
506 data[RTC_OFFSET_DOM] =
507 ((tm->tm_mday << RTC_PWRON_DOM_SHIFT) & RTC_PWRON_DOM_MASK);
508 data[RTC_OFFSET_MTH] =
509 ((tm->tm_mon << RTC_PWRON_MTH_SHIFT) & RTC_PWRON_MTH_MASK);
510 data[RTC_OFFSET_YEAR] =
511 ((tm->tm_year << RTC_PWRON_YEA_SHIFT) & RTC_PWRON_YEA_MASK);
512
513 printk_deferred(" %s set PWRON_SEC %x\n", __func__, data[RTC_OFFSET_SEC]);
514
515 for (i = RTC_OFFSET_SEC; i < RTC_OFFSET_COUNT; i++) {
516 if (i == RTC_OFFSET_DOW)
517 continue;
518 ret = rtc_update_bits(rtc,
519 rtc->addr_base + rtc_pwron_reg[i][RTC_REG],
520 rtc_pwron_reg[i][RTC_MASK],
521 data[i]);
522
523 if (ret < 0)
524 goto exit;
525 mtk_rtc_write_trigger(rtc);
526 }
527
528 if (ret < 0)
529 goto exit;
530
531 return;
532
533exit:
534 dev_err(rtc->dev, "%s error\n", __func__);
535 printk_deferred("%s error\n", __func__);
536
537}
538
539void mtk_rtc_save_pwron_time(struct mt6330_rtc *rtc,
540 bool enable, struct rtc_time *tm)
541{
542 u32 pdn1 = 0;
543 int ret;
544
545 /* set power on time */
546 mtk_rtc_set_pwron_time(rtc, tm);
547
548 /* update power on alarm related flags */
549 if (enable)
550 pdn1 = RTC_PDN1_PWRON_TIME;
551
552 ret = rtc_update_bits(rtc,
553 rtc->addr_base + RTC_PDN1,
554 RTC_PDN1_PWRON_TIME,
555 pdn1);
556
557 mtk_rtc_write_trigger(rtc);
558
559 if (ret < 0)
560 goto exit;
561
562// mtk_rtc_write_trigger(rtc);
563
564 return;
565
566exit:
567 dev_err(rtc->dev, "%s error\n", __func__);
568}
569
xjb04a4022021-11-25 15:01:52 +0800570static int mtk_rtc_read_time(struct device *dev, struct rtc_time *tm)
571{
572 time64_t time;
573 struct mt6330_rtc *rtc = dev_get_drvdata(dev);
574 int days, sec, ret;
575
576 do {
577 ret = __mtk_rtc_read_time(rtc, tm, &sec);
578 if (ret < 0)
579 goto exit;
580 } while (sec < tm->tm_sec);
581
582 /* HW register use 7 bits to store year data, minus
583 * RTC_MIN_YEAR_OFFSET before write year data to register, and plus
584 * RTC_MIN_YEAR_OFFSET back after read year from register
585 */
586 tm->tm_year += RTC_MIN_YEAR_OFFSET;
587
588 /* HW register start mon from one, but tm_mon start from zero. */
589 tm->tm_mon--;
590 time = rtc_tm_to_time64(tm);
591
592 /* rtc_tm_to_time64 covert Gregorian date to seconds since
593 * 01-01-1970 00:00:00, and this date is Thursday.
594 */
595 days = div_s64(time, 86400);
596 tm->tm_wday = (days + 4) % 7;
597
598exit:
599 return ret;
600}
601
602static int mtk_rtc_set_time(struct device *dev, struct rtc_time *tm)
603{
604 struct mt6330_rtc *rtc = dev_get_drvdata(dev);
605 int ret;
606 u16 data[RTC_OFFSET_COUNT];
607
608 if (tm->tm_year > 195) {
609 dev_err(rtc->dev, "%s: invalid year %04d > 2095\n",
610 __func__, tm->tm_year + RTC_BASE_YEAR);
611 return -EINVAL;
612 }
613
614 tm->tm_year -= RTC_MIN_YEAR_OFFSET;
615 tm->tm_mon++;
616
617 data[RTC_OFFSET_SEC] = tm->tm_sec;
618 data[RTC_OFFSET_MIN] = tm->tm_min;
619 data[RTC_OFFSET_HOUR] = tm->tm_hour;
620 data[RTC_OFFSET_DOM] = tm->tm_mday;
621 data[RTC_OFFSET_MTH] = tm->tm_mon;
622 data[RTC_OFFSET_YEAR] = tm->tm_year;
623
624 mutex_lock(&rtc->lock);
625 ret = rtc_bulk_write(rtc, rtc->addr_base + RTC_TC_SEC,
626 data, RTC_OFFSET_COUNT * 2);
627 if (ret < 0)
628 goto exit;
629
630 /* Time register write to hardware after call trigger function */
631 ret = mtk_rtc_write_trigger(rtc);
632
633exit:
634 mutex_unlock(&rtc->lock);
635 return ret;
636}
637
638static int mtk_rtc_read_alarm(struct device *dev, struct rtc_wkalrm *alm)
639{
640 struct rtc_time *tm = &alm->time;
641 struct mt6330_rtc *rtc = dev_get_drvdata(dev);
642 u32 irqen = 0, pdn2 = 0;
643 int ret;
644 u16 data[RTC_OFFSET_COUNT] = { 0 };
645
646 mutex_lock(&rtc->lock);
647 ret = rtc_read(rtc, rtc->addr_base + RTC_IRQ_EN, &irqen);
648 if (ret < 0)
649 goto err_exit;
650 ret = rtc_read(rtc, rtc->addr_base + RTC_PDN2, &pdn2);
651 if (ret < 0)
652 goto err_exit;
653
654 ret = rtc_bulk_read(rtc, rtc->addr_base + RTC_AL_SEC,
655 data, RTC_OFFSET_COUNT * 2);
656 if (ret < 0)
657 goto err_exit;
658
659 alm->enabled = !!(irqen & RTC_IRQ_EN_AL);
660 alm->pending = !!(pdn2 & RTC_PDN2_PWRON_ALARM);
661 mutex_unlock(&rtc->lock);
662
663 tm->tm_sec = data[RTC_OFFSET_SEC] & RTC_AL_SEC_MASK;
664 tm->tm_min = data[RTC_OFFSET_MIN] & RTC_AL_MIN_MASK;
665 tm->tm_hour = data[RTC_OFFSET_HOUR] & RTC_AL_HOU_MASK;
666 tm->tm_mday = data[RTC_OFFSET_DOM] & RTC_AL_DOM_MASK;
667 tm->tm_mon = data[RTC_OFFSET_MTH] & RTC_AL_MTH_MASK;
668 tm->tm_year = data[RTC_OFFSET_YEAR] & RTC_AL_YEA_MASK;
669
670 tm->tm_year += RTC_MIN_YEAR_OFFSET;
671 tm->tm_mon--;
672
673 return 0;
674err_exit:
675 mutex_unlock(&rtc->lock);
676 return ret;
677}
678
679static int mtk_rtc_set_alarm(struct device *dev, struct rtc_wkalrm *alm)
680{
681 struct rtc_time *tm = &alm->time;
682 struct mt6330_rtc *rtc = dev_get_drvdata(dev);
683 int ret;
684 u16 data[RTC_OFFSET_COUNT] = { 0 };
xjd0aa0a12022-05-26 14:45:57 +0800685 ktime_t target;
686
687 printk_deferred(" %s set %d\n", __func__, alm->enabled);
688
689 if (alm->enabled == 1) {
690 /* Add one more second to postpone wake time. */
691 target = rtc_tm_to_ktime(*tm);
692 target = ktime_add_ns(target, NSEC_PER_SEC);
693 *tm = rtc_ktime_to_tm(target);
694 }
xjb04a4022021-11-25 15:01:52 +0800695
696 if (tm->tm_year > 195) {
697 dev_err(rtc->dev, "%s: invalid year %04d > 2095\n",
698 __func__, tm->tm_year + RTC_BASE_YEAR);
699 return -EINVAL;
700 }
701
702 tm->tm_year -= RTC_MIN_YEAR_OFFSET;
703 tm->tm_mon++;
704
705 mutex_lock(&rtc->lock);
xjd0aa0a12022-05-26 14:45:57 +0800706
707 switch (alm->enabled) {
708 case 3:
709 /* enable power-on alarm with logo */
710 mtk_rtc_save_pwron_time(rtc, true, tm);
711 break;
712 case 4:
713 /* disable power-on alarm */
714 mtk_rtc_save_pwron_time(rtc, false, tm);
715 break;
716 default:
717 break;
718 }
719
720 ret = rtc_update_bits(rtc,
721 rtc->addr_base + RTC_PDN2,
722 RTC_PDN2_PWRON_ALARM,
723 0);
724
725 if (ret < 0)
726 goto exit;
727 mtk_rtc_write_trigger(rtc);
728
xjb04a4022021-11-25 15:01:52 +0800729 ret = rtc_bulk_read(rtc, rtc->addr_base + RTC_AL_SEC,
730 data, RTC_OFFSET_COUNT * 2);
731 if (ret < 0)
732 goto exit;
733
734 data[RTC_OFFSET_SEC] = ((data[RTC_OFFSET_SEC] & ~(RTC_AL_SEC_MASK)) |
735 (tm->tm_sec & RTC_AL_SEC_MASK));
736 data[RTC_OFFSET_MIN] = ((data[RTC_OFFSET_MIN] & ~(RTC_AL_MIN_MASK)) |
737 (tm->tm_min & RTC_AL_MIN_MASK));
738 data[RTC_OFFSET_HOUR] = ((data[RTC_OFFSET_HOUR] & ~(RTC_AL_HOU_MASK)) |
739 (tm->tm_hour & RTC_AL_HOU_MASK));
740 data[RTC_OFFSET_DOM] = ((data[RTC_OFFSET_DOM] & ~(RTC_AL_DOM_MASK)) |
741 (tm->tm_mday & RTC_AL_DOM_MASK));
742 data[RTC_OFFSET_MTH] = ((data[RTC_OFFSET_MTH] & ~(RTC_AL_MTH_MASK)) |
743 (tm->tm_mon & RTC_AL_MTH_MASK));
744 data[RTC_OFFSET_YEAR] = ((data[RTC_OFFSET_YEAR] & ~(RTC_AL_YEA_MASK)) |
745 (tm->tm_year & RTC_AL_YEA_MASK));
746
xjd0aa0a12022-05-26 14:45:57 +0800747 printk_deferred(" %s set AL_SEC %x\n", __func__, data[RTC_OFFSET_SEC]);
748
xjb04a4022021-11-25 15:01:52 +0800749 if (alm->enabled) {
750 ret = rtc_bulk_read(rtc, rtc->addr_base + RTC_AL_SEC,
751 data, RTC_OFFSET_COUNT * 2);
752 if (ret < 0)
753 goto exit;
754 data[RTC_OFFSET_SEC] =
755 ((data[RTC_OFFSET_SEC] & ~(RTC_AL_SEC_MASK)) |
756 (tm->tm_sec & RTC_AL_SEC_MASK));
757 data[RTC_OFFSET_MIN] =
758 ((data[RTC_OFFSET_MIN] & ~(RTC_AL_MIN_MASK)) |
759 (tm->tm_min & RTC_AL_MIN_MASK));
760 data[RTC_OFFSET_HOUR] =
761 ((data[RTC_OFFSET_HOUR] & ~(RTC_AL_HOU_MASK)) |
762 (tm->tm_hour & RTC_AL_HOU_MASK));
763 data[RTC_OFFSET_DOM] =
764 ((data[RTC_OFFSET_DOM] & ~(RTC_AL_DOM_MASK)) |
765 (tm->tm_mday & RTC_AL_DOM_MASK));
766 data[RTC_OFFSET_MTH] =
767 ((data[RTC_OFFSET_MTH] & ~(RTC_AL_MTH_MASK)) |
768 (tm->tm_mon & RTC_AL_MTH_MASK));
769 data[RTC_OFFSET_YEAR] =
770 ((data[RTC_OFFSET_YEAR] & ~(RTC_AL_YEA_MASK)) |
771 (tm->tm_year & RTC_AL_YEA_MASK));
772 ret = rtc_bulk_write(rtc,
773 rtc->addr_base + RTC_AL_SEC,
774 data, RTC_OFFSET_COUNT * 2);
775 if (ret < 0)
776 goto exit;
777 ret = rtc_write(rtc, rtc->addr_base + RTC_AL_MASK,
778 RTC_AL_MASK_DOW);
779 if (ret < 0)
780 goto exit;
781 ret = rtc_update_bits(rtc,
782 rtc->addr_base + RTC_IRQ_EN,
783 RTC_IRQ_EN_ONESHOT_AL,
784 RTC_IRQ_EN_ONESHOT_AL);
785 if (ret < 0)
786 goto exit;
787 } else {
788 ret = rtc_update_bits(rtc,
789 rtc->addr_base + RTC_IRQ_EN,
790 RTC_IRQ_EN_ONESHOT_AL, 0);
791 if (ret < 0)
792 goto exit;
793 }
794
795 /* All alarm time register write to hardware after calling
796 * mtk_rtc_write_trigger. This can avoid race condition if alarm
797 * occur happen during writing alarm time register.
798 */
799 ret = mtk_rtc_write_trigger(rtc);
800exit:
801 mutex_unlock(&rtc->lock);
802 return ret;
803}
804
xjd0aa0a12022-05-26 14:45:57 +0800805int alarm_set_power_on(struct device *dev, struct rtc_wkalrm *alm)
806{
807 int err = 0;
808 struct rtc_time tm;
809 time64_t now, scheduled;
810
811 err = rtc_valid_tm(&alm->time);
812 if (err != 0)
813 return err;
814 scheduled = rtc_tm_to_time64(&alm->time);
815
816 err = mtk_rtc_read_time(dev, &tm);
817 if (err != 0)
818 return err;
819 now = rtc_tm_to_time64(&tm);
820
821 if (scheduled <= now)
822 alm->enabled = 4;
823 else
824 alm->enabled = 3;
825
826 mtk_rtc_set_alarm(dev, alm);
827
828 return err;
829}
830
xj6e5de182022-09-17 15:59:22 +0800831static int mtk_rtc_ioctl(struct device *dev,
832 unsigned int cmd, unsigned long arg)
xjd0aa0a12022-05-26 14:45:57 +0800833{
834 void __user *uarg = (void __user *) arg;
835 int err = 0;
836 struct rtc_wkalrm alm;
837
838 switch (cmd) {
839 case RTC_POFF_ALM_SET:
840 if (copy_from_user(&alm.time, uarg, sizeof(alm.time)))
841 return -EFAULT;
842 err = alarm_set_power_on(dev, &alm);
843 break;
844 default:
845 err = -EINVAL;
846 break;
847 }
848
849 return err;
850}
851
xjb04a4022021-11-25 15:01:52 +0800852static const struct rtc_class_ops mtk_rtc_ops = {
xjd0aa0a12022-05-26 14:45:57 +0800853 .ioctl = mtk_rtc_ioctl,
xjb04a4022021-11-25 15:01:52 +0800854 .read_time = mtk_rtc_read_time,
855 .set_time = mtk_rtc_set_time,
856 .read_alarm = mtk_rtc_read_alarm,
857 .set_alarm = mtk_rtc_set_alarm,
858};
859
860static void mtk_rtc_enable_k_eosc(struct device *dev)
861{
862 struct mt6330_rtc *rtc = dev_get_drvdata(dev);
863 u32 td;
864
865 if (!rtc->cali_is_supported)
866 return;
867
868 /* Truning on eosc cali mode clock */
869 rtc_field_write(rtc, &rtc->dev_comp->cali_reg_fields[RTC_EOSC32_CK_PDN], 0);
870
871 if (rtc_eosc_cali_td) {
872 dev_notice(dev, "%s: rtc_eosc_cali_td = %d\n",
873 __func__, rtc_eosc_cali_td);
874 switch (rtc_eosc_cali_td) {
875 case 1:
876 td = EOSC_CALI_TD_01_SEC;
877 break;
878 case 2:
879 td = EOSC_CALI_TD_02_SEC;
880 break;
881 case 4:
882 td = EOSC_CALI_TD_04_SEC;
883 break;
884 case 16:
885 td = EOSC_CALI_TD_16_SEC;
886 break;
887 default:
888 td = EOSC_CALI_TD_08_SEC;
889 break;
890 }
891 rtc_field_write(rtc, &rtc->dev_comp->cali_reg_fields[EOSC_CALI_TD], td);
892 }
893}
894
895static void mtk_rtc_shutdown(struct platform_device *pdev)
896{
897 mtk_rtc_enable_k_eosc(&pdev->dev);
898}
899
900static int mtk_rtc_config_eosc_cali(struct device *dev)
901{
902 struct mt6330_rtc *rtc = dev_get_drvdata(dev);
903 int i;
904
905 for (i = 0; i < CALI_FILED_MAX; i++) {
906 rtc->cali[i] = devm_regmap_field_alloc(dev, rtc->regmap,
907 rtc->dev_comp->cali_reg_fields[i]);
908 if (IS_ERR(rtc->cali[i])) {
909 dev_err(rtc->dev, "cali regmap field[%d] err= %ld\n",
910 i, PTR_ERR(rtc->cali[i]));
911 return PTR_ERR(rtc->cali[i]);
912 }
913 }
914 rtc->cali_is_supported = true;
915
916 return 0;
917}
918
919static int mtk_rtc_set_spare(struct device *dev)
920{
921 struct mt6330_rtc *rtc = dev_get_drvdata(dev);
922 struct reg_field tmp[SPARE_RG_MAX];
923 int i, ret;
924 struct nvmem_config nvmem_cfg = {
925 .name = "mtk_rtc_nvmem",
926 .word_size = SPARE_REG_WIDTH,
927 .stride = 1,
928 .size = SPARE_RG_MAX * SPARE_REG_WIDTH,
929 .reg_read = rtc_nvram_read,
930 .reg_write = rtc_nvram_write,
931 .priv = dev,
932 };
933
934 memcpy(tmp, rtc->dev_comp->spare_reg_fields, sizeof(tmp));
935
936 for (i = 0; i < SPARE_RG_MAX; i++) {
937 tmp[i].reg += rtc->addr_base;
938 rtc->spare[i] = devm_regmap_field_alloc(rtc->dev,
939 rtc->regmap,
940 tmp[i]);
941 if (IS_ERR(rtc->spare[i])) {
942 dev_err(rtc->dev, "spare regmap field[%d] err= %ld\n",
943 i, PTR_ERR(rtc->spare[i]));
944 return PTR_ERR(rtc->spare[i]);
945 }
946 }
947
948 ret = rtc_nvmem_register(rtc->rtc_dev, &nvmem_cfg);
949 if (ret)
950 dev_err(rtc->dev, "nvmem register failed\n");
951
952 return ret;
953}
954
955static int mtk_rtc_probe(struct platform_device *pdev)
956{
957 struct resource *res;
958 struct mt6330_chip *mt6330_chip = dev_get_drvdata(pdev->dev.parent);
959 struct mt6330_rtc *rtc;
960 const struct of_device_id *of_id;
961 int ret;
962
963 rtc = devm_kzalloc(&pdev->dev, sizeof(struct mt6330_rtc), GFP_KERNEL);
964 if (!rtc)
965 return -ENOMEM;
966
967 res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
968 rtc->addr_base = res->start;
969
970 of_id = of_match_device(mt6330_rtc_of_match, &pdev->dev);
971 if (!of_id) {
972 dev_err(&pdev->dev, "Failed to probe of_node\n");
973 return -EINVAL;
974 }
975 rtc->dev_comp = of_id->data;
976
977 rtc->irq = platform_get_irq(pdev, 0);
978 if (rtc->irq < 0)
979 return rtc->irq;
980
981 rtc->regmap = mt6330_chip->regmap;
982 rtc->dev = &pdev->dev;
983 mutex_init(&rtc->lock);
984
985 platform_set_drvdata(pdev, rtc);
986
987 rtc->rtc_dev = devm_rtc_allocate_device(rtc->dev);
988 if (IS_ERR(rtc->rtc_dev))
989 return PTR_ERR(rtc->rtc_dev);
990
991 ret = request_threaded_irq(rtc->irq, NULL,
992 mtk_rtc_irq_handler_thread,
993 IRQF_ONESHOT | IRQF_TRIGGER_HIGH,
994 "mt6330-rtc", rtc);
995 if (ret) {
996 dev_err(&pdev->dev, "Failed to request alarm IRQ: %d: %d\n",
997 rtc->irq, ret);
998 goto out_dispose_irq;
999 }
1000
1001 device_init_wakeup(&pdev->dev, 1);
1002
1003 rtc->rtc_dev->ops = &mtk_rtc_ops;
1004
1005 ret = rtc_register_device(rtc->rtc_dev);
1006 if (ret) {
1007 dev_err(&pdev->dev, "register rtc device failed\n");
1008 goto out_free_irq;
1009 }
1010
1011 if (rtc->dev_comp->spare_reg_fields)
1012 if (mtk_rtc_set_spare(&pdev->dev))
1013 dev_err(&pdev->dev, "spare is not supported\n");
1014
1015 if (rtc->dev_comp->cali_reg_fields)
1016 if (mtk_rtc_config_eosc_cali(&pdev->dev))
1017 dev_err(&pdev->dev, "config eosc cali failed\n");
1018
1019 return 0;
1020
1021out_free_irq:
1022 free_irq(rtc->irq, rtc->rtc_dev);
1023out_dispose_irq:
1024 irq_dispose_mapping(rtc->irq);
1025 return ret;
1026}
1027
1028static int mtk_rtc_remove(struct platform_device *pdev)
1029{
1030 struct mt6330_rtc *rtc = platform_get_drvdata(pdev);
1031
1032 free_irq(rtc->irq, rtc->rtc_dev);
1033 irq_dispose_mapping(rtc->irq);
1034
1035 return 0;
1036}
1037
1038#ifdef CONFIG_PM_SLEEP
1039static int mt6330_rtc_suspend(struct device *dev)
1040{
1041 struct mt6330_rtc *rtc = dev_get_drvdata(dev);
1042
1043 if (device_may_wakeup(dev))
1044 enable_irq_wake(rtc->irq);
1045
1046 return 0;
1047}
1048
1049static int mt6330_rtc_resume(struct device *dev)
1050{
1051 struct mt6330_rtc *rtc = dev_get_drvdata(dev);
1052
1053 if (device_may_wakeup(dev))
1054 disable_irq_wake(rtc->irq);
1055
1056 return 0;
1057}
1058#endif
1059
1060static SIMPLE_DEV_PM_OPS(mt6330_pm_ops, mt6330_rtc_suspend,
1061 mt6330_rtc_resume);
1062
1063static struct platform_driver mtk_rtc_driver = {
1064 .driver = {
1065 .name = "mt6330-rtc",
1066 .of_match_table = mt6330_rtc_of_match,
1067 .pm = &mt6330_pm_ops,
1068 },
1069 .probe = mtk_rtc_probe,
1070 .remove = mtk_rtc_remove,
1071 .shutdown = mtk_rtc_shutdown,
1072};
1073
1074module_platform_driver(mtk_rtc_driver);
1075
1076MODULE_LICENSE("GPL v2");
1077MODULE_AUTHOR("Andrew Yang <andrew.yang@mediatek.com>");
1078MODULE_DESCRIPTION("RTC Driver for MediaTek MT6330 PMIC");