forked from mirrors/linux
		
	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>
This commit is contained in:
		
							parent
							
								
									29615d03cc
								
							
						
					
					
						commit
						32b41f93dc
					
				
					 1 changed files with 18 additions and 27 deletions
				
			
		| 
						 | 
					@ -45,7 +45,6 @@ struct mrst_rtc {
 | 
				
			||||||
	struct rtc_device	*rtc;
 | 
						struct rtc_device	*rtc;
 | 
				
			||||||
	struct device		*dev;
 | 
						struct device		*dev;
 | 
				
			||||||
	int			irq;
 | 
						int			irq;
 | 
				
			||||||
	struct resource		*iomem;
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
	u8			enabled_wake;
 | 
						u8			enabled_wake;
 | 
				
			||||||
	u8			suspend_ctrl;
 | 
						u8			suspend_ctrl;
 | 
				
			||||||
| 
						 | 
					@ -329,24 +328,22 @@ static int vrtc_mrst_do_probe(struct device *dev, struct resource *iomem,
 | 
				
			||||||
	if (!iomem)
 | 
						if (!iomem)
 | 
				
			||||||
		return -ENODEV;
 | 
							return -ENODEV;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	iomem = request_mem_region(iomem->start, resource_size(iomem),
 | 
						iomem = devm_request_mem_region(dev, iomem->start, resource_size(iomem),
 | 
				
			||||||
				   driver_name);
 | 
										driver_name);
 | 
				
			||||||
	if (!iomem) {
 | 
						if (!iomem) {
 | 
				
			||||||
		dev_dbg(dev, "i/o mem already in use.\n");
 | 
							dev_dbg(dev, "i/o mem already in use.\n");
 | 
				
			||||||
		return -EBUSY;
 | 
							return -EBUSY;
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	mrst_rtc.irq = rtc_irq;
 | 
						mrst_rtc.irq = rtc_irq;
 | 
				
			||||||
	mrst_rtc.iomem = iomem;
 | 
					 | 
				
			||||||
	mrst_rtc.dev = dev;
 | 
						mrst_rtc.dev = dev;
 | 
				
			||||||
	dev_set_drvdata(dev, &mrst_rtc);
 | 
						dev_set_drvdata(dev, &mrst_rtc);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	mrst_rtc.rtc = rtc_device_register(driver_name, dev,
 | 
						mrst_rtc.rtc = devm_rtc_allocate_device(dev);
 | 
				
			||||||
				&mrst_rtc_ops, THIS_MODULE);
 | 
						if (IS_ERR(mrst_rtc.rtc))
 | 
				
			||||||
	if (IS_ERR(mrst_rtc.rtc)) {
 | 
							return PTR_ERR(mrst_rtc.rtc);
 | 
				
			||||||
		retval = PTR_ERR(mrst_rtc.rtc);
 | 
					
 | 
				
			||||||
		goto cleanup0;
 | 
						mrst_rtc.rtc->ops = &mrst_rtc_ops;
 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
	rename_region(iomem, dev_name(&mrst_rtc.rtc->dev));
 | 
						rename_region(iomem, dev_name(&mrst_rtc.rtc->dev));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -359,23 +356,27 @@ static int vrtc_mrst_do_probe(struct device *dev, struct resource *iomem,
 | 
				
			||||||
		dev_dbg(dev, "TODO: support more than 24-hr BCD mode\n");
 | 
							dev_dbg(dev, "TODO: support more than 24-hr BCD mode\n");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if (rtc_irq) {
 | 
						if (rtc_irq) {
 | 
				
			||||||
		retval = request_irq(rtc_irq, mrst_rtc_irq,
 | 
							retval = devm_request_irq(dev, rtc_irq, mrst_rtc_irq,
 | 
				
			||||||
				0, dev_name(&mrst_rtc.rtc->dev),
 | 
										  0, dev_name(&mrst_rtc.rtc->dev),
 | 
				
			||||||
				mrst_rtc.rtc);
 | 
										  mrst_rtc.rtc);
 | 
				
			||||||
		if (retval < 0) {
 | 
							if (retval < 0) {
 | 
				
			||||||
			dev_dbg(dev, "IRQ %d is already in use, err %d\n",
 | 
								dev_dbg(dev, "IRQ %d is already in use, err %d\n",
 | 
				
			||||||
				rtc_irq, retval);
 | 
									rtc_irq, retval);
 | 
				
			||||||
			goto cleanup1;
 | 
								goto cleanup0;
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						retval = rtc_register_device(mrst_rtc.rtc);
 | 
				
			||||||
 | 
						if (retval) {
 | 
				
			||||||
 | 
							retval = PTR_ERR(mrst_rtc.rtc);
 | 
				
			||||||
 | 
							goto cleanup0;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	dev_dbg(dev, "initialised\n");
 | 
						dev_dbg(dev, "initialised\n");
 | 
				
			||||||
	return 0;
 | 
						return 0;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
cleanup1:
 | 
					 | 
				
			||||||
	rtc_device_unregister(mrst_rtc.rtc);
 | 
					 | 
				
			||||||
cleanup0:
 | 
					cleanup0:
 | 
				
			||||||
	mrst_rtc.dev = NULL;
 | 
						mrst_rtc.dev = NULL;
 | 
				
			||||||
	release_mem_region(iomem->start, resource_size(iomem));
 | 
					 | 
				
			||||||
	dev_err(dev, "rtc-mrst: unable to initialise\n");
 | 
						dev_err(dev, "rtc-mrst: unable to initialise\n");
 | 
				
			||||||
	return retval;
 | 
						return retval;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
| 
						 | 
					@ -390,20 +391,10 @@ static void rtc_mrst_do_shutdown(void)
 | 
				
			||||||
static void rtc_mrst_do_remove(struct device *dev)
 | 
					static void rtc_mrst_do_remove(struct device *dev)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	struct mrst_rtc	*mrst = dev_get_drvdata(dev);
 | 
						struct mrst_rtc	*mrst = dev_get_drvdata(dev);
 | 
				
			||||||
	struct resource *iomem;
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
	rtc_mrst_do_shutdown();
 | 
						rtc_mrst_do_shutdown();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if (mrst->irq)
 | 
					 | 
				
			||||||
		free_irq(mrst->irq, mrst->rtc);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	rtc_device_unregister(mrst->rtc);
 | 
					 | 
				
			||||||
	mrst->rtc = NULL;
 | 
						mrst->rtc = NULL;
 | 
				
			||||||
 | 
					 | 
				
			||||||
	iomem = mrst->iomem;
 | 
					 | 
				
			||||||
	release_mem_region(iomem->start, resource_size(iomem));
 | 
					 | 
				
			||||||
	mrst->iomem = NULL;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	mrst->dev = NULL;
 | 
						mrst->dev = NULL;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
		Reference in a new issue