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 */ 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 */ 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 */ 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 */ 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 */ 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 */ 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 */ 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