| .. | .. |
|---|
| 5541 | 5541 | u8 frev, crev; |
|---|
| 5542 | 5542 | u8 *power_state_offset; |
|---|
| 5543 | 5543 | struct ci_ps *ps; |
|---|
| 5544 | + int ret; |
|---|
| 5544 | 5545 | |
|---|
| 5545 | 5546 | if (!atom_parse_data_header(mode_info->atom_context, index, NULL, |
|---|
| 5546 | 5547 | &frev, &crev, &data_offset)) |
|---|
| .. | .. |
|---|
| 5570 | 5571 | non_clock_array_index = power_state->v2.nonClockInfoIndex; |
|---|
| 5571 | 5572 | non_clock_info = (struct _ATOM_PPLIB_NONCLOCK_INFO *) |
|---|
| 5572 | 5573 | &non_clock_info_array->nonClockInfo[non_clock_array_index]; |
|---|
| 5573 | | - if (!rdev->pm.power_state[i].clock_info) |
|---|
| 5574 | | - return -EINVAL; |
|---|
| 5574 | + if (!rdev->pm.power_state[i].clock_info) { |
|---|
| 5575 | + ret = -EINVAL; |
|---|
| 5576 | + goto err_free_ps; |
|---|
| 5577 | + } |
|---|
| 5575 | 5578 | ps = kzalloc(sizeof(struct ci_ps), GFP_KERNEL); |
|---|
| 5576 | | - if (ps == NULL) |
|---|
| 5577 | | - return -ENOMEM; |
|---|
| 5579 | + if (ps == NULL) { |
|---|
| 5580 | + ret = -ENOMEM; |
|---|
| 5581 | + goto err_free_ps; |
|---|
| 5582 | + } |
|---|
| 5578 | 5583 | rdev->pm.dpm.ps[i].ps_priv = ps; |
|---|
| 5579 | 5584 | ci_parse_pplib_non_clock_info(rdev, &rdev->pm.dpm.ps[i], |
|---|
| 5580 | 5585 | non_clock_info, |
|---|
| .. | .. |
|---|
| 5614 | 5619 | } |
|---|
| 5615 | 5620 | |
|---|
| 5616 | 5621 | return 0; |
|---|
| 5622 | + |
|---|
| 5623 | +err_free_ps: |
|---|
| 5624 | + for (i = 0; i < rdev->pm.dpm.num_ps; i++) |
|---|
| 5625 | + kfree(rdev->pm.dpm.ps[i].ps_priv); |
|---|
| 5626 | + kfree(rdev->pm.dpm.ps); |
|---|
| 5627 | + return ret; |
|---|
| 5617 | 5628 | } |
|---|
| 5618 | 5629 | |
|---|
| 5619 | 5630 | static int ci_get_vbios_boot_values(struct radeon_device *rdev, |
|---|
| .. | .. |
|---|
| 5702 | 5713 | |
|---|
| 5703 | 5714 | ret = ci_get_vbios_boot_values(rdev, &pi->vbios_boot_state); |
|---|
| 5704 | 5715 | if (ret) { |
|---|
| 5705 | | - ci_dpm_fini(rdev); |
|---|
| 5716 | + kfree(rdev->pm.dpm.priv); |
|---|
| 5706 | 5717 | return ret; |
|---|
| 5707 | 5718 | } |
|---|
| 5708 | 5719 | |
|---|
| 5709 | 5720 | ret = r600_get_platform_caps(rdev); |
|---|
| 5710 | 5721 | if (ret) { |
|---|
| 5711 | | - ci_dpm_fini(rdev); |
|---|
| 5722 | + kfree(rdev->pm.dpm.priv); |
|---|
| 5712 | 5723 | return ret; |
|---|
| 5713 | 5724 | } |
|---|
| 5714 | 5725 | |
|---|
| 5715 | 5726 | ret = r600_parse_extended_power_table(rdev); |
|---|
| 5716 | 5727 | if (ret) { |
|---|
| 5717 | | - ci_dpm_fini(rdev); |
|---|
| 5728 | + kfree(rdev->pm.dpm.priv); |
|---|
| 5718 | 5729 | return ret; |
|---|
| 5719 | 5730 | } |
|---|
| 5720 | 5731 | |
|---|
| 5721 | 5732 | ret = ci_parse_power_table(rdev); |
|---|
| 5722 | 5733 | if (ret) { |
|---|
| 5723 | | - ci_dpm_fini(rdev); |
|---|
| 5734 | + kfree(rdev->pm.dpm.priv); |
|---|
| 5735 | + r600_free_extended_power_table(rdev); |
|---|
| 5724 | 5736 | return ret; |
|---|
| 5725 | 5737 | } |
|---|
| 5726 | 5738 | |
|---|