Skip to content

Commit 6229c16

Browse files
dtorherbertx
authored andcommitted
hwrng: bcm63xx - make use of devm_hwrng_register
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> Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
1 parent 4d9b519 commit 6229c16

File tree

1 file changed

+31
-56
lines changed

1 file changed

+31
-56
lines changed

drivers/char/hw_random/bcm63xx-rng.c

Lines changed: 31 additions & 56 deletions
Original file line numberDiff line numberDiff line change
@@ -24,16 +24,22 @@
2424
#define RNG_MASK 0x10
2525

2626
struct bcm63xx_rng_priv {
27+
struct hwrng rng;
2728
struct clk *clk;
2829
void __iomem *regs;
2930
};
3031

31-
#define to_rng_priv(rng) ((struct bcm63xx_rng_priv *)rng->priv)
32+
#define to_rng_priv(rng) container_of(rng, struct bcm63xx_rng_priv, rng)
3233

3334
static int bcm63xx_rng_init(struct hwrng *rng)
3435
{
3536
struct bcm63xx_rng_priv *priv = to_rng_priv(rng);
3637
u32 val;
38+
int error;
39+
40+
error = clk_prepare_enable(priv->clk);
41+
if (error)
42+
return error;
3743

3844
val = __raw_readl(priv->regs + RNG_CTRL);
3945
val |= RNG_EN;
@@ -50,6 +56,8 @@ static void bcm63xx_rng_cleanup(struct hwrng *rng)
5056
val = __raw_readl(priv->regs + RNG_CTRL);
5157
val &= ~RNG_EN;
5258
__raw_writel(val, priv->regs + RNG_CTRL);
59+
60+
clk_didsable_unprepare(prov->clk);
5361
}
5462

5563
static int bcm63xx_rng_data_present(struct hwrng *rng, int wait)
@@ -79,86 +87,53 @@ static int bcm63xx_rng_probe(struct platform_device *pdev)
7987
r = platform_get_resource(pdev, IORESOURCE_MEM, 0);
8088
if (!r) {
8189
dev_err(&pdev->dev, "no iomem resource\n");
82-
ret = -ENXIO;
83-
goto out;
90+
return -ENXIO;
8491
}
8592

8693
priv = devm_kzalloc(&pdev->dev, sizeof(*priv), GFP_KERNEL);
87-
if (!priv) {
88-
ret = -ENOMEM;
89-
goto out;
90-
}
91-
92-
rng = devm_kzalloc(&pdev->dev, sizeof(*rng), GFP_KERNEL);
93-
if (!rng) {
94-
ret = -ENOMEM;
95-
goto out;
94+
if (!priv)
95+
return -ENOMEM;
96+
97+
priv->rng.name = pdev->name;
98+
priv->rng.init = bcm63xx_rng_init;
99+
priv->rng.cleanup = bcm63xx_rng_cleanup;
100+
prov->rng.data_present = bcm63xx_rng_data_present;
101+
priv->rng.data_read = bcm63xx_rng_data_read;
102+
103+
priv->clk = devm_clk_get(&pdev->dev, "ipsec");
104+
if (IS_ERR(priv->clk)) {
105+
error = PTR_ERR(priv->clk);
106+
dev_err(&pdev->dev, "no clock for device: %d\n", error);
107+
return error;
96108
}
97109

98-
platform_set_drvdata(pdev, rng);
99-
rng->priv = (unsigned long)priv;
100-
rng->name = pdev->name;
101-
rng->init = bcm63xx_rng_init;
102-
rng->cleanup = bcm63xx_rng_cleanup;
103-
rng->data_present = bcm63xx_rng_data_present;
104-
rng->data_read = bcm63xx_rng_data_read;
105-
106-
clk = clk_get(&pdev->dev, "ipsec");
107-
if (IS_ERR(clk)) {
108-
dev_err(&pdev->dev, "no clock for device\n");
109-
ret = PTR_ERR(clk);
110-
goto out;
111-
}
112-
113-
priv->clk = clk;
114-
115110
if (!devm_request_mem_region(&pdev->dev, r->start,
116111
resource_size(r), pdev->name)) {
117112
dev_err(&pdev->dev, "request mem failed");
118-
ret = -ENOMEM;
119-
goto out;
113+
return -EBUSY;
120114
}
121115

122116
priv->regs = devm_ioremap_nocache(&pdev->dev, r->start,
123117
resource_size(r));
124118
if (!priv->regs) {
125119
dev_err(&pdev->dev, "ioremap failed");
126-
ret = -ENOMEM;
127-
goto out;
120+
return -ENOMEM;
128121
}
129122

130-
clk_enable(clk);
131-
132-
ret = hwrng_register(rng);
133-
if (ret) {
134-
dev_err(&pdev->dev, "failed to register rng device\n");
135-
goto out_clk_disable;
123+
error = devm_hwrng_register(&pdev->dev, &priv->rng);
124+
if (error) {
125+
dev_err(&pdev->dev, "failed to register rng device: %d\n",
126+
error);
127+
return error;
136128
}
137129

138130
dev_info(&pdev->dev, "registered RNG driver\n");
139131

140-
return 0;
141-
142-
out_clk_disable:
143-
clk_disable(clk);
144-
out:
145-
return ret;
146-
}
147-
148-
static int bcm63xx_rng_remove(struct platform_device *pdev)
149-
{
150-
struct hwrng *rng = platform_get_drvdata(pdev);
151-
struct bcm63xx_rng_priv *priv = to_rng_priv(rng);
152-
153-
hwrng_unregister(rng);
154-
clk_disable(priv->clk);
155-
156132
return 0;
157133
}
158134

159135
static struct platform_driver bcm63xx_rng_driver = {
160136
.probe = bcm63xx_rng_probe,
161-
.remove = bcm63xx_rng_remove,
162137
.driver = {
163138
.name = "bcm63xx-rng",
164139
},

0 commit comments

Comments
 (0)