2020-07-02 15:29:26

by Anson Huang

[permalink] [raw]
Subject: [PATCH V5 0/6] Support building i.MX ARMv7/ARMv8 platforms clock driver as module

Nowdays, there are more and more requirements of building SoC specific
drivers as modules, such as Android GKI (generic kernel image), this
patch set supports building i.MX ARMv6/ARMv7 SoCs clock drivers as modules,

The CLK_IMXxxx is introduced for i.MX ARMv7 platforms in order to support
various build options, and i.MX1/2/3 platforms now still ONLY support built-in
as they are rarely used now.

Changes since V4:
- add empty function of imx_register_uart_clocks() for MODULE build, then
all earlycon related clock handler can be built-out for MODULE;
- add module build support for ARMv7 platforms, also add COMPILE_TEST for them;
- add COMPILE_TEST for ARMv8 platforms;
- keep using builtin_platform_driver() for i.MX8QXP clock driver.

Anson Huang (6):
clk: composite: Export clk_hw_register_composite()
clk: imx: Support module build for i.MX5/6/7 and vf610
clk: imx: Support building i.MX common clock driver as module
clk: imx: Add clock configuration for ARMv7 platforms
clk: imx8m: Support module build
clk: imx8qxp: Support building i.MX8QXP clock driver as module

drivers/clk/clk-composite.c | 1 +
drivers/clk/imx/Kconfig | 101 ++++++++++++++++++++++++++++++++-----
drivers/clk/imx/Makefile | 79 ++++++++++++++---------------
drivers/clk/imx/clk-composite-8m.c | 2 +
drivers/clk/imx/clk-cpu.c | 2 +
drivers/clk/imx/clk-frac-pll.c | 2 +
drivers/clk/imx/clk-gate2.c | 2 +
drivers/clk/imx/clk-imx5.c | 5 ++
drivers/clk/imx/clk-imx6q.c | 5 ++
drivers/clk/imx/clk-imx6sl.c | 5 ++
drivers/clk/imx/clk-imx6sll.c | 5 ++
drivers/clk/imx/clk-imx6sx.c | 5 ++
drivers/clk/imx/clk-imx6ul.c | 5 ++
drivers/clk/imx/clk-imx7d.c | 5 ++
drivers/clk/imx/clk-imx7ulp.c | 5 ++
drivers/clk/imx/clk-imx8mm.c | 4 ++
drivers/clk/imx/clk-imx8mn.c | 4 ++
drivers/clk/imx/clk-imx8mp.c | 4 ++
drivers/clk/imx/clk-imx8mq.c | 4 ++
drivers/clk/imx/clk-imx8qxp-lpcg.c | 4 ++
drivers/clk/imx/clk-imx8qxp.c | 4 ++
drivers/clk/imx/clk-pll14xx.c | 5 ++
drivers/clk/imx/clk-sscg-pll.c | 2 +
drivers/clk/imx/clk-vf610.c | 5 ++
drivers/clk/imx/clk.c | 17 +++++--
drivers/clk/imx/clk.h | 6 +++
26 files changed, 231 insertions(+), 57 deletions(-)

--
2.7.4


2020-07-02 15:29:59

by Anson Huang

[permalink] [raw]
Subject: [PATCH V5 2/6] clk: imx: Support module build for i.MX5/6/7 and vf610

Add module author, description and license to support module build
for i.MX5/6/7 and vf610 SoCs.

Signed-off-by: Anson Huang <[email protected]>
---
New patch.
---
drivers/clk/imx/clk-imx5.c | 5 +++++
drivers/clk/imx/clk-imx6q.c | 5 +++++
drivers/clk/imx/clk-imx6sl.c | 5 +++++
drivers/clk/imx/clk-imx6sll.c | 5 +++++
drivers/clk/imx/clk-imx6sx.c | 5 +++++
drivers/clk/imx/clk-imx6ul.c | 5 +++++
drivers/clk/imx/clk-imx7d.c | 5 +++++
drivers/clk/imx/clk-imx7ulp.c | 5 +++++
drivers/clk/imx/clk-vf610.c | 5 +++++
9 files changed, 45 insertions(+)

