static int pem_reg_write()

in meta-facebook/recipes-utils/pem/files/pem.c [288:376]


static int pem_reg_write(int fd, uint8_t reg, int value) {
  uint8_t byte;
  uint16_t word;

  if (fd <= 0)
    return -1;

  switch (reg) {
    case ENERGY:
    case TIME_COUNTER:
    case EE_SCRATCH:
    case VIN:
    case VOUT:
    case VGPIO:
    case VSENSE:
    case POWER:
    case STATUS:
        break;
    case CONTROL:
    case ALERT:
    case VGPIO_MIN:
    case VGPIO_MAX:
    case VSOURCE_MIN:
    case VSOURCE_MAX:
    case VSENSE_MIN:
    case VSENSE_MAX:
    case POWER_MIN:
    case POWER_MAX:
      word = value & 0xFFFF;
      word = i2c_smbus_write_word_data(fd, smbus_ltc4282[reg].reg, word);
      break;
    case EE_CONTROL:
    case EE_ALERT:
      /* ltc4282 eeprom not support word write */
      word = value & 0xFFFF;
      if(wait_eeprom_done(fd) == -1)
        return -1;
      byte = (word & 0xFF00) >> 8;
      byte = i2c_smbus_write_byte_data(fd, smbus_ltc4282[reg].reg, byte);
      if(wait_eeprom_done(fd) == -1)
        return -1;
      byte = word & 0xFF;
      byte = i2c_smbus_write_byte_data(fd, smbus_ltc4282[reg].reg + 1, byte);
      break;

    case FAULT_LOG:
    case ADC_ALERT_LOG:
    case FET_BAD_FAULT_TIME:
    case GPIO_CONGIG:
    case VGPIO_ALARM_MIN:
    case VGPIO_ALARM_MAX:
    case VSOURCE_ALARM_MIN:
    case VSOURCE_ALARM_MAX:
    case VSENSE_ALARM_MIN:
    case VSENSE_ALARM_MAX:
    case POWER_ALARM_MIN:
    case POWER_ALARM_MAX:
    case CLOCK_DIVIDER:
    case ILIM_ADJUST:
    case ALERT_CONTROL:
    case ADC_CONTROL:
      byte = value & 0xFF;
      byte = i2c_smbus_write_byte_data(fd, smbus_ltc4282[reg].reg, byte);
      break;
    case EE_FAULT:
    case EE_ADC_ALERT_LOG:
    case EE_FET_BAD_FAULT_TIME:
    case EE_GPIO_CONFIG:
    case EE_VGPIO_ALARM_MIN:
    case EE_VGPIO_ALARM_MAX:
    case EE_VSOURCE_ALARM_MIN:
    case EE_VSOURCE_ALARM_MAX:
    case EE_VSENSE_ALARM_MIN:
    case EE_VSENSE_ALARM_MAX:
    case EE_POWER_ALARM_MIN:
    case EE_POWER_ALARM_MAX:
    case EE_CLOCK_DECIMATOR:
    case EE_ILIM_ADJUST:
      if(wait_eeprom_done(fd) == -1)
        return -1;
      byte = value & 0xFF;
      byte = i2c_smbus_write_byte_data(fd, smbus_ltc4282[reg].reg, byte);
      break;
    default:
      break;
  }

  return 0;
}