clk: sunxi-ng: Allow the CCU core to be built as a module

Like the individual CCU drivers, it can be beneficial for memory
consumption of cross-platform configurations to only load the CCU core
on the relevant platform. For example, a generic arm64 kernel sees the
following improvement when building the CCU core and drivers as modules:

  before:
    text      data     bss     dec       hex      filename
    13882360  5251670  360800  19494830  12977ae  vmlinux

  after:
    text      data     bss     dec       hex      filename
    13734787  5086442  360800  19182029  124b1cd  vmlinux

So the result is a 390KB total reduction in kernel image size.

The one early clock provider (sun5i) requires the core to be built in.

Now that loading the MMC driver will trigger loading the CCU core, the
MMC timing mode functions do not need a compile-time fallback.

Signed-off-by: Samuel Holland <samuel@sholland.org>
Signed-off-by: Maxime Ripard <maxime@cerno.tech>
Link: https://lore.kernel.org/r/20211119033338.25486-5-samuel@sholland.org
This commit is contained in:
Samuel Holland 2021-11-18 21:33:37 -06:00 committed by Maxime Ripard
parent 7ec03b588d
commit 91389c3905
No known key found for this signature in database
GPG Key ID: E3EF0D6F671851C5
6 changed files with 25 additions and 32 deletions

View File

@ -110,7 +110,7 @@ obj-$(CONFIG_PLAT_SPEAR) += spear/
obj-y += sprd/ obj-y += sprd/
obj-$(CONFIG_ARCH_STI) += st/ obj-$(CONFIG_ARCH_STI) += st/
obj-$(CONFIG_ARCH_SUNXI) += sunxi/ obj-$(CONFIG_ARCH_SUNXI) += sunxi/
obj-$(CONFIG_SUNXI_CCU) += sunxi-ng/ obj-y += sunxi-ng/
obj-$(CONFIG_ARCH_TEGRA) += tegra/ obj-$(CONFIG_ARCH_TEGRA) += tegra/
obj-y += ti/ obj-y += ti/
obj-$(CONFIG_CLK_UNIPHIER) += uniphier/ obj-$(CONFIG_CLK_UNIPHIER) += uniphier/

View File

@ -1,6 +1,6 @@
# SPDX-License-Identifier: GPL-2.0-only # SPDX-License-Identifier: GPL-2.0-only
config SUNXI_CCU config SUNXI_CCU
bool "Clock support for Allwinner SoCs" tristate "Clock support for Allwinner SoCs"
depends on ARCH_SUNXI || COMPILE_TEST depends on ARCH_SUNXI || COMPILE_TEST
select RESET_CONTROLLER select RESET_CONTROLLER
default ARCH_SUNXI default ARCH_SUNXI
@ -52,6 +52,7 @@ config SUN5I_CCU
bool "Support for the Allwinner sun5i family CCM" bool "Support for the Allwinner sun5i family CCM"
default MACH_SUN5I default MACH_SUN5I
depends on MACH_SUN5I || COMPILE_TEST depends on MACH_SUN5I || COMPILE_TEST
depends on SUNXI_CCU=y
config SUN6I_A31_CCU config SUN6I_A31_CCU
tristate "Support for the Allwinner A31/A31s CCU" tristate "Support for the Allwinner A31/A31s CCU"

View File

@ -1,24 +1,27 @@
# SPDX-License-Identifier: GPL-2.0 # SPDX-License-Identifier: GPL-2.0
obj-$(CONFIG_SUNXI_CCU) += sunxi-ccu.o
# Common objects # Common objects
obj-y += ccu_common.o sunxi-ccu-y += ccu_common.o
obj-y += ccu_mmc_timing.o sunxi-ccu-y += ccu_mmc_timing.o
obj-y += ccu_reset.o sunxi-ccu-y += ccu_reset.o
# Base clock types # Base clock types
obj-y += ccu_div.o sunxi-ccu-y += ccu_div.o
obj-y += ccu_frac.o sunxi-ccu-y += ccu_frac.o
obj-y += ccu_gate.o sunxi-ccu-y += ccu_gate.o
obj-y += ccu_mux.o sunxi-ccu-y += ccu_mux.o
obj-y += ccu_mult.o sunxi-ccu-y += ccu_mult.o
obj-y += ccu_phase.o sunxi-ccu-y += ccu_phase.o
obj-y += ccu_sdm.o sunxi-ccu-y += ccu_sdm.o
# Multi-factor clocks # Multi-factor clocks
obj-y += ccu_nk.o sunxi-ccu-y += ccu_nk.o
obj-y += ccu_nkm.o sunxi-ccu-y += ccu_nkm.o
obj-y += ccu_nkmp.o sunxi-ccu-y += ccu_nkmp.o
obj-y += ccu_nm.o sunxi-ccu-y += ccu_nm.o
obj-y += ccu_mp.o sunxi-ccu-y += ccu_mp.o
# SoC support # SoC support
obj-$(CONFIG_SUNIV_F1C100S_CCU) += suniv-f1c100s-ccu.o obj-$(CONFIG_SUNIV_F1C100S_CCU) += suniv-f1c100s-ccu.o

View File

@ -9,6 +9,7 @@
#include <linux/clk-provider.h> #include <linux/clk-provider.h>
#include <linux/device.h> #include <linux/device.h>
#include <linux/iopoll.h> #include <linux/iopoll.h>
#include <linux/module.h>
#include <linux/slab.h> #include <linux/slab.h>
#include "ccu_common.h" #include "ccu_common.h"
@ -214,3 +215,5 @@ void of_sunxi_ccu_probe(struct device_node *node, void __iomem *reg,
kfree(ccu); kfree(ccu);
} }
} }
MODULE_LICENSE("GPL");

View File

@ -966,6 +966,7 @@ config MMC_REALTEK_USB
config MMC_SUNXI config MMC_SUNXI
tristate "Allwinner sunxi SD/MMC Host Controller support" tristate "Allwinner sunxi SD/MMC Host Controller support"
depends on ARCH_SUNXI || COMPILE_TEST depends on ARCH_SUNXI || COMPILE_TEST
depends on SUNXI_CCU
help help
This selects support for the SD/MMC Host Controller on This selects support for the SD/MMC Host Controller on
Allwinner sunxi SoCs. Allwinner sunxi SoCs.

View File

@ -6,22 +6,7 @@
#ifndef _LINUX_CLK_SUNXI_NG_H_ #ifndef _LINUX_CLK_SUNXI_NG_H_
#define _LINUX_CLK_SUNXI_NG_H_ #define _LINUX_CLK_SUNXI_NG_H_
#include <linux/errno.h>
#ifdef CONFIG_SUNXI_CCU
int sunxi_ccu_set_mmc_timing_mode(struct clk *clk, bool new_mode); int sunxi_ccu_set_mmc_timing_mode(struct clk *clk, bool new_mode);
int sunxi_ccu_get_mmc_timing_mode(struct clk *clk); int sunxi_ccu_get_mmc_timing_mode(struct clk *clk);
#else
static inline int sunxi_ccu_set_mmc_timing_mode(struct clk *clk,
bool new_mode)
{
return -ENOTSUPP;
}
static inline int sunxi_ccu_get_mmc_timing_mode(struct clk *clk)
{
return -ENOTSUPP;
}
#endif
#endif #endif