aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorNishanth Menon <nm@ti.com>2014-04-15 12:58:31 -0400
committerHerbert Xu <herbert@gondor.apana.org.au>2014-04-16 08:40:19 -0400
commitf51f593b3eb194d01d8980316e6bb1f7d72f567a (patch)
tree1c4d700f3da329372c076e1707f2ec54e988b9eb
parent8ece117104068de3e0e50d1601bca15f58e912fd (diff)
crypto: omap-des - handle error of pm_runtime_get_sync
pm_runtime_get_sync may not always succeed depending on SoC involved. So handle the error appropriately ensuring usage_count is accurate in case of failure. Signed-off-by: Nishanth Menon <nm@ti.com> Reviewed-by: Felipe Balbi <balbi@ti.com> Reported-by: Joachim Eastwood <manabian@gmail.com> Tested-by: Joachim Eastwood <manabian@gmail.com> Acked-by: Joel Fernandes <joelf@ti.com> Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
-rw-r--r--drivers/crypto/omap-des.c26
1 files changed, 23 insertions, 3 deletions
diff --git a/drivers/crypto/omap-des.c b/drivers/crypto/omap-des.c
index 4a13624bb82b..b8bc84be8741 100644
--- a/drivers/crypto/omap-des.c
+++ b/drivers/crypto/omap-des.c
@@ -223,12 +223,19 @@ static void omap_des_write_n(struct omap_des_dev *dd, u32 offset,
223 223
224static int omap_des_hw_init(struct omap_des_dev *dd) 224static int omap_des_hw_init(struct omap_des_dev *dd)
225{ 225{
226 int err;
227
226 /* 228 /*
227 * clocks are enabled when request starts and disabled when finished. 229 * clocks are enabled when request starts and disabled when finished.
228 * It may be long delays between requests. 230 * It may be long delays between requests.
229 * Device might go to off mode to save power. 231 * Device might go to off mode to save power.
230 */ 232 */
231 pm_runtime_get_sync(dd->dev); 233 err = pm_runtime_get_sync(dd->dev);
234 if (err < 0) {
235 pm_runtime_put_noidle(dd->dev);
236 dev_err(dd->dev, "%s: failed to get_sync(%d)\n", __func__, err);
237 return err;
238 }
232 239
233 if (!(dd->flags & FLAGS_INIT)) { 240 if (!(dd->flags & FLAGS_INIT)) {
234 dd->flags |= FLAGS_INIT; 241 dd->flags |= FLAGS_INIT;
@@ -1082,7 +1089,12 @@ static int omap_des_probe(struct platform_device *pdev)
1082 dd->phys_base = res->start; 1089 dd->phys_base = res->start;
1083 1090
1084 pm_runtime_enable(dev); 1091 pm_runtime_enable(dev);
1085 pm_runtime_get_sync(dev); 1092 err = pm_runtime_get_sync(dev);
1093 if (err < 0) {
1094 pm_runtime_put_noidle(dev);
1095 dev_err(dd->dev, "%s: failed to get_sync(%d)\n", __func__, err);
1096 goto err_get;
1097 }
1086 1098
1087 omap_des_dma_stop(dd); 1099 omap_des_dma_stop(dd);
1088 1100
@@ -1147,6 +1159,7 @@ err_algs:
1147err_irq: 1159err_irq:
1148 tasklet_kill(&dd->done_task); 1160 tasklet_kill(&dd->done_task);
1149 tasklet_kill(&dd->queue_task); 1161 tasklet_kill(&dd->queue_task);
1162err_get:
1150 pm_runtime_disable(dev); 1163 pm_runtime_disable(dev);
1151err_res: 1164err_res:
1152 dd = NULL; 1165 dd = NULL;
@@ -1190,7 +1203,14 @@ static int omap_des_suspend(struct device *dev)
1190 1203
1191static int omap_des_resume(struct device *dev) 1204static int omap_des_resume(struct device *dev)
1192{ 1205{
1193 pm_runtime_get_sync(dev); 1206 int err;
1207
1208 err = pm_runtime_get_sync(dev);
1209 if (err < 0) {
1210 pm_runtime_put_noidle(dev);
1211 dev_err(dev, "%s: failed to get_sync(%d)\n", __func__, err);
1212 return err;
1213 }
1194 return 0; 1214 return 0;
1195} 1215}
1196#endif 1216#endif