From b325251966d587215f94b894d9b14937439f3054 Mon Sep 17 00:00:00 2001 From: Peter Robinson Date: Sat, 20 Aug 2016 13:52:20 +0100 Subject: [PATCH] Add fix for RTC crash on ARMv7 am33xx devices --- kernel.spec | 6 + omap-rtc-fix-am33xx.patch | 223 ++++++++++++++++++++++++++++++++++++++ 2 files changed, 229 insertions(+) create mode 100644 omap-rtc-fix-am33xx.patch diff --git a/kernel.spec b/kernel.spec index 37c014041..fe7523cf9 100644 --- a/kernel.spec +++ b/kernel.spec @@ -511,6 +511,9 @@ Patch425: arm64-pcie-quirks-xgene.patch # http://www.spinics.net/lists/linux-tegra/msg26029.html Patch426: usb-phy-tegra-Add-38.4MHz-clock-table-entry.patch +# http://www.spinics.net/lists/linux-omap/msg130698.html +Patch427: omap-rtc-fix-am33xx.patch + # http://patchwork.ozlabs.org/patch/587554/ Patch430: ARM-tegra-usb-no-reset.patch @@ -2139,6 +2142,9 @@ fi # # %changelog +* Sat Aug 20 2016 Peter Robinson +- Add fix for RTC crash on ARMv7 am33xx devices + * Fri Aug 19 2016 Justin M. Forbes - 4.8.0-0.rc2.git4.1 - Linux v4.8-rc2-348-g6040e57 diff --git a/omap-rtc-fix-am33xx.patch b/omap-rtc-fix-am33xx.patch new file mode 100644 index 000000000..af6686a51 --- /dev/null +++ b/omap-rtc-fix-am33xx.patch @@ -0,0 +1,223 @@ +From patchwork Tue Jul 12 17:50:31 2016 +Content-Type: text/plain; charset="utf-8" +MIME-Version: 1.0 +Content-Transfer-Encoding: 7bit +Subject: [1/4] ARM: OMAP4+: hwmod: Add hwmod flag for + HWMOD_OMAP4_ZERO_CLKCTRL_OFFSET +From: Dave Gerlach +X-Patchwork-Id: 9225857 +Message-Id: <20160712175034.743-2-d-gerlach@ti.com> +To: , , + Tony Lindgren , Tero Kristo +Cc: Lokesh Vutla , Olof Johansson , + Paul Walmsley , Arnd Bergmann , + Dave Gerlach +Date: Tue, 12 Jul 2016 12:50:31 -0500 + +Nearly all modules on OMAP4 and newer platforms have clkctrl offsets +that are non-zero except for the RTC on am335x. Because we rely on a +clkctrl_offset of zero to indicate no clkctrl_offset being present, +lets add a HWMOD_OMAP4_ZERO_CLKCTRL_OFFSET flag to use to indicate +hwmods that have a valid clkctrl_offset of 0. + +Signed-off-by: Dave Gerlach +--- + arch/arm/mach-omap2/omap_hwmod.h | 4 ++++ + 1 file changed, 4 insertions(+) + +diff --git a/arch/arm/mach-omap2/omap_hwmod.h b/arch/arm/mach-omap2/omap_hwmod.h +index 4041bad79a9a..78904017f18c 100644 +--- a/arch/arm/mach-omap2/omap_hwmod.h ++++ b/arch/arm/mach-omap2/omap_hwmod.h +@@ -443,8 +443,12 @@ struct omap_hwmod_omap2_prcm { + * HWMOD_OMAP4_NO_CONTEXT_LOSS_BIT: Some IP blocks don't have a PRCM + * module-level context loss register associated with them; this + * flag bit should be set in those cases ++ * HWMOD_OMAP4_ZERO_CLKCTRL_OFFSET: Some IP blocks have a valid CLKCTRL ++ * offset of zero; this flag bit should be set in those cases to ++ * distinguish from hwmods that have no clkctrl offset. + */ + #define HWMOD_OMAP4_NO_CONTEXT_LOSS_BIT (1 << 0) ++#define HWMOD_OMAP4_ZERO_CLKCTRL_OFFSET (1 << 1) + + /** + * struct omap_hwmod_omap4_prcm - OMAP4-specific PRCM data +From patchwork Tue Jul 12 17:50:32 2016 +Content-Type: text/plain; charset="utf-8" +MIME-Version: 1.0 +Content-Transfer-Encoding: 7bit +Subject: [2/4] ARM: OMAP2+: AM33XX: Add HWMOD_OMAP4_ZERO_CLKCTRL_OFFSET flag + to rtc hwmod +From: Dave Gerlach +X-Patchwork-Id: 9225861 +Message-Id: <20160712175034.743-3-d-gerlach@ti.com> +To: , , + Tony Lindgren , Tero Kristo +Cc: Lokesh Vutla , Olof Johansson , + Paul Walmsley , Arnd Bergmann , + Dave Gerlach +Date: Tue, 12 Jul 2016 12:50:32 -0500 + +The RTC hwmod on AM335x family of SoCs is unique in that the +clkctrl_offs in the PRCM is 0. We rely on a clkctrl_offs of zero as +indicating no clkctrl is present so we must flag this hwmod with +HWMOD_OMAP4_ZERO_CLKCTRL_OFFSET to indicate the 0 clkctrl_offs is in +fact valid in this case. + +Signed-off-by: Dave Gerlach +--- + arch/arm/mach-omap2/omap_hwmod_33xx_43xx_ipblock_data.c | 2 ++ + 1 file changed, 2 insertions(+) + +diff --git a/arch/arm/mach-omap2/omap_hwmod_33xx_43xx_ipblock_data.c b/arch/arm/mach-omap2/omap_hwmod_33xx_43xx_ipblock_data.c +index 55c5878577f4..e2d84aa7f595 100644 +--- a/arch/arm/mach-omap2/omap_hwmod_33xx_43xx_ipblock_data.c ++++ b/arch/arm/mach-omap2/omap_hwmod_33xx_43xx_ipblock_data.c +@@ -29,6 +29,7 @@ + #define CLKCTRL(oh, clkctrl) ((oh).prcm.omap4.clkctrl_offs = (clkctrl)) + #define RSTCTRL(oh, rstctrl) ((oh).prcm.omap4.rstctrl_offs = (rstctrl)) + #define RSTST(oh, rstst) ((oh).prcm.omap4.rstst_offs = (rstst)) ++#define PRCM_FLAGS(oh, flag) ((oh).prcm.omap4.flags = (flag)) + + /* + * 'l3' class +@@ -1296,6 +1297,7 @@ static void omap_hwmod_am33xx_clkctrl(void) + CLKCTRL(am33xx_i2c1_hwmod, AM33XX_CM_WKUP_I2C0_CLKCTRL_OFFSET); + CLKCTRL(am33xx_wd_timer1_hwmod, AM33XX_CM_WKUP_WDT1_CLKCTRL_OFFSET); + CLKCTRL(am33xx_rtc_hwmod, AM33XX_CM_RTC_RTC_CLKCTRL_OFFSET); ++ PRCM_FLAGS(am33xx_rtc_hwmod, HWMOD_OMAP4_ZERO_CLKCTRL_OFFSET); + CLKCTRL(am33xx_mmc2_hwmod, AM33XX_CM_PER_MMC2_CLKCTRL_OFFSET); + CLKCTRL(am33xx_gpmc_hwmod, AM33XX_CM_PER_GPMC_CLKCTRL_OFFSET); + CLKCTRL(am33xx_l4_ls_hwmod, AM33XX_CM_PER_L4LS_CLKCTRL_OFFSET); +From patchwork Tue Jul 12 17:50:33 2016 +Content-Type: text/plain; charset="utf-8" +MIME-Version: 1.0 +Content-Transfer-Encoding: 7bit +Subject: [3/4] ARM: OMAP4+: Have _omap4_wait_target_* check for valid + clkctrl_offs +From: Dave Gerlach +X-Patchwork-Id: 9225859 +Message-Id: <20160712175034.743-4-d-gerlach@ti.com> +To: , , + Tony Lindgren , Tero Kristo +Cc: Lokesh Vutla , Olof Johansson , + Paul Walmsley , Arnd Bergmann , + Dave Gerlach +Date: Tue, 12 Jul 2016 12:50:33 -0500 + +Previously the low-level CM call internal to the +_omap4_wait_target_ready/disable calls was responsible for checking for +a valid clkctrl_offs. Now we must also consider the value of the +prcm.omap4.flags because if HWMOD_OMAP4_ZERO_CLKCTRL_OFFSET is set in +the flags then clkctrl_offs of 0 is valid. + +Let's move this check into the _omap4_wait_target_ready/disable where we +have access to both the clkctrl_offs and the flags values and simply +return 0 without calling the low level CM call at all, which would have +returned 0 anyway if the clktrl_offs was zero. + +Signed-off-by: Dave Gerlach +--- + arch/arm/mach-omap2/omap_hwmod.c | 8 ++++++++ + 1 file changed, 8 insertions(+) + +diff --git a/arch/arm/mach-omap2/omap_hwmod.c b/arch/arm/mach-omap2/omap_hwmod.c +index 5b709383381c..1052b29697b8 100644 +--- a/arch/arm/mach-omap2/omap_hwmod.c ++++ b/arch/arm/mach-omap2/omap_hwmod.c +@@ -1053,6 +1053,10 @@ static int _omap4_wait_target_disable(struct omap_hwmod *oh) + if (oh->flags & HWMOD_NO_IDLEST) + return 0; + ++ if (!oh->prcm.omap4.clkctrl_offs && ++ !(oh->prcm.omap4.flags & HWMOD_OMAP4_ZERO_CLKCTRL_OFFSET)) ++ return 0; ++ + return omap_cm_wait_module_idle(oh->clkdm->prcm_partition, + oh->clkdm->cm_inst, + oh->prcm.omap4.clkctrl_offs, 0); +@@ -2971,6 +2975,10 @@ static int _omap4_wait_target_ready(struct omap_hwmod *oh) + if (!_find_mpu_rt_port(oh)) + return 0; + ++ if (!oh->prcm.omap4.clkctrl_offs && ++ !(oh->prcm.omap4.flags & HWMOD_OMAP4_ZERO_CLKCTRL_OFFSET)) ++ return 0; ++ + /* XXX check module SIDLEMODE, hardreset status */ + + return omap_cm_wait_module_ready(oh->clkdm->prcm_partition, +From patchwork Tue Jul 12 17:50:34 2016 +Content-Type: text/plain; charset="utf-8" +MIME-Version: 1.0 +Content-Transfer-Encoding: 7bit +Subject: [4/4] ARM: OMAP4+: CM: Remove redundant checks for clkctrl_offs of + zero +From: Dave Gerlach +X-Patchwork-Id: 9225863 +Message-Id: <20160712175034.743-5-d-gerlach@ti.com> +To: , , + Tony Lindgren , Tero Kristo +Cc: Lokesh Vutla , Olof Johansson , + Paul Walmsley , Arnd Bergmann , + Dave Gerlach +Date: Tue, 12 Jul 2016 12:50:34 -0500 + +Now that we have moved the check for valid clkctrl_offs to the caller of +am33xx_cm_wait_module_ready/idle and omap4_cminst_wait_module_ready/idle +let's remove the now redundant check for clkctrl_offs from these functions. + +Signed-off-by: Dave Gerlach +--- + arch/arm/mach-omap2/cm33xx.c | 6 ------ + arch/arm/mach-omap2/cminst44xx.c | 6 ------ + 2 files changed, 12 deletions(-) + +diff --git a/arch/arm/mach-omap2/cm33xx.c b/arch/arm/mach-omap2/cm33xx.c +index c073fb57dd13..6f2d0aec0513 100644 +--- a/arch/arm/mach-omap2/cm33xx.c ++++ b/arch/arm/mach-omap2/cm33xx.c +@@ -220,9 +220,6 @@ static int am33xx_cm_wait_module_ready(u8 part, s16 inst, u16 clkctrl_offs, + { + int i = 0; + +- if (!clkctrl_offs) +- return 0; +- + omap_test_timeout(_is_module_ready(inst, clkctrl_offs), + MAX_MODULE_READY_TIME, i); + +@@ -246,9 +243,6 @@ static int am33xx_cm_wait_module_idle(u8 part, s16 inst, u16 clkctrl_offs, + { + int i = 0; + +- if (!clkctrl_offs) +- return 0; +- + omap_test_timeout((_clkctrl_idlest(inst, clkctrl_offs) == + CLKCTRL_IDLEST_DISABLED), + MAX_MODULE_READY_TIME, i); +diff --git a/arch/arm/mach-omap2/cminst44xx.c b/arch/arm/mach-omap2/cminst44xx.c +index 2c0e07ed6b99..2ab27ade136a 100644 +--- a/arch/arm/mach-omap2/cminst44xx.c ++++ b/arch/arm/mach-omap2/cminst44xx.c +@@ -278,9 +278,6 @@ static int omap4_cminst_wait_module_ready(u8 part, s16 inst, u16 clkctrl_offs, + { + int i = 0; + +- if (!clkctrl_offs) +- return 0; +- + omap_test_timeout(_is_module_ready(part, inst, clkctrl_offs), + MAX_MODULE_READY_TIME, i); + +@@ -304,9 +301,6 @@ static int omap4_cminst_wait_module_idle(u8 part, s16 inst, u16 clkctrl_offs, + { + int i = 0; + +- if (!clkctrl_offs) +- return 0; +- + omap_test_timeout((_clkctrl_idlest(part, inst, clkctrl_offs) == + CLKCTRL_IDLEST_DISABLED), + MAX_MODULE_DISABLE_TIME, i);