.. | .. |
---|
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 | |
---|