openbcm

Git mirror of https://github.com/Broadcom-Network-Switching-Software/OpenBCM
git clone git://git.finwo.net/mirror/broadcom/openbcm
Log | Files | Refs | README

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