diff options
| author | Dmitry Torokhov <dmitry.torokhov@gmail.com> | 2012-01-08 23:38:23 -0800 | 
|---|---|---|
| committer | Dmitry Torokhov <dmitry.torokhov@gmail.com> | 2012-01-08 23:38:23 -0800 | 
| commit | da733563be5a9da26fe81d9f007262d00b846e22 (patch) | |
| tree | db28291df94a2043af2123911984c5c173da4e6f /drivers/rtc/rtc-twl.c | |
| parent | 6ccbcf2cb41131f8d56ef0723bf3f7c1f8486076 (diff) | |
| parent | dab78d7924598ea4031663dd10db814e2e324928 (diff) | |
Merge branch 'next' into for-linus
Diffstat (limited to 'drivers/rtc/rtc-twl.c')
| -rw-r--r-- | drivers/rtc/rtc-twl.c | 60 | 
1 files changed, 24 insertions, 36 deletions
diff --git a/drivers/rtc/rtc-twl.c b/drivers/rtc/rtc-twl.c index 9a81f778d6b..20687d55e7a 100644 --- a/drivers/rtc/rtc-twl.c +++ b/drivers/rtc/rtc-twl.c @@ -362,14 +362,6 @@ static irqreturn_t twl_rtc_interrupt(int irq, void *rtc)  	int res;  	u8 rd_reg; -#ifdef CONFIG_LOCKDEP -	/* WORKAROUND for lockdep forcing IRQF_DISABLED on us, which -	 * we don't want and can't tolerate.  Although it might be -	 * friendlier not to borrow this thread context... -	 */ -	local_irq_enable(); -#endif -  	res = twl_rtc_read_u8(&rd_reg, REG_RTC_STATUS_REG);  	if (res)  		goto out; @@ -428,24 +420,12 @@ static struct rtc_class_ops twl_rtc_ops = {  static int __devinit twl_rtc_probe(struct platform_device *pdev)  {  	struct rtc_device *rtc; -	int ret = 0; +	int ret = -EINVAL;  	int irq = platform_get_irq(pdev, 0);  	u8 rd_reg;  	if (irq <= 0) -		return -EINVAL; - -	rtc = rtc_device_register(pdev->name, -				  &pdev->dev, &twl_rtc_ops, THIS_MODULE); -	if (IS_ERR(rtc)) { -		ret = PTR_ERR(rtc); -		dev_err(&pdev->dev, "can't register RTC device, err %ld\n", -			PTR_ERR(rtc)); -		goto out0; - -	} - -	platform_set_drvdata(pdev, rtc); +		goto out1;  	ret = twl_rtc_read_u8(&rd_reg, REG_RTC_STATUS_REG);  	if (ret < 0) @@ -462,14 +442,6 @@ static int __devinit twl_rtc_probe(struct platform_device *pdev)  	if (ret < 0)  		goto out1; -	ret = request_irq(irq, twl_rtc_interrupt, -				IRQF_TRIGGER_RISING, -				dev_name(&rtc->dev), rtc); -	if (ret < 0) { -		dev_err(&pdev->dev, "IRQ is not free.\n"); -		goto out1; -	} -  	if (twl_class_is_6030()) {  		twl6030_interrupt_unmask(TWL6030_RTC_INT_MASK,  			REG_INT_MSK_LINE_A); @@ -480,28 +452,44 @@ static int __devinit twl_rtc_probe(struct platform_device *pdev)  	/* Check RTC module status, Enable if it is off */  	ret = twl_rtc_read_u8(&rd_reg, REG_RTC_CTRL_REG);  	if (ret < 0) -		goto out2; +		goto out1;  	if (!(rd_reg & BIT_RTC_CTRL_REG_STOP_RTC_M)) {  		dev_info(&pdev->dev, "Enabling TWL-RTC.\n");  		rd_reg = BIT_RTC_CTRL_REG_STOP_RTC_M;  		ret = twl_rtc_write_u8(rd_reg, REG_RTC_CTRL_REG);  		if (ret < 0) -			goto out2; +			goto out1;  	}  	/* init cached IRQ enable bits */  	ret = twl_rtc_read_u8(&rtc_irq_bits, REG_RTC_INTERRUPTS_REG);  	if (ret < 0) +		goto out1; + +	rtc = rtc_device_register(pdev->name, +				  &pdev->dev, &twl_rtc_ops, THIS_MODULE); +	if (IS_ERR(rtc)) { +		ret = PTR_ERR(rtc); +		dev_err(&pdev->dev, "can't register RTC device, err %ld\n", +			PTR_ERR(rtc)); +		goto out1; +	} + +	ret = request_threaded_irq(irq, NULL, twl_rtc_interrupt, +				   IRQF_TRIGGER_RISING, +				   dev_name(&rtc->dev), rtc); +	if (ret < 0) { +		dev_err(&pdev->dev, "IRQ is not free.\n");  		goto out2; +	} -	return ret; +	platform_set_drvdata(pdev, rtc); +	return 0;  out2: -	free_irq(irq, rtc); -out1:  	rtc_device_unregister(rtc); -out0: +out1:  	return ret;  }  | 
