From 6c4f3e4a16562c6813e8c6cc9507f1249e2bf877 Mon Sep 17 00:00:00 2001 From: Joel A Fernandes Date: Wed, 10 Aug 2011 22:12:55 -0500 Subject: [PATCH] linux-3.0: rtc-twl: Updated Sakoman patches with newer versions This fixes all IRQ kernel panics that were showing up on my BeagleBoard-xM * Refreshed patch that switched to using threaded IRQ (0009-rtc-twl-Switch-to-using-threaded-irq.patch) * Added patch to fix registration vs init order (0010-fix-registration-vs-init-order.patch) * Modified batter recharge patch to be applyable with the other changes (0014-rtc-twl-add-support-for-backup-battery-recharge.patch) Summary of patches added/updated: [PATCH 1/2] rtc: twl: Use threaded IRQ, remove IRQ enable in interrupt handler [PATCH 2/2] rtc: twl: Fix registration vs. init order kernel.org patchwork links: http://www.spinics.net/lists/linux-omap/msg54794.html http://www.mail-archive.com/linux-omap@vger.kernel.org/msg53176.html Signed-off-by: Joel A Fernandes Signed-off-by: Koen Kooi --- ...rtc-twl-Switch-to-using-threaded-irq.patch | 62 +++++++-- .../0010-fix-registration-vs-init-order.patch | 128 ++++++++++++++++++ ...support-for-backup-battery-recharge.patch} | 20 +-- recipes-kernel/linux/linux_3.0.bb | 5 +- 4 files changed, 190 insertions(+), 25 deletions(-) create mode 100644 recipes-kernel/linux/linux-3.0/sakoman/0010-fix-registration-vs-init-order.patch rename recipes-kernel/linux/linux-3.0/sakoman/{0010-rtc-twl-add-support-for-backup-battery-recharge.patch => 0014-rtc-twl-add-support-for-backup-battery-recharge.patch} (90%) diff --git a/recipes-kernel/linux/linux-3.0/sakoman/0009-rtc-twl-Switch-to-using-threaded-irq.patch b/recipes-kernel/linux/linux-3.0/sakoman/0009-rtc-twl-Switch-to-using-threaded-irq.patch index 59e1f37..750bec8 100644 --- a/recipes-kernel/linux/linux-3.0/sakoman/0009-rtc-twl-Switch-to-using-threaded-irq.patch +++ b/recipes-kernel/linux/linux-3.0/sakoman/0009-rtc-twl-Switch-to-using-threaded-irq.patch @@ -1,25 +1,61 @@ -From 61f6890ed80c09e40841221d238410a8d9ebace6 Mon Sep 17 00:00:00 2001 -From: Ilkka Koskinen -Date: Wed, 16 Mar 2011 16:07:14 +0000 -Subject: [PATCH 09/13] rtc-twl: Switch to using threaded irq +From patchwork Wed Jul 27 07:07:20 2011 +Subject: [1/2] rtc: twl: Use threaded IRQ, + remove IRQ enable in interrupt handler +Date: Wed, 27 Jul 2011 07:07:20 -0000 +From: Todd Poynor +X-Patchwork-Id: 1010862 +Message-Id: <1311750441-5559-1-git-send-email-toddpoynor@google.com> +To: Alessandro Zummo +Cc: rtc-linux@googlegroups.com, linux-omap@vger.kernel.org, + linux-kernel@vger.kernel.org, Todd Poynor + +IRQs disabled on entry to twl_rtc_interrupt is not a consequence +of LOCKDEP; both twl6030 and twl4030 explicitly disable IRQs +before calling the module IRQ handlers. + +The ISR should not be enabling IRQs; use a threaded IRQ handler +instead. + +Also fixes warnings: + + WARNING: at kernel/irq/handle.c:130 handle_irq_event_percpu+nnn + irq nnn handler twl_rtc_interrupt+nnn enabled interrupts + +Signed-off-by: Todd Poynor --- - drivers/rtc/rtc-twl.c | 2 +- - 1 files changed, 1 insertions(+), 1 deletions(-) +drivers/rtc/rtc-twl.c | 14 +++----------- + 1 files changed, 3 insertions(+), 11 deletions(-) diff --git a/drivers/rtc/rtc-twl.c b/drivers/rtc/rtc-twl.c -index f9a2799..f3e5045 100644 +index 9a81f77..ece41b9 100644 --- a/drivers/rtc/rtc-twl.c +++ b/drivers/rtc/rtc-twl.c -@@ -462,7 +462,7 @@ static int __devinit twl_rtc_probe(struct platform_device *pdev) +@@ -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; +@@ -462,9 +454,9 @@ 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); + ret = request_threaded_irq(irq, NULL, twl_rtc_interrupt, - IRQF_TRIGGER_RISING, - dev_name(&rtc->dev), rtc); ++ IRQF_TRIGGER_RISING, ++ dev_name(&rtc->dev), rtc); if (ret < 0) { --- -1.6.6.1 - + dev_err(&pdev->dev, "IRQ is not free.\n"); + goto out1; diff --git a/recipes-kernel/linux/linux-3.0/sakoman/0010-fix-registration-vs-init-order.patch b/recipes-kernel/linux/linux-3.0/sakoman/0010-fix-registration-vs-init-order.patch new file mode 100644 index 0000000..16aab35 --- /dev/null +++ b/recipes-kernel/linux/linux-3.0/sakoman/0010-fix-registration-vs-init-order.patch @@ -0,0 +1,128 @@ +From patchwork Wed Jul 27 07:07:21 2011 +Content-Type: text/plain; charset="utf-8" +MIME-Version: 1.0 +Content-Transfer-Encoding: 7bit +Subject: [2/2] rtc: twl: Fix registration vs. init order +Date: Wed, 27 Jul 2011 07:07:21 -0000 +From: Todd Poynor +X-Patchwork-Id: 1010892 +Message-Id: <1311750441-5559-2-git-send-email-toddpoynor@google.com> +To: Alessandro Zummo +Cc: rtc-linux@googlegroups.com, linux-omap@vger.kernel.org, + linux-kernel@vger.kernel.org, Todd Poynor + +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 + +--- +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 ece41b9..20687d5 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; + } + diff --git a/recipes-kernel/linux/linux-3.0/sakoman/0010-rtc-twl-add-support-for-backup-battery-recharge.patch b/recipes-kernel/linux/linux-3.0/sakoman/0014-rtc-twl-add-support-for-backup-battery-recharge.patch similarity index 90% rename from recipes-kernel/linux/linux-3.0/sakoman/0010-rtc-twl-add-support-for-backup-battery-recharge.patch rename to recipes-kernel/linux/linux-3.0/sakoman/0014-rtc-twl-add-support-for-backup-battery-recharge.patch index 7afbf33..270d0af 100644 --- a/recipes-kernel/linux/linux-3.0/sakoman/0010-rtc-twl-add-support-for-backup-battery-recharge.patch +++ b/recipes-kernel/linux/linux-3.0/sakoman/0014-rtc-twl-add-support-for-backup-battery-recharge.patch @@ -7,14 +7,16 @@ Subject: [PATCH 10/13] rtc-twl: add support for backup battery recharge drivers/rtc/rtc-twl.c | 25 +++++++++++++++++++++++++ 1 files changed, 25 insertions(+), 0 deletions(-) + diff --git a/drivers/rtc/rtc-twl.c b/drivers/rtc/rtc-twl.c -index f3e5045..1fe1bc9 100644 +index a64494e..552446b 100644 --- a/drivers/rtc/rtc-twl.c +++ b/drivers/rtc/rtc-twl.c -@@ -30,6 +30,23 @@ +@@ -30,7 +30,24 @@ #include +- +/* + * PM_RECEIVER block register offsets (use TWL4030_MODULE_PM_RECEIVER) + */ @@ -32,12 +34,13 @@ index f3e5045..1fe1bc9 100644 +#define BIT_PM_RECEIVER_BB_CFG_BBISEL_150UA 0x01 +#define BIT_PM_RECEIVER_BB_CFG_BBISEL_500UA 0x02 +#define BIT_PM_RECEIVER_BB_CFG_BBISEL_1MA 0x03 - ++ /* * RTC block register offsets (use TWL_MODULE_RTC) -@@ -495,6 +512,14 @@ static int __devinit twl_rtc_probe(struct platform_device *pdev) - if (ret < 0) + */ +@@ -484,6 +501,14 @@ static int __devinit twl_rtc_probe(struct platform_device *pdev) goto out2; + } + /* enable backup battery charging */ + /* use a conservative 25uA @ 3.1V */ @@ -47,9 +50,6 @@ index f3e5045..1fe1bc9 100644 + BIT_PM_RECEIVER_BB_CFG_BBISEL_25UA, + REG_BB_CFG); + - return ret; - - out2: --- -1.6.6.1 + platform_set_drvdata(pdev, rtc); + return 0; diff --git a/recipes-kernel/linux/linux_3.0.bb b/recipes-kernel/linux/linux_3.0.bb index edb8df7..718b6af 100644 --- a/recipes-kernel/linux/linux_3.0.bb +++ b/recipes-kernel/linux/linux_3.0.bb @@ -9,7 +9,7 @@ COMPATIBLE_MACHINE = "(beagleboard)" SRCREV_pn-${PN} = "94ed5b4788a7cdbe68bc7cb8516972cbebdc8274" # The main PR is now using MACHINE_KERNEL_PR, for omap3 see conf/machine/include/omap3.inc -MACHINE_KERNEL_PR_append = "k" +MACHINE_KERNEL_PR_append = "m" FILESPATHPKG_prepend = "linux-3.0:" @@ -208,10 +208,11 @@ SRC_URI += "git://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-3.0.y.git file://sakoman/0007-drivers-input-touchscreen-ads7846-return-ENODEV-if-d.patch \ file://sakoman/0008-Revert-omap2_mcspi-Flush-posted-writes.patch \ file://sakoman/0009-rtc-twl-Switch-to-using-threaded-irq.patch \ - file://sakoman/0010-rtc-twl-add-support-for-backup-battery-recharge.patch \ + file://sakoman/0010-fix-registration-vs-init-order.patch \ file://sakoman/0011-soc-codecs-Enable-audio-capture-by-default-for-twl40.patch \ file://sakoman/0012-soc-codecs-twl4030-Turn-on-mic-bias-by-default.patch \ file://sakoman/0013-omap-mmc-twl4030-move-clock-input-selection-prior-to.patch \ + file://sakoman/0014-rtc-twl-add-support-for-backup-battery-recharge.patch \ \ file://sgx/0001-ARM-L2-Add-and-export-outer_clean_all.patch \ file://defconfig" -- 2.39.2