mirror of
https://git.yoctoproject.org/meta-ti
synced 2026-07-16 22:38:04 +00:00
18ff66cb77
Signed-off-by: Koen Kooi <koen@dominion.thruhere.net>
123 lines
3.2 KiB
Diff
123 lines
3.2 KiB
Diff
From 2cc62887b37d504df009d7241e6cebc3c65c32a5 Mon Sep 17 00:00:00 2001
|
|
From: Todd Poynor <toddpoynor@google.com>
|
|
Date: Wed, 27 Jul 2011 07:07:21 +0000
|
|
Subject: [PATCH 10/14] rtc: twl: Fix registration vs. init order
|
|
|
|
Only register as an RTC device after the hardware has been
|
|
successfully initialized. The RTC class driver will call
|
|
back to this driver to read a pending alarm, and other
|
|
drivers watching for new devices on the RTC class may
|
|
read the RTC time upon registration. Such access might
|
|
occur while the RTC is stopped, prior to clearing
|
|
pending alarms, etc.
|
|
|
|
The new ordering also avoids leaving the platform
|
|
device drvdata set to an unregistered struct rtc_device *
|
|
on probe errors.
|
|
|
|
Signed-off-by: Todd Poynor <toddpoynor@google.com>
|
|
---
|
|
drivers/rtc/rtc-twl.c | 52 ++++++++++++++++++++++--------------------------
|
|
1 files changed, 24 insertions(+), 28 deletions(-)
|
|
|
|
diff --git a/drivers/rtc/rtc-twl.c b/drivers/rtc/rtc-twl.c
|
|
index 3fee95e..a64494e 100644
|
|
--- a/drivers/rtc/rtc-twl.c
|
|
+++ b/drivers/rtc/rtc-twl.c
|
|
@@ -420,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)
|
|
@@ -454,14 +442,6 @@ static int __devinit twl_rtc_probe(struct platform_device *pdev)
|
|
if (ret < 0)
|
|
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 out1;
|
|
- }
|
|
-
|
|
if (twl_class_is_6030()) {
|
|
twl6030_interrupt_unmask(TWL6030_RTC_INT_MASK,
|
|
REG_INT_MSK_LINE_A);
|
|
@@ -472,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;
|
|
}
|
|
|
|
--
|
|
1.7.2.5
|
|
|