LKML Archive on lore.kernel.org
help / color / mirror / Atom feed
* [PATCH 0/6] Introduce devm_hwrng_register and convert a few dirvers
@ 2015-03-12 21:00 Dmitry Torokhov
  2015-03-12 21:00 ` [PATCH 1/6] hwrng: add devm_* interfaces Dmitry Torokhov
                   ` (6 more replies)
  0 siblings, 7 replies; 8+ messages in thread
From: Dmitry Torokhov @ 2015-03-12 21:00 UTC (permalink / raw)
  To: Herbert Xu; +Cc: linux-crypto, linux-kernel

A few drivers can benefit from devm-style interface for hwrng since it
is quite often the last thing that isn't automatically managed. Using
devm_hwrng_register() in such drivers allows get rid of manual error
unwinding and drivers' remove() methods.

I tested changes to iproc-rng200, the rest are compiled only.

Thanks.

-- 
Dmitry


^ permalink raw reply	[flat|nested] 8+ messages in thread

* [PATCH 1/6] hwrng: add devm_* interfaces
  2015-03-12 21:00 [PATCH 0/6] Introduce devm_hwrng_register and convert a few dirvers Dmitry Torokhov
@ 2015-03-12 21:00 ` Dmitry Torokhov
  2015-03-12 21:00 ` [PATCH 2/6] hwrng: bcm63xx - make use of devm_hwrng_register Dmitry Torokhov
                   ` (5 subsequent siblings)
  6 siblings, 0 replies; 8+ messages in thread
From: Dmitry Torokhov @ 2015-03-12 21:00 UTC (permalink / raw)
  To: Herbert Xu; +Cc: linux-crypto, linux-kernel

This change adds devm_hwrng_register and devm_hwrng_unregister which
use can simplify error unwinding and unbinding code paths in device
drivers.

Signed-off-by: Dmitry Torokhov <dmitry.torokhov@gmail.com>
---
 drivers/char/hw_random/core.c | 42 ++++++++++++++++++++++++++++++++++++++++++
 include/linux/hw_random.h     |  4 ++++
 2 files changed, 46 insertions(+)

diff --git a/drivers/char/hw_random/core.c b/drivers/char/hw_random/core.c
index 32a8a86..83161dd 100644
--- a/drivers/char/hw_random/core.c
+++ b/drivers/char/hw_random/core.c
@@ -536,6 +536,48 @@ void hwrng_unregister(struct hwrng *rng)
 }
 EXPORT_SYMBOL_GPL(hwrng_unregister);
 
+static void devm_hwrng_release(struct device *dev, void *res)
+{
+	hwrng_unregister(*(struct hwrng **)res);
+}
+
+static int devm_hwrng_match(struct device *dev, void *res, void *data)
+{
+	struct hwrng **r = res;
+
+	if (WARN_ON(!r || !*r))
+		return 0;
+
+	return *r == data;
+}
+
+int devm_hwrng_register(struct device *dev, struct hwrng *rng)
+{
+	struct hwrng **ptr;
+	int error;
+
+	ptr = devres_alloc(devm_hwrng_release, sizeof(*ptr), GFP_KERNEL);
+	if (!ptr)
+		return -ENOMEM;
+
+	error = hwrng_register(rng);
+	if (error) {
+		devres_free(ptr);
+		return error;
+	}
+
+	*ptr = rng;
+	devres_add(dev, ptr);
+	return 0;
+}
+EXPORT_SYMBOL_GPL(devm_hwrng_register);
+
+void devm_hwrng_unregister(struct device *dev, struct hwrng *rng)
+{
+	devres_release(dev, devm_hwrng_release, devm_hwrng_match, rng);
+}
+EXPORT_SYMBOL_GPL(devm_hwrng_unregister);
+
 static int __init hwrng_modinit(void)
 {
 	return register_miscdev();
diff --git a/include/linux/hw_random.h b/include/linux/hw_random.h
index eb7b414..4f7d8f4 100644
--- a/include/linux/hw_random.h
+++ b/include/linux/hw_random.h
@@ -50,10 +50,14 @@ struct hwrng {
 	struct completion cleanup_done;
 };
 
+struct device;
+
 /** Register a new Hardware Random Number Generator driver. */
 extern int hwrng_register(struct hwrng *rng);
+extern int devm_hwrng_register(struct device *dev, struct hwrng *rng);
 /** Unregister a Hardware Random Number Generator driver. */
 extern void hwrng_unregister(struct hwrng *rng);
+extern void devm_hwrng_unregister(struct device *dve, struct hwrng *rng);
 /** Feed random bits into the pool. */
 extern void add_hwgenerator_randomness(const char *buffer, size_t count, size_t entropy);
 
-- 
2.2.0.rc0.207.ga3a616c


^ permalink raw reply	[flat|nested] 8+ messages in thread

* [PATCH 2/6] hwrng: bcm63xx - make use of devm_hwrng_register
  2015-03-12 21:00 [PATCH 0/6] Introduce devm_hwrng_register and convert a few dirvers Dmitry Torokhov
  2015-03-12 21:00 ` [PATCH 1/6] hwrng: add devm_* interfaces Dmitry Torokhov
