diff options
| -rw-r--r-- | drivers/rtc/rtc-spear.c | 89 | 
1 files changed, 29 insertions, 60 deletions
diff --git a/drivers/rtc/rtc-spear.c b/drivers/rtc/rtc-spear.c index bb507d23f6c..311a5274b52 100644 --- a/drivers/rtc/rtc-spear.c +++ b/drivers/rtc/rtc-spear.c @@ -363,35 +363,42 @@ static int __devinit spear_rtc_probe(struct platform_device *pdev)  		dev_err(&pdev->dev, "no resource defined\n");  		return -EBUSY;  	} -	if (!request_mem_region(res->start, resource_size(res), pdev->name)) { -		dev_err(&pdev->dev, "rtc region already claimed\n"); -		return -EBUSY; -	} -	config = kzalloc(sizeof(*config), GFP_KERNEL); +	config = devm_kzalloc(&pdev->dev, sizeof(*config), GFP_KERNEL);  	if (!config) {  		dev_err(&pdev->dev, "out of memory\n"); -		status = -ENOMEM; -		goto err_release_region; +		return -ENOMEM;  	} -	config->clk = clk_get(&pdev->dev, NULL); -	if (IS_ERR(config->clk)) { -		status = PTR_ERR(config->clk); -		goto err_kfree; +	/* alarm irqs */ +	irq = platform_get_irq(pdev, 0); +	if (irq < 0) { +		dev_err(&pdev->dev, "no update irq?\n"); +		return irq;  	} -	status = clk_enable(config->clk); -	if (status < 0) -		goto err_clk_put; +	status = devm_request_irq(&pdev->dev, irq, spear_rtc_irq, 0, pdev->name, +			config); +	if (status) { +		dev_err(&pdev->dev, "Alarm interrupt IRQ%d already claimed\n", +				irq); +		return status; +	} -	config->ioaddr = ioremap(res->start, resource_size(res)); +	config->ioaddr = devm_request_and_ioremap(&pdev->dev, res);  	if (!config->ioaddr) { -		dev_err(&pdev->dev, "ioremap fail\n"); -		status = -ENOMEM; -		goto err_disable_clock; +		dev_err(&pdev->dev, "request-ioremap fail\n"); +		return -ENOMEM;  	} +	config->clk = devm_clk_get(&pdev->dev, NULL); +	if (IS_ERR(config->clk)) +		return PTR_ERR(config->clk); + +	status = clk_enable(config->clk); +	if (status < 0) +		return status; +  	spin_lock_init(&config->lock);  	platform_set_drvdata(pdev, config); @@ -401,22 +408,7 @@ static int __devinit spear_rtc_probe(struct platform_device *pdev)  		dev_err(&pdev->dev, "can't register RTC device, err %ld\n",  				PTR_ERR(config->rtc));  		status = PTR_ERR(config->rtc); -		goto err_iounmap; -	} - -	/* alarm irqs */ -	irq = platform_get_irq(pdev, 0); -	if (irq < 0) { -		dev_err(&pdev->dev, "no update irq?\n"); -		status = irq; -		goto err_clear_platdata; -	} - -	status = request_irq(irq, spear_rtc_irq, 0, pdev->name, config); -	if (status) { -		dev_err(&pdev->dev, "Alarm interrupt IRQ%d already \ -				claimed\n", irq); -		goto err_clear_platdata; +		goto err_disable_clock;  	}  	if (!device_can_wakeup(&pdev->dev)) @@ -424,19 +416,9 @@ static int __devinit spear_rtc_probe(struct platform_device *pdev)  	return 0; -err_clear_platdata: -	platform_set_drvdata(pdev, NULL); -	rtc_device_unregister(config->rtc); -err_iounmap: -	iounmap(config->ioaddr);  err_disable_clock: +	platform_set_drvdata(pdev, NULL);  	clk_disable(config->clk); -err_clk_put: -	clk_put(config->clk); -err_kfree: -	kfree(config); -err_release_region: -	release_mem_region(res->start, resource_size(res));  	return status;  } @@ -444,24 +426,11 @@ err_release_region:  static int __devexit spear_rtc_remove(struct platform_device *pdev)  {  	struct spear_rtc_config *config = platform_get_drvdata(pdev); -	int irq; -	struct resource *res; -	/* leave rtc running, but disable irqs */ +	rtc_device_unregister(config->rtc);  	spear_rtc_disable_interrupt(config); -	device_init_wakeup(&pdev->dev, 0); -	irq = platform_get_irq(pdev, 0); -	if (irq) -		free_irq(irq, pdev);  	clk_disable(config->clk); -	clk_put(config->clk); -	iounmap(config->ioaddr); -	res = platform_get_resource(pdev, IORESOURCE_MEM, 0); -	if (res) -		release_mem_region(res->start, resource_size(res)); -	platform_set_drvdata(pdev, NULL); -	rtc_device_unregister(config->rtc); -	kfree(config); +	device_init_wakeup(&pdev->dev, 0);  	return 0;  }  |