pm_err_flag_type pm_comm_read_byte(uint32 slave_id, uint32 addr, uint8* data, uint8 priority) { pm_err_flag_type err = PM_ERR_FLAG__SUCCESS ; SpmiBus_ResultType spmi_result = SPMI_BUS_SUCCESS; if(TRUE == spmi_initialized()) { /* check for out-of-bounds index */ if ( addr > PM_MAX_REGS) { err = PM_ERR_FLAG__SPMI_OPT_ERR ; } else { spmi_result = spmi_reg_read(slave_id, addr, data, priority); if ( spmi_result != SPMI_BUS_SUCCESS ) { err = PM_ERR_FLAG__SPMI_OPT_ERR ; } } } else { err = PM_ERR_FLAG__SPMI_OPT_ERR ; } return err ; }
/* Test if it's possible to read bus directly and indirectly */ static int dm_test_spmi_access(struct unit_test_state *uts) { const char *pmic_name = "pm8916@0"; struct udevice *bus, *pmic; ut_assertok(uclass_get_device(UCLASS_SPMI, 0, &bus)); ut_assertok(device_get_child(bus, 0, &pmic)); /* Sanity check if it's proper PMIC */ ut_asserteq_str(pmic_name, pmic->name); /* Read PMIC ID reg using SPMI bus - it assumes it has slaveID == 0*/ ut_asserteq(spmi_reg_read(bus, 0, 0xC0, 0x4), 0x10); ut_asserteq(spmi_reg_read(bus, 0, 0xC0, 0x5), 0x5); /* Read ID reg via pmic interface */ ut_asserteq(pmic_reg_read(pmic, 0xC004), 0x10); ut_asserteq(pmic_reg_read(pmic, 0xC005), 0x5); return 0; }
pm_err_flag_type pm_comm_read_byte_mask(uint32 slave_id, uint32 addr, uint8 mask, uint8* data, uint8 priority) { pm_err_flag_type err = PM_ERR_FLAG__SUCCESS ; err = spmi_reg_read(slave_id, addr, data, priority); if ( err != PM_ERR_FLAG__SUCCESS ) { err = PM_ERR_FLAG__SPMI_OPT_ERR ; } else { *data = *data & mask; } return err ; }
pm_err_flag_type pm_comm_write_byte_mask(uint32 slave_id, uint32 addr, uint8 mask, uint8 value, uint8 priority) { pm_err_flag_type err = PM_ERR_FLAG__SUCCESS ; SpmiBus_ResultType spmi_result = SPMI_BUS_SUCCESS; uint8 data = 0 ; if(TRUE == spmi_initialized()) { /* check for out-of-bounds index */ if ( addr > PM_MAX_REGS) { err = PM_ERR_FLAG__SPMI_OPT_ERR ; } else { /* Read the data from the SPMI and leave all the bits other than the mask to the previous state */ spmi_result = spmi_reg_read(slave_id, addr, &data, priority); if ( spmi_result == SPMI_BUS_SUCCESS ) { data &= (~mask) ; data |= (value & mask) ; spmi_result = spmi_reg_write(slave_id, addr, &data, priority); if ( spmi_result != SPMI_BUS_SUCCESS ) { err = PM_ERR_FLAG__SPMI_OPT_ERR ; } } } } else { err = PM_ERR_FLAG__SPMI_OPT_ERR ; } return err ; }