blob: 6739b0dd3e1ddfa92a0550ba29c68bee70b497c1 [file] [log] [blame]
Jorge Ramirez-Ortiz47503d22018-09-23 09:36:52 +02001/*
2 * Copyright (c) 2015-2018, Renesas Electronics Corporation. All rights reserved.
3 *
4 * SPDX-License-Identifier: BSD-3-Clause
5 */
6
Antonio Nino Diaze0f90632018-12-14 00:18:21 +00007#include <common/debug.h>
8#include <lib/mmio.h>
9
Jorge Ramirez-Ortiz47503d22018-09-23 09:36:52 +020010#include "dram_sub_func.h"
11
12#define PRR (0xFFF00044U)
13#define PRR_PRODUCT_MASK (0x00007F00U)
14#define PRR_CUT_MASK (0x000000FFU)
15#define PRR_PRODUCT_H3 (0x00004F00U) /* R-Car H3 */
16#define PRR_PRODUCT_M3 (0x00005200U) /* R-Car M3 */
17#define PRR_PRODUCT_M3N (0x00005500U) /* R-Car M3N */
18#define PRR_PRODUCT_E3 (0x00005700U) /* R-Car E3 */
19#define PRR_PRODUCT_V3H (0x00005600U) /* R-Car V3H */
20
21#if RCAR_SYSTEM_SUSPEND
Marek Vasut6c245a52018-12-12 18:06:39 +010022/* Local defines */
Jorge Ramirez-Ortiz47503d22018-09-23 09:36:52 +020023#define DRAM_BACKUP_GPIO_USE (0)
Marek Vasut6c245a52018-12-12 18:06:39 +010024#include "iic_dvfs.h"
Jorge Ramirez-Ortiz47503d22018-09-23 09:36:52 +020025#if PMIC_ROHM_BD9571
Marek Vasut6c245a52018-12-12 18:06:39 +010026#define PMIC_SLAVE_ADDR (0x30U)
Jorge Ramirez-Ortiz47503d22018-09-23 09:36:52 +020027#define PMIC_BKUP_MODE_CNT (0x20U)
28#define PMIC_QLLM_CNT (0x27U)
29#define BIT_BKUP_CTRL_OUT ((uint8_t)(1U << 4U))
30#define BIT_QLLM_DDR0_EN ((uint8_t)(1U << 0U))
31#define BIT_QLLM_DDR1_EN ((uint8_t)(1U << 1U))
32#endif
33
34#define GPIO_OUTDT1 (0xE6051008U)
35#define GPIO_INDT1 (0xE605100CU)
36#define GPIO_OUTDT3 (0xE6053008U)
37#define GPIO_INDT3 (0xE605300CU)
38#define GPIO_OUTDT6 (0xE6055408U)
39#define GPIO_INDT6 (0xE605540CU)
40
41#if DRAM_BACKUP_GPIO_USE == 1
42#define GPIO_BKUP_REQB_SHIFT_SALVATOR (9U) /* GP1_9 (BKUP_REQB) */
43#define GPIO_BKUP_REQB_SHIFT_EBISU (14U) /* GP6_14(BKUP_REQB) */
44#define GPIO_BKUP_REQB_SHIFT_CONDOR (1U) /* GP3_1 (BKUP_REQB) */
45#endif
46#define GPIO_BKUP_TRG_SHIFT_SALVATOR (8U) /* GP1_8 (BKUP_TRG) */
47#define GPIO_BKUP_TRG_SHIFT_EBISU (13U) /* GP6_13(BKUP_TRG) */
48#define GPIO_BKUP_TRG_SHIFT_CONDOR (0U) /* GP3_0 (BKUP_TRG) */
49
50#define DRAM_BKUP_TRG_LOOP_CNT (1000U)
51#endif
52
53void rcar_dram_get_boot_status(uint32_t * status)
54{
55#if RCAR_SYSTEM_SUSPEND
Jorge Ramirez-Ortiz47503d22018-09-23 09:36:52 +020056
Marek Vasut6c245a52018-12-12 18:06:39 +010057 uint32_t reg_data;
58 uint32_t product;
59 uint32_t shift;
60 uint32_t gpio;
Jorge Ramirez-Ortiz47503d22018-09-23 09:36:52 +020061
Marek Vasut6c245a52018-12-12 18:06:39 +010062 product = mmio_read_32(PRR) & PRR_PRODUCT_MASK;
Jorge Ramirez-Ortiz47503d22018-09-23 09:36:52 +020063 if (product == PRR_PRODUCT_V3H) {
64 shift = GPIO_BKUP_TRG_SHIFT_CONDOR;
65 gpio = GPIO_INDT3;
66 } else if (product == PRR_PRODUCT_E3) {
67 shift = GPIO_BKUP_TRG_SHIFT_EBISU;
68 gpio = GPIO_INDT6;
Marek Vasut6c245a52018-12-12 18:06:39 +010069 } else {
70 shift = GPIO_BKUP_TRG_SHIFT_SALVATOR;
71 gpio = GPIO_INDT1;
Jorge Ramirez-Ortiz47503d22018-09-23 09:36:52 +020072 }
73
Marek Vasut6c245a52018-12-12 18:06:39 +010074 reg_data = mmio_read_32(gpio);
75 if (0U != (reg_data & ((uint32_t)1U << shift))) {
76 *status = DRAM_BOOT_STATUS_WARM;
77 } else {
78 *status = DRAM_BOOT_STATUS_COLD;
79 }
80#else /* RCAR_SYSTEM_SUSPEND */
Jorge Ramirez-Ortiz47503d22018-09-23 09:36:52 +020081 *status = DRAM_BOOT_STATUS_COLD;
Marek Vasut6c245a52018-12-12 18:06:39 +010082#endif /* RCAR_SYSTEM_SUSPEND */
Jorge Ramirez-Ortiz47503d22018-09-23 09:36:52 +020083}
84
85int32_t rcar_dram_update_boot_status(uint32_t status)
86{
87 int32_t ret = 0;
88#if RCAR_SYSTEM_SUSPEND
Marek Vasut6c245a52018-12-12 18:06:39 +010089 uint32_t reg_data;
Jorge Ramirez-Ortiz47503d22018-09-23 09:36:52 +020090#if PMIC_ROHM_BD9571
91#if DRAM_BACKUP_GPIO_USE == 0
Marek Vasut6c245a52018-12-12 18:06:39 +010092 uint8_t bkup_mode_cnt = 0U;
Jorge Ramirez-Ortiz47503d22018-09-23 09:36:52 +020093#else
94 uint32_t reqb, outd;
95#endif
Marek Vasut6c245a52018-12-12 18:06:39 +010096 uint8_t qllm_cnt = 0U;
97 int32_t i2c_dvfs_ret = -1;
Jorge Ramirez-Ortiz47503d22018-09-23 09:36:52 +020098#endif
Marek Vasut6c245a52018-12-12 18:06:39 +010099 uint32_t loop_count;
100 uint32_t product;
101 uint32_t trg;
102 uint32_t gpio;
Jorge Ramirez-Ortiz47503d22018-09-23 09:36:52 +0200103
104 product = mmio_read_32(PRR) & PRR_PRODUCT_MASK;
105 if (product == PRR_PRODUCT_V3H) {
106#if DRAM_BACKUP_GPIO_USE == 1
107 reqb = GPIO_BKUP_REQB_SHIFT_CONDOR;
108 outd = GPIO_OUTDT3;
109#endif
110 trg = GPIO_BKUP_TRG_SHIFT_CONDOR;
111 gpio = GPIO_INDT3;
112 } else if (product == PRR_PRODUCT_E3) {
113#if DRAM_BACKUP_GPIO_USE == 1
114 reqb = GPIO_BKUP_REQB_SHIFT_EBISU;
115 outd = GPIO_OUTDT6;
116#endif
117 trg = GPIO_BKUP_TRG_SHIFT_EBISU;
118 gpio = GPIO_INDT6;
119 } else {
120#if DRAM_BACKUP_GPIO_USE == 1
121 reqb = GPIO_BKUP_REQB_SHIFT_SALVATOR;
122 outd = GPIO_OUTDT1;
123#endif
124 trg = GPIO_BKUP_TRG_SHIFT_SALVATOR;
125 gpio = GPIO_INDT1;
126 }
127
Marek Vasut6c245a52018-12-12 18:06:39 +0100128 if (status == DRAM_BOOT_STATUS_WARM) {
Jorge Ramirez-Ortiz47503d22018-09-23 09:36:52 +0200129#if DRAM_BACKUP_GPIO_USE==1
130 mmio_setbits_32(outd, 1U << reqb);
131#else
Jorge Ramirez-Ortiz47503d22018-09-23 09:36:52 +0200132#if PMIC_ROHM_BD9571
Marek Vasut6c245a52018-12-12 18:06:39 +0100133 /* Set BKUP_CRTL_OUT=High (BKUP mode cnt register) */
134 i2c_dvfs_ret = rcar_iic_dvfs_receive(PMIC_SLAVE_ADDR,
135 PMIC_BKUP_MODE_CNT, &bkup_mode_cnt);
136 if (0 != i2c_dvfs_ret) {
137 ERROR("BKUP mode cnt READ ERROR.\n");
138 ret = DRAM_UPDATE_STATUS_ERR;
139 } else {
140 bkup_mode_cnt &= (uint8_t)~BIT_BKUP_CTRL_OUT;
141 i2c_dvfs_ret = rcar_iic_dvfs_send(PMIC_SLAVE_ADDR,
142 PMIC_BKUP_MODE_CNT, bkup_mode_cnt);
143 if (0 != i2c_dvfs_ret) {
144 ERROR("BKUP mode cnt WRITE ERROR. "
145 "value = %d\n", bkup_mode_cnt);
146 ret = DRAM_UPDATE_STATUS_ERR;
147 }
148 }
149#endif /* PMIC_ROHM_BD9571 */
150#endif /* DRAM_BACKUP_GPIO_USE==1 */
151 /* Wait BKUP_TRG=Low */
152 loop_count = DRAM_BKUP_TRG_LOOP_CNT;
153 while (0U < loop_count) {
154 reg_data = mmio_read_32(gpio);
155 if ((reg_data &
156 ((uint32_t)1U << trg)) == 0U) {
157 break;
158 }
159 loop_count--;
160 }
161 if (0U == loop_count) {
162 ERROR( "\nWarm booting...\n" \
163 " The potential of BKUP_TRG did not switch " \
164 "to Low.\n If you expect the operation of " \
165 "cold boot,\n check the board configuration" \
166 " (ex, Dip-SW) and/or the H/W failure.\n");
167 ret = DRAM_UPDATE_STATUS_ERR;
168 }
Jorge Ramirez-Ortiz47503d22018-09-23 09:36:52 +0200169 }
Jorge Ramirez-Ortiz47503d22018-09-23 09:36:52 +0200170#if PMIC_ROHM_BD9571
Marek Vasut6c245a52018-12-12 18:06:39 +0100171 if(0 == ret) {
172 qllm_cnt = (BIT_QLLM_DDR0_EN | BIT_QLLM_DDR1_EN);
173 i2c_dvfs_ret = rcar_iic_dvfs_send(PMIC_SLAVE_ADDR,
174 PMIC_QLLM_CNT, qllm_cnt);
175 if (0 != i2c_dvfs_ret) {
176 ERROR("QLLM cnt WRITE ERROR. "
177 "value = %d\n", qllm_cnt);
178 ret = DRAM_UPDATE_STATUS_ERR;
179 }
Jorge Ramirez-Ortiz47503d22018-09-23 09:36:52 +0200180 }
181#endif
182#endif
183 return ret;
184}