Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

rtc: mrst: switch to devm functions

Switch to devm managed functions to simplify error handling and device
removal

Signed-off-by: Alexandre Belloni <alexandre.belloni@bootlin.com>

+18 -27
+18 -27
drivers/rtc/rtc-mrst.c
··· 45 45 struct rtc_device *rtc; 46 46 struct device *dev; 47 47 int irq; 48 - struct resource *iomem; 49 48 50 49 u8 enabled_wake; 51 50 u8 suspend_ctrl; ··· 328 329 if (!iomem) 329 330 return -ENODEV; 330 331 331 - iomem = request_mem_region(iomem->start, resource_size(iomem), 332 - driver_name); 332 + iomem = devm_request_mem_region(dev, iomem->start, resource_size(iomem), 333 + driver_name); 333 334 if (!iomem) { 334 335 dev_dbg(dev, "i/o mem already in use.\n"); 335 336 return -EBUSY; 336 337 } 337 338 338 339 mrst_rtc.irq = rtc_irq; 339 - mrst_rtc.iomem = iomem; 340 340 mrst_rtc.dev = dev; 341 341 dev_set_drvdata(dev, &mrst_rtc); 342 342 343 - mrst_rtc.rtc = rtc_device_register(driver_name, dev, 344 - &mrst_rtc_ops, THIS_MODULE); 345 - if (IS_ERR(mrst_rtc.rtc)) { 346 - retval = PTR_ERR(mrst_rtc.rtc); 347 - goto cleanup0; 348 - } 343 + mrst_rtc.rtc = devm_rtc_allocate_device(dev); 344 + if (IS_ERR(mrst_rtc.rtc)) 345 + return PTR_ERR(mrst_rtc.rtc); 346 + 347 + mrst_rtc.rtc->ops = &mrst_rtc_ops; 349 348 350 349 rename_region(iomem, dev_name(&mrst_rtc.rtc->dev)); 351 350 ··· 356 359 dev_dbg(dev, "TODO: support more than 24-hr BCD mode\n"); 357 360 358 361 if (rtc_irq) { 359 - retval = request_irq(rtc_irq, mrst_rtc_irq, 360 - 0, dev_name(&mrst_rtc.rtc->dev), 361 - mrst_rtc.rtc); 362 + retval = devm_request_irq(dev, rtc_irq, mrst_rtc_irq, 363 + 0, dev_name(&mrst_rtc.rtc->dev), 364 + mrst_rtc.rtc); 362 365 if (retval < 0) { 363 366 dev_dbg(dev, "IRQ %d is already in use, err %d\n", 364 367 rtc_irq, retval); 365 - goto cleanup1; 368 + goto cleanup0; 366 369 } 367 370 } 371 + 372 + retval = rtc_register_device(mrst_rtc.rtc); 373 + if (retval) { 374 + retval = PTR_ERR(mrst_rtc.rtc); 375 + goto cleanup0; 376 + } 377 + 368 378 dev_dbg(dev, "initialised\n"); 369 379 return 0; 370 380 371 - cleanup1: 372 - rtc_device_unregister(mrst_rtc.rtc); 373 381 cleanup0: 374 382 mrst_rtc.dev = NULL; 375 - release_mem_region(iomem->start, resource_size(iomem)); 376 383 dev_err(dev, "rtc-mrst: unable to initialise\n"); 377 384 return retval; 378 385 } ··· 391 390 static void rtc_mrst_do_remove(struct device *dev) 392 391 { 393 392 struct mrst_rtc *mrst = dev_get_drvdata(dev); 394 - struct resource *iomem; 395 393 396 394 rtc_mrst_do_shutdown(); 397 395 398 - if (mrst->irq) 399 - free_irq(mrst->irq, mrst->rtc); 400 - 401 - rtc_device_unregister(mrst->rtc); 402 396 mrst->rtc = NULL; 403 - 404 - iomem = mrst->iomem; 405 - release_mem_region(iomem->start, resource_size(iomem)); 406 - mrst->iomem = NULL; 407 - 408 397 mrst->dev = NULL; 409 398 } 410 399