summaryrefslogtreecommitdiff
path: root/drivers/crypto
diff options
context:
space:
mode:
authorVictoria Milhoan <vicki.milhoan@freescale.com>2014-11-03 15:28:10 -0700
committerNitin Garg <nitin.garg@nxp.com>2016-01-20 14:28:46 -0600
commit1cccc4368ad353b79b62f6c2e3d2f141d76527f6 (patch)
treecc0b4051a3e6ec1bb16c2ee1ad51491bba56d7ed /drivers/crypto
parent8a7d9a5cd4cd80920eed9b3594e5b20202a3d337 (diff)
MLK-9710-5 Unregister Secure Memory platform device upon shutdown
Unregister Secure Memory platform device when the Secure Memory module is shut down. This allows the Secure Memory module to be inserted again successfully. Signed-off-by: Victoria Milhoan <vicki.milhoan@freescale.com> (cherry picked from commit 785456f38234e64618ee9c74ab4258f39f00e73c) Signed-off-by: Dan Douglass <dan.douglass@freescale.com>
Diffstat (limited to 'drivers/crypto')
-rw-r--r--drivers/crypto/caam/sm.h1
-rw-r--r--drivers/crypto/caam/sm_store.c11
2 files changed, 12 insertions, 0 deletions
diff --git a/drivers/crypto/caam/sm.h b/drivers/crypto/caam/sm.h
index 51020de82edb..c8114d126700 100644
--- a/drivers/crypto/caam/sm.h
+++ b/drivers/crypto/caam/sm.h
@@ -93,6 +93,7 @@ struct sm_page_descriptor {
struct caam_drv_private_sm {
struct device *parentdev; /* this ends up as the controller */
struct device *smringdev; /* ring that owns this instance */
+ struct platform_device *sm_pdev; /* Secure Memory platform device */
spinlock_t kslock ____cacheline_aligned;
/* Default parameters for geometry */
diff --git a/drivers/crypto/caam/sm_store.c b/drivers/crypto/caam/sm_store.c
index 5562b74ad558..51c1f2ee93e4 100644
--- a/drivers/crypto/caam/sm_store.c
+++ b/drivers/crypto/caam/sm_store.c
@@ -979,6 +979,9 @@ int caam_sm_startup(struct platform_device *pdev)
kfree(smpriv);
return -EINVAL;
}
+
+ /* Save a pointer to the platform device for Secure Memory */
+ smpriv->sm_pdev = sm_pdev;
smdev = &sm_pdev->dev;
dev_set_drvdata(smdev, smpriv);
ctrlpriv->smdev = smdev;
@@ -1092,8 +1095,16 @@ void caam_sm_shutdown(struct platform_device *pdev)
ctrldev = &pdev->dev;
priv = dev_get_drvdata(ctrldev);
smdev = priv->smdev;
+
+ /* Return if resource not initialized by startup */
+ if (smdev == NULL)
+ return;
+
smpriv = dev_get_drvdata(smdev);
+ /* Remove Secure Memory Platform Device */
+ of_device_unregister(smpriv->sm_pdev);
+
kfree(smpriv->pagedesc);
kfree(smpriv);
}