avs_vctl.c (5851B)
1 /* 2 * 3 * This license is set out in https://raw.githubusercontent.com/Broadcom-Network-Switching-Software/OpenBCM/master/Legal/LICENSE file. 4 * 5 * Copyright 2007-2019 Broadcom Inc. All rights reserved. 6 * 7 * File: avs_ext_vcore_ctl.c 8 */ 9 10 #include <shared/bsl.h> 11 12 #ifdef INCLUDE_AVS 13 14 #define _SOC_AVS_TH3_VOLTAGE_GET_USE_I2C 15 /* #define _SOC_AVS_TH3_VOLTAGE_GET_USE_PVTMON */ 16 17 #define _SOC_AVS_TH3_VOLTAGE_SET_USE_I2C 18 /* #define _SOC_AVS_TH3_VOLTAGE_SET_USE_PVTMON - not yet implemented */ 19 20 #include <soc/avs.h> 21 22 #if defined(_SOC_AVS_TH3_VOLTAGE_GET_USE_I2C) || defined(_SOC_AVS_TH3_VOLTAGE_SET_USE_I2C) 23 #include <soc/i2c.h> 24 25 typedef 26 struct th3_avs_vconfig_params { 27 uint8 mux; 28 char *adc; 29 int chan; 30 char *dac; 31 } th3_avs_vparams_t; 32 33 STATIC char *_soc_tomahawk3_avs_board_vctl_sel; 34 35 #define MUX_0 0 36 #define MUX_2 2 37 #define MUX_3 3 38 39 th3_avs_vparams_t th3_isl68127_vs_config = {1 << MUX_3, I2C_ISL68127_60, I2C_ISL68127_CH1, I2C_ISL68127_60}; 40 41 #endif 42 43 #if defined(_SOC_AVS_TH3_VOLTAGE_GET_USE_I2C) 44 45 STATIC soc_error_t 46 _soc_tomahawk3_i2c_isl68127_voltage_get(int unit, uint32 *val) 47 { 48 int rv, adc, mux; 49 #ifdef COMPILER_HAS_DOUBLE 50 double value; 51 #else 52 int value; 53 #endif 54 55 /* Going to get a voltage (need ADC), and the ADC is MUXed */ 56 /* Open MUX (lpt0) device */ 57 if ((mux = soc_i2c_devopen(unit, I2C_MUX_3, 0, 0)) < 0) { 58 LOG_ERROR(BSL_LS_SOC_AVS, 59 (BSL_META_U(unit, 60 "Could not open %s for mux selection:%s\n"), 61 I2C_MUX_3, soc_errmsg(mux))); 62 return SOC_E_FAIL; 63 } 64 65 /* Set mux value so we can see the device when we try to open it */ 66 if((rv = soc_i2c_device(unit, mux)->driver-> 67 write(unit, mux, 0, &th3_isl68127_vs_config.mux, 1)) < 0) { 68 LOG_ERROR(BSL_LS_SOC_AVS, 69 (BSL_META_U(unit, 70 "Error: write of lpt byte failed:%s\n"), 71 soc_errmsg(rv))); 72 return SOC_E_FAIL; 73 } 74 75 /* Open the correct ADC */ 76 if ( (adc = soc_i2c_devopen(unit, th3_isl68127_vs_config.adc, 0, 0)) < 0) { 77 LOG_ERROR(BSL_LS_SOC_AVS, 78 (BSL_META_U(unit, 79 "Could not open %s:%s\n"), 80 th3_isl68127_vs_config.adc, soc_errmsg(adc))); 81 return SOC_E_FAIL; 82 } 83 84 /* Read the voltage */ 85 if((rv = soc_i2c_device(unit, adc)->driver->ioctl(unit, adc, 86 PMBUS_IOC_READ_VOUT,&value, th3_isl68127_vs_config.chan)) < 0) { 87 LOG_ERROR(BSL_LS_SOC_AVS, 88 (BSL_META_U(unit, 89 "Error: failed to read VDD_Core's ISL device.\n"))); 90 return SOC_E_FAIL; 91 } 92 93 94 #ifdef COMPILER_HAS_DOUBLE 95 *val = (value * 10000); 96 #else 97 *val = value; 98 #endif 99 100 return SOC_E_NONE; 101 } 102 103 #endif /*_SOC_AVS_TH3_VOLTAGE_GET_USE_I2C */ 104 105 106 #if defined(_SOC_AVS_TH3_VOLTAGE_SET_USE_I2C) 107 108 STATIC soc_error_t 109 _soc_tomahawk3_i2c_isl68127_voltage_set(int unit, uint32 val) 110 { 111 int rv, dac, mux; 112 #ifdef COMPILER_HAS_DOUBLE 113 double value = (double) val; 114 value = value/10000; 115 #else 116 int value; 117 /* value = _shr_atof_exp10(val, 2); */ 118 value = val * 100; /* RHS is in 0.1mV units, we want LHS in uV */ 119 #endif 120 121 /* Going to set a voltage (need DAC), and the DAC is MUXed */ 122 /* Open MUX (lpt0) device */ 123 if ((mux = soc_i2c_devopen(unit, I2C_MUX_3, 0, 0)) < 0) { 124 LOG_ERROR(BSL_LS_SOC_AVS, 125 (BSL_META_U(unit, 126 "Could not open %s for mux selection:%s\n"), 127 I2C_MUX_3, soc_errmsg(mux))); 128 return SOC_E_FAIL; 129 } 130 131 /* Set mux value so we can see the device when we try to open it */ 132 if((rv = soc_i2c_device(unit, mux)->driver-> 133 write(unit, mux, 0, &th3_isl68127_vs_config.mux, 1)) < 0) { 134 LOG_ERROR(BSL_LS_SOC_AVS, 135 (BSL_META_U(unit, 136 "Error: write of lpt byte failed:%s\n"), 137 soc_errmsg(rv))); 138 return SOC_E_FAIL; 139 } 140 141 /* Open the correct DAC */ 142 if ( (dac = soc_i2c_devopen(unit, th3_isl68127_vs_config.dac, 0, 0)) < 0) { 143 LOG_ERROR(BSL_LS_SOC_AVS, 144 (BSL_META_U(unit, 145 "Could not open %s:%s\n"), 146 th3_isl68127_vs_config.dac, soc_errmsg(dac))); 147 return SOC_E_FAIL; 148 } 149 150 /* Finally, set the actual voltage ... */ 151 if ((rv = soc_i2c_device(unit, dac)->driver->ioctl(unit, dac, 152 PMBUS_IOC_SET_VOUT, &value, th3_isl68127_vs_config.chan) < 0)) { 153 LOG_ERROR(BSL_LS_SOC_AVS, 154 (BSL_META_U(unit, 155 "Error: failed to set VDD_Core's voltage regulator device %d\n"), val)); 156 return SOC_E_FAIL; 157 } 158 159 return SOC_E_NONE; 160 } 161 #endif /*_SOC_AVS_TH3_VOLTAGE_SET_USE_I2C */ 162 163 soc_error_t 164 soc_tomahawk3_avs_vcore_init(int unit) 165 { 166 _soc_tomahawk3_avs_board_vctl_sel = soc_property_get_str(unit, 167 "th_avs_board_vctl_sel"); 168 return SOC_E_NONE; 169 } 170 171 soc_error_t 172 soc_tomahawk3_avs_vcore_deinit(int unit) 173 { 174 return SOC_E_NONE; 175 } 176 177 soc_error_t 178 soc_tomahawk3_avs_vcore_get(int unit, uint32 *voltage) 179 { 180 #if defined(_SOC_AVS_TH3_VOLTAGE_GET_USE_I2C) 181 if (_soc_tomahawk3_avs_board_vctl_sel != NULL) { 182 if ((sal_strcmp(_soc_tomahawk3_avs_board_vctl_sel, "ISL68127") == 0)) { 183 return _soc_tomahawk3_i2c_isl68127_voltage_get(unit, voltage); 184 } 185 } 186 #endif 187 188 return SOC_E_UNAVAIL; 189 } 190 191 soc_error_t 192 soc_tomahawk3_avs_vcore_set(int unit, uint32 voltage) 193 { 194 #if defined(_SOC_AVS_TH3_VOLTAGE_SET_USE_I2C) 195 if (_soc_tomahawk3_avs_board_vctl_sel != NULL) { 196 if ((sal_strcmp(_soc_tomahawk3_avs_board_vctl_sel, "ISL68127") == 0)) { 197 return _soc_tomahawk3_i2c_isl68127_voltage_set(unit, voltage); 198 } 199 } 200 #endif 201 202 return SOC_E_UNAVAIL; 203 } 204 205 #endif /* INCLUDE_AVS */