coreboot
coreboot is an Open Source project aimed at replacing the proprietary BIOS found in most computers.
rtc.c
Go to the documentation of this file.
1 /* SPDX-License-Identifier: GPL-2.0-only */
2 
3 #include <delay.h>
4 #include <soc/rtc.h>
5 #include <soc/rtc_common.h>
6 #include <soc/mt6391.h>
7 #include <soc/pmic_wrap.h>
8 #include <types.h>
9 
10 /* initialize rtc related gpio */
11 static bool rtc_gpio_init(void)
12 {
13  u16 con;
14 
16  MT6391_GPIO_PULL_DOWN); /* RTC_32K1V8 */
17 
18  /* Export 32K clock RTC_32K2V8 */
19  rtc_read(RTC_CON, &con);
21  con |= (RTC_CON_GPEN | RTC_CON_GOE);
22  con &= ~(RTC_CON_F32KOB);
23  rtc_write(RTC_CON, con);
24  return rtc_write_trigger();
25 }
26 
27 /* set xosc mode */
28 void rtc_osc_init(void)
29 {
30  u16 con;
31 
32  /* enable 32K export */
33  rtc_gpio_init();
34 
36  rtc_read(RTC_OSC32CON, &con);
37  if ((con & 0x1f) != 0x0) /* check XOSCCALI */
38  rtc_xosc_write(0x3);
39 }
40 
41 /* low power detect setting */
42 static bool rtc_lpd_init(void)
43 {
45  if (!rtc_write_trigger())
46  return false;
47 
49  if (!rtc_write_trigger())
50  return false;
51 
53  if (!rtc_write_trigger())
54  return false;
55 
56  return true;
57 }
58 
59 /* rtc init check */
60 int rtc_init(int recover)
61 {
62  int ret;
63 
64  rtc_info("recovery: %d\n", recover);
65 
66  if (!rtc_writeif_unlock()) {
68  goto err;
69  }
70 
71  if (!rtc_gpio_init()) {
73  goto err;
74  }
75 
76  /* Use SW to detect 32K mode instead of HW */
77  if (recover)
79 
80  if (!rtc_xosc_write(0x3)) {
82  goto err;
83  }
84 
85  /* In recovery mode, we need delay for register setting. */
86  if (recover)
87  mdelay(1000);
88 
89  /* write powerkeys */
92  if (!rtc_write_trigger()) {
94  goto err;
95  }
96 
97  if (recover)
99 
100  if (!rtc_xosc_write(0)) {
102  goto err;
103  }
104 
105  if (!rtc_reg_init()) {
107  goto err;
108  }
109 
110  if (!rtc_lpd_init()) {
112  goto err;
113  }
114 
115  return RTC_STATUS_OK;
116 err:
117  rtc_info("init fail: ret=%d\n", ret);
118  return ret;
119 }
120 
121 /* enable rtc bbpu */
122 static void rtc_bbpu_power_on(void)
123 {
124  u16 bbpu;
125  int ret;
126 
127  /* pull PWRBB high */
129  rtc_write(RTC_BBPU, bbpu);
130  ret = rtc_write_trigger();
131  rtc_info("rtc_write_trigger=%d\n", ret);
132 
133  /* enable DCXO to transform external 32KHz clock to 26MHz clock
134  directly sent to SoC */
137  BIT(8) | BIT(9) | BIT(10) | BIT(11), 0, 0);
139  BIT(1) | BIT(3) | BIT(5) | BIT(6), 0, 0);
140 
141  rtc_read(RTC_BBPU, &bbpu);
142  rtc_info("done BBPU=%#x\n", bbpu);
143 
144  /* detect hw clock done,close RG_RTC_75K_PDN for low power setting. */
146 }
147 
148 /* the rtc boot flow entry */
149 void rtc_boot(void)
150 {
153 
154  rtc_boot_common();
156 }
void mdelay(unsigned int msecs)
Definition: delay.c:2
#define BIT(nr)
Definition: ec_commands.h:45
@ MT6391_GPIO_PULL_DOWN
Definition: mt6391.h:305
void mt6391_gpio_set_pull(u32 gpio, enum mt6391_pull_enable enable, enum mt6391_pull_select select)
Definition: mt6391.c:480
@ MT6391_GPIO_PULL_DISABLE
Definition: mt6391.h:300
@ PMIC_RG_TOP_CKTST2
Definition: mt6391.h:45
@ PMIC_RG_CHRSTATUS
Definition: mt6391.h:48
@ PMIC_RG_TOP_CKPDN2
Definition: mt6391.h:38
@ PMIC_RG_TOP_CKPDN
Definition: mt6391.h:37
@ PMIC_RG_DCXO_POR2_CON3
Definition: mt6391.h:208
@ PMIC_RG_DCXO_FORCE_MODE1
Definition: mt6391.h:207
@ PMIC_RG_DCXO_CON2
Definition: mt6391.h:204
static void pwrap_write_field(u16 reg, u16 val, u16 mask, u16 shift)
@ RTC_STATUS_OK
Definition: rtc_common.h:87
@ RTC_STATUS_LPD_INIT_FAIL
Definition: rtc_common.h:94
@ RTC_STATUS_OSC_SETTING_FAIL
Definition: rtc_common.h:90
@ RTC_STATUS_REG_INIT_FAIL
Definition: rtc_common.h:93
@ RTC_STATUS_GPIO_INIT_FAIL
Definition: rtc_common.h:91
@ RTC_STATUS_WRITEIF_UNLOCK_FAIL
Definition: rtc_common.h:89
@ RTC_STATUS_POWERKEY_INIT_FAIL
Definition: rtc_common.h:88
#define rtc_info(fmt, arg ...)
Definition: rtc_common.h:12
@ RTC_BBPU_KEY
Definition: rtc_common.h:45
@ RTC_POWERKEY1_KEY
Definition: rtc_common.h:63
@ RTC_POWERKEY2_KEY
Definition: rtc_common.h:64
void rtc_read(u16 addr, u16 *rdata)
Definition: rtc_mt6359p.c:14
void rtc_write(u16 addr, u16 wdata)
Definition: rtc_mt6359p.c:25
void rtc_init(void)
Definition: rtc.c:29
bool rtc_write_trigger(void)
Definition: rtc.c:27
bool rtc_writeif_unlock(void)
Definition: rtc.c:34
bool rtc_reg_init(void)
Definition: rtc.c:121
void rtc_boot_common(void)
Definition: rtc.c:190
bool rtc_xosc_write(u16 val)
Definition: rtc.c:74
@ RTC_CON
Definition: rtc.h:43
@ RTC_OSC32CON
Definition: rtc.h:42
@ RTC_BBPU
Definition: rtc.h:14
@ RTC_BBPU_BBPU
Definition: rtc.h:64
@ RTC_BBPU_AUTO
Definition: rtc.h:65
@ RTC_BBPU_PWREN
Definition: rtc.h:63
@ RTC_CON_F32KOB
Definition: rtc.h:82
@ RTC_CON_LPSTA_RAW
Definition: rtc.h:92
@ RTC_CON_GOE
Definition: rtc.h:84
@ RTC_CON_LPRST
Definition: rtc.h:80
@ RTC_CON_LPEN
Definition: rtc.h:79
@ RTC_CON_GPEN
Definition: rtc.h:87
@ RTC_POWERKEY1
Definition: rtc.h:48
@ RTC_POWERKEY2
Definition: rtc.h:49
static bool rtc_gpio_init(void)
Definition: rtc.c:11
void rtc_boot(void)
Definition: rtc.c:149
void rtc_osc_init(void)
Definition: rtc.c:28
static bool rtc_lpd_init(void)
Definition: rtc.c:42
static void rtc_bbpu_power_on(void)
Definition: rtc.c:122
uint16_t u16
Definition: stdint.h:48