xref: /rk3399_ARM-atf/drivers/renesas/common/avs/avs_driver.c (revision 65d227c3a20c80bb70f796e5839dc96014f0f9cf)
1*b50b6c81SBiju Das /*
2*b50b6c81SBiju Das  * Copyright (c) 2015-2020, Renesas Electronics Corporation. All rights reserved.
3*b50b6c81SBiju Das  *
4*b50b6c81SBiju Das  * SPDX-License-Identifier: BSD-3-Clause
5*b50b6c81SBiju Das  */
6*b50b6c81SBiju Das 
7*b50b6c81SBiju Das #include <common/debug.h>
8*b50b6c81SBiju Das #include <lib/mmio.h>
9*b50b6c81SBiju Das #include <lib/utils_def.h>
10*b50b6c81SBiju Das 
11*b50b6c81SBiju Das #include "avs_driver.h"
12*b50b6c81SBiju Das #include "cpg_registers.h"
13*b50b6c81SBiju Das #include "rcar_def.h"
14*b50b6c81SBiju Das #include "rcar_private.h"
15*b50b6c81SBiju Das 
16*b50b6c81SBiju Das #if (AVS_SETTING_ENABLE == 1)
17*b50b6c81SBiju Das #if PMIC_ROHM_BD9571
18*b50b6c81SBiju Das /* Read PMIC register for debug. 1:enable / 0:disable */
19*b50b6c81SBiju Das #define AVS_READ_PMIC_REG_ENABLE	0
20*b50b6c81SBiju Das /* The re-try number of times of the AVS setting. */
21*b50b6c81SBiju Das #define AVS_RETRY_NUM			(1U)
22*b50b6c81SBiju Das #endif /* PMIC_ROHM_BD9571 */
23*b50b6c81SBiju Das 
24*b50b6c81SBiju Das /* Base address of Adaptive Voltage Scaling module registers*/
25*b50b6c81SBiju Das #define AVS_BASE			(0xE60A0000U)
26*b50b6c81SBiju Das /* Adaptive Dynamic Voltage ADJust Parameter2 registers */
27*b50b6c81SBiju Das #define ADVADJP2			(AVS_BASE + 0x013CU)
28*b50b6c81SBiju Das 
29*b50b6c81SBiju Das /* Mask VOLCOND bit in ADVADJP2 registers */
30*b50b6c81SBiju Das #define ADVADJP2_VOLCOND_MASK		(0x000001FFU)	/* VOLCOND[8:0] */
31*b50b6c81SBiju Das 
32*b50b6c81SBiju Das #if PMIC_ROHM_BD9571
33*b50b6c81SBiju Das /* I2C for DVFS bit in CPG registers for module standby and software reset*/
34*b50b6c81SBiju Das #define CPG_SYS_DVFS_BIT		(0x04000000U)
35*b50b6c81SBiju Das #endif /* PMIC_ROHM_BD9571 */
36*b50b6c81SBiju Das /* ADVFS Module bit in CPG registers for module standby and software reset*/
37*b50b6c81SBiju Das #define CPG_SYS_ADVFS_BIT		(0x02000000U)
38*b50b6c81SBiju Das 
39*b50b6c81SBiju Das #if PMIC_ROHM_BD9571
40*b50b6c81SBiju Das /* Base address of IICDVFS registers*/
41*b50b6c81SBiju Das #define IIC_DVFS_BASE			(0xE60B0000U)
42*b50b6c81SBiju Das /* IIC bus data register */
43*b50b6c81SBiju Das #define IIC_ICDR			(IIC_DVFS_BASE + 0x0000U)
44*b50b6c81SBiju Das /* IIC bus control register */
45*b50b6c81SBiju Das #define IIC_ICCR			(IIC_DVFS_BASE + 0x0004U)
46*b50b6c81SBiju Das /* IIC bus status register */
47*b50b6c81SBiju Das #define IIC_ICSR			(IIC_DVFS_BASE + 0x0008U)
48*b50b6c81SBiju Das /* IIC interrupt control register */
49*b50b6c81SBiju Das #define IIC_ICIC			(IIC_DVFS_BASE + 0x000CU)
50*b50b6c81SBiju Das /* IIC clock control register low */
51*b50b6c81SBiju Das #define IIC_ICCL			(IIC_DVFS_BASE + 0x0010U)
52*b50b6c81SBiju Das /* IIC clock control register high */
53*b50b6c81SBiju Das #define IIC_ICCH			(IIC_DVFS_BASE + 0x0014U)
54*b50b6c81SBiju Das 
55*b50b6c81SBiju Das /* Bit in ICSR register */
56*b50b6c81SBiju Das #define ICSR_BUSY			(0x10U)
57*b50b6c81SBiju Das #define ICSR_AL				(0x08U)
58*b50b6c81SBiju Das #define ICSR_TACK			(0x04U)
59*b50b6c81SBiju Das #define ICSR_WAIT			(0x02U)
60*b50b6c81SBiju Das #define ICSR_DTE			(0x01U)
61*b50b6c81SBiju Das 
62*b50b6c81SBiju Das /* Bit in ICIC register */
63*b50b6c81SBiju Das #define ICIC_TACKE			(0x04U)
64*b50b6c81SBiju Das #define ICIC_WAITE			(0x02U)
65*b50b6c81SBiju Das #define ICIC_DTEE			(0x01U)
66*b50b6c81SBiju Das 
67*b50b6c81SBiju Das /* I2C bus interface enable */
68*b50b6c81SBiju Das #define ICCR_ENABLE			(0x80U)
69*b50b6c81SBiju Das /* Start condition */
70*b50b6c81SBiju Das #define ICCR_START			(0x94U)
71*b50b6c81SBiju Das /* Stop condition */
72*b50b6c81SBiju Das #define ICCR_STOP			(0x90U)
73*b50b6c81SBiju Das /* Restart condition with change to receive mode change */
74*b50b6c81SBiju Das #define ICCR_START_RECV			(0x81U)
75*b50b6c81SBiju Das /* Stop condition for receive mode */
76*b50b6c81SBiju Das #define ICCR_STOP_RECV			(0xC0U)
77*b50b6c81SBiju Das 
78*b50b6c81SBiju Das /* Low-level period of SCL */
79*b50b6c81SBiju Das #define ICCL_FREQ_8p33M			(0x07U)	/* for CP Phy 8.3333MHz */
80*b50b6c81SBiju Das #define ICCL_FREQ_10M			(0x09U)	/* for CP Phy 10MHz */
81*b50b6c81SBiju Das #define ICCL_FREQ_12p5M			(0x0BU)	/* for CP Phy 12.5MHz */
82*b50b6c81SBiju Das #define ICCL_FREQ_16p66M		(0x0EU)	/* for CP Phy 16.6666MHz */
83*b50b6c81SBiju Das /* High-level period of SCL */
84*b50b6c81SBiju Das #define ICCH_FREQ_8p33M			(0x01U)	/* for CP Phy 8.3333MHz */
85*b50b6c81SBiju Das #define ICCH_FREQ_10M			(0x02U)	/* for CP Phy 10MHz */
86*b50b6c81SBiju Das #define ICCH_FREQ_12p5M			(0x03U)	/* for CP Phy 12.5MHz */
87*b50b6c81SBiju Das #define ICCH_FREQ_16p66M		(0x05U)	/* for CP Phy 16.6666MHz */
88*b50b6c81SBiju Das 
89*b50b6c81SBiju Das /* PMIC */
90*b50b6c81SBiju Das /* ROHM BD9571 slave address + (W) */
91*b50b6c81SBiju Das #define PMIC_W_SLAVE_ADDRESS		(0x60U)
92*b50b6c81SBiju Das /* ROHM BD9571 slave address + (R) */
93*b50b6c81SBiju Das #define PMIC_R_SLAVE_ADDRESS		(0x61U)
94*b50b6c81SBiju Das /* ROHM BD9571 DVFS SetVID register */
95*b50b6c81SBiju Das #define PMIC_DVFS_SETVID		(0x54U)
96*b50b6c81SBiju Das #endif /* PMIC_ROHM_BD9571  */
97*b50b6c81SBiju Das 
98*b50b6c81SBiju Das /* Individual information */
99*b50b6c81SBiju Das #define EFUSE_AVS0			(0U)
100*b50b6c81SBiju Das #define EFUSE_AVS_NUM			ARRAY_SIZE(init_vol_tbl)
101*b50b6c81SBiju Das 
102*b50b6c81SBiju Das typedef struct {
103*b50b6c81SBiju Das 	uint32_t avs;		/* AVS code */
104*b50b6c81SBiju Das 	uint8_t vol;		/* Voltage */
105*b50b6c81SBiju Das } initial_voltage_t;
106*b50b6c81SBiju Das 
107*b50b6c81SBiju Das static const initial_voltage_t init_vol_tbl[] = {
108*b50b6c81SBiju Das 	/* AVS code, ROHM BD9571 DVFS SetVID register */
109*b50b6c81SBiju Das 	{0x00U, 0x53U},		/* AVS0, 0.83V */
110*b50b6c81SBiju Das 	{0x01U, 0x52U},		/* AVS1, 0.82V */
111*b50b6c81SBiju Das 	{0x02U, 0x51U},		/* AVS2, 0.81V */
112*b50b6c81SBiju Das 	{0x04U, 0x50U},		/* AVS3, 0.80V */
113*b50b6c81SBiju Das 	{0x08U, 0x4FU},		/* AVS4, 0.79V */
114*b50b6c81SBiju Das 	{0x10U, 0x4EU},		/* AVS5, 0.78V */
115*b50b6c81SBiju Das 	{0x20U, 0x4DU},		/* AVS6, 0.77V */
116*b50b6c81SBiju Das 	{0x40U, 0x4CU}		/* AVS7, 0.76V */
117*b50b6c81SBiju Das };
118*b50b6c81SBiju Das 
119*b50b6c81SBiju Das #if PMIC_ROHM_BD9571
120*b50b6c81SBiju Das /* Kind of AVS settings status */
121*b50b6c81SBiju Das typedef enum {
122*b50b6c81SBiju Das 	avs_status_none = 0,
123*b50b6c81SBiju Das 	avs_status_init,
124*b50b6c81SBiju Das 	avs_status_start_condition,
125*b50b6c81SBiju Das 	avs_status_set_slave_addr,
126*b50b6c81SBiju Das 	avs_status_write_reg_addr,
127*b50b6c81SBiju Das 	avs_status_write_reg_data,
128*b50b6c81SBiju Das 	avs_status_stop_condition,
129*b50b6c81SBiju Das 	avs_status_end,
130*b50b6c81SBiju Das 	avs_status_complete,
131*b50b6c81SBiju Das 	avs_status_al_start,
132*b50b6c81SBiju Das 	avs_status_al_transfer,
133*b50b6c81SBiju Das 	avs_status_nack,
134*b50b6c81SBiju Das 	avs_status_error_stop,
135*b50b6c81SBiju Das 	ave_status_error_end
136*b50b6c81SBiju Das } avs_status_t;
137*b50b6c81SBiju Das 
138*b50b6c81SBiju Das /* Kind of AVS error */
139*b50b6c81SBiju Das typedef enum {
140*b50b6c81SBiju Das 	avs_error_none = 0,
141*b50b6c81SBiju Das 	avs_error_al,
142*b50b6c81SBiju Das 	avs_error_nack
143*b50b6c81SBiju Das } avs_error_t;
144*b50b6c81SBiju Das 
145*b50b6c81SBiju Das static avs_status_t avs_status;
146*b50b6c81SBiju Das static uint32_t avs_retry;
147*b50b6c81SBiju Das #endif /* PMIC_ROHM_BD9571  */
148*b50b6c81SBiju Das static uint32_t efuse_avs = EFUSE_AVS0;
149*b50b6c81SBiju Das 
150*b50b6c81SBiju Das #if PMIC_ROHM_BD9571
151*b50b6c81SBiju Das /* prototype */
152*b50b6c81SBiju Das static avs_error_t avs_check_error(void);
153*b50b6c81SBiju Das static void avs_set_iic_clock(void);
154*b50b6c81SBiju Das #if AVS_READ_PMIC_REG_ENABLE == 1
155*b50b6c81SBiju Das static uint8_t avs_read_pmic_reg(uint8_t addr);
156*b50b6c81SBiju Das static void avs_poll(uint8_t bit_pos, uint8_t val);
157*b50b6c81SBiju Das #endif
158*b50b6c81SBiju Das #endif /* PMIC_ROHM_BD9571 */
159*b50b6c81SBiju Das #endif /* (AVS_SETTING_ENABLE==1) */
160*b50b6c81SBiju Das 
161*b50b6c81SBiju Das /*
162*b50b6c81SBiju Das  * Initialize to enable the AVS setting.
163*b50b6c81SBiju Das  */
rcar_avs_init(void)164*b50b6c81SBiju Das void rcar_avs_init(void)
165*b50b6c81SBiju Das {
166*b50b6c81SBiju Das #if (AVS_SETTING_ENABLE == 1)
167*b50b6c81SBiju Das 	uint32_t val;
168*b50b6c81SBiju Das 
169*b50b6c81SBiju Das #if PMIC_ROHM_BD9571
170*b50b6c81SBiju Das 	/* Initialize AVS status */
171*b50b6c81SBiju Das 	avs_status = avs_status_init;
172*b50b6c81SBiju Das #endif /* PMIC_ROHM_BD9571 */
173*b50b6c81SBiju Das 
174*b50b6c81SBiju Das 	/* Enable clock supply to ADVFS. */
175*b50b6c81SBiju Das 	mstpcr_write(CPG_SMSTPCR9, CPG_MSTPSR9, CPG_SYS_ADVFS_BIT);
176*b50b6c81SBiju Das 
177*b50b6c81SBiju Das 	/* Read AVS code (Initial values are derived from eFuse) */
178*b50b6c81SBiju Das 	val = mmio_read_32(ADVADJP2) & ADVADJP2_VOLCOND_MASK;
179*b50b6c81SBiju Das 
180*b50b6c81SBiju Das 	for (efuse_avs = 0U; efuse_avs < EFUSE_AVS_NUM; efuse_avs++) {
181*b50b6c81SBiju Das 		if (val == init_vol_tbl[efuse_avs].avs)
182*b50b6c81SBiju Das 			break;
183*b50b6c81SBiju Das 	}
184*b50b6c81SBiju Das 
185*b50b6c81SBiju Das 	if (efuse_avs >= EFUSE_AVS_NUM)
186*b50b6c81SBiju Das 		efuse_avs = EFUSE_AVS0;	/* Not applicable */
187*b50b6c81SBiju Das #if PMIC_ROHM_BD9571
188*b50b6c81SBiju Das 	/* Enable clock supply to DVFS. */
189*b50b6c81SBiju Das 	mstpcr_write(CPG_SMSTPCR9, CPG_MSTPSR9, CPG_SYS_DVFS_BIT);
190*b50b6c81SBiju Das 
191*b50b6c81SBiju Das 	/* Disable I2C module and All internal registers initialized. */
192*b50b6c81SBiju Das 	mmio_write_8(IIC_ICCR, 0x00U);
193*b50b6c81SBiju Das 	while ((mmio_read_8(IIC_ICCR) & ICCR_ENABLE) != 0U) {
194*b50b6c81SBiju Das 		/* Disable I2C module and all internal registers initialized. */
195*b50b6c81SBiju Das 		mmio_write_8(IIC_ICCR, 0x00U);
196*b50b6c81SBiju Das 	}
197*b50b6c81SBiju Das 
198*b50b6c81SBiju Das 	/* Set next status */
199*b50b6c81SBiju Das 	avs_status = avs_status_start_condition;
200*b50b6c81SBiju Das 
201*b50b6c81SBiju Das #endif /* PMIC_ROHM_BD9571 */
202*b50b6c81SBiju Das #endif /* (AVS_SETTING_ENABLE==1) */
203*b50b6c81SBiju Das }
204*b50b6c81SBiju Das 
205*b50b6c81SBiju Das /*
206*b50b6c81SBiju Das  * Set the value of register corresponding to the voltage
207*b50b6c81SBiju Das  * by transfer of I2C to PIMC.
208*b50b6c81SBiju Das  */
rcar_avs_setting(void)209*b50b6c81SBiju Das void rcar_avs_setting(void)
210*b50b6c81SBiju Das {
211*b50b6c81SBiju Das #if (AVS_SETTING_ENABLE == 1)
212*b50b6c81SBiju Das #if PMIC_ROHM_BD9571
213*b50b6c81SBiju Das 	avs_error_t err;
214*b50b6c81SBiju Das 
215*b50b6c81SBiju Das 	switch (avs_status) {
216*b50b6c81SBiju Das 	case avs_status_start_condition:
217*b50b6c81SBiju Das 		/* Set ICCR.ICE=1 to activate the I2C module. */
218*b50b6c81SBiju Das 		mmio_write_8(IIC_ICCR, mmio_read_8(IIC_ICCR) | ICCR_ENABLE);
219*b50b6c81SBiju Das 		/* Set frequency of 400kHz */
220*b50b6c81SBiju Das 		avs_set_iic_clock();
221*b50b6c81SBiju Das 		/* Set ICIC.TACKE=1, ICIC.WAITE=1, ICIC.DTEE=1 to */
222*b50b6c81SBiju Das 		/* enable interrupt control.                      */
223*b50b6c81SBiju Das 		mmio_write_8(IIC_ICIC, mmio_read_8(IIC_ICIC)
224*b50b6c81SBiju Das 			     | ICIC_TACKE | ICIC_WAITE | ICIC_DTEE);
225*b50b6c81SBiju Das 		/* Write H'94 in ICCR to issue start condition */
226*b50b6c81SBiju Das 		mmio_write_8(IIC_ICCR, ICCR_START);
227*b50b6c81SBiju Das 		/* Set next status */
228*b50b6c81SBiju Das 		avs_status = avs_status_set_slave_addr;
229*b50b6c81SBiju Das 		break;
230*b50b6c81SBiju Das 	case avs_status_set_slave_addr:
231*b50b6c81SBiju Das 		/* Check error. */
232*b50b6c81SBiju Das 		err = avs_check_error();
233*b50b6c81SBiju Das 		if (err == avs_error_al) {
234*b50b6c81SBiju Das 			/* Recovery sequence of just after start. */
235*b50b6c81SBiju Das 			avs_status = avs_status_al_start;
236*b50b6c81SBiju Das 		} else if (err == avs_error_nack) {
237*b50b6c81SBiju Das 			/* Recovery sequence of detected NACK */
238*b50b6c81SBiju Das 			avs_status = avs_status_nack;
239*b50b6c81SBiju Das 		} else {
240*b50b6c81SBiju Das 			/* Was data transmission enabled ? */
241*b50b6c81SBiju Das 			if ((mmio_read_8(IIC_ICSR) & ICSR_DTE) == ICSR_DTE) {
242*b50b6c81SBiju Das 				/* Clear ICIC.DTEE to disable a DTE interrupt */
243*b50b6c81SBiju Das 				mmio_write_8(IIC_ICIC, mmio_read_8(IIC_ICIC)
244*b50b6c81SBiju Das 					     & (uint8_t) (~ICIC_DTEE));
245*b50b6c81SBiju Das 				/* Send PMIC slave address + (W) */
246*b50b6c81SBiju Das 				mmio_write_8(IIC_ICDR, PMIC_W_SLAVE_ADDRESS);
247*b50b6c81SBiju Das 				/* Set next status */
248*b50b6c81SBiju Das 				avs_status = avs_status_write_reg_addr;
249*b50b6c81SBiju Das 			}
250*b50b6c81SBiju Das 		}
251*b50b6c81SBiju Das 		break;
252*b50b6c81SBiju Das 	case avs_status_write_reg_addr:
253*b50b6c81SBiju Das 		/* Check error. */
254*b50b6c81SBiju Das 		err = avs_check_error();
255*b50b6c81SBiju Das 		if (err == avs_error_al) {
256*b50b6c81SBiju Das 			/* Recovery sequence of during data transfer. */
257*b50b6c81SBiju Das 			avs_status = avs_status_al_transfer;
258*b50b6c81SBiju Das 		} else if (err == avs_error_nack) {
259*b50b6c81SBiju Das 			/* Recovery sequence of detected NACK */
260*b50b6c81SBiju Das 			avs_status = avs_status_nack;
261*b50b6c81SBiju Das 		} else {
262*b50b6c81SBiju Das 			/* If wait state after data transmission. */
263*b50b6c81SBiju Das 			if ((mmio_read_8(IIC_ICSR) & ICSR_WAIT) == ICSR_WAIT) {
264*b50b6c81SBiju Das 				/* Write PMIC DVFS_SetVID address */
265*b50b6c81SBiju Das 				mmio_write_8(IIC_ICDR, PMIC_DVFS_SETVID);
266*b50b6c81SBiju Das 				/* Clear ICSR.WAIT to exit from wait state. */
267*b50b6c81SBiju Das 				mmio_write_8(IIC_ICSR, mmio_read_8(IIC_ICSR)
268*b50b6c81SBiju Das 					     & (uint8_t) (~ICSR_WAIT));
269*b50b6c81SBiju Das 				/* Set next status */
270*b50b6c81SBiju Das 				avs_status = avs_status_write_reg_data;
271*b50b6c81SBiju Das 			}
272*b50b6c81SBiju Das 		}
273*b50b6c81SBiju Das 		break;
274*b50b6c81SBiju Das 	case avs_status_write_reg_data:
275*b50b6c81SBiju Das 		/* Check error. */
276*b50b6c81SBiju Das 		err = avs_check_error();
277*b50b6c81SBiju Das 		if (err == avs_error_al) {
278*b50b6c81SBiju Das 			/* Recovery sequence of during data transfer. */
279*b50b6c81SBiju Das 			avs_status = avs_status_al_transfer;
280*b50b6c81SBiju Das 		} else if (err == avs_error_nack) {
281*b50b6c81SBiju Das 			/* Recovery sequence of detected NACK */
282*b50b6c81SBiju Das 			avs_status = avs_status_nack;
283*b50b6c81SBiju Das 		} else {
284*b50b6c81SBiju Das 			/* If wait state after data transmission. */
285*b50b6c81SBiju Das 			if ((mmio_read_8(IIC_ICSR) & ICSR_WAIT) == ICSR_WAIT) {
286*b50b6c81SBiju Das 				/* Dose efuse_avs exceed the number of */
287*b50b6c81SBiju Das 				/* the tables? */
288*b50b6c81SBiju Das 				if (efuse_avs >= EFUSE_AVS_NUM) {
289*b50b6c81SBiju Das 					ERROR("%s%s=%u\n", "AVS number of ",
290*b50b6c81SBiju Das 					      "eFuse is out of range. number",
291*b50b6c81SBiju Das 					      efuse_avs);
292*b50b6c81SBiju Das 					/* Infinite loop */
293*b50b6c81SBiju Das 					panic();
294*b50b6c81SBiju Das 				}
295*b50b6c81SBiju Das 				/* Write PMIC DVFS_SetVID value */
296*b50b6c81SBiju Das 				mmio_write_8(IIC_ICDR,
297*b50b6c81SBiju Das 					     init_vol_tbl[efuse_avs].vol);
298*b50b6c81SBiju Das 				/* Clear ICSR.WAIT to exit from wait state. */
299*b50b6c81SBiju Das 				mmio_write_8(IIC_ICSR, mmio_read_8(IIC_ICSR)
300*b50b6c81SBiju Das 					     & (uint8_t) (~ICSR_WAIT));
301*b50b6c81SBiju Das 				/* Set next status */
302*b50b6c81SBiju Das 				avs_status = avs_status_stop_condition;
303*b50b6c81SBiju Das 			}
304*b50b6c81SBiju Das 		}
305*b50b6c81SBiju Das 		break;
306*b50b6c81SBiju Das 	case avs_status_stop_condition:
307*b50b6c81SBiju Das 		err = avs_check_error();
308*b50b6c81SBiju Das 		if (err == avs_error_al) {
309*b50b6c81SBiju Das 			/* Recovery sequence of during data transfer. */
310*b50b6c81SBiju Das 			avs_status = avs_status_al_transfer;
311*b50b6c81SBiju Das 		} else if (err == avs_error_nack) {
312*b50b6c81SBiju Das 			/* Recovery sequence of detected NACK */
313*b50b6c81SBiju Das 			avs_status = avs_status_nack;
314*b50b6c81SBiju Das 		} else {
315*b50b6c81SBiju Das 			/* If wait state after data transmission. */
316*b50b6c81SBiju Das 			if ((mmio_read_8(IIC_ICSR) & ICSR_WAIT) == ICSR_WAIT) {
317*b50b6c81SBiju Das 				/* Write H'90 in ICCR to issue stop condition */
318*b50b6c81SBiju Das 				mmio_write_8(IIC_ICCR, ICCR_STOP);
319*b50b6c81SBiju Das 				/* Clear ICSR.WAIT to exit from wait state. */
320*b50b6c81SBiju Das 				mmio_write_8(IIC_ICSR, mmio_read_8(IIC_ICSR)
321*b50b6c81SBiju Das 					     & (uint8_t) (~ICSR_WAIT));
322*b50b6c81SBiju Das 				/* Set next status */
323*b50b6c81SBiju Das 				avs_status = avs_status_end;
324*b50b6c81SBiju Das 			}
325*b50b6c81SBiju Das 		}
326*b50b6c81SBiju Das 		break;
327*b50b6c81SBiju Das 	case avs_status_end:
328*b50b6c81SBiju Das 		/* Is this module not busy?. */
329*b50b6c81SBiju Das 		if ((mmio_read_8(IIC_ICSR) & ICSR_BUSY) == 0U) {
330*b50b6c81SBiju Das 			/* Set ICCR=H'00 to disable the I2C module. */
331*b50b6c81SBiju Das 			mmio_write_8(IIC_ICCR, 0x00U);
332*b50b6c81SBiju Das 			/* Set next status */
333*b50b6c81SBiju Das 			avs_status = avs_status_complete;
334*b50b6c81SBiju Das 		}
335*b50b6c81SBiju Das 		break;
336*b50b6c81SBiju Das 	case avs_status_al_start:
337*b50b6c81SBiju Das 		/* Clear ICSR.AL bit */
338*b50b6c81SBiju Das 		mmio_write_8(IIC_ICSR, (mmio_read_8(IIC_ICSR)
339*b50b6c81SBiju Das 					& (uint8_t) (~ICSR_AL)));
340*b50b6c81SBiju Das 		/* Transmit a clock pulse */
341*b50b6c81SBiju Das 		mmio_write_8(IIC_ICDR, init_vol_tbl[EFUSE_AVS0].vol);
342*b50b6c81SBiju Das 		/* Set next status */
343*b50b6c81SBiju Das 		avs_status = avs_status_error_stop;
344*b50b6c81SBiju Das 		break;
345*b50b6c81SBiju Das 	case avs_status_al_transfer:
346*b50b6c81SBiju Das 		/* Clear ICSR.AL bit */
347*b50b6c81SBiju Das 		mmio_write_8(IIC_ICSR, (mmio_read_8(IIC_ICSR)
348*b50b6c81SBiju Das 					& (uint8_t) (~ICSR_AL)));
349*b50b6c81SBiju Das 		/* Set next status */
350*b50b6c81SBiju Das 		avs_status = avs_status_error_stop;
351*b50b6c81SBiju Das 		break;
352*b50b6c81SBiju Das 	case avs_status_nack:
353*b50b6c81SBiju Das 		/* Write H'90 in ICCR to issue stop condition */
354*b50b6c81SBiju Das 		mmio_write_8(IIC_ICCR, ICCR_STOP);
355*b50b6c81SBiju Das 		/* Disable a WAIT and DTEE interrupt. */
356*b50b6c81SBiju Das 		mmio_write_8(IIC_ICIC, mmio_read_8(IIC_ICIC)
357*b50b6c81SBiju Das 			     & (uint8_t) (~(ICIC_WAITE | ICIC_DTEE)));
358*b50b6c81SBiju Das 		/* Clear ICSR.TACK bit */
359*b50b6c81SBiju Das 		mmio_write_8(IIC_ICSR, mmio_read_8(IIC_ICSR)
360*b50b6c81SBiju Das 			     & (uint8_t) (~ICSR_TACK));
361*b50b6c81SBiju Das 		/* Set next status */
362*b50b6c81SBiju Das 		avs_status = ave_status_error_end;
363*b50b6c81SBiju Das 		break;
364*b50b6c81SBiju Das 	case avs_status_error_stop:
365*b50b6c81SBiju Das 		/* If wait state after data transmission. */
366*b50b6c81SBiju Das 		if ((mmio_read_8(IIC_ICSR) & ICSR_WAIT) == ICSR_WAIT) {
367*b50b6c81SBiju Das 			/* Write H'90 in ICCR to issue stop condition */
368*b50b6c81SBiju Das 			mmio_write_8(IIC_ICCR, ICCR_STOP);
369*b50b6c81SBiju Das 			/* Clear ICSR.WAIT to exit from wait state. */
370*b50b6c81SBiju Das 			mmio_write_8(IIC_ICSR, mmio_read_8(IIC_ICSR)
371*b50b6c81SBiju Das 				     & (uint8_t) (~ICSR_WAIT));
372*b50b6c81SBiju Das 			/* Set next status */
373*b50b6c81SBiju Das 			avs_status = ave_status_error_end;
374*b50b6c81SBiju Das 		}
375*b50b6c81SBiju Das 		break;
376*b50b6c81SBiju Das 	case ave_status_error_end:
377*b50b6c81SBiju Das 		/* Is this module not busy?. */
378*b50b6c81SBiju Das 		if ((mmio_read_8(IIC_ICSR) & ICSR_BUSY) == 0U) {
379*b50b6c81SBiju Das 			/* Set ICCR=H'00 to disable the I2C module. */
380*b50b6c81SBiju Das 			mmio_write_8(IIC_ICCR, 0x00U);
381*b50b6c81SBiju Das 			/* Increment the re-try number of times. */
382*b50b6c81SBiju Das 			avs_retry++;
383*b50b6c81SBiju Das 			/* Set start a re-try to status. */
384*b50b6c81SBiju Das 			avs_status = avs_status_start_condition;
385*b50b6c81SBiju Das 		}
386*b50b6c81SBiju Das 		break;
387*b50b6c81SBiju Das 	case avs_status_complete:
388*b50b6c81SBiju Das 		/* After "avs_status" became the "avs_status_complete", */
389*b50b6c81SBiju Das 		/* "avs_setting()" function may be called. */
390*b50b6c81SBiju Das 		break;
391*b50b6c81SBiju Das 	default:
392*b50b6c81SBiju Das 		/* This case is not possible. */
393*b50b6c81SBiju Das 		ERROR("AVS setting is in invalid status. status=%u\n",
394*b50b6c81SBiju Das 		      avs_status);
395*b50b6c81SBiju Das 		/* Infinite loop */
396*b50b6c81SBiju Das 		panic();
397*b50b6c81SBiju Das 		break;
398*b50b6c81SBiju Das 	}
399*b50b6c81SBiju Das #endif /* PMIC_ROHM_BD9571 */
400*b50b6c81SBiju Das #endif /* (AVS_SETTING_ENABLE==1) */
401*b50b6c81SBiju Das }
402*b50b6c81SBiju Das 
403*b50b6c81SBiju Das /*
404*b50b6c81SBiju Das  * Finish the AVS setting.
405*b50b6c81SBiju Das  */
rcar_avs_end(void)406*b50b6c81SBiju Das void rcar_avs_end(void)
407*b50b6c81SBiju Das {
408*b50b6c81SBiju Das #if (AVS_SETTING_ENABLE == 1)
409*b50b6c81SBiju Das 	uint32_t mstp;
410*b50b6c81SBiju Das 
411*b50b6c81SBiju Das #if PMIC_ROHM_BD9571
412*b50b6c81SBiju Das 	/* While status is not completion, be repeated. */
413*b50b6c81SBiju Das 	while (avs_status != avs_status_complete)
414*b50b6c81SBiju Das 		rcar_avs_setting();
415*b50b6c81SBiju Das 
416*b50b6c81SBiju Das 	NOTICE("AVS setting succeeded. DVFS_SetVID=0x%x\n",
417*b50b6c81SBiju Das 	       init_vol_tbl[efuse_avs].vol);
418*b50b6c81SBiju Das 
419*b50b6c81SBiju Das #if AVS_READ_PMIC_REG_ENABLE == 1
420*b50b6c81SBiju Das 	{
421*b50b6c81SBiju Das 		uint8_t addr = PMIC_DVFS_SETVID;
422*b50b6c81SBiju Das 		uint8_t value = avs_read_pmic_reg(addr);
423*b50b6c81SBiju Das 
424*b50b6c81SBiju Das 		NOTICE("Read PMIC register. address=0x%x value=0x%x\n",
425*b50b6c81SBiju Das 		       addr, value);
426*b50b6c81SBiju Das 	}
427*b50b6c81SBiju Das #endif
428*b50b6c81SBiju Das 
429*b50b6c81SBiju Das 	/* Bit of the module which wants to disable clock supply. */
430*b50b6c81SBiju Das 	mstp = CPG_SYS_DVFS_BIT;
431*b50b6c81SBiju Das 	/* Disables the supply of clock signal to a module. */
432*b50b6c81SBiju Das 	cpg_write(CPG_SMSTPCR9, mmio_read_32(CPG_SMSTPCR9) | mstp);
433*b50b6c81SBiju Das #endif /* PMIC_ROHM_BD9571 */
434*b50b6c81SBiju Das 
435*b50b6c81SBiju Das 	/* Bit of the module which wants to disable clock supply. */
436*b50b6c81SBiju Das 	mstp = CPG_SYS_ADVFS_BIT;
437*b50b6c81SBiju Das 	/* Disables the supply of clock signal to a module. */
438*b50b6c81SBiju Das 	cpg_write(CPG_SMSTPCR9, mmio_read_32(CPG_SMSTPCR9) | mstp);
439*b50b6c81SBiju Das 
440*b50b6c81SBiju Das #endif /* (AVS_SETTING_ENABLE==1) */
441*b50b6c81SBiju Das }
442*b50b6c81SBiju Das 
443*b50b6c81SBiju Das #if (AVS_SETTING_ENABLE == 1)
444*b50b6c81SBiju Das #if PMIC_ROHM_BD9571
445*b50b6c81SBiju Das /*
446*b50b6c81SBiju Das  * Check error and judge re-try.
447*b50b6c81SBiju Das  */
avs_check_error(void)448*b50b6c81SBiju Das static avs_error_t avs_check_error(void)
449*b50b6c81SBiju Das {
450*b50b6c81SBiju Das 	avs_error_t ret;
451*b50b6c81SBiju Das 
452*b50b6c81SBiju Das 	if ((mmio_read_8(IIC_ICSR) & ICSR_AL) == ICSR_AL) {
453*b50b6c81SBiju Das 		NOTICE("%s AVS status=%d Retry=%u\n",
454*b50b6c81SBiju Das 		       "Loss of arbitration is detected.", avs_status, avs_retry);
455*b50b6c81SBiju Das 		/* Check of retry number of times */
456*b50b6c81SBiju Das 		if (avs_retry >= AVS_RETRY_NUM) {
457*b50b6c81SBiju Das 			ERROR("AVS setting failed in retry. max=%u\n",
458*b50b6c81SBiju Das 			      AVS_RETRY_NUM);
459*b50b6c81SBiju Das 			/* Infinite loop */
460*b50b6c81SBiju Das 			panic();
461*b50b6c81SBiju Das 		}
462*b50b6c81SBiju Das 		/* Set the error detected to error status. */
463*b50b6c81SBiju Das 		ret = avs_error_al;
464*b50b6c81SBiju Das 	} else if ((mmio_read_8(IIC_ICSR) & ICSR_TACK) == ICSR_TACK) {
465*b50b6c81SBiju Das 		NOTICE("%s AVS status=%d Retry=%u\n",
466*b50b6c81SBiju Das 		       "Non-acknowledge is detected.", avs_status, avs_retry);
467*b50b6c81SBiju Das 		/* Check of retry number of times */
468*b50b6c81SBiju Das 		if (avs_retry >= AVS_RETRY_NUM) {
469*b50b6c81SBiju Das 			ERROR("AVS setting failed in retry. max=%u\n",
470*b50b6c81SBiju Das 			      AVS_RETRY_NUM);
471*b50b6c81SBiju Das 			/* Infinite loop */
472*b50b6c81SBiju Das 			panic();
473*b50b6c81SBiju Das 		}
474*b50b6c81SBiju Das 		/* Set the error detected to error status. */
475*b50b6c81SBiju Das 		ret = avs_error_nack;
476*b50b6c81SBiju Das 	} else {
477*b50b6c81SBiju Das 		/* Not error. */
478*b50b6c81SBiju Das 		ret = avs_error_none;
479*b50b6c81SBiju Das 	}
480*b50b6c81SBiju Das 	return ret;
481*b50b6c81SBiju Das }
482*b50b6c81SBiju Das 
483*b50b6c81SBiju Das /*
484*b50b6c81SBiju Das  * Set I2C for DVFS clock.
485*b50b6c81SBiju Das  */
avs_set_iic_clock(void)486*b50b6c81SBiju Das static void avs_set_iic_clock(void)
487*b50b6c81SBiju Das {
488*b50b6c81SBiju Das 	uint32_t md_pin;
489*b50b6c81SBiju Das 
490*b50b6c81SBiju Das 	/* Read Mode pin register. */
491*b50b6c81SBiju Das 	md_pin = mmio_read_32(RCAR_MODEMR) & CHECK_MD13_MD14;
492*b50b6c81SBiju Das 	/* Set the module clock (CP phy) for the IIC-DVFS. */
493*b50b6c81SBiju Das 	/* CP phy is EXTAL / 2.                            */
494*b50b6c81SBiju Das 	switch (md_pin) {
495*b50b6c81SBiju Das 	case MD14_MD13_TYPE_0:	/* EXTAL = 16.6666MHz */
496*b50b6c81SBiju Das 		mmio_write_8(IIC_ICCL, ICCL_FREQ_8p33M);
497*b50b6c81SBiju Das 		mmio_write_8(IIC_ICCH, ICCH_FREQ_8p33M);
498*b50b6c81SBiju Das 		break;
499*b50b6c81SBiju Das 	case MD14_MD13_TYPE_1:	/* EXTAL = 20MHz */
500*b50b6c81SBiju Das 		mmio_write_8(IIC_ICCL, ICCL_FREQ_10M);
501*b50b6c81SBiju Das 		mmio_write_8(IIC_ICCH, ICCH_FREQ_10M);
502*b50b6c81SBiju Das 		break;
503*b50b6c81SBiju Das 	case MD14_MD13_TYPE_2:	/* EXTAL = 25MHz (H3/M3) */
504*b50b6c81SBiju Das 		mmio_write_8(IIC_ICCL, ICCL_FREQ_12p5M);
505*b50b6c81SBiju Das 		mmio_write_8(IIC_ICCH, ICCH_FREQ_12p5M);
506*b50b6c81SBiju Das 		break;
507*b50b6c81SBiju Das 	case MD14_MD13_TYPE_3:	/* EXTAL = 33.3333MHz */
508*b50b6c81SBiju Das 		mmio_write_8(IIC_ICCL, ICCL_FREQ_16p66M);
509*b50b6c81SBiju Das 		mmio_write_8(IIC_ICCH, ICCH_FREQ_16p66M);
510*b50b6c81SBiju Das 		break;
511*b50b6c81SBiju Das 	default:		/* This case is not possible. */
512*b50b6c81SBiju Das 		/* CP Phy frequency is to be set for the 16.66MHz */
513*b50b6c81SBiju Das 		mmio_write_8(IIC_ICCL, ICCL_FREQ_16p66M);
514*b50b6c81SBiju Das 		mmio_write_8(IIC_ICCH, ICCH_FREQ_16p66M);
515*b50b6c81SBiju Das 		break;
516*b50b6c81SBiju Das 	}
517*b50b6c81SBiju Das }
518*b50b6c81SBiju Das 
519*b50b6c81SBiju Das #if AVS_READ_PMIC_REG_ENABLE == 1
520*b50b6c81SBiju Das /*
521*b50b6c81SBiju Das  * Read the value of the register of PMIC.
522*b50b6c81SBiju Das  */
avs_read_pmic_reg(uint8_t addr)523*b50b6c81SBiju Das static uint8_t avs_read_pmic_reg(uint8_t addr)
524*b50b6c81SBiju Das {
525*b50b6c81SBiju Das 	uint8_t reg;
526*b50b6c81SBiju Das 
527*b50b6c81SBiju Das 	/* Set ICCR.ICE=1 to activate the I2C module. */
528*b50b6c81SBiju Das 	mmio_write_8(IIC_ICCR, mmio_read_8(IIC_ICCR) | ICCR_ENABLE);
529*b50b6c81SBiju Das 
530*b50b6c81SBiju Das 	/* Set frequency of 400kHz */
531*b50b6c81SBiju Das 	avs_set_iic_clock();
532*b50b6c81SBiju Das 
533*b50b6c81SBiju Das 	/*
534*b50b6c81SBiju Das 	 * Set ICIC.WAITE=1, ICIC.DTEE=1 to enable data transmission
535*b50b6c81SBiju Das 	 * interrupt and wait interrupt.
536*b50b6c81SBiju Das 	 */
537*b50b6c81SBiju Das 	mmio_write_8(IIC_ICIC, mmio_read_8(IIC_ICIC) | ICIC_WAITE | ICIC_DTEE);
538*b50b6c81SBiju Das 
539*b50b6c81SBiju Das 	/* Write H'94 in ICCR to issue start condition */
540*b50b6c81SBiju Das 	mmio_write_8(IIC_ICCR, ICCR_START);
541*b50b6c81SBiju Das 
542*b50b6c81SBiju Das 	/* Wait for a until ICSR.DTE becomes 1. */
543*b50b6c81SBiju Das 	avs_poll(ICSR_DTE, 1U);
544*b50b6c81SBiju Das 
545*b50b6c81SBiju Das 	/* Clear ICIC.DTEE to disable a DTE interrupt. */
546*b50b6c81SBiju Das 	mmio_write_8(IIC_ICIC, mmio_read_8(IIC_ICIC) & (uint8_t) (~ICIC_DTEE));
547*b50b6c81SBiju Das 	/* Send slave address of PMIC */
548*b50b6c81SBiju Das 	mmio_write_8(IIC_ICDR, PMIC_W_SLAVE_ADDRESS);
549*b50b6c81SBiju Das 
550*b50b6c81SBiju Das 	/* Wait for a until ICSR.WAIT becomes 1. */
551*b50b6c81SBiju Das 	avs_poll(ICSR_WAIT, 1U);
552*b50b6c81SBiju Das 
553*b50b6c81SBiju Das 	/* write PMIC address */
554*b50b6c81SBiju Das 	mmio_write_8(IIC_ICDR, addr);
555*b50b6c81SBiju Das 	/* Clear ICSR.WAIT to exit from WAIT status. */
556*b50b6c81SBiju Das 	mmio_write_8(IIC_ICSR, mmio_read_8(IIC_ICSR) & (uint8_t) (~ICSR_WAIT));
557*b50b6c81SBiju Das 
558*b50b6c81SBiju Das 	/* Wait for a until ICSR.WAIT becomes 1. */
559*b50b6c81SBiju Das 	avs_poll(ICSR_WAIT, 1U);
560*b50b6c81SBiju Das 
561*b50b6c81SBiju Das 	/* Write H'94 in ICCR to issue restart condition */
562*b50b6c81SBiju Das 	mmio_write_8(IIC_ICCR, ICCR_START);
563*b50b6c81SBiju Das 	/* Clear ICSR.WAIT to exit from WAIT status. */
564*b50b6c81SBiju Das 	mmio_write_8(IIC_ICSR, mmio_read_8(IIC_ICSR) & (uint8_t) (~ICSR_WAIT));
565*b50b6c81SBiju Das 	/* Set ICIC.DTEE=1 to enable data transmission interrupt. */
566*b50b6c81SBiju Das 	mmio_write_8(IIC_ICIC, mmio_read_8(IIC_ICIC) | ICIC_DTEE);
567*b50b6c81SBiju Das 
568*b50b6c81SBiju Das 	/* Wait for a until ICSR.DTE becomes 1. */
569*b50b6c81SBiju Das 	avs_poll(ICSR_DTE, 1U);
570*b50b6c81SBiju Das 
571*b50b6c81SBiju Das 	/* Clear ICIC.DTEE to disable a DTE interrupt. */
572*b50b6c81SBiju Das 	mmio_write_8(IIC_ICIC, mmio_read_8(IIC_ICIC) & (uint8_t) (~ICIC_DTEE));
573*b50b6c81SBiju Das 	/* Send slave address of PMIC */
574*b50b6c81SBiju Das 	mmio_write_8(IIC_ICDR, PMIC_R_SLAVE_ADDRESS);
575*b50b6c81SBiju Das 
576*b50b6c81SBiju Das 	/* Wait for a until ICSR.WAIT becomes 1. */
577*b50b6c81SBiju Das 	avs_poll(ICSR_WAIT, 1U);
578*b50b6c81SBiju Das 
579*b50b6c81SBiju Das 	/* Write H'81 to ICCR to issue the repeated START condition     */
580*b50b6c81SBiju Das 	/* for changing the transmission mode to the receive mode.      */
581*b50b6c81SBiju Das 	mmio_write_8(IIC_ICCR, ICCR_START_RECV);
582*b50b6c81SBiju Das 	/* Clear ICSR.WAIT to exit from WAIT status. */
583*b50b6c81SBiju Das 	mmio_write_8(IIC_ICSR, mmio_read_8(IIC_ICSR) & (uint8_t) (~ICSR_WAIT));
584*b50b6c81SBiju Das 
585*b50b6c81SBiju Das 	/* Wait for a until ICSR.WAIT becomes 1. */
586*b50b6c81SBiju Das 	avs_poll(ICSR_WAIT, 1U);
587*b50b6c81SBiju Das 
588*b50b6c81SBiju Das 	/* Set ICCR to H'C0 for the STOP condition */
589*b50b6c81SBiju Das 	mmio_write_8(IIC_ICCR, ICCR_STOP_RECV);
590*b50b6c81SBiju Das 	/* Clear ICSR.WAIT to exit from WAIT status. */
591*b50b6c81SBiju Das 	mmio_write_8(IIC_ICSR, mmio_read_8(IIC_ICSR) & (uint8_t) (~ICSR_WAIT));
592*b50b6c81SBiju Das 	/* Set ICIC.DTEE=1 to enable data transmission interrupt. */
593*b50b6c81SBiju Das 	mmio_write_8(IIC_ICIC, mmio_read_8(IIC_ICIC) | ICIC_DTEE);
594*b50b6c81SBiju Das 
595*b50b6c81SBiju Das 	/* Wait for a until ICSR.DTE becomes 1. */
596*b50b6c81SBiju Das 	avs_poll(ICSR_DTE, 1U);
597*b50b6c81SBiju Das 
598*b50b6c81SBiju Das 	/* Receive DVFS SetVID register */
599*b50b6c81SBiju Das 	/* Clear ICIC.DTEE to disable a DTE interrupt. */
600*b50b6c81SBiju Das 	mmio_write_8(IIC_ICIC, mmio_read_8(IIC_ICIC) & (uint8_t) (~ICIC_DTEE));
601*b50b6c81SBiju Das 	/* Receive DVFS SetVID register */
602*b50b6c81SBiju Das 	reg = mmio_read_8(IIC_ICDR);
603*b50b6c81SBiju Das 
604*b50b6c81SBiju Das 	/* Wait until ICSR.BUSY is cleared. */
605*b50b6c81SBiju Das 	avs_poll(ICSR_BUSY, 0U);
606*b50b6c81SBiju Das 
607*b50b6c81SBiju Das 	/* Set ICCR=H'00 to disable the I2C module. */
608*b50b6c81SBiju Das 	mmio_write_8(IIC_ICCR, 0x00U);
609*b50b6c81SBiju Das 
610*b50b6c81SBiju Das 	return reg;
611*b50b6c81SBiju Das }
612*b50b6c81SBiju Das 
613*b50b6c81SBiju Das /*
614*b50b6c81SBiju Das  * Wait processing by the polling.
615*b50b6c81SBiju Das  */
avs_poll(uint8_t bit_pos,uint8_t val)616*b50b6c81SBiju Das static void avs_poll(uint8_t bit_pos, uint8_t val)
617*b50b6c81SBiju Das {
618*b50b6c81SBiju Das 	uint8_t bit_val = 0U;
619*b50b6c81SBiju Das 
620*b50b6c81SBiju Das 	if (val != 0U)
621*b50b6c81SBiju Das 		bit_val = bit_pos;
622*b50b6c81SBiju Das 
623*b50b6c81SBiju Das 	while (1) {
624*b50b6c81SBiju Das 		if ((mmio_read_8(IIC_ICSR) & bit_pos) == bit_val)
625*b50b6c81SBiju Das 			break;
626*b50b6c81SBiju Das 	}
627*b50b6c81SBiju Das }
628*b50b6c81SBiju Das #endif /* AVS_READ_PMIC_REG_ENABLE */
629*b50b6c81SBiju Das #endif /* PMIC_ROHM_BD9571 */
630*b50b6c81SBiju Das #endif /* (AVS_SETTING_ENABLE==1) */
631