diff options
author | Jonas Bonn <jonas@southpole.se> | 2010-11-24 11:26:21 -0500 |
---|---|---|
committer | Ben Dooks <ben-linux@fluff.org> | 2011-01-03 20:04:23 -0500 |
commit | 47def5b80f087d033013c0609679812cfafd6b49 (patch) | |
tree | 6ec05ee144fdad62d3308aa50c1a1149e571a0e1 /drivers/i2c | |
parent | 049bb69d82e5f7f356949c1ae34a244b3338611b (diff) |
i2c-ocores: Use devres for resource allocation
This patch converts the i2c-cores driver to use devres routines for
resource allocation.
Signed-off-by: Jonas Bonn <jonas@southpole.se>
Signed-off-by: Ben Dooks <ben-linux@fluff.org>
Diffstat (limited to 'drivers/i2c')
-rw-r--r-- | drivers/i2c/busses/i2c-ocores.c | 46 |
1 files changed, 11 insertions, 35 deletions
diff --git a/drivers/i2c/busses/i2c-ocores.c b/drivers/i2c/busses/i2c-ocores.c index c05e8c44404a..dee0352737d7 100644 --- a/drivers/i2c/busses/i2c-ocores.c +++ b/drivers/i2c/busses/i2c-ocores.c | |||
@@ -253,22 +253,21 @@ static int __devinit ocores_i2c_probe(struct platform_device *pdev) | |||
253 | if (!res2) | 253 | if (!res2) |
254 | return -ENODEV; | 254 | return -ENODEV; |
255 | 255 | ||
256 | i2c = kzalloc(sizeof(*i2c), GFP_KERNEL); | 256 | i2c = devm_kzalloc(&pdev->dev, sizeof(*i2c), GFP_KERNEL); |
257 | if (!i2c) | 257 | if (!i2c) |
258 | return -ENOMEM; | 258 | return -ENOMEM; |
259 | 259 | ||
260 | if (!request_mem_region(res->start, resource_size(res), | 260 | if (!devm_request_mem_region(&pdev->dev, res->start, |
261 | pdev->name)) { | 261 | resource_size(res), pdev->name)) { |
262 | dev_err(&pdev->dev, "Memory region busy\n"); | 262 | dev_err(&pdev->dev, "Memory region busy\n"); |
263 | ret = -EBUSY; | 263 | return -EBUSY; |
264 | goto request_mem_failed; | ||
265 | } | 264 | } |
266 | 265 | ||
267 | i2c->base = ioremap(res->start, resource_size(res)); | 266 | i2c->base = devm_ioremap_nocache(&pdev->dev, res->start, |
267 | resource_size(res)); | ||
268 | if (!i2c->base) { | 268 | if (!i2c->base) { |
269 | dev_err(&pdev->dev, "Unable to map registers\n"); | 269 | dev_err(&pdev->dev, "Unable to map registers\n"); |
270 | ret = -EIO; | 270 | return -EIO; |
271 | goto map_failed; | ||
272 | } | 271 | } |
273 | 272 | ||
274 | pdata = pdev->dev.platform_data; | 273 | pdata = pdev->dev.platform_data; |
@@ -284,10 +283,11 @@ static int __devinit ocores_i2c_probe(struct platform_device *pdev) | |||
284 | ocores_init(i2c); | 283 | ocores_init(i2c); |
285 | 284 | ||
286 | init_waitqueue_head(&i2c->wait); | 285 | init_waitqueue_head(&i2c->wait); |
287 | ret = request_irq(res2->start, ocores_isr, 0, pdev->name, i2c); | 286 | ret = devm_request_irq(&pdev->dev, res2->start, ocores_isr, 0, |
287 | pdev->name, i2c); | ||
288 | if (ret) { | 288 | if (ret) { |
289 | dev_err(&pdev->dev, "Cannot claim IRQ\n"); | 289 | dev_err(&pdev->dev, "Cannot claim IRQ\n"); |
290 | goto request_irq_failed; | 290 | return ret; |
291 | } | 291 | } |
292 | 292 | ||
293 | /* hook up driver to tree */ | 293 | /* hook up driver to tree */ |
@@ -303,7 +303,7 @@ static int __devinit ocores_i2c_probe(struct platform_device *pdev) | |||
303 | ret = i2c_add_adapter(&i2c->adap); | 303 | ret = i2c_add_adapter(&i2c->adap); |
304 | if (ret) { | 304 | if (ret) { |
305 | dev_err(&pdev->dev, "Failed to add adapter\n"); | 305 | dev_err(&pdev->dev, "Failed to add adapter\n"); |
306 | goto add_adapter_failed; | 306 | return ret; |
307 | } | 307 | } |
308 | 308 | ||
309 | /* add in known devices to the bus */ | 309 | /* add in known devices to the bus */ |
@@ -313,23 +313,11 @@ static int __devinit ocores_i2c_probe(struct platform_device *pdev) | |||
313 | } | 313 | } |
314 | 314 | ||
315 | return 0; | 315 | return 0; |
316 | |||
317 | add_adapter_failed: | ||
318 | free_irq(res2->start, i2c); | ||
319 | request_irq_failed: | ||
320 | iounmap(i2c->base); | ||
321 | map_failed: | ||
322 | release_mem_region(res->start, resource_size(res)); | ||
323 | request_mem_failed: | ||
324 | kfree(i2c); | ||
325 | |||
326 | return ret; | ||
327 | } | 316 | } |
328 | 317 | ||
329 | static int __devexit ocores_i2c_remove(struct platform_device* pdev) | 318 | static int __devexit ocores_i2c_remove(struct platform_device* pdev) |
330 | { | 319 | { |
331 | struct ocores_i2c *i2c = platform_get_drvdata(pdev); | 320 | struct ocores_i2c *i2c = platform_get_drvdata(pdev); |
332 | struct resource *res; | ||
333 | 321 | ||
334 | /* disable i2c logic */ | 322 | /* disable i2c logic */ |
335 | oc_setreg(i2c, OCI2C_CONTROL, oc_getreg(i2c, OCI2C_CONTROL) | 323 | oc_setreg(i2c, OCI2C_CONTROL, oc_getreg(i2c, OCI2C_CONTROL) |
@@ -339,18 +327,6 @@ static int __devexit ocores_i2c_remove(struct platform_device* pdev) | |||
339 | i2c_del_adapter(&i2c->adap); | 327 | i2c_del_adapter(&i2c->adap); |
340 | platform_set_drvdata(pdev, NULL); | 328 | platform_set_drvdata(pdev, NULL); |
341 | 329 | ||
342 | res = platform_get_resource(pdev, IORESOURCE_IRQ, 0); | ||
343 | if (res) | ||
344 | free_irq(res->start, i2c); | ||
345 | |||
346 | iounmap(i2c->base); | ||
347 | |||
348 | res = platform_get_resource(pdev, IORESOURCE_MEM, 0); | ||
349 | if (res) | ||
350 | release_mem_region(res->start, resource_size(res)); | ||
351 | |||
352 | kfree(i2c); | ||
353 | |||
354 | return 0; | 330 | return 0; |
355 | } | 331 | } |
356 | 332 | ||