summaryrefslogtreecommitdiff
path: root/drivers/crypto/ccp/ccp-dev.c
diff options
context:
space:
mode:
authorBrijesh Singh <brijesh.singh@amd.com>2017-07-06 17:59:13 +0300
committerHerbert Xu <herbert@gondor.apana.org.au>2017-07-18 12:50:59 +0300
commit970e8303cb8d6d8e77402345abbdd83862e800ac (patch)
tree2bec04857f2902b78ff4f56095f220d22f8a11fe /drivers/crypto/ccp/ccp-dev.c
parenta0a613abe190c96047c63b9147bd1c9d8e96e74f (diff)
downloadlinux-970e8303cb8d6d8e77402345abbdd83862e800ac.tar.xz
crypto: ccp - Use devres interface to allocate PCI/iomap and cleanup
Update pci and platform files to use devres interface to allocate the PCI and iomap resources. Also add helper functions to consolicate module init, exit and power mangagement code duplication. Signed-off-by: Brijesh Singh <brijesh.singh@amd.com> Acked-by: Gary R Hook <gary.hook@amd.com> Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
Diffstat (limited to 'drivers/crypto/ccp/ccp-dev.c')
-rw-r--r--drivers/crypto/ccp/ccp-dev.c61
1 files changed, 61 insertions, 0 deletions
diff --git a/drivers/crypto/ccp/ccp-dev.c b/drivers/crypto/ccp/ccp-dev.c
index 67cbb3e76888..83a0ce5661ad 100644
--- a/drivers/crypto/ccp/ccp-dev.c
+++ b/drivers/crypto/ccp/ccp-dev.c
@@ -539,8 +539,69 @@ bool ccp_queues_suspended(struct ccp_device *ccp)
return ccp->cmd_q_count == suspended;
}
+
+int ccp_dev_suspend(struct ccp_device *ccp, pm_message_t state)
+{
+ unsigned long flags;
+ unsigned int i;
+
+ spin_lock_irqsave(&ccp->cmd_lock, flags);
+
+ ccp->suspending = 1;
+
+ /* Wake all the queue kthreads to prepare for suspend */
+ for (i = 0; i < ccp->cmd_q_count; i++)
+ wake_up_process(ccp->cmd_q[i].kthread);
+
+ spin_unlock_irqrestore(&ccp->cmd_lock, flags);
+
+ /* Wait for all queue kthreads to say they're done */
+ while (!ccp_queues_suspended(ccp))
+ wait_event_interruptible(ccp->suspend_queue,
+ ccp_queues_suspended(ccp));
+
+ return 0;
+}
+
+int ccp_dev_resume(struct ccp_device *ccp)
+{
+ unsigned long flags;
+ unsigned int i;
+
+ spin_lock_irqsave(&ccp->cmd_lock, flags);
+
+ ccp->suspending = 0;
+
+ /* Wake up all the kthreads */
+ for (i = 0; i < ccp->cmd_q_count; i++) {
+ ccp->cmd_q[i].suspended = 0;
+ wake_up_process(ccp->cmd_q[i].kthread);
+ }
+
+ spin_unlock_irqrestore(&ccp->cmd_lock, flags);
+
+ return 0;
+}
#endif
+int ccp_dev_init(struct ccp_device *ccp)
+{
+ ccp->io_regs = ccp->io_map + ccp->vdata->offset;
+
+ if (ccp->vdata->setup)
+ ccp->vdata->setup(ccp);
+
+ return ccp->vdata->perform->init(ccp);
+}
+
+void ccp_dev_destroy(struct ccp_device *ccp)
+{
+ if (!ccp)
+ return;
+
+ ccp->vdata->perform->destroy(ccp);
+}
+
static int __init ccp_mod_init(void)
{
#ifdef CONFIG_X86