diff options
author | Jingoo Han <jg1.han@samsung.com> | 2014-02-27 00:07:52 -0500 |
---|---|---|
committer | Herbert Xu <herbert@gondor.apana.org.au> | 2014-03-10 08:13:38 -0400 |
commit | 93b7f9c92840102da43aafc41dd943926826269e (patch) | |
tree | 79a2aec05c22f8d26a00fcded93fa5df1c378278 | |
parent | 1655c24095da0b13bbd7a80b25948b19f6efdb37 (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.c | 40 |
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 | ||
188 | out: | ||
189 | iounmap(priv->io_base); | ||
190 | out_release_io: | ||
191 | release_mem_region(res->start, resource_size(res)); | ||
192 | out_timer: | 180 | out_timer: |
193 | del_timer_sync(&priv->timer); | 181 | del_timer_sync(&priv->timer); |
194 | out_free: | ||
195 | kfree(priv); | ||
196 | return err; | 182 | return err; |
197 | } | 183 | } |
198 | 184 | ||
199 | static int timeriomem_rng_remove(struct platform_device *pdev) | 185 | static 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 | } |