Commit 7dedd346 authored by Rajendra Nayak's avatar Rajendra Nayak Committed by Paul Walmsley

ARM: OMAP2+: hwmod: Fix a crash in _setup_reset() with DEBUG_LL

With commit '82702ea1' "ARM: OMAP2+:
Fix serial init for device tree based booting" stubbing out
omap_serial_early_init() for Device tree based booting, there was a
crash observed on AM335x based devices when hwmod does a
_setup_reset() early at boot.

This was rootcaused to hwmod trying to reset console uart while
earlycon was using it.  The way to tell hwmod not to do this is to
specify the HWMOD_INIT_NO_RESET flag, which were infact set by the
omap_serial_early_init() function by parsing the cmdline to identify
the console device.

Parsing the cmdline to identify the uart used by earlycon itself seems
broken as there is nothing preventing earlycon to use a different one.

This patch, instead, attempts to populate the requiste flags for hwmod
based on the CONFIG_DEBUG_OMAPxUARTy FLAGS. This gets rid of the need
for cmdline parsing in the DT as well as non-DT cases to identify the
uart used by earlycon.
Signed-off-by: default avatarRajendra Nayak <rnayak@ti.com>
Reported-by: default avatarMark Jackson <mpfj-list@newflow.co.uk>
Reported-by: default avatarVaibhav Bedia <vaibhav.bedia@ti.com>
Tested-by: default avatarMark Jackson <mpfj-list@newflow.co.uk>
Signed-off-by: default avatarPaul Walmsley <paul@pwsan.com>
parent 5ae90d8e
...@@ -95,6 +95,54 @@ extern struct omap_hwmod_sysc_fields omap_hwmod_sysc_type3; ...@@ -95,6 +95,54 @@ extern struct omap_hwmod_sysc_fields omap_hwmod_sysc_type3;
#define MODULEMODE_HWCTRL 1 #define MODULEMODE_HWCTRL 1
#define MODULEMODE_SWCTRL 2 #define MODULEMODE_SWCTRL 2
#define DEBUG_OMAP2UART1_FLAGS 0
#define DEBUG_OMAP2UART2_FLAGS 0
#define DEBUG_OMAP2UART3_FLAGS 0
#define DEBUG_OMAP3UART3_FLAGS 0
#define DEBUG_OMAP3UART4_FLAGS 0
#define DEBUG_OMAP4UART3_FLAGS 0
#define DEBUG_OMAP4UART4_FLAGS 0
#define DEBUG_TI81XXUART1_FLAGS 0
#define DEBUG_TI81XXUART2_FLAGS 0
#define DEBUG_TI81XXUART3_FLAGS 0
#define DEBUG_AM33XXUART1_FLAGS 0
#define DEBUG_OMAPUART_FLAGS (HWMOD_INIT_NO_IDLE | HWMOD_INIT_NO_RESET)
#if defined(CONFIG_DEBUG_OMAP2UART1)
#undef DEBUG_OMAP2UART1_FLAGS
#define DEBUG_OMAP2UART1_FLAGS DEBUG_OMAPUART_FLAGS
#elif defined(CONFIG_DEBUG_OMAP2UART2)
#undef DEBUG_OMAP2UART2_FLAGS
#define DEBUG_OMAP2UART2_FLAGS DEBUG_OMAPUART_FLAGS
#elif defined(CONFIG_DEBUG_OMAP2UART3)
#undef DEBUG_OMAP2UART3_FLAGS
#define DEBUG_OMAP2UART3_FLAGS DEBUG_OMAPUART_FLAGS
#elif defined(CONFIG_DEBUG_OMAP3UART3)
#undef DEBUG_OMAP3UART3_FLAGS
#define DEBUG_OMAP3UART3_FLAGS DEBUG_OMAPUART_FLAGS
#elif defined(CONFIG_DEBUG_OMAP3UART4)
#undef DEBUG_OMAP3UART4_FLAGS
#define DEBUG_OMAP3UART4_FLAGS DEBUG_OMAPUART_FLAGS
#elif defined(CONFIG_DEBUG_OMAP4UART3)
#undef DEBUG_OMAP4UART3_FLAGS
#define DEBUG_OMAP4UART3_FLAGS DEBUG_OMAPUART_FLAGS
#elif defined(CONFIG_DEBUG_OMAP4UART4)
#undef DEBUG_OMAP4UART4_FLAGS
#define DEBUG_OMAP4UART4_FLAGS DEBUG_OMAPUART_FLAGS
#elif defined(CONFIG_DEBUG_TI81XXUART1)
#undef DEBUG_TI81XXUART1_FLAGS
#define DEBUG_TI81XXUART1_FLAGS DEBUG_OMAPUART_FLAGS
#elif defined(CONFIG_DEBUG_TI81XXUART2)
#undef DEBUG_TI81XXUART2_FLAGS
#define DEBUG_TI81XXUART2_FLAGS DEBUG_OMAPUART_FLAGS
#elif defined(CONFIG_DEBUG_TI81XXUART3)
#undef DEBUG_TI81XXUART3_FLAGS
#define DEBUG_TI81XXUART3_FLAGS DEBUG_OMAPUART_FLAGS
#elif defined(CONFIG_DEBUG_AM33XXUART1)
#undef DEBUG_AM33XXUART1_FLAGS
#define DEBUG_AM33XXUART1_FLAGS DEBUG_OMAPUART_FLAGS
#endif
/** /**
* struct omap_hwmod_mux_info - hwmod specific mux configuration * struct omap_hwmod_mux_info - hwmod specific mux configuration
......
...@@ -512,7 +512,7 @@ struct omap_hwmod omap2xxx_uart1_hwmod = { ...@@ -512,7 +512,7 @@ struct omap_hwmod omap2xxx_uart1_hwmod = {
.mpu_irqs = omap2_uart1_mpu_irqs, .mpu_irqs = omap2_uart1_mpu_irqs,
.sdma_reqs = omap2_uart1_sdma_reqs, .sdma_reqs = omap2_uart1_sdma_reqs,
.main_clk = "uart1_fck", .main_clk = "uart1_fck",
.flags = HWMOD_SWSUP_SIDLE_ACT, .flags = DEBUG_OMAP2UART1_FLAGS | HWMOD_SWSUP_SIDLE_ACT,
.prcm = { .prcm = {
.omap2 = { .omap2 = {
.module_offs = CORE_MOD, .module_offs = CORE_MOD,
...@@ -532,7 +532,7 @@ struct omap_hwmod omap2xxx_uart2_hwmod = { ...@@ -532,7 +532,7 @@ struct omap_hwmod omap2xxx_uart2_hwmod = {
.mpu_irqs = omap2_uart2_mpu_irqs, .mpu_irqs = omap2_uart2_mpu_irqs,
.sdma_reqs = omap2_uart2_sdma_reqs, .sdma_reqs = omap2_uart2_sdma_reqs,
.main_clk = "uart2_fck", .main_clk = "uart2_fck",
.flags = HWMOD_SWSUP_SIDLE_ACT, .flags = DEBUG_OMAP2UART2_FLAGS | HWMOD_SWSUP_SIDLE_ACT,
.prcm = { .prcm = {
.omap2 = { .omap2 = {
.module_offs = CORE_MOD, .module_offs = CORE_MOD,
...@@ -552,7 +552,7 @@ struct omap_hwmod omap2xxx_uart3_hwmod = { ...@@ -552,7 +552,7 @@ struct omap_hwmod omap2xxx_uart3_hwmod = {
.mpu_irqs = omap2_uart3_mpu_irqs, .mpu_irqs = omap2_uart3_mpu_irqs,
.sdma_reqs = omap2_uart3_sdma_reqs, .sdma_reqs = omap2_uart3_sdma_reqs,
.main_clk = "uart3_fck", .main_clk = "uart3_fck",
.flags = HWMOD_SWSUP_SIDLE_ACT, .flags = DEBUG_OMAP2UART3_FLAGS | HWMOD_SWSUP_SIDLE_ACT,
.prcm = { .prcm = {
.omap2 = { .omap2 = {
.module_offs = CORE_MOD, .module_offs = CORE_MOD,
......
...@@ -1512,7 +1512,7 @@ static struct omap_hwmod am33xx_uart1_hwmod = { ...@@ -1512,7 +1512,7 @@ static struct omap_hwmod am33xx_uart1_hwmod = {
.name = "uart1", .name = "uart1",
.class = &uart_class, .class = &uart_class,
.clkdm_name = "l4_wkup_clkdm", .clkdm_name = "l4_wkup_clkdm",
.flags = HWMOD_SWSUP_SIDLE_ACT, .flags = DEBUG_AM33XXUART1_FLAGS | HWMOD_SWSUP_SIDLE_ACT,
.main_clk = "dpll_per_m2_div4_wkupdm_ck", .main_clk = "dpll_per_m2_div4_wkupdm_ck",
.prcm = { .prcm = {
.omap4 = { .omap4 = {
......
...@@ -490,7 +490,7 @@ static struct omap_hwmod omap3xxx_uart1_hwmod = { ...@@ -490,7 +490,7 @@ static struct omap_hwmod omap3xxx_uart1_hwmod = {
.mpu_irqs = omap2_uart1_mpu_irqs, .mpu_irqs = omap2_uart1_mpu_irqs,
.sdma_reqs = omap2_uart1_sdma_reqs, .sdma_reqs = omap2_uart1_sdma_reqs,
.main_clk = "uart1_fck", .main_clk = "uart1_fck",
.flags = HWMOD_SWSUP_SIDLE_ACT, .flags = DEBUG_TI81XXUART1_FLAGS | HWMOD_SWSUP_SIDLE_ACT,
.prcm = { .prcm = {
.omap2 = { .omap2 = {
.module_offs = CORE_MOD, .module_offs = CORE_MOD,
...@@ -509,7 +509,7 @@ static struct omap_hwmod omap3xxx_uart2_hwmod = { ...@@ -509,7 +509,7 @@ static struct omap_hwmod omap3xxx_uart2_hwmod = {
.mpu_irqs = omap2_uart2_mpu_irqs, .mpu_irqs = omap2_uart2_mpu_irqs,
.sdma_reqs = omap2_uart2_sdma_reqs, .sdma_reqs = omap2_uart2_sdma_reqs,
.main_clk = "uart2_fck", .main_clk = "uart2_fck",
.flags = HWMOD_SWSUP_SIDLE_ACT, .flags = DEBUG_TI81XXUART2_FLAGS | HWMOD_SWSUP_SIDLE_ACT,
.prcm = { .prcm = {
.omap2 = { .omap2 = {
.module_offs = CORE_MOD, .module_offs = CORE_MOD,
...@@ -528,7 +528,8 @@ static struct omap_hwmod omap3xxx_uart3_hwmod = { ...@@ -528,7 +528,8 @@ static struct omap_hwmod omap3xxx_uart3_hwmod = {
.mpu_irqs = omap2_uart3_mpu_irqs, .mpu_irqs = omap2_uart3_mpu_irqs,
.sdma_reqs = omap2_uart3_sdma_reqs, .sdma_reqs = omap2_uart3_sdma_reqs,
.main_clk = "uart3_fck", .main_clk = "uart3_fck",
.flags = HWMOD_SWSUP_SIDLE_ACT, .flags = DEBUG_OMAP3UART3_FLAGS | DEBUG_TI81XXUART3_FLAGS |
HWMOD_SWSUP_SIDLE_ACT,
.prcm = { .prcm = {
.omap2 = { .omap2 = {
.module_offs = OMAP3430_PER_MOD, .module_offs = OMAP3430_PER_MOD,
...@@ -558,7 +559,7 @@ static struct omap_hwmod omap36xx_uart4_hwmod = { ...@@ -558,7 +559,7 @@ static struct omap_hwmod omap36xx_uart4_hwmod = {
.mpu_irqs = uart4_mpu_irqs, .mpu_irqs = uart4_mpu_irqs,
.sdma_reqs = uart4_sdma_reqs, .sdma_reqs = uart4_sdma_reqs,
.main_clk = "uart4_fck", .main_clk = "uart4_fck",
.flags = HWMOD_SWSUP_SIDLE_ACT, .flags = DEBUG_OMAP3UART4_FLAGS | HWMOD_SWSUP_SIDLE_ACT,
.prcm = { .prcm = {
.omap2 = { .omap2 = {
.module_offs = OMAP3430_PER_MOD, .module_offs = OMAP3430_PER_MOD,
......
...@@ -2858,8 +2858,7 @@ static struct omap_hwmod omap44xx_uart3_hwmod = { ...@@ -2858,8 +2858,7 @@ static struct omap_hwmod omap44xx_uart3_hwmod = {
.name = "uart3", .name = "uart3",
.class = &omap44xx_uart_hwmod_class, .class = &omap44xx_uart_hwmod_class,
.clkdm_name = "l4_per_clkdm", .clkdm_name = "l4_per_clkdm",
.flags = HWMOD_INIT_NO_IDLE | HWMOD_INIT_NO_RESET | .flags = DEBUG_OMAP4UART3_FLAGS | HWMOD_SWSUP_SIDLE_ACT,
HWMOD_SWSUP_SIDLE_ACT,
.main_clk = "func_48m_fclk", .main_clk = "func_48m_fclk",
.prcm = { .prcm = {
.omap4 = { .omap4 = {
...@@ -2875,7 +2874,7 @@ static struct omap_hwmod omap44xx_uart4_hwmod = { ...@@ -2875,7 +2874,7 @@ static struct omap_hwmod omap44xx_uart4_hwmod = {
.name = "uart4", .name = "uart4",
.class = &omap44xx_uart_hwmod_class, .class = &omap44xx_uart_hwmod_class,
.clkdm_name = "l4_per_clkdm", .clkdm_name = "l4_per_clkdm",
.flags = HWMOD_SWSUP_SIDLE_ACT, .flags = DEBUG_OMAP4UART4_FLAGS | HWMOD_SWSUP_SIDLE_ACT,
.main_clk = "func_48m_fclk", .main_clk = "func_48m_fclk",
.prcm = { .prcm = {
.omap4 = { .omap4 = {
......
...@@ -1375,7 +1375,7 @@ static struct omap_hwmod omap54xx_uart3_hwmod = { ...@@ -1375,7 +1375,7 @@ static struct omap_hwmod omap54xx_uart3_hwmod = {
.name = "uart3", .name = "uart3",
.class = &omap54xx_uart_hwmod_class, .class = &omap54xx_uart_hwmod_class,
.clkdm_name = "l4per_clkdm", .clkdm_name = "l4per_clkdm",
.flags = HWMOD_INIT_NO_IDLE | HWMOD_INIT_NO_RESET, .flags = DEBUG_OMAP4UART3_FLAGS,
.main_clk = "func_48m_fclk", .main_clk = "func_48m_fclk",
.prcm = { .prcm = {
.omap4 = { .omap4 = {
...@@ -1391,6 +1391,7 @@ static struct omap_hwmod omap54xx_uart4_hwmod = { ...@@ -1391,6 +1391,7 @@ static struct omap_hwmod omap54xx_uart4_hwmod = {
.name = "uart4", .name = "uart4",
.class = &omap54xx_uart_hwmod_class, .class = &omap54xx_uart_hwmod_class,
.clkdm_name = "l4per_clkdm", .clkdm_name = "l4per_clkdm",
.flags = DEBUG_OMAP4UART4_FLAGS,
.main_clk = "func_48m_fclk", .main_clk = "func_48m_fclk",
.prcm = { .prcm = {
.omap4 = { .omap4 = {
......
...@@ -208,17 +208,6 @@ static int __init omap_serial_early_init(void) ...@@ -208,17 +208,6 @@ static int __init omap_serial_early_init(void)
pr_info("%s used as console in debug mode: uart%d clocks will not be gated", pr_info("%s used as console in debug mode: uart%d clocks will not be gated",
uart_name, uart->num); uart_name, uart->num);
} }
/*
* omap-uart can be used for earlyprintk logs
* So if omap-uart is used as console then prevent
* uart reset and idle to get logs from omap-uart
* until uart console driver is available to take
* care for console messages.
* Idling or resetting omap-uart while printing logs
* early boot logs can stall the boot-up.
*/
oh->flags |= HWMOD_INIT_NO_IDLE | HWMOD_INIT_NO_RESET;
} }
} while (1); } while (1);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment