diff options
author | Gary R Hook <gary.hook@amd.com> | 2016-07-26 20:10:31 -0400 |
---|---|---|
committer | Herbert Xu <herbert@gondor.apana.org.au> | 2016-08-09 06:47:17 -0400 |
commit | 084935b208f6507ef5214fd67052a67a700bc6cf (patch) | |
tree | 5b617289cb4807fd950c9028f8c18a26f2949f3c | |
parent | 4b394a232df78414442778b02ca4a388d947d059 (diff) |
crypto: ccp - Add support for the RNG in a version 5 CCP
Signed-off-by: Gary R Hook <gary.hook@amd.com>
Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
-rw-r--r-- | drivers/crypto/ccp/ccp-dev-v3.c | 13 | ||||
-rw-r--r-- | drivers/crypto/ccp/ccp-dev-v5.c | 7 | ||||
-rw-r--r-- | drivers/crypto/ccp/ccp-dev.c | 23 | ||||
-rw-r--r-- | drivers/crypto/ccp/ccp-dev.h | 2 |
4 files changed, 36 insertions, 9 deletions
diff --git a/drivers/crypto/ccp/ccp-dev-v3.c b/drivers/crypto/ccp/ccp-dev-v3.c index ff2d2a4de16a..578522d8f22e 100644 --- a/drivers/crypto/ccp/ccp-dev-v3.c +++ b/drivers/crypto/ccp/ccp-dev-v3.c | |||
@@ -432,14 +432,9 @@ static int ccp_init(struct ccp_device *ccp) | |||
432 | dev_dbg(dev, "Registering device...\n"); | 432 | dev_dbg(dev, "Registering device...\n"); |
433 | ccp_add_device(ccp); | 433 | ccp_add_device(ccp); |
434 | 434 | ||
435 | /* Register the RNG */ | 435 | ret = ccp_register_rng(ccp); |
436 | ccp->hwrng.name = ccp->rngname; | 436 | if (ret) |
437 | ccp->hwrng.read = ccp_trng_read; | ||
438 | ret = hwrng_register(&ccp->hwrng); | ||
439 | if (ret) { | ||
440 | dev_err(dev, "error registering hwrng (%d)\n", ret); | ||
441 | goto e_kthread; | 437 | goto e_kthread; |
442 | } | ||
443 | 438 | ||
444 | /* Register the DMA engine support */ | 439 | /* Register the DMA engine support */ |
445 | ret = ccp_dmaengine_register(ccp); | 440 | ret = ccp_dmaengine_register(ccp); |
@@ -449,7 +444,7 @@ static int ccp_init(struct ccp_device *ccp) | |||
449 | return 0; | 444 | return 0; |
450 | 445 | ||
451 | e_hwrng: | 446 | e_hwrng: |
452 | hwrng_unregister(&ccp->hwrng); | 447 | ccp_unregister_rng(ccp); |
453 | 448 | ||
454 | e_kthread: | 449 | e_kthread: |
455 | for (i = 0; i < ccp->cmd_q_count; i++) | 450 | for (i = 0; i < ccp->cmd_q_count; i++) |
@@ -475,7 +470,7 @@ static void ccp_destroy(struct ccp_device *ccp) | |||
475 | ccp_dmaengine_unregister(ccp); | 470 | ccp_dmaengine_unregister(ccp); |
476 | 471 | ||
477 | /* Unregister the RNG */ | 472 | /* Unregister the RNG */ |
478 | hwrng_unregister(&ccp->hwrng); | 473 | ccp_unregister_rng(ccp); |
479 | 474 | ||
480 | /* Remove this device from the list of available units */ | 475 | /* Remove this device from the list of available units */ |
481 | ccp_del_device(ccp); | 476 | ccp_del_device(ccp); |
diff --git a/drivers/crypto/ccp/ccp-dev-v5.c b/drivers/crypto/ccp/ccp-dev-v5.c index 16dad9633754..ddce2205e5fa 100644 --- a/drivers/crypto/ccp/ccp-dev-v5.c +++ b/drivers/crypto/ccp/ccp-dev-v5.c | |||
@@ -828,6 +828,10 @@ static int ccp5_init(struct ccp_device *ccp) | |||
828 | /* Put this on the unit list to make it available */ | 828 | /* Put this on the unit list to make it available */ |
829 | ccp_add_device(ccp); | 829 | ccp_add_device(ccp); |
830 | 830 | ||
831 | ret = ccp_register_rng(ccp); | ||
832 | if (ret) | ||
833 | goto e_kthread; | ||
834 | |||
831 | return 0; | 835 | return 0; |
832 | 836 | ||
833 | e_kthread: | 837 | e_kthread: |
@@ -852,6 +856,9 @@ static void ccp5_destroy(struct ccp_device *ccp) | |||
852 | struct ccp_cmd *cmd; | 856 | struct ccp_cmd *cmd; |
853 | unsigned int i; | 857 | unsigned int i; |
854 | 858 | ||
859 | /* Unregister the RNG */ | ||
860 | ccp_unregister_rng(ccp); | ||
861 | |||
855 | /* Remove this device from the list of available units first */ | 862 | /* Remove this device from the list of available units first */ |
856 | ccp_del_device(ccp); | 863 | ccp_del_device(ccp); |
857 | 864 | ||
diff --git a/drivers/crypto/ccp/ccp-dev.c b/drivers/crypto/ccp/ccp-dev.c index 6b44730ef9d6..38a98d879f82 100644 --- a/drivers/crypto/ccp/ccp-dev.c +++ b/drivers/crypto/ccp/ccp-dev.c | |||
@@ -119,6 +119,29 @@ void ccp_del_device(struct ccp_device *ccp) | |||
119 | write_unlock_irqrestore(&ccp_unit_lock, flags); | 119 | write_unlock_irqrestore(&ccp_unit_lock, flags); |
120 | } | 120 | } |
121 | 121 | ||
122 | |||
123 | |||
124 | int ccp_register_rng(struct ccp_device *ccp) | ||
125 | { | ||
126 | int ret = 0; | ||
127 | |||
128 | dev_dbg(ccp->dev, "Registering RNG...\n"); | ||
129 | /* Register an RNG */ | ||
130 | ccp->hwrng.name = ccp->rngname; | ||
131 | ccp->hwrng.read = ccp_trng_read; | ||
132 | ret = hwrng_register(&ccp->hwrng); | ||
133 | if (ret) | ||
134 | dev_err(ccp->dev, "error registering hwrng (%d)\n", ret); | ||
135 | |||
136 | return ret; | ||
137 | } | ||
138 | |||
139 | void ccp_unregister_rng(struct ccp_device *ccp) | ||
140 | { | ||
141 | if (ccp->hwrng.name) | ||
142 | hwrng_unregister(&ccp->hwrng); | ||
143 | } | ||
144 | |||
122 | static struct ccp_device *ccp_get_device(void) | 145 | static struct ccp_device *ccp_get_device(void) |
123 | { | 146 | { |
124 | unsigned long flags; | 147 | unsigned long flags; |
diff --git a/drivers/crypto/ccp/ccp-dev.h b/drivers/crypto/ccp/ccp-dev.h index 5ff4a73e3bd4..d04bd61ed845 100644 --- a/drivers/crypto/ccp/ccp-dev.h +++ b/drivers/crypto/ccp/ccp-dev.h | |||
@@ -601,6 +601,8 @@ int ccp_trng_read(struct hwrng *rng, void *data, size_t max, bool wait); | |||
601 | 601 | ||
602 | int ccp_run_cmd(struct ccp_cmd_queue *cmd_q, struct ccp_cmd *cmd); | 602 | int ccp_run_cmd(struct ccp_cmd_queue *cmd_q, struct ccp_cmd *cmd); |
603 | 603 | ||
604 | int ccp_register_rng(struct ccp_device *ccp); | ||
605 | void ccp_unregister_rng(struct ccp_device *ccp); | ||
604 | int ccp_dmaengine_register(struct ccp_device *ccp); | 606 | int ccp_dmaengine_register(struct ccp_device *ccp); |
605 | void ccp_dmaengine_unregister(struct ccp_device *ccp); | 607 | void ccp_dmaengine_unregister(struct ccp_device *ccp); |
606 | 608 | ||