clk: sunxi-ng: Move all clock types to a library
authorStephen Boyd <sboyd@codeaurora.org>
Fri, 2 Jun 2017 22:30:06 +0000 (15:30 -0700)
committerMaxime Ripard <maxime.ripard@free-electrons.com>
Wed, 7 Jun 2017 13:33:39 +0000 (15:33 +0200)
We've run into kconfig missing dependency errors in the sunxi-ng
code a couple times now. Each time the fix is to find the missing
select statement and add it to the Kconfig entry for a particular
SoC driver. Given that all this code is builtin (non-modular) we
don't need to do this complicated dependency tracking in Kconfig.
Instead we can move all the "library"ish code to be compiled as
lib-y instead of obj-y, let the linker throw away unused code in
the resulting vmlinux, and drop all the Kconfig stuff we use to
track clock types.

Suggested-by: Arnd Bergmann <arnd@arndb.de>
Signed-off-by: Stephen Boyd <sboyd@codeaurora.org>
[Maxime: added lib.a to obj-y, added the comment]
Signed-off-by: Maxime Ripard <maxime.ripard@free-electrons.com>
drivers/clk/sunxi-ng/Kconfig
drivers/clk/sunxi-ng/Makefile

index 67acef3d2494b6471264c6e92212d70db583088b..7342928c35cd7d4caac62eee144896480e7210f6 100644 (file)
@@ -6,174 +6,55 @@ config SUNXI_CCU
 
 if SUNXI_CCU
 
-# Base clock types
-
-config SUNXI_CCU_DIV
-       bool
-       select SUNXI_CCU_MUX
-
-config SUNXI_CCU_FRAC
-       bool
-
-config SUNXI_CCU_GATE
-       def_bool y
-
-config SUNXI_CCU_MUX
-       bool
-
-config SUNXI_CCU_MULT
-       bool
-       select SUNXI_CCU_MUX
-
-config SUNXI_CCU_PHASE
-       bool
-
-# Multi-factor clocks
-
-config SUNXI_CCU_NK
-       bool
-       select SUNXI_CCU_GATE
-
-config SUNXI_CCU_NKM
-       bool
-       select SUNXI_CCU_GATE
-
-config SUNXI_CCU_NKMP
-       bool
-       select SUNXI_CCU_GATE
-
-config SUNXI_CCU_NM
-       bool
-       select SUNXI_CCU_FRAC
-       select SUNXI_CCU_GATE
-
-config SUNXI_CCU_MP
-       bool
-       select SUNXI_CCU_GATE
-       select SUNXI_CCU_MUX
-
-# SoC Drivers
-
 config SUN50I_A64_CCU
        bool "Support for the Allwinner A64 CCU"
-       select SUNXI_CCU_DIV
-       select SUNXI_CCU_NK
-       select SUNXI_CCU_NKM
-       select SUNXI_CCU_NKMP
-       select SUNXI_CCU_NM
-       select SUNXI_CCU_MP
-       select SUNXI_CCU_PHASE
        default ARM64 && ARCH_SUNXI
        depends on (ARM64 && ARCH_SUNXI) || COMPILE_TEST
 
 config SUN5I_CCU
        bool "Support for the Allwinner sun5i family CCM"
-       select SUNXI_CCU_DIV
-       select SUNXI_CCU_MULT
-       select SUNXI_CCU_NK
-       select SUNXI_CCU_NKM
-       select SUNXI_CCU_NM
-       select SUNXI_CCU_MP
-       select SUNXI_CCU_PHASE
        default MACH_SUN5I
        depends on MACH_SUN5I || COMPILE_TEST
 
 config SUN6I_A31_CCU
        bool "Support for the Allwinner A31/A31s CCU"
-       select SUNXI_CCU_DIV
-       select SUNXI_CCU_NK
-       select SUNXI_CCU_NKM
-       select SUNXI_CCU_NKMP
-       select SUNXI_CCU_NM
-       select SUNXI_CCU_MP
-       select SUNXI_CCU_PHASE
        default MACH_SUN6I
        depends on MACH_SUN6I || COMPILE_TEST
 
 config SUN8I_A23_CCU
        bool "Support for the Allwinner A23 CCU"
-       select SUNXI_CCU_DIV
-       select SUNXI_CCU_MULT
-       select SUNXI_CCU_NK
-       select SUNXI_CCU_NKM
-       select SUNXI_CCU_NKMP
-       select SUNXI_CCU_NM
-       select SUNXI_CCU_MP
-       select SUNXI_CCU_PHASE
        default MACH_SUN8I
        depends on MACH_SUN8I || COMPILE_TEST
 
 config SUN8I_A33_CCU
        bool "Support for the Allwinner A33 CCU"
-       select SUNXI_CCU_DIV
-       select SUNXI_CCU_MULT
-       select SUNXI_CCU_NK
-       select SUNXI_CCU_NKM
-       select SUNXI_CCU_NKMP
-       select SUNXI_CCU_NM
-       select SUNXI_CCU_MP
-       select SUNXI_CCU_PHASE
        default MACH_SUN8I
        depends on MACH_SUN8I || COMPILE_TEST
 
 config SUN8I_A83T_CCU
        bool "Support for the Allwinner A83T CCU"
-       select SUNXI_CCU_DIV
-       select SUNXI_CCU_GATE
-       select SUNXI_CCU_MP
-       select SUNXI_CCU_MULT
-       select SUNXI_CCU_MUX
-       select SUNXI_CCU_NKMP
-       select SUNXI_CCU_NM
-       select SUNXI_CCU_PHASE
        default MACH_SUN8I
 
 config SUN8I_H3_CCU
        bool "Support for the Allwinner H3 CCU"