diff --git a/drivers/clk/imx/clk-imx5.c b/drivers/clk/imx/clk-imx5.c
index 01e079b..fcdd398 100644
--- a/drivers/clk/imx/clk-imx5.c
+++ b/drivers/clk/imx/clk-imx5.c
@@ -9,6 +9,7 @@
#include <linux/clkdev.h>
#include <linux/clk-provider.h>
#include <linux/err.h>
+#include <linux/module.h>
#include <linux/of.h>
#include <linux/of_address.h>
#include <linux/of_irq.h>
@@ -636,3 +637,7 @@ static void __init mx53_clocks_init(struct device_node *np)
imx_register_uart_clocks(uart_clks_mx50_mx53);
}
CLK_OF_DECLARE(imx53_ccm, "fsl,imx53-ccm", mx53_clocks_init);
+
+MODULE_AUTHOR("Shawn Guo <[email protected]>");
+MODULE_DESCRIPTION("NXP i.MX5 clock driver");
+MODULE_LICENSE("GPL v2");
diff --git a/drivers/clk/imx/clk-imx6q.c b/drivers/clk/imx/clk-imx6q.c
index ba33c79..46d31be 100644
--- a/drivers/clk/imx/clk-imx6q.c
+++ b/drivers/clk/imx/clk-imx6q.c
@@ -11,6 +11,7 @@
#include <linux/clk-provider.h>
#include <linux/err.h>
#include <linux/io.h>
+#include <linux/module.h>
#include <linux/of.h>
#include <linux/of_address.h>
#include <linux/of_irq.h>
@@ -990,3 +991,7 @@ static void __init imx6q_clocks_init(struct device_node *ccm_node)
imx_register_uart_clocks(uart_clks);
}
CLK_OF_DECLARE(imx6q, "fsl,imx6q-ccm", imx6q_clocks_init);
+
+MODULE_AUTHOR("Shawn Guo <[email protected]>");
+MODULE_DESCRIPTION("NXP i.MX6Q clock driver");
+MODULE_LICENSE("GPL v2");
diff --git a/drivers/clk/imx/clk-imx6sl.c b/drivers/clk/imx/clk-imx6sl.c
index 0f647d1..f19d52f 100644
--- a/drivers/clk/imx/clk-imx6sl.c
+++ b/drivers/clk/imx/clk-imx6sl.c
@@ -6,6 +6,7 @@
#include <linux/clk.h>
#include <linux/clkdev.h>
#include <linux/err.h>
+#include <linux/module.h>
#include <linux/of.h>
#include <linux/of_address.h>
#include <linux/of_irq.h>
@@ -455,3 +456,7 @@ static void __init imx6sl_clocks_init(struct device_node *ccm_node)
imx_register_uart_clocks(uart_clks);
}
CLK_OF_DECLARE(imx6sl, "fsl,imx6sl-ccm", imx6sl_clocks_init);
+
+MODULE_AUTHOR("Shawn Guo <[email protected]>");
+MODULE_DESCRIPTION("NXP i.MX6SL clock driver");
+MODULE_LICENSE("GPL v2");
diff --git a/drivers/clk/imx/clk-imx6sll.c b/drivers/clk/imx/clk-imx6sll.c
index 8e8288b..4ec0dea 100644
--- a/drivers/clk/imx/clk-imx6sll.c
+++ b/drivers/clk/imx/clk-imx6sll.c
@@ -11,6 +11,7 @@
#include <linux/err.h>
#include <linux/init.h>
#include <linux/io.h>
+#include <linux/module.h>
#include <linux/of.h>
#include <linux/of_address.h>

@@ -376,3 +377,7 @@ static void __init imx6sll_clocks_init(struct device_node *ccm_node)
clk_set_rate(hws[IMX6SLL_CLK_AHB]->clk, 132000000);
}
CLK_OF_DECLARE_DRIVER(imx6sll, "fsl,imx6sll-ccm", imx6sll_clocks_init);
+
+MODULE_AUTHOR("Shawn Guo <[email protected]>");
+MODULE_DESCRIPTION("NXP i.MX6SLL clock driver");
+MODULE_LICENSE("GPL v2");
diff --git a/drivers/clk/imx/clk-imx6sx.c b/drivers/clk/imx/clk-imx6sx.c
index 89ba712..156163d 100644
--- a/drivers/clk/imx/clk-imx6sx.c
+++ b/drivers/clk/imx/clk-imx6sx.c
@@ -10,6 +10,7 @@
#include <linux/err.h>
#include <linux/init.h>
#include <linux/io.h>
+#include <linux/module.h>
#include <linux/of.h>
#include <linux/of_address.h>
#include <linux/of_irq.h>
@@ -564,3 +565,7 @@ static void __init imx6sx_clocks_init(struct device_node *ccm_node)
imx_register_uart_clocks(uart_clks);
}
CLK_OF_DECLARE(imx6sx, "fsl,imx6sx-ccm", imx6sx_clocks_init);
+
+MODULE_AUTHOR("Shawn Guo <[email protected]>");
+MODULE_DESCRIPTION("NXP i.MX6SX clock driver");
+MODULE_LICENSE("GPL v2");
diff --git a/drivers/clk/imx/clk-imx6ul.c b/drivers/clk/imx/clk-imx6ul.c
index 5dbb6a9..090b684 100644
--- a/drivers/clk/imx/clk-imx6ul.c
+++ b/drivers/clk/imx/clk-imx6ul.c
@@ -10,6 +10,7 @@
#include <linux/err.h>
#include <linux/init.h>
#include <linux/io.h>
+#include <linux/module.h>
#include <linux/of.h>
#include <linux/of_address.h>
#include <linux/of_irq.h>
@@ -513,3 +514,7 @@ static void __init imx6ul_clocks_init(struct device_node *ccm_node)
}

