diff options
author | Timo Alho <talho@nvidia.com> | 2017-09-07 05:31:04 -0400 |
---|---|---|
committer | Thierry Reding <treding@nvidia.com> | 2017-10-19 10:33:57 -0400 |
commit | 775dba87f891e99c2f46df17edd5f5359d0883ad (patch) | |
tree | 839d0976e12482c0ec2278437a58006ddde86267 | |
parent | d5d91f30860f9c1139c41a652461e9d54614670d (diff) |
soc/tegra: bpmp: Check BPMP response return code
Add checks for the return code in BPMP response messages.
Signed-off-by: Timo Alho <talho@nvidia.com>
Acked-by: Jon Hunter <jonathanh@nvidia.com>
Signed-off-by: Thierry Reding <treding@nvidia.com>
-rw-r--r-- | drivers/soc/tegra/powergate-bpmp.c | 15 |
1 files changed, 13 insertions, 2 deletions
diff --git a/drivers/soc/tegra/powergate-bpmp.c b/drivers/soc/tegra/powergate-bpmp.c index 8fc356039401..82c7e27cd8bb 100644 --- a/drivers/soc/tegra/powergate-bpmp.c +++ b/drivers/soc/tegra/powergate-bpmp.c | |||
@@ -42,6 +42,7 @@ static int tegra_bpmp_powergate_set_state(struct tegra_bpmp *bpmp, | |||
42 | { | 42 | { |
43 | struct mrq_pg_request request; | 43 | struct mrq_pg_request request; |
44 | struct tegra_bpmp_message msg; | 44 | struct tegra_bpmp_message msg; |
45 | int err; | ||
45 | 46 | ||
46 | memset(&request, 0, sizeof(request)); | 47 | memset(&request, 0, sizeof(request)); |
47 | request.cmd = CMD_PG_SET_STATE; | 48 | request.cmd = CMD_PG_SET_STATE; |
@@ -53,7 +54,13 @@ static int tegra_bpmp_powergate_set_state(struct tegra_bpmp *bpmp, | |||
53 | msg.tx.data = &request; | 54 | msg.tx.data = &request; |
54 | msg.tx.size = sizeof(request); | 55 | msg.tx.size = sizeof(request); |
55 | 56 | ||
56 | return tegra_bpmp_transfer(bpmp, &msg); | 57 | err = tegra_bpmp_transfer(bpmp, &msg); |
58 | if (err < 0) | ||
59 | return err; | ||
60 | else if (msg.rx.ret < 0) | ||
61 | return -EINVAL; | ||
62 | |||
63 | return 0; | ||
57 | } | 64 | } |
58 | 65 | ||
59 | static int tegra_bpmp_powergate_get_state(struct tegra_bpmp *bpmp, | 66 | static int tegra_bpmp_powergate_get_state(struct tegra_bpmp *bpmp, |
@@ -80,6 +87,8 @@ static int tegra_bpmp_powergate_get_state(struct tegra_bpmp *bpmp, | |||
80 | err = tegra_bpmp_transfer(bpmp, &msg); | 87 | err = tegra_bpmp_transfer(bpmp, &msg); |
81 | if (err < 0) | 88 | if (err < 0) |
82 | return PG_STATE_OFF; | 89 | return PG_STATE_OFF; |
90 | else if (msg.rx.ret < 0) | ||
91 | return -EINVAL; | ||
83 | 92 | ||
84 | return response.get_state.state; | 93 | return response.get_state.state; |
85 | } | 94 | } |
@@ -106,6 +115,8 @@ static int tegra_bpmp_powergate_get_max_id(struct tegra_bpmp *bpmp) | |||
106 | err = tegra_bpmp_transfer(bpmp, &msg); | 115 | err = tegra_bpmp_transfer(bpmp, &msg); |
107 | if (err < 0) | 116 | if (err < 0) |
108 | return err; | 117 | return err; |
118 | else if (msg.rx.ret < 0) | ||
119 | return -EINVAL; | ||
109 | 120 | ||
110 | return response.get_max_id.max_id; | 121 | return response.get_max_id.max_id; |
111 | } | 122 | } |
@@ -132,7 +143,7 @@ static char *tegra_bpmp_powergate_get_name(struct tegra_bpmp *bpmp, | |||
132 | msg.rx.size = sizeof(response); | 143 | msg.rx.size = sizeof(response); |
133 | 144 | ||
134 | err = tegra_bpmp_transfer(bpmp, &msg); | 145 | err = tegra_bpmp_transfer(bpmp, &msg); |
135 | if (err < 0) | 146 | if (err < 0 || msg.rx.ret < 0) |
136 | return NULL; | 147 | return NULL; |
137 | 148 | ||
138 | return kstrdup(response.get_name.name, GFP_KERNEL); | 149 | return kstrdup(response.get_name.name, GFP_KERNEL); |