in meta-facebook/recipes-utils/pem/files/pem.c [1029:1156]
static int pem_eeprom_regs(uint8_t num, int option, pem_eeprom_reg_t *eeprom_reg) {
if (option != READ && option != WRITE)
return -1;
pem[num].fd = i2c_cdev_slave_open(pem[num].bus, pem[num].chip_addr[LTC4282],
I2C_SLAVE_FORCE_CLAIM);
if (pem[num].fd < 0) {
ERR_PRINT("Fail to open i2c");
return -1;
}
for(int reg = EE_CONTROL; reg <= EE_ILIM_ADJUST; reg++) {
int value = 0;
if (option == READ) {
pem_reg_read(pem[num].fd, reg, &value);
switch(reg) {
case EE_CONTROL:
eeprom_reg->control.reg_val.value = value;
break;
case EE_ALERT:
eeprom_reg->alert.reg_val.value = value;
break;
case EE_FAULT:
eeprom_reg->fault.reg_val.value = value;
break;
case EE_ADC_ALERT_LOG:
eeprom_reg->adc_alert_log.reg_val.value = value;
break;
case EE_FET_BAD_FAULT_TIME:
eeprom_reg->fet_bad_fault_time = value;
break;
case EE_GPIO_CONFIG:
eeprom_reg->gpio_config.reg_val.value = value;
break;
case EE_VGPIO_ALARM_MIN:
eeprom_reg->vgpio_alarm_min = value;
break;
case EE_VGPIO_ALARM_MAX:
eeprom_reg->vgpio_alarm_max = value;
break;
case EE_VSOURCE_ALARM_MIN:
eeprom_reg->vsource_alarm_min = value;
break;
case EE_VSOURCE_ALARM_MAX:
eeprom_reg->vsource_alarm_max = value;
break;
case EE_VSENSE_ALARM_MIN:
eeprom_reg->vsense_alarm_min = value;
break;
case EE_VSENSE_ALARM_MAX:
eeprom_reg->vsense_alarm_max = value;
break;
case EE_POWER_ALARM_MIN:
eeprom_reg->power_alarm_min = value;
break;
case EE_POWER_ALARM_MAX:
eeprom_reg->power_alarm_max = value;
break;
case EE_CLOCK_DECIMATOR:
eeprom_reg->clock_decimator.reg_val.value = value;
break;
case EE_ILIM_ADJUST:
eeprom_reg->ilim_adjust.reg_val.value = value;
break;
default:
continue;
}
} else if (option == WRITE) {
switch(reg) {
case EE_CONTROL:
value = eeprom_reg->control.reg_val.value;
break;
case EE_ALERT:
value = eeprom_reg->alert.reg_val.value;
break;
case EE_FAULT:
value = eeprom_reg->fault.reg_val.value;
break;
case EE_ADC_ALERT_LOG:
value = eeprom_reg->adc_alert_log.reg_val.value;
break;
case EE_FET_BAD_FAULT_TIME:
value = eeprom_reg->fet_bad_fault_time;
break;
case EE_GPIO_CONFIG:
value = eeprom_reg->gpio_config.reg_val.value;
break;
case EE_VGPIO_ALARM_MIN:
value = eeprom_reg->vgpio_alarm_min;
break;
case EE_VGPIO_ALARM_MAX:
value = eeprom_reg->vgpio_alarm_max;
break;
case EE_VSOURCE_ALARM_MIN:
value = eeprom_reg->vsource_alarm_min;
break;
case EE_VSOURCE_ALARM_MAX:
value = eeprom_reg->vsource_alarm_max;
break;
case EE_VSENSE_ALARM_MIN:
value = eeprom_reg->vsense_alarm_min;
break;
case EE_VSENSE_ALARM_MAX:
value = eeprom_reg->vsense_alarm_max;
break;
case EE_POWER_ALARM_MIN:
value = eeprom_reg->power_alarm_min;
break;
case EE_POWER_ALARM_MAX:
value = eeprom_reg->power_alarm_max;
break;
case EE_CLOCK_DECIMATOR:
value = eeprom_reg->clock_decimator.reg_val.value;
break;
case EE_ILIM_ADJUST:
value = eeprom_reg->ilim_adjust.reg_val.value;
break;
default:
continue;
}
pem_reg_write(pem[num].fd, reg, value);
}
}
close(pem[num].fd);
return 0;
}