CLK_OF_DECLARE(imx6ul, "fsl,imx6ul-ccm", imx6ul_clocks_init);
+
+MODULE_AUTHOR("Frank Li <[email protected]>");
+MODULE_DESCRIPTION("NXP i.MX6UL clock driver");
+MODULE_LICENSE("GPL v2");
diff --git a/drivers/clk/imx/clk-imx7d.c b/drivers/clk/imx/clk-imx7d.c
index b2057bd..1837c42 100644
--- a/drivers/clk/imx/clk-imx7d.c
+++ b/drivers/clk/imx/clk-imx7d.c
@@ -10,6 +10,7 @@
#include <linux/err.h>
#include <linux/init.h>
#include <linux/io.h>
+#include <linux/module.h>
#include <linux/of.h>
#include <linux/of_address.h>
#include <linux/of_irq.h>
@@ -906,3 +907,7 @@ static void __init imx7d_clocks_init(struct device_node *ccm_node)

}
CLK_OF_DECLARE(imx7d, "fsl,imx7d-ccm", imx7d_clocks_init);
+
+MODULE_AUTHOR("Frank Li <[email protected]>");
+MODULE_DESCRIPTION("NXP i.MX7D clock driver");
+MODULE_LICENSE("GPL v2");
diff --git a/drivers/clk/imx/clk-imx7ulp.c b/drivers/clk/imx/clk-imx7ulp.c
index 634c0b6..d2eb80e 100644
--- a/drivers/clk/imx/clk-imx7ulp.c
+++ b/drivers/clk/imx/clk-imx7ulp.c
@@ -12,6 +12,7 @@
#include <linux/err.h>
#include <linux/init.h>
#include <linux/io.h>
+#include <linux/module.h>
#include <linux/of.h>
#include <linux/of_address.h>
#include <linux/platform_device.h>
@@ -279,3 +280,7 @@ static void __init imx7ulp_clk_smc1_init(struct device_node *np)
of_clk_add_hw_provider(np, of_clk_hw_onecell_get, clk_data);
}
CLK_OF_DECLARE(imx7ulp_clk_smc1, "fsl,imx7ulp-smc1", imx7ulp_clk_smc1_init);
+
+MODULE_AUTHOR("A.s. Dong <[email protected]>");
+MODULE_DESCRIPTION("NXP i.MX7ULP clock driver");
+MODULE_LICENSE("GPL v2");
diff --git a/drivers/clk/imx/clk-vf610.c b/drivers/clk/imx/clk-vf610.c
index 5129ef8..bf174ac 100644
--- a/drivers/clk/imx/clk-vf610.c
+++ b/drivers/clk/imx/clk-vf610.c
@@ -5,6 +5,7 @@

#include <linux/of_address.h>
#include <linux/clk.h>
+#include <linux/module.h>
#include <linux/syscore_ops.h>
#include <dt-bindings/clock/vf610-clock.h>

@@ -468,3 +469,7 @@ static void __init vf610_clocks_init(struct device_node *ccm_node)
of_clk_add_provider(np, of_clk_src_onecell_get, &clk_data);
}
CLK_OF_DECLARE(vf610, "fsl,vf610-ccm", vf610_clocks_init);
+
+MODULE_AUTHOR("Shawn Guo <[email protected]>");
+MODULE_DESCRIPTION("NXP VF610 clock driver");
+MODULE_LICENSE("GPL v2");
--
2.7.4

2020-07-02 18:32:30

by Laurent Pinchart

[permalink] [raw]
Subject: Re: [PATCH V5 0/6] Support building i.MX ARMv7/ARMv8 platforms clock driver as module

Hi Anson,

On Thu, Jul 02, 2020 at 11:23:55PM +0800, Anson Huang wrote:
> Nowdays, there are more and more requirements of building SoC specific
> drivers as modules, such as Android GKI (generic kernel image), this
> patch set supports building i.MX ARMv6/ARMv7 SoCs clock drivers as modules,