@ 2015-03-12 21:00 ` Dmitry Torokhov
  2015-03-12 21:00 ` [PATCH 3/6] hwrng: exynos " Dmitry Torokhov
                   ` (4 subsequent siblings)
  6 siblings, 0 replies; 8+ messages in thread
From: Dmitry Torokhov @ 2015-03-12 21:00 UTC (permalink / raw)
  To: Herbert Xu; +Cc: linux-crypto, linux-kernel

This change converts bcm63xx-rng to use devm* API for managing all
resources, which allows us to dispense with the rest of error handling
path and remove() function. Also we combine hwern and driver-private
data into a single allocation, use clk_prepare_enable() instead
of "naked" clk_enable() and move clock enabling/disabling into hwrnd
inti(0 and cleanup() methods so the clock stays off until rng is
used.

Signed-off-by: Dmitry Torokhov <dmitry.torokhov@gmail.com>
---
 drivers/char/hw_random/bcm63xx-rng.c | 87 +++++++++++++-----------------------
 1 file changed, 31 insertions(+), 56 deletions(-)

diff --git a/drivers/char/hw_random/bcm63xx-rng.c b/drivers/char/hw_random/bcm63xx-rng.c
index 27da00f..d1494ec 100644
--- a/drivers/char/hw_random/bcm63xx-rng.c
+++ b/drivers/char/hw_random/bcm63xx-rng.c
@@ -24,16 +24,22 @@
 #define RNG_MASK			0x10
 
 struct bcm63xx_rng_priv {
+	struct hwrng rng;
 	struct clk *clk;
 	void __iomem *regs;
 };
 
-#define to_rng_priv(rng)	((struct bcm63xx_rng_priv *)rng->priv)
+#define to_rng_priv(rng)	container_of(rng, struct bcm63xx_rng_priv, rng)
 
 static int bcm63xx_rng_init(struct hwrng *rng)
 {
 	struct bcm63xx_rng_priv *priv = to_rng_priv(rng);
 	u32 val;
+	int error;
+
+	error = clk_prepare_enable(priv->clk);
+	if (error)
+		return error;
 
 	val = __raw_readl(priv->regs + RNG_CTRL);
 	val |= RNG_EN;
@@ -50,6 +56,8 @@ static void bcm63xx_rng_cleanup(struct hwrng *rng)
 	val = __raw_readl(priv->regs + RNG_CTRL);
 	val &= ~RNG_EN;
 	__raw_writel(val, priv->regs + RNG_CTRL);
+
+	clk_didsable_unprepare(prov->clk);
 }
 
 static int bcm63xx_rng_data_present(struct hwrng *rng, int wait)
@@ -79,86 +87,53 @@ static int bcm63xx_rng_probe(struct platform_device *pdev)
 	r = platform_get_resource(pdev, IORESOURCE_MEM, 0);
 	if (!r) {
 		dev_err(&pdev->dev, "no iomem resource\n");
-		ret = -ENXIO;
-		goto out;
+		return -ENXIO;
 	}
 
 	priv = devm_kzalloc(&pdev->dev, sizeof(*priv), GFP_KERNEL);
-	if (!priv) {
-		ret = -ENOMEM;
-		goto out;
-	}
-
-	rng = devm_kzalloc(&pdev->dev, sizeof(*rng), GFP_KERNEL);
-	if (!rng) {
-		ret = -ENOMEM;
-		goto out;
+	if (!priv)
+		return -ENOMEM;
+
+	priv->rng.name = pdev->name;
+	priv->rng.init = bcm63xx_rng_init;
+	priv->rng.cleanup = bcm63xx_rng_cleanup;
+	prov->rng.data_present = bcm63xx_rng_data_present;
+	priv->rng.data_read = bcm63xx_rng_data_read;
+
+	priv->clk = devm_clk_get(&pdev->dev, "ipsec");
+	if (IS_ERR(priv->clk)) {
+		error = PTR_ERR(priv->clk);
+		dev_err(&pdev->dev, "no clock for device: %d\n", error);
+		return error;
 	}
 
-	platform_set_drvdata(pdev, rng);
-	rng->priv = (unsigned long)priv;
-	rng->name = pdev->name;
-	rng->init = bcm63xx_rng_init;
-	rng->cleanup = bcm63xx_rng_cleanup;
-	rng->data_present = bcm63xx_rng_data_present;
-	rng->data_read = bcm63xx_rng_data_read;
-
-	clk = clk_get(&pdev->dev, "ipsec");
-	if (IS_ERR(clk)) {
-		dev_err(&pdev->dev, "no clock for device\n");
-		ret = PTR_ERR(clk);
-		goto out;
-	}
-
-	priv->clk = clk;
-
 	if (!devm_request_mem_region(&pdev->dev, r->start,
 					resource_size(r), pdev->name)) {
 		dev_err(&pdev->dev, "request mem failed");
-		ret = -ENOMEM;
-		goto out;
+		return -EBUSY;
 	}
 
 	priv->regs = devm_ioremap_nocache(&pdev->dev, r->start,
 					resource_size(r));
 	if (!priv->regs) {
 		dev_err(&pdev->dev, "ioremap failed");
-		ret = -ENOMEM;
-		goto out;
+		return -ENOMEM;
 	}
 
-	clk_enable(clk);
-
-	ret = hwrng_register(rng);
-	if (ret) {
-		dev_err(&pdev->dev, "failed to register rng device\n");
-		goto out_clk_disable;
+	error = devm_hwrng_register(&pdev->dev, &priv->rng);
+	if (error) {
+		dev_err(&pdev->dev, "failed to register rng device: %d\n",
+			error);
+		return error;
 	}
 
 	dev_info(&pdev->dev, "registered RNG driver\n");
 
 	return 0;
-
-out_clk_disable:
-	clk_disable(clk);
-out:
-	return ret;
-}
-
-static int bcm63xx_rng_remove(struct platform_device *pdev)
-{
-	struct hwrng *rng = platform_get_drvdata(pdev);
-	struct bcm63xx_rng_priv *priv = to_rng_priv(rng);
-
-	hwrng_unregister(rng);
-	clk_disable(priv->clk);
-
-	return 0;
 }
 
 static struct platform_driver bcm63xx_rng_driver = {
 	.probe		= bcm63xx_rng_probe,
-	.remove		= bcm63xx_rng_remove,
 	.driver		= {
 		.name	= "bcm63xx-rng",
 	},
-- 
2.2.0.rc0.207.ga3a616c


^ permalink raw reply	[flat|nested] 8+ messages in thread

* [PATCH 3/6] hwrng: exynos - make use of devm_hwrng_register
  2015-03-12 21:00 [PATCH 0/6] Introduce devm_hwrng_register and convert a few dirvers Dmitry Torokhov
  2015-03-12 21:00 ` [PATCH 1/6] hwrng: add devm_* interfaces Dmitry Torokhov
  2015-03-12 21:00 ` [PATCH 2/6] hwrng: bcm63xx - make use of devm_hwrng_register Dmitry Torokhov
@ 2015-03-12 21:00 ` Dmitry Torokhov
  2015-03-12 21:00 ` [PATCH 4/6] hwrng: msm " Dmitry Torokhov
                   ` (3 subsequent siblings)
  6 siblings, 0 replies; 8+ messages in thread
