diff options
| author | Mark Brown <[email protected]> | 2015-10-12 18:09:27 +0100 | 
|---|---|---|
| committer | Mark Brown <[email protected]> | 2015-10-12 18:09:27 +0100 | 
| commit | 79828b4fa835f73cdaf4bffa48696abdcbea9d02 (patch) | |
| tree | 5e0fa7156acb75ba603022bc807df8f2fedb97a8 /drivers/rtc/rtc-at91sam9.c | |
| parent | 721b51fcf91898299d96f4b72cb9434cda29dce6 (diff) | |
| parent | 8c1a9d6323abf0fb1e5dad96cf3f1c783505ea5a (diff) | |
Merge remote-tracking branch 'asoc/fix/rt5645' into asoc-fix-rt5645
Diffstat (limited to 'drivers/rtc/rtc-at91sam9.c')
| -rw-r--r-- | drivers/rtc/rtc-at91sam9.c | 45 | 
1 files changed, 26 insertions, 19 deletions
diff --git a/drivers/rtc/rtc-at91sam9.c b/drivers/rtc/rtc-at91sam9.c index 5ccaee32df72..7206e2fa4383 100644 --- a/drivers/rtc/rtc-at91sam9.c +++ b/drivers/rtc/rtc-at91sam9.c @@ -11,20 +11,20 @@   * 2 of the License, or (at your option) any later version.   */ -#include <linux/module.h> -#include <linux/kernel.h> -#include <linux/platform_device.h> -#include <linux/time.h> -#include <linux/rtc.h> +#include <linux/clk.h>  #include <linux/interrupt.h>  #include <linux/ioctl.h> -#include <linux/slab.h> -#include <linux/platform_data/atmel.h>  #include <linux/io.h> +#include <linux/kernel.h>  #include <linux/mfd/syscon.h> +#include <linux/module.h> +#include <linux/of.h> +#include <linux/platform_device.h>  #include <linux/regmap.h> +#include <linux/rtc.h> +#include <linux/slab.h>  #include <linux/suspend.h> -#include <linux/clk.h> +#include <linux/time.h>  /*   * This driver uses two configurable hardware resources that live in the @@ -425,18 +425,19 @@ static int at91_rtc_probe(struct platform_device *pdev)  	if (IS_ERR(rtc->sclk))  		return PTR_ERR(rtc->sclk); -	sclk_rate = clk_get_rate(rtc->sclk); -	if (!sclk_rate || sclk_rate > AT91_RTT_RTPRES) { -		dev_err(&pdev->dev, "Invalid slow clock rate\n"); -		return -EINVAL; -	} -  	ret = clk_prepare_enable(rtc->sclk);  	if (ret) {  		dev_err(&pdev->dev, "Could not enable slow clock\n");  		return ret;  	} +	sclk_rate = clk_get_rate(rtc->sclk); +	if (!sclk_rate || sclk_rate > AT91_RTT_RTPRES) { +		dev_err(&pdev->dev, "Invalid slow clock rate\n"); +		ret = -EINVAL; +		goto err_clk; +	} +  	mr = rtt_readl(rtc, MR);  	/* unless RTT is counting at 1 Hz, re-initialize it */ @@ -451,8 +452,10 @@ static int at91_rtc_probe(struct platform_device *pdev)  	rtc->rtcdev = devm_rtc_device_register(&pdev->dev, pdev->name,  					&at91_rtc_ops, THIS_MODULE); -	if (IS_ERR(rtc->rtcdev)) -		return PTR_ERR(rtc->rtcdev); +	if (IS_ERR(rtc->rtcdev)) { +		ret = PTR_ERR(rtc->rtcdev); +		goto err_clk; +	}  	/* register irq handler after we know what name we'll use */  	ret = devm_request_irq(&pdev->dev, rtc->irq, at91_rtc_interrupt, @@ -460,7 +463,7 @@ static int at91_rtc_probe(struct platform_device *pdev)  			       dev_name(&rtc->rtcdev->dev), rtc);  	if (ret) {  		dev_dbg(&pdev->dev, "can't share IRQ %d?\n", rtc->irq); -		return ret; +		goto err_clk;  	}  	/* NOTE:  sam9260 rev A silicon has a ROM bug which resets the @@ -474,6 +477,11 @@ static int at91_rtc_probe(struct platform_device *pdev)  				dev_name(&rtc->rtcdev->dev));  	return 0; + +err_clk: +	clk_disable_unprepare(rtc->sclk); + +	return ret;  }  /* @@ -487,8 +495,7 @@ static int at91_rtc_remove(struct platform_device *pdev)  	/* disable all interrupts */  	rtt_writel(rtc, MR, mr & ~(AT91_RTT_ALMIEN | AT91_RTT_RTTINCIEN)); -	if (!IS_ERR(rtc->sclk)) -		clk_disable_unprepare(rtc->sclk); +	clk_disable_unprepare(rtc->sclk);  	return 0;  }  |