aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJingoo Han <jg1.han@samsung.com>2014-02-27 00:07:52 -0500
committerHerbert Xu <herbert@gondor.apana.org.au>2014-03-10 08:13:38 -0400
commit93b7f9c92840102da43aafc41dd943926826269e (patch)
tree79a2aec05c22f8d26a00fcded93fa5df1c378278
parent1655c24095da0b13bbd7a80b25948b19f6efdb37 (diff)
hwrng: timeriomem - Use devm_*() functions
Use devm_*() functions to make cleanup paths simpler. Signed-off-by: Jingoo Han <jg1.han@samsung.com> Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
-rw-r--r--drivers/char/hw_random/timeriomem-rng.c40
1 files changed, 10 insertions, 30 deletions
diff --git a/drivers/char/hw_random/timeriomem-rng.c b/drivers/char/hw_random/timeriomem-rng.c
index 73ce739f8e19..439ff8b28c43 100644
--- a/drivers/char/hw_random/timeriomem-rng.c
+++ b/drivers/char/hw_random/timeriomem-rng.c
@@ -118,7 +118,8 @@ static int timeriomem_rng_probe(struct platform_device *pdev)
118 } 118 }
119 119
120 /* Allocate memory for the device structure (and zero it) */ 120 /* Allocate memory for the device structure (and zero it) */
121 priv = kzalloc(sizeof(struct timeriomem_rng_private_data), GFP_KERNEL); 121 priv = devm_kzalloc(&pdev->dev,
122 sizeof(struct timeriomem_rng_private_data), GFP_KERNEL);
122 if (!priv) { 123 if (!priv) {
123 dev_err(&pdev->dev, "failed to allocate device structure.\n"); 124 dev_err(&pdev->dev, "failed to allocate device structure.\n");
124 return -ENOMEM; 125 return -ENOMEM;
@@ -134,17 +135,16 @@ static int timeriomem_rng_probe(struct platform_device *pdev)
134 period = i; 135 period = i;
135 else { 136 else {
136 dev_err(&pdev->dev, "missing period\n"); 137 dev_err(&pdev->dev, "missing period\n");
137 err = -EINVAL; 138 return -EINVAL;
138 goto out_free;
139 } 139 }
140 } else 140 } else {
141 period = pdata->period; 141 period = pdata->period;
142 }
142 143
143 priv->period = usecs_to_jiffies(period); 144 priv->period = usecs_to_jiffies(period);
144 if (priv->period < 1) { 145 if (priv->period < 1) {
145 dev_err(&pdev->dev, "period is less than one jiffy\n"); 146 dev_err(&pdev->dev, "period is less than one jiffy\n");
146 err = -EINVAL; 147 return -EINVAL;
147 goto out_free;
148 } 148 }
149 149
150 priv->expires = jiffies; 150 priv->expires = jiffies;
@@ -160,24 +160,16 @@ static int timeriomem_rng_probe(struct platform_device *pdev)
160 priv->timeriomem_rng_ops.data_read = timeriomem_rng_data_read; 160 priv->timeriomem_rng_ops.data_read = timeriomem_rng_data_read;
161 priv->timeriomem_rng_ops.priv = (unsigned long)priv; 161 priv->timeriomem_rng_ops.priv = (unsigned long)priv;
162 162
163 if (!request_mem_region(res->start, resource_size(res), 163 priv->io_base = devm_ioremap_resource(&pdev->dev, res);
164 dev_name(&pdev->dev))) { 164 if (IS_ERR(priv->io_base)) {
165 dev_err(&pdev->dev, "request_mem_region failed\n"); 165 err = PTR_ERR(priv->io_base);
166 err = -EBUSY;
167 goto out_timer; 166 goto out_timer;
168 } 167 }
169 168
170 priv->io_base = ioremap(res->start, resource_size(res));
171 if (priv->io_base == NULL) {
172 dev_err(&pdev->dev, "ioremap failed\n");
173 err = -EIO;
174 goto out_release_io;
175 }
176
177 err = hwrng_register(&priv->timeriomem_rng_ops); 169 err = hwrng_register(&priv->timeriomem_rng_ops);
178 if (err) { 170 if (err) {
179 dev_err(&pdev->dev, "problem registering\n"); 171 dev_err(&pdev->dev, "problem registering\n");
180 goto out; 172 goto out_timer;
181 } 173 }
182 174
183 dev_info(&pdev->dev, "32bits from 0x%p @ %dus\n", 175 dev_info(&pdev->dev, "32bits from 0x%p @ %dus\n",
@@ -185,30 +177,18 @@ static int timeriomem_rng_probe(struct platform_device *pdev)
185 177
186 return 0; 178 return 0;
187 179
188out:
189 iounmap(priv->io_base);
190out_release_io:
191 release_mem_region(res->start, resource_size(res));
192out_timer: 180out_timer:
193 del_timer_sync(&priv->timer); 181 del_timer_sync(&priv->timer);
194out_free:
195 kfree(priv);
196 return err; 182 return err;
197} 183}
198 184
199static int timeriomem_rng_remove(struct platform_device *pdev) 185static int timeriomem_rng_remove(struct platform_device *pdev)
200{ 186{
201 struct timeriomem_rng_private_data *priv = platform_get_drvdata(pdev); 187 struct timeriomem_rng_private_data *priv = platform_get_drvdata(pdev);
202 struct resource *res;
203
204 res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
205 188
206 hwrng_unregister(&priv->timeriomem_rng_ops); 189 hwrng_unregister(&priv->timeriomem_rng_ops);
207 190
208 del_timer_sync(&priv->timer); 191 del_timer_sync(&priv->timer);
209 iounmap(priv->io_base);
210 release_mem_region(res->start, resource_size(res));
211 kfree(priv);
212 192
213 return 0; 193 return 0;
214} 194}