From: Dmitry Torokhov @ 2015-03-12 21:00 UTC (permalink / raw)
  To: Herbert Xu; +Cc: linux-crypto, linux-kernel

This allows us to get rid of remove() method.

Signed-off-by: Dmitry Torokhov <dmitry.torokhov@gmail.com>
---
 drivers/char/hw_random/exynos-rng.c | 12 +-----------
 1 file changed, 1 insertion(+), 11 deletions(-)

diff --git a/drivers/char/hw_random/exynos-rng.c b/drivers/char/hw_random/exynos-rng.c
index fed0830..dc4701f 100644
--- a/drivers/char/hw_random/exynos-rng.c
+++ b/drivers/char/hw_random/exynos-rng.c
@@ -131,16 +131,7 @@ static int exynos_rng_probe(struct platform_device *pdev)
 	pm_runtime_use_autosuspend(&pdev->dev);
 	pm_runtime_enable(&pdev->dev);
 
-	return hwrng_register(&exynos_rng->rng);
-}
-
-static int exynos_rng_remove(struct platform_device *pdev)
-{
-	struct exynos_rng *exynos_rng = platform_get_drvdata(pdev);
-
-	hwrng_unregister(&exynos_rng->rng);
-
-	return 0;
+	return devm_hwrng_register(&pdev->dev, &exynos_rng->rng);
 }
 
 #ifdef CONFIG_PM
