Lines Matching refs:ccp

117 void ccp_add_device(struct ccp_device *ccp)  in ccp_add_device()  argument
122 list_add_tail(&ccp->entry, &ccp_units); in ccp_add_device()
127 ccp_rr = ccp; in ccp_add_device()
140 void ccp_del_device(struct ccp_device *ccp) in ccp_del_device() argument
145 if (ccp_rr == ccp) { in ccp_del_device()
156 list_del(&ccp->entry); in ccp_del_device()
164 int ccp_register_rng(struct ccp_device *ccp) in ccp_register_rng() argument
168 dev_dbg(ccp->dev, "Registering RNG...\n"); in ccp_register_rng()
170 ccp->hwrng.name = ccp->rngname; in ccp_register_rng()
171 ccp->hwrng.read = ccp_trng_read; in ccp_register_rng()
172 ret = hwrng_register(&ccp->hwrng); in ccp_register_rng()
174 dev_err(ccp->dev, "error registering hwrng (%d)\n", ret); in ccp_register_rng()
179 void ccp_unregister_rng(struct ccp_device *ccp) in ccp_unregister_rng() argument
181 if (ccp->hwrng.name) in ccp_unregister_rng()
182 hwrng_unregister(&ccp->hwrng); in ccp_unregister_rng()
273 struct ccp_device *ccp; in ccp_enqueue_cmd() local
279 ccp = cmd->ccp ? cmd->ccp : ccp_get_device(); in ccp_enqueue_cmd()
281 if (!ccp) in ccp_enqueue_cmd()
288 cmd->ccp = ccp; in ccp_enqueue_cmd()
290 spin_lock_irqsave(&ccp->cmd_lock, flags); in ccp_enqueue_cmd()
292 i = ccp->cmd_q_count; in ccp_enqueue_cmd()
294 if (ccp->cmd_count >= MAX_CMD_QLEN) { in ccp_enqueue_cmd()
297 list_add_tail(&cmd->entry, &ccp->backlog); in ccp_enqueue_cmd()
303 ccp->cmd_count++; in ccp_enqueue_cmd()
304 list_add_tail(&cmd->entry, &ccp->cmd); in ccp_enqueue_cmd()
307 if (!ccp->suspending) { in ccp_enqueue_cmd()
308 for (i = 0; i < ccp->cmd_q_count; i++) { in ccp_enqueue_cmd()
309 if (ccp->cmd_q[i].active) in ccp_enqueue_cmd()
317 spin_unlock_irqrestore(&ccp->cmd_lock, flags); in ccp_enqueue_cmd()
320 if (i < ccp->cmd_q_count) in ccp_enqueue_cmd()
321 wake_up_process(ccp->cmd_q[i].kthread); in ccp_enqueue_cmd()
330 struct ccp_device *ccp = cmd->ccp; in ccp_do_cmd_backlog() local
336 spin_lock_irqsave(&ccp->cmd_lock, flags); in ccp_do_cmd_backlog()
338 ccp->cmd_count++; in ccp_do_cmd_backlog()
339 list_add_tail(&cmd->entry, &ccp->cmd); in ccp_do_cmd_backlog()
342 for (i = 0; i < ccp->cmd_q_count; i++) { in ccp_do_cmd_backlog()
343 if (ccp->cmd_q[i].active) in ccp_do_cmd_backlog()
349 spin_unlock_irqrestore(&ccp->cmd_lock, flags); in ccp_do_cmd_backlog()
352 if (i < ccp->cmd_q_count) in ccp_do_cmd_backlog()
353 wake_up_process(ccp->cmd_q[i].kthread); in ccp_do_cmd_backlog()
358 struct ccp_device *ccp = cmd_q->ccp; in ccp_dequeue_cmd() local
363 spin_lock_irqsave(&ccp->cmd_lock, flags); in ccp_dequeue_cmd()
367 if (ccp->suspending) { in ccp_dequeue_cmd()
370 spin_unlock_irqrestore(&ccp->cmd_lock, flags); in ccp_dequeue_cmd()
371 wake_up_interruptible(&ccp->suspend_queue); in ccp_dequeue_cmd()
376 if (ccp->cmd_count) { in ccp_dequeue_cmd()
379 cmd = list_first_entry(&ccp->cmd, struct ccp_cmd, entry); in ccp_dequeue_cmd()
382 ccp->cmd_count--; in ccp_dequeue_cmd()
385 if (!list_empty(&ccp->backlog)) { in ccp_dequeue_cmd()
386 backlog = list_first_entry(&ccp->backlog, struct ccp_cmd, in ccp_dequeue_cmd()
391 spin_unlock_irqrestore(&ccp->cmd_lock, flags); in ccp_dequeue_cmd()
460 struct ccp_device *ccp; in ccp_alloc_struct() local
462 ccp = devm_kzalloc(dev, sizeof(*ccp), GFP_KERNEL); in ccp_alloc_struct()
463 if (!ccp) in ccp_alloc_struct()
465 ccp->dev = dev; in ccp_alloc_struct()
466 ccp->sp = sp; in ccp_alloc_struct()
467 ccp->axcache = sp->axcache; in ccp_alloc_struct()
469 INIT_LIST_HEAD(&ccp->cmd); in ccp_alloc_struct()
470 INIT_LIST_HEAD(&ccp->backlog); in ccp_alloc_struct()
472 spin_lock_init(&ccp->cmd_lock); in ccp_alloc_struct()
473 mutex_init(&ccp->req_mutex); in ccp_alloc_struct()
474 mutex_init(&ccp->sb_mutex); in ccp_alloc_struct()
475 ccp->sb_count = KSB_COUNT; in ccp_alloc_struct()
476 ccp->sb_start = 0; in ccp_alloc_struct()
479 init_waitqueue_head(&ccp->sb_queue); in ccp_alloc_struct()
480 init_waitqueue_head(&ccp->suspend_queue); in ccp_alloc_struct()
482 snprintf(ccp->name, MAX_CCP_NAME_LEN, "ccp-%u", sp->ord); in ccp_alloc_struct()
483 snprintf(ccp->rngname, MAX_CCP_NAME_LEN, "ccp-%u-rng", sp->ord); in ccp_alloc_struct()
485 return ccp; in ccp_alloc_struct()
490 struct ccp_device *ccp = container_of(rng, struct ccp_device, hwrng); in ccp_trng_read() local
497 trng_value = ioread32(ccp->io_regs + TRNG_OUT_REG); in ccp_trng_read()
503 if (ccp->hwrng_retries++ > TRNG_RETRIES) in ccp_trng_read()
510 ccp->hwrng_retries = 0; in ccp_trng_read()
517 bool ccp_queues_suspended(struct ccp_device *ccp) in ccp_queues_suspended() argument
523 spin_lock_irqsave(&ccp->cmd_lock, flags); in ccp_queues_suspended()
525 for (i = 0; i < ccp->cmd_q_count; i++) in ccp_queues_suspended()
526 if (ccp->cmd_q[i].suspended) in ccp_queues_suspended()
529 spin_unlock_irqrestore(&ccp->cmd_lock, flags); in ccp_queues_suspended()
531 return ccp->cmd_q_count == suspended; in ccp_queues_suspended()
536 struct ccp_device *ccp = sp->ccp_data; in ccp_dev_suspend() local
540 spin_lock_irqsave(&ccp->cmd_lock, flags); in ccp_dev_suspend()
542 ccp->suspending = 1; in ccp_dev_suspend()
545 for (i = 0; i < ccp->cmd_q_count; i++) in ccp_dev_suspend()
546 wake_up_process(ccp->cmd_q[i].kthread); in ccp_dev_suspend()
548 spin_unlock_irqrestore(&ccp->cmd_lock, flags); in ccp_dev_suspend()
551 while (!ccp_queues_suspended(ccp)) in ccp_dev_suspend()
552 wait_event_interruptible(ccp->suspend_queue, in ccp_dev_suspend()
553 ccp_queues_suspended(ccp)); in ccp_dev_suspend()
560 struct ccp_device *ccp = sp->ccp_data; in ccp_dev_resume() local
564 spin_lock_irqsave(&ccp->cmd_lock, flags); in ccp_dev_resume()
566 ccp->suspending = 0; in ccp_dev_resume()
569 for (i = 0; i < ccp->cmd_q_count; i++) { in ccp_dev_resume()
570 ccp->cmd_q[i].suspended = 0; in ccp_dev_resume()
571 wake_up_process(ccp->cmd_q[i].kthread); in ccp_dev_resume()
574 spin_unlock_irqrestore(&ccp->cmd_lock, flags); in ccp_dev_resume()
583 struct ccp_device *ccp; in ccp_dev_init() local
587 ccp = ccp_alloc_struct(sp); in ccp_dev_init()
588 if (!ccp) in ccp_dev_init()
590 sp->ccp_data = ccp; in ccp_dev_init()
592 ccp->vdata = (struct ccp_vdata *)sp->dev_vdata->ccp_vdata; in ccp_dev_init()
593 if (!ccp->vdata || !ccp->vdata->version) { in ccp_dev_init()
599 ccp->use_tasklet = sp->use_tasklet; in ccp_dev_init()
601 ccp->io_regs = sp->io_map + ccp->vdata->offset; in ccp_dev_init()
602 if (ccp->vdata->setup) in ccp_dev_init()
603 ccp->vdata->setup(ccp); in ccp_dev_init()
605 ret = ccp->vdata->perform->init(ccp); in ccp_dev_init()
623 struct ccp_device *ccp = sp->ccp_data; in ccp_dev_destroy() local
625 if (!ccp) in ccp_dev_destroy()
628 ccp->vdata->perform->destroy(ccp); in ccp_dev_destroy()