diff options
| author | Bengt Jonsson <bengt.g.jonsson@stericsson.com> | 2011-08-12 04:28:25 -0400 |
|---|---|---|
| committer | Samuel Ortiz <sameo@linux.intel.com> | 2011-10-24 08:09:18 -0400 |
| commit | 0b9199e3186e1998a8e066fbcf15bcf18cdbfc42 (patch) | |
| tree | 9f3d880051fa9a0121f90b3e4dfd36de6bfe711f | |
| parent | 0837bb7260a17283b4518e11206546ffc92265fc (diff) | |
mfd: hwacc power state db8500-prcmu accessor
This implements the accessor function for hardware accelerator
power state settings.
Signed-off-by: Bengt Jonsson <bengt.g.jonsson@stericsson.com>
Signed-off-by: Linus Walleij <linus.walleij@linaro.org>
Signed-off-by: Samuel Ortiz <sameo@linux.intel.com>
| -rw-r--r-- | drivers/mfd/db8500-prcmu.c | 126 |
1 files changed, 126 insertions, 0 deletions
diff --git a/drivers/mfd/db8500-prcmu.c b/drivers/mfd/db8500-prcmu.c index af369995b013..28a60906f5f7 100644 --- a/drivers/mfd/db8500-prcmu.c +++ b/drivers/mfd/db8500-prcmu.c | |||
| @@ -1081,6 +1081,132 @@ static int request_pll(u8 clock, bool enable) | |||
| 1081 | } | 1081 | } |
| 1082 | 1082 | ||
| 1083 | /** | 1083 | /** |
| 1084 | * prcmu_set_hwacc - set the power state of a h/w accelerator | ||
| 1085 | * @hwacc_dev: The hardware accelerator (enum hw_acc_dev). | ||
| 1086 | * @state: The new power state (enum hw_acc_state). | ||
| 1087 | * | ||
| 1088 | * This function sets the power state of a hardware accelerator. | ||
| 1089 | * This function should not be called from interrupt context. | ||
| 1090 | * | ||
| 1091 | * NOTE! Deprecated, to be removed when all users switched over to use the | ||
| 1092 | * regulator framework API. | ||
| 1093 | */ | ||
| 1094 | int prcmu_set_hwacc(u16 hwacc_dev, u8 state) | ||
| 1095 | { | ||
| 1096 | int r = 0; | ||
| 1097 | bool ram_retention = false; | ||
| 1098 | bool enable, enable_ret; | ||
| 1099 | |||
| 1100 | /* check argument */ | ||
| 1101 | BUG_ON(hwacc_dev >= NUM_HW_ACC); | ||
| 1102 | |||
| 1103 | /* get state of switches */ | ||
| 1104 | enable = hwacc_enabled[hwacc_dev]; | ||
| 1105 | enable_ret = hwacc_ret_enabled[hwacc_dev]; | ||
| 1106 | |||
| 1107 | /* set flag if retention is possible */ | ||
| 1108 | switch (hwacc_dev) { | ||
| 1109 | case HW_ACC_SVAMMDSP: | ||
| 1110 | case HW_ACC_SIAMMDSP: | ||
| 1111 | case HW_ACC_ESRAM1: | ||
| 1112 | case HW_ACC_ESRAM2: | ||
| 1113 | case HW_ACC_ESRAM3: | ||
| 1114 | case HW_ACC_ESRAM4: | ||
| 1115 | ram_retention = true; | ||
| 1116 | break; | ||
| 1117 | } | ||
| 1118 | |||
| 1119 | /* check argument */ | ||
| 1120 | BUG_ON(state > HW_ON); | ||
| 1121 | BUG_ON(state == HW_OFF_RAMRET && !ram_retention); | ||
| 1122 | |||
| 1123 | /* modify enable flags */ | ||
| 1124 | switch (state) { | ||
| 1125 | case HW_OFF: | ||
| 1126 | enable_ret = false; | ||
| 1127 | enable = false; | ||
| 1128 | break; | ||
| 1129 | case HW_ON: | ||
| 1130 | enable = true; | ||
| 1131 | break; | ||
| 1132 | case HW_OFF_RAMRET: | ||
| 1133 | enable_ret = true; | ||
| 1134 | enable = false; | ||
| 1135 | break; | ||
| 1136 | } | ||
| 1137 | |||
| 1138 | /* get regulator (lazy) */ | ||
| 1139 | if (hwacc_regulator[hwacc_dev] == NULL) { | ||
| 1140 | hwacc_regulator[hwacc_dev] = regulator_get(NULL, | ||
| 1141 | hwacc_regulator_name[hwacc_dev]); | ||
| 1142 | if (IS_ERR(hwacc_regulator[hwacc_dev])) { | ||
| 1143 | pr_err("prcmu: failed to get supply %s\n", | ||
| 1144 | hwacc_regulator_name[hwacc_dev]); | ||
| 1145 | r = PTR_ERR(hwacc_regulator[hwacc_dev]); | ||
| 1146 | goto out; | ||
| 1147 | } | ||
| 1148 | } | ||
| 1149 | |||
| 1150 | if (ram_retention) { | ||
| 1151 | if (hwacc_ret_regulator[hwacc_dev] == NULL) { | ||
| 1152 | hwacc_ret_regulator[hwacc_dev] = regulator_get(NULL, | ||
| 1153 | hwacc_ret_regulator_name[hwacc_dev]); | ||
| 1154 | if (IS_ERR(hwacc_ret_regulator[hwacc_dev])) { | ||
| 1155 | pr_err("prcmu: failed to get supply %s\n", | ||
| 1156 | hwacc_ret_regulator_name[hwacc_dev]); | ||
| 1157 | r = PTR_ERR(hwacc_ret_regulator[hwacc_dev]); | ||
| 1158 | goto out; | ||
| 1159 | } | ||
| 1160 | } | ||
| 1161 | } | ||
| 1162 | |||
| 1163 | /* set regulators */ | ||
| 1164 | if (ram_retention) { | ||
| 1165 | if (enable_ret && !hwacc_ret_enabled[hwacc_dev]) { | ||
| 1166 | r = regulator_enable(hwacc_ret_regulator[hwacc_dev]); | ||
| 1167 | if (r < 0) { | ||
| 1168 | pr_err("prcmu_set_hwacc: ret enable failed\n"); | ||
| 1169 | goto out; | ||
| 1170 | } | ||
| 1171 | hwacc_ret_enabled[hwacc_dev] = true; | ||
| 1172 | } | ||
| 1173 | } | ||
| 1174 | |||
| 1175 | if (enable && !hwacc_enabled[hwacc_dev]) { | ||
| 1176 | r = regulator_enable(hwacc_regulator[hwacc_dev]); | ||
| 1177 | if (r < 0) { | ||
| 1178 | pr_err("prcmu_set_hwacc: enable failed\n"); | ||
| 1179 | goto out; | ||
| 1180 | } | ||
| 1181 | hwacc_enabled[hwacc_dev] = true; | ||
| 1182 | } | ||
| 1183 | |||
| 1184 | if (!enable && hwacc_enabled[hwacc_dev]) { | ||
| 1185 | r = regulator_disable(hwacc_regulator[hwacc_dev]); | ||
| 1186 | if (r < 0) { | ||
| 1187 | pr_err("prcmu_set_hwacc: disable failed\n"); | ||
| 1188 | goto out; | ||
| 1189 | } | ||
| 1190 | hwacc_enabled[hwacc_dev] = false; | ||
| 1191 | } | ||
| 1192 | |||
| 1193 | if (ram_retention) { | ||
| 1194 | if (!enable_ret && hwacc_ret_enabled[hwacc_dev]) { | ||
| 1195 | r = regulator_disable(hwacc_ret_regulator[hwacc_dev]); | ||
| 1196 | if (r < 0) { | ||
| 1197 | pr_err("prcmu_set_hwacc: ret disable failed\n"); | ||
| 1198 | goto out; | ||
| 1199 | } | ||
| 1200 | hwacc_ret_enabled[hwacc_dev] = false; | ||
| 1201 | } | ||
| 1202 | } | ||
| 1203 | |||
| 1204 | out: | ||
| 1205 | return r; | ||
| 1206 | } | ||
| 1207 | EXPORT_SYMBOL(prcmu_set_hwacc); | ||
| 1208 | |||
| 1209 | /** | ||
| 1084 | * db8500_prcmu_set_epod - set the state of a EPOD (power domain) | 1210 | * db8500_prcmu_set_epod - set the state of a EPOD (power domain) |
| 1085 | * @epod_id: The EPOD to set | 1211 | * @epod_id: The EPOD to set |
| 1086 | * @epod_state: The new EPOD state | 1212 | * @epod_state: The new EPOD state |