@@ -172,7 +163,6 @@ static struct platform_driver exynos_rng_driver = {
 		.pm	= &exynos_rng_pm_ops,
 	},
 	.probe		= exynos_rng_probe,
-	.remove		= exynos_rng_remove,
 };
 
 module_platform_driver(exynos_rng_driver);
-- 
2.2.0.rc0.207.ga3a616c


^ permalink raw reply	[flat|nested] 8+ messages in thread

* [PATCH 4/6] hwrng: msm - make use of devm_hwrng_register
  2015-03-12 21:00 [PATCH 0/6] Introduce devm_hwrng_register and convert a few dirvers Dmitry Torokhov
                   ` (2 preceding siblings ...)
  2015-03-12 21:00 ` [PATCH 3/6] hwrng: exynos " Dmitry Torokhov
@ 2015-03-12 21:00 ` Dmitry Torokhov
  2015-03-12 21:00 ` [PATCH 5/6] hwrng: iproc-rng200 - do not use static structure Dmitry Torokhov
                   ` (2 subsequent siblings)
  6 siblings, 0 replies; 8+ messages in thread
From: Dmitry Torokhov @ 2015-03-12 21:00 UTC (permalink / raw)
  To: Herbert Xu; +Cc: linux-crypto, linux-kernel

This allows us to get rid of remove() method.

Signed-off-by: Dmitry Torokhov <dmitry.torokhov@gmail.com>
---
 drivers/char/hw_random/msm-rng.c | 11 +----------
 1 file changed, 1 insertion(+), 10 deletions(-)

diff --git a/drivers/char/hw_random/msm-rng.c b/drivers/char/hw_random/msm-rng.c
index cea1c70..96fb986 100644
--- a/drivers/char/hw_random/msm-rng.c
+++ b/drivers/char/hw_random/msm-rng.c
@@ -157,7 +157,7 @@ static int msm_rng_probe(struct platform_device *pdev)
 	rng->hwrng.cleanup = msm_rng_cleanup,
 	rng->hwrng.read = msm_rng_read,
 
-	ret = hwrng_register(&rng->hwrng);
+	ret = devm_hwrng_register(&pdev->dev, &rng->hwrng);
 	if (ret) {
 		dev_err(&pdev->dev, "failed to register hwrng\n");
 		return ret;
@@ -166,14 +166,6 @@ static int msm_rng_probe(struct platform_device *pdev)
 	return 0;
 }
 
-static int msm_rng_remove(struct platform_device *pdev)
-{
-	struct msm_rng *rng = platform_get_drvdata(pdev);
-
-	hwrng_unregister(&rng->hwrng);
-	return 0;
-}
-
 static const struct of_device_id msm_rng_of_match[] = {
 	{ .compatible = "qcom,prng", },
 	{}
@@ -182,7 +174,6 @@ MODULE_DEVICE_TABLE(of, msm_rng_of_match);
 
 static struct platform_driver msm_rng_driver = {
 	.probe = msm_rng_probe,
-	.remove = msm_rng_remove,
 	.driver = {
 		.name = KBUILD_MODNAME,
 		.of_match_table = of_match_ptr(msm_rng_of_match),
-- 
2.2.0.rc0.207.ga3a616c


^ permalink raw reply	[flat|nested] 8+ messages in thread

* [PATCH 5/6] hwrng: iproc-rng200 - do not use static structure
  2015-03-12 21:00 [PATCH 0/6] Introduce devm_hwrng_register and convert a few dirvers Dmitry Torokhov
                   ` (3 preceding siblings ...)
  2015-03-12 21:00 ` [PATCH 4/6] hwrng: msm " Dmitry Torokhov
@ 2015-03-12 21:00 ` Dmitry Torokhov
  2015-03-12 21:00 ` [PATCH 6/6] hwrng: iproc-rng200 - make use of devm_hwrng_register Dmitry Torokhov
  2015-03-16 10:49 ` [PATCH 0/6] Introduce devm_hwrng_register and convert a few dirvers Herbert Xu
  6 siblings, 0 replies; 8+ messages in thread