I'm curious, how does the system boot to userspace to be able to load
modules without clock support in the kernel ? What if the driver for the
device storing the rootfs cope with clocks not being available ? Does
this require an initramfs with the clock module ? Even then, how does
the serial port driver cope with not having clocks ?

> The CLK_IMXxxx is introduced for i.MX ARMv7 platforms in order to support
> various build options, and i.MX1/2/3 platforms now still ONLY support built-in
> as they are rarely used now.
>
> Changes since V4:
> - add empty function of imx_register_uart_clocks() for MODULE build, then
> all earlycon related clock handler can be built-out for MODULE;
> - add module build support for ARMv7 platforms, also add COMPILE_TEST for them;
> - add COMPILE_TEST for ARMv8 platforms;
> - keep using builtin_platform_driver() for i.MX8QXP clock driver.
>
> Anson Huang (6):
> clk: composite: Export clk_hw_register_composite()
> clk: imx: Support module build for i.MX5/6/7 and vf610
> clk: imx: Support building i.MX common clock driver as module
> clk: imx: Add clock configuration for ARMv7 platforms
> clk: imx8m: Support module build
> clk: imx8qxp: Support building i.MX8QXP clock driver as module
>
> drivers/clk/clk-composite.c | 1 +
> drivers/clk/imx/Kconfig | 101 ++++++++++++++++++++++++++++++++-----
> drivers/clk/imx/Makefile | 79 ++++++++++++++---------------
> drivers/clk/imx/clk-composite-8m.c | 2 +
> drivers/clk/imx/clk-cpu.c | 2 +
> drivers/clk/imx/clk-frac-pll.c | 2 +
> drivers/clk/imx/clk-gate2.c | 2 +
> drivers/clk/imx/clk-imx5.c | 5 ++
> drivers/clk/imx/clk-imx6q.c | 5 ++
> drivers/clk/imx/clk-imx6sl.c | 5 ++
> drivers/clk/imx/clk-imx6sll.c | 5 ++
> drivers/clk/imx/clk-imx6sx.c | 5 ++
> drivers/clk/imx/clk-imx6ul.c | 5 ++
> drivers/clk/imx/clk-imx7d.c | 5 ++
> drivers/clk/imx/clk-imx7ulp.c | 5 ++
> drivers/clk/imx/clk-imx8mm.c | 4 ++
> drivers/clk/imx/clk-imx8mn.c | 4 ++
> drivers/clk/imx/clk-imx8mp.c | 4 ++
> drivers/clk/imx/clk-imx8mq.c | 4 ++
> drivers/clk/imx/clk-imx8qxp-lpcg.c | 4 ++
> drivers/clk/imx/clk-imx8qxp.c | 4 ++
> drivers/clk/imx/clk-pll14xx.c | 5 ++
> drivers/clk/imx/clk-sscg-pll.c | 2 +
> drivers/clk/imx/clk-vf610.c | 5 ++
> drivers/clk/imx/clk.c | 17 +++++--
> drivers/clk/imx/clk.h | 6 +++
> 26 files changed, 231 insertions(+), 57 deletions(-)

--
Regards,

Laurent Pinchart

2020-07-07 02:29:33

by Anson Huang

[permalink] [raw]
Subject: RE: [PATCH V5 0/6] Support building i.MX ARMv7/ARMv8 platforms clock driver as module

Hi, Laurent

> Subject: Re: [PATCH V5 0/6] Support building i.MX ARMv7/ARMv8 platforms
> clock driver as module
>
> Hi Anson,
>
> On Thu, Jul 02, 2020 at 11:23:55PM +0800, Anson Huang wrote:
> > Nowdays, there are more and more requirements of building SoC specific
> > drivers as modules, such as Android GKI (generic kernel image), this
> > patch set supports building i.MX ARMv6/ARMv7 SoCs clock drivers as
> > modules,
>
> I'm curious, how does the system boot to userspace to be able to load
> modules without clock support in the kernel ? What if the driver for the device
> storing the rootfs cope with clocks not being available ? Does this require an
> initramfs with the clock module ? Even then, how does the serial port driver
> cope with not having clocks ?

Yes, this requires an initramfs, and in the initramfs, it will insmod those .ko with
correct sequence, as per my test and Android GKI test from our Andoird team,
the clock and pinctrl need to be insmod first, then the debug console, then other
module devices....And this patch series ONLY provides the capability of loadable
clock module for this scenario, Linux will still use built-in by default.

Thanks,
Anson