aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorKim Phillips <kim.phillips@freescale.com>2012-06-22 20:48:54 -0400
committerHerbert Xu <herbert@gondor.apana.org.au>2012-06-27 02:42:06 -0400
commit4bba1e9f41d68279ff2c17db53fbd379692b10bc (patch)
tree8d0ed5e6e7b51131cd0c53b3fce00bceb0612d9e
parent1a076689cda8a1d623dcda170b2dc2b476cc6f1a (diff)
crypto: caam - use non-irq versions of spinlocks for job rings
The enqueue lock isn't used in any interrupt context, and the dequeue lock isn't used in the h/w interrupt context, only in bh context. Signed-off-by: Kim Phillips <kim.phillips@freescale.com> Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
-rw-r--r--drivers/crypto/caam/jr.c30
1 files changed, 13 insertions, 17 deletions
diff --git a/drivers/crypto/caam/jr.c b/drivers/crypto/caam/jr.c
index 9f16b2c03613..11d93f243705 100644
--- a/drivers/crypto/caam/jr.c
+++ b/drivers/crypto/caam/jr.c
@@ -2,7 +2,7 @@
2 * CAAM/SEC 4.x transport/backend driver 2 * CAAM/SEC 4.x transport/backend driver
3 * JobR backend functionality 3 * JobR backend functionality
4 * 4 *
5 * Copyright 2008-2011 Freescale Semiconductor, Inc. 5 * Copyright 2008-2012 Freescale Semiconductor, Inc.
6 */ 6 */
7 7
8#include "compat.h" 8#include "compat.h"
@@ -58,9 +58,8 @@ static void caam_jr_dequeue(unsigned long devarg)
58 void (*usercall)(struct device *dev, u32 *desc, u32 status, void *arg); 58 void (*usercall)(struct device *dev, u32 *desc, u32 status, void *arg);
59 u32 *userdesc, userstatus; 59 u32 *userdesc, userstatus;
60 void *userarg; 60 void *userarg;
61 unsigned long flags;
62 61
63 spin_lock_irqsave(&jrp->outlock, flags); 62 spin_lock_bh(&jrp->outlock);
64 63
65 head = ACCESS_ONCE(jrp->head); 64 head = ACCESS_ONCE(jrp->head);
66 sw_idx = tail = jrp->tail; 65 sw_idx = tail = jrp->tail;
@@ -118,18 +117,18 @@ static void caam_jr_dequeue(unsigned long devarg)
118 /* set done */ 117 /* set done */
119 wr_reg32(&jrp->rregs->outring_rmvd, 1); 118 wr_reg32(&jrp->rregs->outring_rmvd, 1);
120 119
121 spin_unlock_irqrestore(&jrp->outlock, flags); 120 spin_unlock_bh(&jrp->outlock);
122 121
123 /* Finally, execute user's callback */ 122 /* Finally, execute user's callback */
124 usercall(dev, userdesc, userstatus, userarg); 123 usercall(dev, userdesc, userstatus, userarg);
125 124
126 spin_lock_irqsave(&jrp->outlock, flags); 125 spin_lock_bh(&jrp->outlock);
127 126
128 head = ACCESS_ONCE(jrp->head); 127 head = ACCESS_ONCE(jrp->head);
129 sw_idx = tail = jrp->tail; 128 sw_idx = tail = jrp->tail;
130 } 129 }
131 130
132 spin_unlock_irqrestore(&jrp->outlock, flags); 131 spin_unlock_bh(&jrp->outlock);
133 132
134 /* reenable / unmask IRQs */ 133 /* reenable / unmask IRQs */
135 clrbits32(&jrp->rregs->rconfig_lo, JRCFG_IMSK); 134 clrbits32(&jrp->rregs->rconfig_lo, JRCFG_IMSK);
@@ -148,23 +147,22 @@ int caam_jr_register(struct device *ctrldev, struct device **rdev)
148{ 147{
149 struct caam_drv_private *ctrlpriv = dev_get_drvdata(ctrldev); 148 struct caam_drv_private *ctrlpriv = dev_get_drvdata(ctrldev);
150 struct caam_drv_private_jr *jrpriv = NULL; 149 struct caam_drv_private_jr *jrpriv = NULL;
151 unsigned long flags;
152 int ring; 150 int ring;
153 151
154 /* Lock, if free ring - assign, unlock */ 152 /* Lock, if free ring - assign, unlock */
155 spin_lock_irqsave(&ctrlpriv->jr_alloc_lock, flags); 153 spin_lock(&ctrlpriv->jr_alloc_lock);
156 for (ring = 0; ring < ctrlpriv->total_jobrs; ring++) { 154 for (ring = 0; ring < ctrlpriv->total_jobrs; ring++) {
157 jrpriv = dev_get_drvdata(ctrlpriv->jrdev[ring]); 155 jrpriv = dev_get_drvdata(ctrlpriv->jrdev[ring]);
158 if (jrpriv->assign == JOBR_UNASSIGNED) { 156 if (jrpriv->assign == JOBR_UNASSIGNED) {
159 jrpriv->assign = JOBR_ASSIGNED; 157 jrpriv->assign = JOBR_ASSIGNED;
160 *rdev = ctrlpriv->jrdev[ring]; 158 *rdev = ctrlpriv->jrdev[ring];
161 spin_unlock_irqrestore(&ctrlpriv->jr_alloc_lock, flags); 159 spin_unlock(&ctrlpriv->jr_alloc_lock);
162 return ring; 160 return ring;
163 } 161 }
164 } 162 }
165 163
166 /* If assigned, write dev where caller needs it */ 164 /* If assigned, write dev where caller needs it */
167 spin_unlock_irqrestore(&ctrlpriv->jr_alloc_lock, flags); 165 spin_unlock(&ctrlpriv->jr_alloc_lock);
168 *rdev = NULL; 166 *rdev = NULL;
169 167
170 return -ENODEV; 168 return -ENODEV;
@@ -182,7 +180,6 @@ int caam_jr_deregister(struct device *rdev)
182{ 180{
183 struct caam_drv_private_jr *jrpriv = dev_get_drvdata(rdev); 181 struct caam_drv_private_jr *jrpriv = dev_get_drvdata(rdev);
184 struct caam_drv_private *ctrlpriv; 182 struct caam_drv_private *ctrlpriv;
185 unsigned long flags;
186 183
187 /* Get the owning controller's private space */ 184 /* Get the owning controller's private space */
188 ctrlpriv = dev_get_drvdata(jrpriv->parentdev); 185 ctrlpriv = dev_get_drvdata(jrpriv->parentdev);
@@ -195,9 +192,9 @@ int caam_jr_deregister(struct device *rdev)
195 return -EBUSY; 192 return -EBUSY;
196 193
197 /* Release ring */ 194 /* Release ring */
198 spin_lock_irqsave(&ctrlpriv->jr_alloc_lock, flags); 195 spin_lock(&ctrlpriv->jr_alloc_lock);
199 jrpriv->assign = JOBR_UNASSIGNED; 196 jrpriv->assign = JOBR_UNASSIGNED;
200 spin_unlock_irqrestore(&ctrlpriv->jr_alloc_lock, flags); 197 spin_unlock(&ctrlpriv->jr_alloc_lock);
201 198
202 return 0; 199 return 0;
203} 200}
@@ -238,7 +235,6 @@ int caam_jr_enqueue(struct device *dev, u32 *desc,
238{ 235{
239 struct caam_drv_private_jr *jrp = dev_get_drvdata(dev); 236 struct caam_drv_private_jr *jrp = dev_get_drvdata(dev);
240 struct caam_jrentry_info *head_entry; 237 struct caam_jrentry_info *head_entry;
241 unsigned long flags;
242 int head, tail, desc_size; 238 int head, tail, desc_size;
243 dma_addr_t desc_dma; 239 dma_addr_t desc_dma;
244 240
@@ -249,14 +245,14 @@ int caam_jr_enqueue(struct device *dev, u32 *desc,
249 return -EIO; 245 return -EIO;
250 } 246 }
251 247
252 spin_lock_irqsave(&jrp->inplock, flags); 248 spin_lock(&jrp->inplock);
253 249
254 head = jrp->head; 250 head = jrp->head;
255 tail = ACCESS_ONCE(jrp->tail); 251 tail = ACCESS_ONCE(jrp->tail);
256 252
257 if (!rd_reg32(&jrp->rregs->inpring_avail) || 253 if (!rd_reg32(&jrp->rregs->inpring_avail) ||
258 CIRC_SPACE(head, tail, JOBR_DEPTH) <= 0) { 254 CIRC_SPACE(head, tail, JOBR_DEPTH) <= 0) {
259 spin_unlock_irqrestore(&jrp->inplock, flags); 255 spin_unlock(&jrp->inplock);
260 dma_unmap_single(dev, desc_dma, desc_size, DMA_TO_DEVICE); 256 dma_unmap_single(dev, desc_dma, desc_size, DMA_TO_DEVICE);
261 return -EBUSY; 257 return -EBUSY;
262 } 258 }
@@ -280,7 +276,7 @@ int caam_jr_enqueue(struct device *dev, u32 *desc,
280 276
281 wr_reg32(&jrp->rregs->inpring_jobadd, 1); 277 wr_reg32(&jrp->rregs->inpring_jobadd, 1);
282 278
283 spin_unlock_irqrestore(&jrp->inplock, flags); 279 spin_unlock(&jrp->inplock);
284 280
285 return 0; 281 return 0;
286} 282}