From: Dmitry Torokhov @ 2015-03-12 21:00 UTC (permalink / raw)
  To: Herbert Xu; +Cc: linux-crypto, linux-kernel

Instead of using static hwrng structure that is reused between
binds/unbinds of the device let's embed it into driver's private
structure that we allocate. This way we are guaranteed not to stumble
onto something left from previous bind attempt.

Signed-off-by: Dmitry Torokhov <dmitry.torokhov@gmail.com>
---
 drivers/char/hw_random/iproc-rng200.c | 44 +++++++++++++++++------------------
 1 file changed, 21 insertions(+), 23 deletions(-)

diff --git a/drivers/char/hw_random/iproc-rng200.c b/drivers/char/hw_random/iproc-rng200.c
index 276cb8a..2dbaf5c 100644
--- a/drivers/char/hw_random/iproc-rng200.c
+++ b/drivers/char/hw_random/iproc-rng200.c
@@ -48,9 +48,12 @@
 #define RNG_FIFO_COUNT_RNG_FIFO_COUNT_MASK		0x000000FF
 
 struct iproc_rng200_dev {
-	void __iomem			*base;
+	struct hwrng rng;
+	void __iomem *base;
 };
 
+#define to_rng_priv(rng)	container_of(rng, struct iproc_rng200_dev, rng)
+
 static void iproc_rng200_restart(void __iomem *rng_base)
 {
 	uint32_t val;
@@ -89,11 +92,11 @@ static void iproc_rng200_restart(void __iomem *rng_base)
 }
 
 static int iproc_rng200_read(struct hwrng *rng, void *buf, size_t max,
-			       bool wait)
+			     bool wait)
 {
-	uint32_t status;
+	struct iproc_rng200_dev *priv = to_rng_priv(rng);
 	uint32_t num_remaining = max;
-	struct iproc_rng200_dev *priv = (struct iproc_rng200_dev *)rng->priv;
+	uint32_t status;
 
 	#define MAX_RESETS_PER_READ	1
 	uint32_t num_resets = 0;
@@ -151,10 +154,8 @@ static int iproc_rng200_read(struct hwrng *rng, void *buf, size_t max,
 
 static int iproc_rng200_init(struct hwrng *rng)
 {
+	struct iproc_rng200_dev *priv = to_rng_priv(rng);
 	uint32_t val;
-	struct iproc_rng200_dev *priv;
-
-	priv = (struct iproc_rng200_dev *)rng->priv;
 
 	/* Setup RNG. */
 	val = ioread32(priv->base + RNG_CTRL_OFFSET);
@@ -167,10 +168,8 @@ static int iproc_rng200_init(struct hwrng *rng)
 
 static void iproc_rng200_cleanup(struct hwrng *rng)
 {
+	struct iproc_rng200_dev *priv = to_rng_priv(rng);
 	uint32_t val;
-	struct iproc_rng200_dev *priv;
-
-	priv = (struct iproc_rng200_dev *)rng->priv;
 
 	/* Disable RNG hardware */
 	val = ioread32(priv->base + RNG_CTRL_OFFSET);
@@ -179,13 +178,6 @@ static void iproc_rng200_cleanup(struct hwrng *rng)
 	iowrite32(val, priv->base + RNG_CTRL_OFFSET);
 }
 
-static struct hwrng iproc_rng200_ops = {
-	.name		= "iproc-rng200",
-	.read		= iproc_rng200_read,
-	.init		= iproc_rng200_init,
-	.cleanup	= iproc_rng200_cleanup,
-};
-
 static int iproc_rng200_probe(struct platform_device *pdev)
 {
 	struct iproc_rng200_dev *priv;
@@ -193,13 +185,10 @@ static int iproc_rng200_probe(struct platform_device *pdev)
 	struct device *dev = &pdev->dev;
 	int ret;
 
-	priv = devm_kzalloc(dev, sizeof(struct iproc_rng200_dev), GFP_KERNEL);
+	priv = devm_kzalloc(dev, sizeof(*priv), GFP_KERNEL);
 	if (!priv)
 		return -ENOMEM;
 
-	iproc_rng200_ops.priv = (unsigned long)priv;
-	platform_set_drvdata(pdev, priv);
-
 	/* Map peripheral */
 	res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
 	if (!res) {
@@ -213,13 +202,20 @@ static int iproc_rng200_probe(struct platform_device *pdev)
 		return PTR_ERR(priv->base);
 	}
 
+	priv->rng.name = "iproc-rng200",
+	priv->rng.read = iproc_rng200_read,
+	priv->rng.init = iproc_rng200_init,
+	priv->rng.cleanup = iproc_rng200_cleanup,
+
 	/* Register driver */
-	ret = hwrng_register(&iproc_rng200_ops);
+	ret = hwrng_register(&priv->rng);
 	if (ret) {
 		dev_err(dev, "hwrng registration failed\n");
 		return ret;
 	}
 
+	platform_set_drvdata(pdev, priv);
+
 	dev_info(dev, "hwrng registered\n");
 
 	return 0;
@@ -227,8 +223,10 @@ static int iproc_rng200_probe(struct platform_device *pdev)
 
 static int iproc_rng200_remove(struct platform_device *pdev)
 {
+	struct iproc_rng200_dev *priv = platform_get_drvdata(pdev);
+
 	/* Unregister driver */
-	hwrng_unregister(&iproc_rng200_ops);
+	hwrng_unregister(&priv->rng);
 
 	return 0;
 }
-- 
2.2.0.rc0.207.ga3a616c


^ permalink raw reply	[flat|nested] 8+ messages in thread

* [PATCH 6/6] hwrng: iproc-rng200 - make use of devm_hwrng_register
  2015-03-12 21:00 [PATCH 0/6] Introduce devm_hwrng_register and convert a few dirvers Dmitry Torokhov
                   ` (4 preceding siblings ...)
  2015-03-12 21:00 ` [PATCH 5/6] hwrng: iproc-rng200 - do not use static structure Dmitry Torokhov
@ 2015-03-12 21:00 ` Dmitry Torokhov
  2015-03-16 10:49 ` [PATCH 0/6] Introduce devm_hwrng_register and convert a few dirvers Herbert Xu
  6 siblings, 0 replies; 8+ messages in thread
From: Dmitry Torokhov @ 2015-03-12 21:00 UTC (permalink / raw)
  To: Herbert Xu; +Cc: linux-crypto, linux-kernel

This allows us to get rid of driver's remove() method.

Signed-off-by: Dmitry Torokhov <dmitry.torokhov@gmail.com>
---
 drivers/char/hw_random/iproc-rng200.c | 15 +--------------
 1 file changed, 1 insertion(+), 14 deletions(-)

diff --git a/drivers/char/hw_random/iproc-rng200.c b/drivers/char/hw_random/iproc-rng200.c
index 2dbaf5c..3eaf7cb 100644
--- a/drivers/char/hw_random/iproc-rng200.c
+++ b/drivers/char/hw_random/iproc-rng200.c
@@ -208,29 +208,17 @@ static int iproc_rng200_probe(struct platform_device *pdev)
 	priv->rng.cleanup = iproc_rng200_cleanup,
 
 	/* Register driver */
-	ret = hwrng_register(&priv->rng);
+	ret = devm_hwrng_register(dev, &priv->rng);
 	if (ret) {
 		dev_err(dev, "hwrng registration failed\n");
 		return ret;
 	}
 
-	platform_set_drvdata(pdev, priv);
-
 	dev_info(dev, "hwrng registered\n");
 
 	return 0;
 }
 
-static int iproc_rng200_remove(struct platform_device *pdev)
-{
-	struct iproc_rng200_dev *priv = platform_get_drvdata(pdev);
-
-	/* Unregister driver */
-	hwrng_unregister(&priv->rng);
-
-	return 0;
-}
-
 static const struct of_device_id iproc_rng200_of_match[] = {
 	{ .compatible = "brcm,iproc-rng200", },
 	{},
@@ -243,7 +231,6 @@ static struct platform_driver iproc_rng200_driver = {
 		.of_match_table = iproc_rng200_of_match,
 	},
 	.probe		= iproc_rng200_probe,
-	.remove		= iproc_rng200_remove,
 };
 module_platform_driver(iproc_rng200_driver);
 
-- 
2.2.0.rc0.207.ga3a616c


^ permalink raw reply	[flat|nested] 8+ messages in thread

* Re: [PATCH 0/6] Introduce devm_hwrng_register and convert a few dirvers
  2015-03-12 21:00 [PATCH 0/6] Introduce devm_hwrng_register and convert a few dirvers Dmitry Torokhov
                   ` (5 preceding siblings ...)
  2015-03-12 21:00 ` [PATCH 6/6] hwrng: iproc-rng200 - make use of devm_hwrng_register Dmitry Torokhov
@ 2015-03-16 10:49 ` Herbert Xu
  6 siblings, 0 replies; 8+ messages in thread
From: Herbert Xu @ 2015-03-16 10:49 UTC (permalink / raw)
  To: Dmitry Torokhov; +Cc: linux-crypto, linux-kernel

On Thu, Mar 12, 2015 at 02:00:01PM -0700, Dmitry Torokhov wrote:
> A few drivers can benefit from devm-style interface for hwrng since it
> is quite often the last thing that isn't automatically managed. Using
> devm_hwrng_register() in such drivers allows get rid of manual error
> unwinding and drivers' remove() methods.
> 
> I tested changes to iproc-rng200, the rest are compiled only.

All applied.  Thanks!
-- 
Email: Herbert Xu <herbert@gondor.apana.org.au>
Home Page: http://gondor.apana.org.au/~herbert/
PGP Key: http://gondor.apana.org.au/~herbert/pubkey.txt

^ permalink raw reply	[flat|nested] 8+ messages in thread

end of thread, other threads:[~2015-03-16 10:49 UTC | newest]

Thread overview: 8+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2015-03-12 21:00 [PATCH 0/6] Introduce devm_hwrng_register and convert a few dirvers Dmitry Torokhov
2015-03-12 21:00 ` [PATCH 1/6] hwrng: add devm_* interfaces Dmitry Torokhov
2015-03-12 21:00 ` [PATCH 2/6] hwrng: bcm63xx - make use of devm_hwrng_register Dmitry Torokhov
2015-03-12 21:00 ` [PATCH 3/6] hwrng: exynos " Dmitry Torokhov
2015-03-12 21:00 ` [PATCH 4/6] hwrng: msm " Dmitry Torokhov
2015-03-12 21:00 ` [PATCH 5/6] hwrng: iproc-rng200 - do not use static structure Dmitry Torokhov
2015-03-12 21:00 ` [PATCH 6/6] hwrng: iproc-rng200 - make use of devm_hwrng_register Dmitry Torokhov
2015-03-16 10:49 ` [PATCH 0/6] Introduce devm_hwrng_register and convert a few dirvers Herbert Xu

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).