-       select SUNXI_CCU_DIV
-       select SUNXI_CCU_NK
-       select SUNXI_CCU_NKM
-       select SUNXI_CCU_NKMP
-       select SUNXI_CCU_NM
-       select SUNXI_CCU_MP
-       select SUNXI_CCU_PHASE
        default MACH_SUN8I || (ARM64 && ARCH_SUNXI)
        depends on MACH_SUN8I || (ARM64 && ARCH_SUNXI) || COMPILE_TEST
 
 config SUN8I_V3S_CCU
        bool "Support for the Allwinner V3s CCU"
-       select SUNXI_CCU_DIV
-       select SUNXI_CCU_NK
-       select SUNXI_CCU_NKM
-       select SUNXI_CCU_NKMP
-       select SUNXI_CCU_NM
-       select SUNXI_CCU_MP
-       select SUNXI_CCU_PHASE
        default MACH_SUN8I
        depends on MACH_SUN8I || COMPILE_TEST
 
 config SUN8I_DE2_CCU
        bool "Support for the Allwinner SoCs DE2 CCU"
-       select SUNXI_CCU_DIV
-       select SUNXI_CCU_GATE
 
 config SUN9I_A80_CCU
        bool "Support for the Allwinner A80 CCU"
-       select SUNXI_CCU_DIV
-       select SUNXI_CCU_MULT
-       select SUNXI_CCU_GATE
-       select SUNXI_CCU_NKMP
-       select SUNXI_CCU_NM
-       select SUNXI_CCU_MP
-       select SUNXI_CCU_PHASE
        default MACH_SUN9I
        depends on MACH_SUN9I || COMPILE_TEST
 
 config SUN8I_R_CCU
        bool "Support for Allwinner SoCs' PRCM CCUs"
-       select SUNXI_CCU_DIV
-       select SUNXI_CCU_GATE
-       select SUNXI_CCU_MP
        default MACH_SUN8I || (ARCH_SUNXI && ARM64)
 
 endif
index 0185c6ffadcbef923a6ac5806e828a89e43502e0..0c45fa50283dadf45880dc1b6145d05ad648356a 100644 (file)
@@ -1,21 +1,21 @@
 # Common objects
-obj-$(CONFIG_SUNXI_CCU)                += ccu_common.o
-obj-$(CONFIG_SUNXI_CCU)                += ccu_reset.o
+lib-$(CONFIG_SUNXI_CCU)                += ccu_common.o
+lib-$(CONFIG_SUNXI_CCU)                += ccu_reset.o
 
 # Base clock types
-obj-$(CONFIG_SUNXI_CCU_DIV)    += ccu_div.o
-obj-$(CONFIG_SUNXI_CCU_FRAC)   += ccu_frac.o
-obj-$(CONFIG_SUNXI_CCU_GATE)   += ccu_gate.o
-obj-$(CONFIG_SUNXI_CCU_MUX)    += ccu_mux.o
-obj-$(CONFIG_SUNXI_CCU_MULT)   += ccu_mult.o
-obj-$(CONFIG_SUNXI_CCU_PHASE)  += ccu_phase.o
+lib-$(CONFIG_SUNXI_CCU)                += ccu_div.o
+lib-$(CONFIG_SUNXI_CCU)                += ccu_frac.o
+lib-$(CONFIG_SUNXI_CCU)                += ccu_gate.o
+lib-$(CONFIG_SUNXI_CCU)                += ccu_mux.o
+lib-$(CONFIG_SUNXI_CCU)                += ccu_mult.o
+lib-$(CONFIG_SUNXI_CCU)                += ccu_phase.o
 
 # Multi-factor clocks
-obj-$(CONFIG_SUNXI_CCU_NK)     += ccu_nk.o
-obj-$(CONFIG_SUNXI_CCU_NKM)    += ccu_nkm.o
-obj-$(CONFIG_SUNXI_CCU_NKMP)   += ccu_nkmp.o
-obj-$(CONFIG_SUNXI_CCU_NM)     += ccu_nm.o
-obj-$(CONFIG_SUNXI_CCU_MP)     += ccu_mp.o
+lib-$(CONFIG_SUNXI_CCU)                += ccu_nk.o
+lib-$(CONFIG_SUNXI_CCU)                += ccu_nkm.o
+lib-$(CONFIG_SUNXI_CCU)                += ccu_nkmp.o
+lib-$(CONFIG_SUNXI_CCU)                += ccu_nm.o
+lib-$(CONFIG_SUNXI_CCU)                += ccu_mp.o
 
 # SoC support
 obj-$(CONFIG_SUN50I_A64_CCU)   += ccu-sun50i-a64.o
@@ -31,3 +31,12 @@ obj-$(CONFIG_SUN8I_R_CCU)    += ccu-sun8i-r.o
 obj-$(CONFIG_SUN9I_A80_CCU)    += ccu-sun9i-a80.o
 obj-$(CONFIG_SUN9I_A80_CCU)    += ccu-sun9i-a80-de.o
 obj-$(CONFIG_SUN9I_A80_CCU)    += ccu-sun9i-a80-usb.o
+
+# The lib-y file goals is supposed to work only in arch/*/lib or lib/. In our
+# case, we want to use that goal, but even though lib.a will be properly
+# generated, it will not be linked in, eventually resulting in a linker error
+# for missing symbols.
+#
+# We can work around that by explicitly adding lib.a to the obj-y goal. This is
+# an undocumented behaviour, but works well for now.
+obj-$(CONFIG_SUNXI_CCU)                += lib.a