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