* [PATCH v4 1/8] clk: imx: add common logic to detect early UART usage
2015-09-21 16:53 [PATCH v4 0/8] i.MX early debug UART clock fixes Lucas Stach
@ 2015-09-21 16:53 ` Lucas Stach
2015-09-21 17:56 ` Fabio Estevam
2015-09-21 16:53 ` [PATCH v4 2/8] clk: imx25: retain early UART clocks during kernel init Lucas Stach
` (7 subsequent siblings)
8 siblings, 1 reply; 14+ messages in thread
From: Lucas Stach @ 2015-09-21 16:53 UTC (permalink / raw)
To: linux-arm-kernel
Both earlycon and eralyprintk depend on the bootloader setup UART
clocks being retained. This patch adds the common logic to detect such
situations and make the information available to the clock drivers, as
well as adding the facilities to disable those clocks at the end of
the kernel init.
Signed-off-by: Lucas Stach <l.stach@pengutronix.de>
---
drivers/clk/imx/clk.c | 38 ++++++++++++++++++++++++++++++++++++++
drivers/clk/imx/clk.h | 1 +
2 files changed, 39 insertions(+)
diff --git a/drivers/clk/imx/clk.c b/drivers/clk/imx/clk.c
index df12b5307175..a634b1185be3 100644
--- a/drivers/clk/imx/clk.c
+++ b/drivers/clk/imx/clk.c
@@ -73,3 +73,41 @@ void imx_cscmr1_fixup(u32 *val)
*val ^= CSCMR1_FIXUP;
return;
}
+
+static int imx_keep_uart_clocks __initdata;
+static struct clk ** const *imx_uart_clocks __initdata;
+
+static int __init imx_keep_uart_clocks_param(char *str)
+{
+ imx_keep_uart_clocks = 1;
+
+ return 0;
+}
+__setup_param("earlycon", imx_keep_uart_earlycon,
+ imx_keep_uart_clocks_param, 0);
+__setup_param("earlyprintk", imx_keep_uart_earlyprintk,
+ imx_keep_uart_clocks_param, 0);
+
+void __init imx_register_uart_clocks(struct clk ** const clks[])
+{
+ if (imx_keep_uart_clocks) {
+ int i;
+
+ imx_uart_clocks = clks;
+ for (i = 0; imx_uart_clocks[i]; i++)
+ clk_prepare_enable(*imx_uart_clocks[i]);
+ }
+}
+
+static int __init imx_clk_disable_uart(void)
+{
+ if (imx_keep_uart_clocks && imx_uart_clocks) {
+ int i;
+
+ for (i = 0; imx_uart_clocks[i]; i++)
+ clk_disable_unprepare(*imx_uart_clocks[i]);
+ }
+
+ return 0;
+}
+late_initcall_sync(imx_clk_disable_uart);
diff --git a/drivers/clk/imx/clk.h b/drivers/clk/imx/clk.h
index 1049b0c7d818..c94ac5c26226 100644
--- a/drivers/clk/imx/clk.h
+++ b/drivers/clk/imx/clk.h
@@ -7,6 +7,7 @@
extern spinlock_t imx_ccm_lock;
void imx_check_clocks(struct clk *clks[], unsigned int count);
+void imx_register_uart_clocks(struct clk ** const clks[]);
extern void imx_cscmr1_fixup(u32 *val);
--
2.5.1
^ permalink raw reply related [flat|nested] 14+ messages in thread* [PATCH v4 1/8] clk: imx: add common logic to detect early UART usage
2015-09-21 16:53 ` [PATCH v4 1/8] clk: imx: add common logic to detect early UART usage Lucas Stach
@ 2015-09-21 17:56 ` Fabio Estevam
2015-09-23 10:02 ` Lucas Stach
0 siblings, 1 reply; 14+ messages in thread
From: Fabio Estevam @ 2015-09-21 17:56 UTC (permalink / raw)
To: linux-arm-kernel
On Mon, Sep 21, 2015 at 1:53 PM, Lucas Stach <l.stach@pengutronix.de> wrote:
> Both earlycon and eralyprintk depend on the bootloader setup UART
s/eralyprintk/earlyprintk
> clocks being retained. This patch adds the common logic to detect such
> situations and make the information available to the clock drivers, as
> well as adding the facilities to disable those clocks at the end of
> the kernel init.
> +void __init imx_register_uart_clocks(struct clk ** const clks[])
> +{
> + if (imx_keep_uart_clocks) {
> + int i;
> +
> + imx_uart_clocks = clks;
> + for (i = 0; imx_uart_clocks[i]; i++)
> + clk_prepare_enable(*imx_uart_clocks[i]);
It would be better to check the return value from clk_prepare_enable()
and propagate it in the case of error.
> +
> +static int __init imx_clk_disable_uart(void)
> +{
> + if (imx_keep_uart_clocks && imx_uart_clocks) {
> + int i;
> +
> + for (i = 0; imx_uart_clocks[i]; i++)
> + clk_disable_unprepare(*imx_uart_clocks[i]);
> + }
> +
> + return 0;
This function could be made 'void' instead.
^ permalink raw reply [flat|nested] 14+ messages in thread* [PATCH v4 1/8] clk: imx: add common logic to detect early UART usage
2015-09-21 17:56 ` Fabio Estevam
@ 2015-09-23 10:02 ` Lucas Stach
0 siblings, 0 replies; 14+ messages in thread
From: Lucas Stach @ 2015-09-23 10:02 UTC (permalink / raw)
To: linux-arm-kernel
Am Montag, den 21.09.2015, 14:56 -0300 schrieb Fabio Estevam:
> On Mon, Sep 21, 2015 at 1:53 PM, Lucas Stach <l.stach@pengutronix.de> wrote:
> > Both earlycon and eralyprintk depend on the bootloader setup UART
>
> s/eralyprintk/earlyprintk
>
> > clocks being retained. This patch adds the common logic to detect such
> > situations and make the information available to the clock drivers, as
> > well as adding the facilities to disable those clocks at the end of
> > the kernel init.
>
> > +void __init imx_register_uart_clocks(struct clk ** const clks[])
> > +{
> > + if (imx_keep_uart_clocks) {
> > + int i;
> > +
> > + imx_uart_clocks = clks;
> > + for (i = 0; imx_uart_clocks[i]; i++)
> > + clk_prepare_enable(*imx_uart_clocks[i]);
>
> It would be better to check the return value from clk_prepare_enable()
> and propagate it in the case of error.
>
I don't see any value of that. We certainly don't want to abort probing
of the clock driver just because keeping the debug UART clocks enabled
did not work. Everything in this series is about improving the debug
experience, so I'm not a fan of adding code that makes it more likely to
break (possibly unrelated) things.
> > +
> > +static int __init imx_clk_disable_uart(void)
> > +{
> > + if (imx_keep_uart_clocks && imx_uart_clocks) {
> > + int i;
> > +
> > + for (i = 0; imx_uart_clocks[i]; i++)
> > + clk_disable_unprepare(*imx_uart_clocks[i]);
> > + }
> > +
> > + return 0;
>
> This function could be made 'void' instead.
This is an initcall, which have a fixed function prototype.
Regards,
Lucas
--
Pengutronix e.K. | Lucas Stach |
Industrial Linux Solutions | http://www.pengutronix.de/ |
^ permalink raw reply [flat|nested] 14+ messages in thread
* [PATCH v4 2/8] clk: imx25: retain early UART clocks during kernel init
2015-09-21 16:53 [PATCH v4 0/8] i.MX early debug UART clock fixes Lucas Stach
2015-09-21 16:53 ` [PATCH v4 1/8] clk: imx: add common logic to detect early UART usage Lucas Stach
@ 2015-09-21 16:53 ` Lucas Stach
2015-09-21 16:53 ` [PATCH v4 3/8] clk: imx27: " Lucas Stach
` (6 subsequent siblings)
8 siblings, 0 replies; 14+ messages in thread
From: Lucas Stach @ 2015-09-21 16:53 UTC (permalink / raw)
To: linux-arm-kernel
Make sure to keep UART clocks enabled during kernel init if
earlyprintk or earlycon are active.
Signed-off-by: Lucas Stach <l.stach@pengutronix.de>
---
drivers/clk/imx/clk-imx25.c | 12 ++++++++++++
1 file changed, 12 insertions(+)
diff --git a/drivers/clk/imx/clk-imx25.c b/drivers/clk/imx/clk-imx25.c
index ec1a4c1dacf1..c4c141cab444 100644
--- a/drivers/clk/imx/clk-imx25.c
+++ b/drivers/clk/imx/clk-imx25.c
@@ -86,6 +86,16 @@ enum mx25_clks {
static struct clk *clk[clk_max];
+static struct clk ** const uart_clks[] __initconst = {
+ &clk[uart_ipg_per],
+ &clk[uart1_ipg],
+ &clk[uart2_ipg],
+ &clk[uart3_ipg],
+ &clk[uart4_ipg],
+ &clk[uart5_ipg],
+ NULL
+};
+
static int __init __mx25_clocks_init(unsigned long osc_rate,
void __iomem *ccm_base)
{
@@ -233,6 +243,8 @@ static int __init __mx25_clocks_init(unsigned long osc_rate,
*/
clk_set_parent(clk[cko_sel], clk[ipg]);
+ imx_register_uart_clocks(uart_clks);
+
return 0;
}
--
2.5.1
^ permalink raw reply related [flat|nested] 14+ messages in thread* [PATCH v4 3/8] clk: imx27: retain early UART clocks during kernel init
2015-09-21 16:53 [PATCH v4 0/8] i.MX early debug UART clock fixes Lucas Stach
2015-09-21 16:53 ` [PATCH v4 1/8] clk: imx: add common logic to detect early UART usage Lucas Stach
2015-09-21 16:53 ` [PATCH v4 2/8] clk: imx25: retain early UART clocks during kernel init Lucas Stach
@ 2015-09-21 16:53 ` Lucas Stach
2015-09-21 16:54 ` [PATCH v4 4/8] clk: imx31: " Lucas Stach
` (5 subsequent siblings)
8 siblings, 0 replies; 14+ messages in thread
From: Lucas Stach @ 2015-09-21 16:53 UTC (permalink / raw)
To: linux-arm-kernel
Make sure to keep UART clocks enabled during kernel init if
earlyprintk or earlycon are active.
Signed-off-by: Lucas Stach <l.stach@pengutronix.de>
---
drivers/clk/imx/clk-imx27.c | 13 +++++++++++++
1 file changed, 13 insertions(+)
diff --git a/drivers/clk/imx/clk-imx27.c b/drivers/clk/imx/clk-imx27.c
index d9d50d54ef2a..0d7b8df04dfa 100644
--- a/drivers/clk/imx/clk-imx27.c
+++ b/drivers/clk/imx/clk-imx27.c
@@ -47,6 +47,17 @@ static const char *ssi_sel_clks[] = { "spll_gate", "mpll", };
static struct clk *clk[IMX27_CLK_MAX];
static struct clk_onecell_data clk_data;
+static struct clk ** const uart_clks[] __initconst = {
+ &clk[IMX27_CLK_PER1_GATE],
+ &clk[IMX27_CLK_UART1_IPG_GATE],
+ &clk[IMX27_CLK_UART2_IPG_GATE],
+ &clk[IMX27_CLK_UART3_IPG_GATE],
+ &clk[IMX27_CLK_UART4_IPG_GATE],
+ &clk[IMX27_CLK_UART5_IPG_GATE],
+ &clk[IMX27_CLK_UART6_IPG_GATE],
+ NULL
+};
+
static void __init _mx27_clocks_init(unsigned long fref)
{
BUG_ON(!ccm);
@@ -163,6 +174,8 @@ static void __init _mx27_clocks_init(unsigned long fref)
clk_prepare_enable(clk[IMX27_CLK_EMI_AHB_GATE]);
+ imx_register_uart_clocks(uart_clks);
+
imx_print_silicon_rev("i.MX27", mx27_revision());
}
--
2.5.1
^ permalink raw reply related [flat|nested] 14+ messages in thread* [PATCH v4 4/8] clk: imx31: retain early UART clocks during kernel init
2015-09-21 16:53 [PATCH v4 0/8] i.MX early debug UART clock fixes Lucas Stach
` (2 preceding siblings ...)
2015-09-21 16:53 ` [PATCH v4 3/8] clk: imx27: " Lucas Stach
@ 2015-09-21 16:54 ` Lucas Stach
2015-09-21 16:54 ` [PATCH v4 5/8] clk: imx35: " Lucas Stach
` (4 subsequent siblings)
8 siblings, 0 replies; 14+ messages in thread
From: Lucas Stach @ 2015-09-21 16:54 UTC (permalink / raw)
To: linux-arm-kernel
Make sure to keep UART clocks enabled during kernel init if
earlyprintk or earlycon are active.
Signed-off-by: Lucas Stach <l.stach@pengutronix.de>
---
drivers/clk/imx/clk-imx31.c | 12 ++++++++++++
1 file changed, 12 insertions(+)
diff --git a/drivers/clk/imx/clk-imx31.c b/drivers/clk/imx/clk-imx31.c
index 1f8383475bb3..5520e20eaceb 100644
--- a/drivers/clk/imx/clk-imx31.c
+++ b/drivers/clk/imx/clk-imx31.c
@@ -62,6 +62,16 @@ enum mx31_clks {
static struct clk *clk[clk_max];
static struct clk_onecell_data clk_data;
+static struct clk ** const uart_clks[] __initconst = {
+ &clk[ipg],
+ &clk[uart1_gate],
+ &clk[uart2_gate],
+ &clk[uart3_gate],
+ &clk[uart4_gate],
+ &clk[uart5_gate],
+ NULL
+};
+
int __init mx31_clocks_init(unsigned long fref)
{
void __iomem *base;
@@ -200,6 +210,8 @@ int __init mx31_clocks_init(unsigned long fref)
mx31_revision();
clk_disable_unprepare(clk[iim_gate]);
+ imx_register_uart_clocks(uart_clks);
+
mxc_timer_init(MX31_GPT1_BASE_ADDR, MX31_INT_GPT, GPT_TYPE_IMX31);
return 0;
--
2.5.1
^ permalink raw reply related [flat|nested] 14+ messages in thread* [PATCH v4 5/8] clk: imx35: retain early UART clocks during kernel init
2015-09-21 16:53 [PATCH v4 0/8] i.MX early debug UART clock fixes Lucas Stach
` (3 preceding siblings ...)
2015-09-21 16:54 ` [PATCH v4 4/8] clk: imx31: " Lucas Stach
@ 2015-09-21 16:54 ` Lucas Stach
2015-09-21 16:54 ` [PATCH v4 6/8] clk: imx5: " Lucas Stach
` (3 subsequent siblings)
8 siblings, 0 replies; 14+ messages in thread
From: Lucas Stach @ 2015-09-21 16:54 UTC (permalink / raw)
To: linux-arm-kernel
Make sure to keep UART clocks enabled during kernel init if
earlyprintk or earlycon are active.
Signed-off-by: Lucas Stach <l.stach@pengutronix.de>
---
drivers/clk/imx/clk-imx35.c | 10 ++++++++++
1 file changed, 10 insertions(+)
diff --git a/drivers/clk/imx/clk-imx35.c b/drivers/clk/imx/clk-imx35.c
index 8623cd4e49fd..ba8b33328a8d 100644
--- a/drivers/clk/imx/clk-imx35.c
+++ b/drivers/clk/imx/clk-imx35.c
@@ -84,6 +84,14 @@ enum mx35_clks {
static struct clk *clk[clk_max];
+static struct clk ** const uart_clks[] __initconst = {
+ &clk[ipg],
+ &clk[uart1_gate],
+ &clk[uart2_gate],
+ &clk[uart3_gate],
+ NULL
+};
+
int __init mx35_clocks_init(void)
{
void __iomem *base;
@@ -296,6 +304,8 @@ int __init mx35_clocks_init(void)
*/
clk_prepare_enable(clk[scc_gate]);
+ imx_register_uart_clocks(uart_clks);
+
imx_print_silicon_rev("i.MX35", mx35_revision());
mxc_timer_init(MX35_GPT1_BASE_ADDR, MX35_INT_GPT, GPT_TYPE_IMX31);
--
2.5.1
^ permalink raw reply related [flat|nested] 14+ messages in thread* [PATCH v4 6/8] clk: imx5: retain early UART clocks during kernel init
2015-09-21 16:53 [PATCH v4 0/8] i.MX early debug UART clock fixes Lucas Stach
` (4 preceding siblings ...)
2015-09-21 16:54 ` [PATCH v4 5/8] clk: imx35: " Lucas Stach
@ 2015-09-21 16:54 ` Lucas Stach
2015-09-21 16:54 ` [PATCH v4 7/8] clk: imx6: " Lucas Stach
` (2 subsequent siblings)
8 siblings, 0 replies; 14+ messages in thread
From: Lucas Stach @ 2015-09-21 16:54 UTC (permalink / raw)
To: linux-arm-kernel
Make sure to keep UART clocks enabled during kernel init if
earlyprintk or earlycon are active.
Signed-off-by: Lucas Stach <l.stach@pengutronix.de>
---
drivers/clk/imx/clk-imx51-imx53.c | 16 ++++++++++++++++
1 file changed, 16 insertions(+)
diff --git a/drivers/clk/imx/clk-imx51-imx53.c b/drivers/clk/imx/clk-imx51-imx53.c
index a7e4f394be0d..c6770348d2ab 100644
--- a/drivers/clk/imx/clk-imx51-imx53.c
+++ b/drivers/clk/imx/clk-imx51-imx53.c
@@ -130,6 +130,20 @@ static const char *cpu_podf_sels[] = { "pll1_sw", "step_sel" };
static struct clk *clk[IMX5_CLK_END];
static struct clk_onecell_data clk_data;
+static struct clk ** const uart_clks[] __initconst = {
+ &clk[IMX5_CLK_UART1_IPG_GATE],
+ &clk[IMX5_CLK_UART1_PER_GATE],
+ &clk[IMX5_CLK_UART2_IPG_GATE],
+ &clk[IMX5_CLK_UART2_PER_GATE],
+ &clk[IMX5_CLK_UART3_IPG_GATE],
+ &clk[IMX5_CLK_UART3_PER_GATE],
+ &clk[IMX5_CLK_UART4_IPG_GATE],
+ &clk[IMX5_CLK_UART4_PER_GATE],
+ &clk[IMX5_CLK_UART5_IPG_GATE],
+ &clk[IMX5_CLK_UART5_PER_GATE],
+ NULL
+};
+
static void __init mx5_clocks_common_init(void __iomem *ccm_base)
{
clk[IMX5_CLK_DUMMY] = imx_clk_fixed("dummy", 0);
@@ -310,6 +324,8 @@ static void __init mx5_clocks_common_init(void __iomem *ccm_base)
clk_prepare_enable(clk[IMX5_CLK_TMAX1]);
clk_prepare_enable(clk[IMX5_CLK_TMAX2]); /* esdhc2, fec */
clk_prepare_enable(clk[IMX5_CLK_TMAX3]); /* esdhc1, esdhc4 */
+
+ imx_register_uart_clocks(uart_clks);
}
static void __init mx50_clocks_init(struct device_node *np)
--
2.5.1
^ permalink raw reply related [flat|nested] 14+ messages in thread* [PATCH v4 7/8] clk: imx6: retain early UART clocks during kernel init
2015-09-21 16:53 [PATCH v4 0/8] i.MX early debug UART clock fixes Lucas Stach
` (5 preceding siblings ...)
2015-09-21 16:54 ` [PATCH v4 6/8] clk: imx5: " Lucas Stach
@ 2015-09-21 16:54 ` Lucas Stach
2015-09-21 16:54 ` [PATCH v4 8/8] clk: imx7d: " Lucas Stach
2015-09-24 15:20 ` [PATCH v4 0/8] i.MX early debug UART clock fixes Shawn Guo
8 siblings, 0 replies; 14+ messages in thread
From: Lucas Stach @ 2015-09-21 16:54 UTC (permalink / raw)
To: linux-arm-kernel
Make sure to keep UART clocks enabled during kernel init if
earlyprintk or earlycon are active.
Signed-off-by: Lucas Stach <l.stach@pengutronix.de>
---
drivers/clk/imx/clk-imx6q.c | 8 ++++++++
drivers/clk/imx/clk-imx6sl.c | 8 ++++++++
drivers/clk/imx/clk-imx6sx.c | 8 ++++++++
3 files changed, 24 insertions(+)
diff --git a/drivers/clk/imx/clk-imx6q.c b/drivers/clk/imx/clk-imx6q.c
index b2c1c047dc94..e9ba018ac6a3 100644
--- a/drivers/clk/imx/clk-imx6q.c
+++ b/drivers/clk/imx/clk-imx6q.c
@@ -130,6 +130,12 @@ static inline int clk_on_imx6dl(void)
return of_machine_is_compatible("fsl,imx6dl");
}
+static struct clk ** const uart_clks[] __initconst = {
+ &clk[IMX6QDL_CLK_UART_IPG],
+ &clk[IMX6QDL_CLK_UART_SERIAL],
+ NULL
+};
+
static void __init imx6q_clocks_init(struct device_node *ccm_node)
{
struct device_node *np;
@@ -541,5 +547,7 @@ static void __init imx6q_clocks_init(struct device_node *ccm_node)
/* All existing boards with PCIe use LVDS1 */
if (IS_ENABLED(CONFIG_PCI_IMX6))
clk_set_parent(clk[IMX6QDL_CLK_LVDS1_SEL], clk[IMX6QDL_CLK_SATA_REF_100M]);
+
+ imx_register_uart_clocks(uart_clks);
}
CLK_OF_DECLARE(imx6q, "fsl,imx6q-ccm", imx6q_clocks_init);
diff --git a/drivers/clk/imx/clk-imx6sl.c b/drivers/clk/imx/clk-imx6sl.c
index a0d4cf26cfa9..3c3333faae8e 100644
--- a/drivers/clk/imx/clk-imx6sl.c
+++ b/drivers/clk/imx/clk-imx6sl.c
@@ -184,6 +184,12 @@ void imx6sl_set_wait_clk(bool enter)
imx6sl_enable_pll_arm(false);
}
+static struct clk ** const uart_clks[] __initconst = {
+ &clks[IMX6SL_CLK_UART],
+ &clks[IMX6SL_CLK_UART_SERIAL],
+ NULL
+};
+
static void __init imx6sl_clocks_init(struct device_node *ccm_node)
{
struct device_node *np;
@@ -439,5 +445,7 @@ static void __init imx6sl_clocks_init(struct device_node *ccm_node)
clk_set_parent(clks[IMX6SL_CLK_LCDIF_AXI_SEL],
clks[IMX6SL_CLK_PLL2_PFD2]);
+
+ imx_register_uart_clocks(uart_clks);
}
CLK_OF_DECLARE(imx6sl, "fsl,imx6sl-ccm", imx6sl_clocks_init);
diff --git a/drivers/clk/imx/clk-imx6sx.c b/drivers/clk/imx/clk-imx6sx.c
index 5b95c2c2bf52..f0ad8bbc12f8 100644
--- a/drivers/clk/imx/clk-imx6sx.c
+++ b/drivers/clk/imx/clk-imx6sx.c
@@ -135,6 +135,12 @@ static u32 share_count_ssi1;
static u32 share_count_ssi2;
static u32 share_count_ssi3;
+static struct clk ** const uart_clks[] __initconst = {
+ &clks[IMX6SX_CLK_UART_IPG],
+ &clks[IMX6SX_CLK_UART_SERIAL],
+ NULL
+};
+
static void __init imx6sx_clocks_init(struct device_node *ccm_node)
{
struct device_node *np;
@@ -557,5 +563,7 @@ static void __init imx6sx_clocks_init(struct device_node *ccm_node)
clk_set_parent(clks[IMX6SX_CLK_QSPI1_SEL], clks[IMX6SX_CLK_PLL2_BUS]);
clk_set_parent(clks[IMX6SX_CLK_QSPI2_SEL], clks[IMX6SX_CLK_PLL2_BUS]);
+
+ imx_register_uart_clocks(uart_clks);
}
CLK_OF_DECLARE(imx6sx, "fsl,imx6sx-ccm", imx6sx_clocks_init);
--
2.5.1
^ permalink raw reply related [flat|nested] 14+ messages in thread* [PATCH v4 8/8] clk: imx7d: retain early UART clocks during kernel init
2015-09-21 16:53 [PATCH v4 0/8] i.MX early debug UART clock fixes Lucas Stach
` (6 preceding siblings ...)
2015-09-21 16:54 ` [PATCH v4 7/8] clk: imx6: " Lucas Stach
@ 2015-09-21 16:54 ` Lucas Stach
2015-09-24 15:20 ` [PATCH v4 0/8] i.MX early debug UART clock fixes Shawn Guo
8 siblings, 0 replies; 14+ messages in thread
From: Lucas Stach @ 2015-09-21 16:54 UTC (permalink / raw)
To: linux-arm-kernel
Make sure to keep UART clocks enabled during kernel init if
earlyprintk or earlycon are active.
Signed-off-by: Lucas Stach <l.stach@pengutronix.de>
---
drivers/clk/imx/clk-imx7d.c | 13 +++++++++++++
1 file changed, 13 insertions(+)
diff --git a/drivers/clk/imx/clk-imx7d.c b/drivers/clk/imx/clk-imx7d.c
index 71f3a94b472c..f86b68049872 100644
--- a/drivers/clk/imx/clk-imx7d.c
+++ b/drivers/clk/imx/clk-imx7d.c
@@ -363,6 +363,17 @@ static const char *pll_video_bypass_sel[] = { "pll_video_main", "pll_video_main_
static struct clk_onecell_data clk_data;
+static struct clk ** const uart_clks[] __initconst = {
+ &clks[IMX7D_UART1_ROOT_CLK],
+ &clks[IMX7D_UART2_ROOT_CLK],
+ &clks[IMX7D_UART3_ROOT_CLK],
+ &clks[IMX7D_UART4_ROOT_CLK],
+ &clks[IMX7D_UART5_ROOT_CLK],
+ &clks[IMX7D_UART6_ROOT_CLK],
+ &clks[IMX7D_UART7_ROOT_CLK],
+ NULL
+};
+
static void __init imx7d_clocks_init(struct device_node *ccm_node)
{
struct device_node *np;
@@ -856,5 +867,7 @@ static void __init imx7d_clocks_init(struct device_node *ccm_node)
/* set uart module clock's parent clock source that must be great then 80MHz */
clk_set_parent(clks[IMX7D_UART1_ROOT_SRC], clks[IMX7D_OSC_24M_CLK]);
+ imx_register_uart_clocks(uart_clks);
+
}
CLK_OF_DECLARE(imx7d, "fsl,imx7d-ccm", imx7d_clocks_init);
--
2.5.1
^ permalink raw reply related [flat|nested] 14+ messages in thread* [PATCH v4 0/8] i.MX early debug UART clock fixes
2015-09-21 16:53 [PATCH v4 0/8] i.MX early debug UART clock fixes Lucas Stach
` (7 preceding siblings ...)
2015-09-21 16:54 ` [PATCH v4 8/8] clk: imx7d: " Lucas Stach
@ 2015-09-24 15:20 ` Shawn Guo
2015-09-24 15:36 ` Lucas Stach
8 siblings, 1 reply; 14+ messages in thread
From: Shawn Guo @ 2015-09-24 15:20 UTC (permalink / raw)
To: linux-arm-kernel
On Mon, Sep 21, 2015 at 06:53:56PM +0200, Lucas Stach wrote:
> This series fixes a long standing interaction issue between the
> kernels early debug facilities and the i.MX clock drivers.
This is fixing some issue but not regression. As the change basically
has influence on all i.MX platforms, my take is that we should get them
into linux-next for extensive testing and queue for 4.4. Agree?
Shawn
^ permalink raw reply [flat|nested] 14+ messages in thread* [PATCH v4 0/8] i.MX early debug UART clock fixes
2015-09-24 15:20 ` [PATCH v4 0/8] i.MX early debug UART clock fixes Shawn Guo
@ 2015-09-24 15:36 ` Lucas Stach
2015-10-02 19:45 ` Stephen Boyd
0 siblings, 1 reply; 14+ messages in thread
From: Lucas Stach @ 2015-09-24 15:36 UTC (permalink / raw)
To: linux-arm-kernel
Am Donnerstag, den 24.09.2015, 08:20 -0700 schrieb Shawn Guo:
> On Mon, Sep 21, 2015 at 06:53:56PM +0200, Lucas Stach wrote:
> > This series fixes a long standing interaction issue between the
> > kernels early debug facilities and the i.MX clock drivers.
>
> This is fixing some issue but not regression. As the change basically
> has influence on all i.MX platforms, my take is that we should get them
> into linux-next for extensive testing and queue for 4.4. Agree?
>
Absolutely, this fixes a bug which should mostly hit developers running
with earlyprintk or earlycon, so it's definitely not fixes material.
Please queue it up for 4.4.
Thanks,
Lucas
--
Pengutronix e.K. | Lucas Stach |
Industrial Linux Solutions | http://www.pengutronix.de/ |
^ permalink raw reply [flat|nested] 14+ messages in thread
* [PATCH v4 0/8] i.MX early debug UART clock fixes
2015-09-24 15:36 ` Lucas Stach
@ 2015-10-02 19:45 ` Stephen Boyd
0 siblings, 0 replies; 14+ messages in thread
From: Stephen Boyd @ 2015-10-02 19:45 UTC (permalink / raw)
To: linux-arm-kernel
On 09/24, Lucas Stach wrote:
> Am Donnerstag, den 24.09.2015, 08:20 -0700 schrieb Shawn Guo:
> > On Mon, Sep 21, 2015 at 06:53:56PM +0200, Lucas Stach wrote:
> > > This series fixes a long standing interaction issue between the
> > > kernels early debug facilities and the i.MX clock drivers.
> >
> > This is fixing some issue but not regression. As the change basically
> > has influence on all i.MX platforms, my take is that we should get them
> > into linux-next for extensive testing and queue for 4.4. Agree?
> >
> Absolutely, this fixes a bug which should mostly hit developers running
> with earlyprintk or earlycon, so it's definitely not fixes material.
>
> Please queue it up for 4.4.
Patches look mostly ok to me, but this certainly feels like some
generic problem that we should handle in the core. Perhaps it
would make sense to move this over to using the handoff mechanism
Mike is working on, where we keep the clock on until a consumer
grabs a reference to the clock?
So I'm not opposed to merging this for 4.4, but I'd like to see
it become a generic solution sometime soon, instead of staying as
a one-off fix for imx platforms.
--
Qualcomm Innovation Center, Inc. is a member of Code Aurora Forum,
a Linux Foundation Collaborative Project
^ permalink raw reply [flat|nested] 14+ messages in thread