diff options
Diffstat (limited to 'drivers/watchdog/ts72xx_wdt.c')
-rw-r--r-- | drivers/watchdog/ts72xx_wdt.c | 67 |
1 files changed, 10 insertions, 57 deletions
diff --git a/drivers/watchdog/ts72xx_wdt.c b/drivers/watchdog/ts72xx_wdt.c index b8a92459f10f..4da59b4d73f0 100644 --- a/drivers/watchdog/ts72xx_wdt.c +++ b/drivers/watchdog/ts72xx_wdt.c | |||
@@ -396,7 +396,7 @@ static int ts72xx_wdt_probe(struct platform_device *pdev) | |||
396 | struct resource *r1, *r2; | 396 | struct resource *r1, *r2; |
397 | int error = 0; | 397 | int error = 0; |
398 | 398 | ||
399 | wdt = kzalloc(sizeof(struct ts72xx_wdt), GFP_KERNEL); | 399 | wdt = devm_kzalloc(&pdev->dev, sizeof(struct ts72xx_wdt), GFP_KERNEL); |
400 | if (!wdt) { | 400 | if (!wdt) { |
401 | dev_err(&pdev->dev, "failed to allocate memory\n"); | 401 | dev_err(&pdev->dev, "failed to allocate memory\n"); |
402 | return -ENOMEM; | 402 | return -ENOMEM; |
@@ -405,44 +405,22 @@ static int ts72xx_wdt_probe(struct platform_device *pdev) | |||
405 | r1 = platform_get_resource(pdev, IORESOURCE_MEM, 0); | 405 | r1 = platform_get_resource(pdev, IORESOURCE_MEM, 0); |
406 | if (!r1) { | 406 | if (!r1) { |
407 | dev_err(&pdev->dev, "failed to get memory resource\n"); | 407 | dev_err(&pdev->dev, "failed to get memory resource\n"); |
408 | error = -ENODEV; | 408 | return -ENODEV; |
409 | goto fail; | ||
410 | } | 409 | } |
411 | 410 | ||
412 | r1 = request_mem_region(r1->start, resource_size(r1), pdev->name); | 411 | wdt->control_reg = devm_ioremap_resource(&pdev->dev, r1); |
413 | if (!r1) { | 412 | if (IS_ERR(wdt->control_reg)) |
414 | dev_err(&pdev->dev, "cannot request memory region\n"); | 413 | return PTR_ERR(wdt->control_reg); |
415 | error = -EBUSY; | ||
416 | goto fail; | ||
417 | } | ||
418 | |||
419 | wdt->control_reg = ioremap(r1->start, resource_size(r1)); | ||
420 | if (!wdt->control_reg) { | ||
421 | dev_err(&pdev->dev, "failed to map memory\n"); | ||
422 | error = -ENODEV; | ||
423 | goto fail_free_control; | ||
424 | } | ||
425 | 414 | ||
426 | r2 = platform_get_resource(pdev, IORESOURCE_MEM, 1); | 415 | r2 = platform_get_resource(pdev, IORESOURCE_MEM, 1); |
427 | if (!r2) { | 416 | if (!r2) { |
428 | dev_err(&pdev->dev, "failed to get memory resource\n"); | 417 | dev_err(&pdev->dev, "failed to get memory resource\n"); |
429 | error = -ENODEV; | 418 | return -ENODEV; |
430 | goto fail_unmap_control; | ||
431 | } | ||
432 | |||
433 | r2 = request_mem_region(r2->start, resource_size(r2), pdev->name); | ||
434 | if (!r2) { | ||
435 | dev_err(&pdev->dev, "cannot request memory region\n"); | ||
436 | error = -EBUSY; | ||
437 | goto fail_unmap_control; | ||
438 | } | 419 | } |
439 | 420 | ||
440 | wdt->feed_reg = ioremap(r2->start, resource_size(r2)); | 421 | wdt->feed_reg = devm_ioremap_resource(&pdev->dev, r2); |
441 | if (!wdt->feed_reg) { | 422 | if (IS_ERR(wdt->feed_reg)) |
442 | dev_err(&pdev->dev, "failed to map memory\n"); | 423 | return PTR_ERR(wdt->feed_reg); |
443 | error = -ENODEV; | ||
444 | goto fail_free_feed; | ||
445 | } | ||
446 | 424 | ||
447 | platform_set_drvdata(pdev, wdt); | 425 | platform_set_drvdata(pdev, wdt); |
448 | ts72xx_wdt_pdev = pdev; | 426 | ts72xx_wdt_pdev = pdev; |
@@ -455,45 +433,20 @@ static int ts72xx_wdt_probe(struct platform_device *pdev) | |||
455 | error = misc_register(&ts72xx_wdt_miscdev); | 433 | error = misc_register(&ts72xx_wdt_miscdev); |
456 | if (error) { | 434 | if (error) { |
457 | dev_err(&pdev->dev, "failed to register miscdev\n"); | 435 | dev_err(&pdev->dev, "failed to register miscdev\n"); |
458 | goto fail_unmap_feed; | 436 | return error; |
459 | } | 437 | } |
460 | 438 | ||
461 | dev_info(&pdev->dev, "TS-72xx Watchdog driver\n"); | 439 | dev_info(&pdev->dev, "TS-72xx Watchdog driver\n"); |
462 | 440 | ||
463 | return 0; | 441 | return 0; |
464 | |||
465 | fail_unmap_feed: | ||
466 | platform_set_drvdata(pdev, NULL); | ||
467 | iounmap(wdt->feed_reg); | ||
468 | fail_free_feed: | ||
469 | release_mem_region(r2->start, resource_size(r2)); | ||
470 | fail_unmap_control: | ||
471 | iounmap(wdt->control_reg); | ||
472 | fail_free_control: | ||
473 | release_mem_region(r1->start, resource_size(r1)); | ||
474 | fail: | ||
475 | kfree(wdt); | ||
476 | return error; | ||
477 | } | 442 | } |
478 | 443 | ||
479 | static int ts72xx_wdt_remove(struct platform_device *pdev) | 444 | static int ts72xx_wdt_remove(struct platform_device *pdev) |
480 | { | 445 | { |
481 | struct ts72xx_wdt *wdt = platform_get_drvdata(pdev); | ||
482 | struct resource *res; | ||
483 | int error; | 446 | int error; |
484 | 447 | ||
485 | error = misc_deregister(&ts72xx_wdt_miscdev); | 448 | error = misc_deregister(&ts72xx_wdt_miscdev); |
486 | platform_set_drvdata(pdev, NULL); | ||
487 | |||
488 | iounmap(wdt->feed_reg); | ||
489 | res = platform_get_resource(pdev, IORESOURCE_MEM, 1); | ||
490 | release_mem_region(res->start, resource_size(res)); | ||
491 | |||
492 | iounmap(wdt->control_reg); | ||
493 | res = platform_get_resource(pdev, IORESOURCE_MEM, 0); | ||
494 | release_mem_region(res->start, resource_size(res)); | ||
495 | 449 | ||
496 | kfree(wdt); | ||
497 | return error; | 450 | return error; |
498 | } | 451 | } |
499 | 452 | ||