Skip to content

Commit

Permalink
clk: imx: Support building i.MX common clock driver as module
Browse files Browse the repository at this point in the history
There are more and more requirements of building SoC specific drivers
as modules, add support for building i.MX common clock driver as module
to meet the requirement.

Signed-off-by: Anson Huang <Anson.Huang@nxp.com>
Reviewed-by: Stephen Boyd <sboyd@kernel.org>
Signed-off-by: Shawn Guo <shawnguo@kernel.org>
  • Loading branch information
Anson Huang authored and Shawn Guo committed Aug 22, 2020
1 parent d7d7518 commit 870ed5e
Show file tree
Hide file tree
Showing 10 changed files with 60 additions and 26 deletions.
8 changes: 6 additions & 2 deletions drivers/clk/imx/Kconfig
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
# SPDX-License-Identifier: GPL-2.0
# common clock support for NXP i.MX SoC family.
config MXC_CLK
bool
def_bool ARCH_MXC
tristate "IMX clock"
depends on ARCH_MXC

config MXC_CLK_SCU
bool
Expand All @@ -11,24 +11,28 @@ config MXC_CLK_SCU
config CLK_IMX8MM
bool "IMX8MM CCM Clock Driver"
depends on ARCH_MXC
select MXC_CLK
help
Build the driver for i.MX8MM CCM Clock Driver

config CLK_IMX8MN
bool "IMX8MN CCM Clock Driver"
depends on ARCH_MXC
select MXC_CLK
help
Build the driver for i.MX8MN CCM Clock Driver

config CLK_IMX8MP
bool "IMX8MP CCM Clock Driver"
depends on ARCH_MXC
select MXC_CLK
help
Build the driver for i.MX8MP CCM Clock Driver

config CLK_IMX8MQ
bool "IMX8MQ CCM Clock Driver"
depends on ARCH_MXC
select MXC_CLK
help
Build the driver for i.MX8MQ CCM Clock Driver

Expand Down
40 changes: 20 additions & 20 deletions drivers/clk/imx/Makefile
Original file line number Diff line number Diff line change
@@ -1,25 +1,25 @@
# SPDX-License-Identifier: GPL-2.0

obj-$(CONFIG_MXC_CLK) += \
clk.o \
clk-busy.o \
clk-composite-8m.o \
clk-cpu.o \
clk-composite-7ulp.o \
clk-divider-gate.o \
clk-fixup-div.o \
clk-fixup-mux.o \
clk-frac-pll.o \
clk-gate-exclusive.o \
clk-gate2.o \
clk-pfd.o \
clk-pfdv2.o \
clk-pllv1.o \
clk-pllv2.o \
clk-pllv3.o \
clk-pllv4.o \
clk-sscg-pll.o \
clk-pll14xx.o
mxc-clk-objs += clk.o
mxc-clk-objs += clk-busy.o
mxc-clk-objs += clk-composite-7ulp.o
mxc-clk-objs += clk-composite-8m.o
mxc-clk-objs += clk-cpu.o
mxc-clk-objs += clk-divider-gate.o
mxc-clk-objs += clk-fixup-div.o
mxc-clk-objs += clk-fixup-mux.o
mxc-clk-objs += clk-frac-pll.o
mxc-clk-objs += clk-gate2.o
mxc-clk-objs += clk-gate-exclusive.o
mxc-clk-objs += clk-pfd.o
mxc-clk-objs += clk-pfdv2.o
mxc-clk-objs += clk-pllv1.o
mxc-clk-objs += clk-pllv2.o
mxc-clk-objs += clk-pllv3.o
mxc-clk-objs += clk-pllv4.o
mxc-clk-objs += clk-pll14xx.o
mxc-clk-objs += clk-sscg-pll.o
obj-$(CONFIG_MXC_CLK) += mxc-clk.o

obj-$(CONFIG_MXC_CLK_SCU) += \
clk-scu.o \
Expand Down
2 changes: 2 additions & 0 deletions drivers/clk/imx/clk-composite-8m.c
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@

#include <linux/clk-provider.h>
#include <linux/errno.h>
#include <linux/export.h>
#include <linux/io.h>
#include <linux/slab.h>

Expand Down Expand Up @@ -243,3 +244,4 @@ struct clk_hw *imx8m_clk_hw_composite_flags(const char *name,
kfree(mux);
return ERR_CAST(hw);
}
EXPORT_SYMBOL_GPL(imx8m_clk_hw_composite_flags);
2 changes: 2 additions & 0 deletions drivers/clk/imx/clk-cpu.c
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@

#include <linux/clk.h>
#include <linux/clk-provider.h>
#include <linux/export.h>
#include <linux/slab.h>
#include "clk.h"

Expand Down Expand Up @@ -104,3 +105,4 @@ struct clk_hw *imx_clk_hw_cpu(const char *name, const char *parent_name,

return hw;
}
EXPORT_SYMBOL_GPL(imx_clk_hw_cpu);
2 changes: 2 additions & 0 deletions drivers/clk/imx/clk-frac-pll.c
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@

#include <linux/clk-provider.h>
#include <linux/err.h>
#include <linux/export.h>
#include <linux/io.h>
#include <linux/iopoll.h>
#include <linux/slab.h>
Expand Down Expand Up @@ -233,3 +234,4 @@ struct clk_hw *imx_clk_hw_frac_pll(const char *name,

return hw;
}
EXPORT_SYMBOL_GPL(imx_clk_hw_frac_pll);
2 changes: 2 additions & 0 deletions drivers/clk/imx/clk-gate2.c
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@
*/

#include <linux/clk-provider.h>
#include <linux/export.h>
#include <linux/module.h>
#include <linux/slab.h>
#include <linux/io.h>
Expand Down Expand Up @@ -177,3 +178,4 @@ struct clk_hw *clk_hw_register_gate2(struct device *dev, const char *name,

return hw;
}
EXPORT_SYMBOL_GPL(clk_hw_register_gate2);
5 changes: 5 additions & 0 deletions drivers/clk/imx/clk-pll14xx.c
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@
#include <linux/bitops.h>
#include <linux/clk-provider.h>
#include <linux/err.h>
#include <linux/export.h>
#include <linux/io.h>
#include <linux/iopoll.h>
#include <linux/slab.h>
Expand Down Expand Up @@ -68,19 +69,22 @@ struct imx_pll14xx_clk imx_1443x_pll = {
.rate_table = imx_pll1443x_tbl,
.rate_count = ARRAY_SIZE(imx_pll1443x_tbl),
};
EXPORT_SYMBOL_GPL(imx_1443x_pll);

struct imx_pll14xx_clk imx_1443x_dram_pll = {
.type = PLL_1443X,
.rate_table = imx_pll1443x_tbl,
.rate_count = ARRAY_SIZE(imx_pll1443x_tbl),
.flags = CLK_GET_RATE_NOCACHE,
};
EXPORT_SYMBOL_GPL(imx_1443x_dram_pll);

struct imx_pll14xx_clk imx_1416x_pll = {
.type = PLL_1416X,
.rate_table = imx_pll1416x_tbl,
.rate_count = ARRAY_SIZE(imx_pll1416x_tbl),
};
EXPORT_SYMBOL_GPL(imx_1416x_pll);

static const struct imx_pll14xx_rate_table *imx_get_pll_settings(
struct clk_pll14xx *pll, unsigned long rate)
Expand Down Expand Up @@ -436,3 +440,4 @@ struct clk_hw *imx_dev_clk_hw_pll14xx(struct device *dev, const char *name,

return hw;
}
EXPORT_SYMBOL_GPL(imx_dev_clk_hw_pll14xx);
2 changes: 2 additions & 0 deletions drivers/clk/imx/clk-sscg-pll.c
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@

#include <linux/clk-provider.h>
#include <linux/err.h>
#include <linux/export.h>
#include <linux/io.h>
#include <linux/iopoll.h>
#include <linux/slab.h>
Expand Down Expand Up @@ -537,3 +538,4 @@ struct clk_hw *imx_clk_hw_sscg_pll(const char *name,

return hw;
}
EXPORT_SYMBOL_GPL(imx_clk_hw_sscg_pll);
17 changes: 13 additions & 4 deletions drivers/clk/imx/clk.c
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@
#include <linux/clk-provider.h>
#include <linux/err.h>
#include <linux/io.h>
#include <linux/module.h>
#include <linux/of.h>
#include <linux/slab.h>
#include <linux/spinlock.h>
Expand All @@ -13,6 +14,7 @@
#define CCDR_MMDC_CH1_MASK BIT(16)

DEFINE_SPINLOCK(imx_ccm_lock);
EXPORT_SYMBOL_GPL(imx_ccm_lock);

void imx_unregister_clocks(struct clk *clks[], unsigned int count)
{
Expand All @@ -29,8 +31,9 @@ void imx_unregister_hw_clocks(struct clk_hw *hws[], unsigned int count)
for (i = 0; i < count; i++)
clk_hw_unregister(hws[i]);
}
EXPORT_SYMBOL_GPL(imx_unregister_hw_clocks);

void __init imx_mmdc_mask_handshake(void __iomem *ccm_base,
void imx_mmdc_mask_handshake(void __iomem *ccm_base,
unsigned int chn)
{
unsigned int reg;
Expand Down Expand Up @@ -59,8 +62,9 @@ void imx_check_clk_hws(struct clk_hw *clks[], unsigned int count)
pr_err("i.MX clk %u: register failed with %ld\n",
i, PTR_ERR(clks[i]));
}
EXPORT_SYMBOL_GPL(imx_check_clk_hws);

static struct clk * __init imx_obtain_fixed_clock_from_dt(const char *name)
static struct clk *imx_obtain_fixed_clock_from_dt(const char *name)
{
struct of_phandle_args phandle;
struct clk *clk = ERR_PTR(-ENODEV);
Expand All @@ -80,7 +84,7 @@ static struct clk * __init imx_obtain_fixed_clock_from_dt(const char *name)
return clk;
}

struct clk * __init imx_obtain_fixed_clock(
struct clk *imx_obtain_fixed_clock(
const char *name, unsigned long rate)
{
struct clk *clk;
Expand All @@ -91,7 +95,7 @@ struct clk * __init imx_obtain_fixed_clock(
return clk;
}

struct clk_hw * __init imx_obtain_fixed_clock_hw(
struct clk_hw *imx_obtain_fixed_clock_hw(
const char *name, unsigned long rate)
{
struct clk *clk;
Expand All @@ -113,6 +117,7 @@ struct clk_hw * imx_obtain_fixed_clk_hw(struct device_node *np,

return __clk_get_hw(clk);
}
EXPORT_SYMBOL_GPL(imx_obtain_fixed_clk_hw);

/*
* This fixups the register CCM_CSCMR1 write value.
Expand Down Expand Up @@ -140,6 +145,7 @@ void imx_cscmr1_fixup(u32 *val)
return;
}

#ifndef MODULE
static int imx_keep_uart_clocks;
static struct clk ** const *imx_uart_clocks;

Expand Down Expand Up @@ -177,3 +183,6 @@ static int __init imx_clk_disable_uart(void)
return 0;
}
late_initcall_sync(imx_clk_disable_uart);
#endif

MODULE_LICENSE("GPL v2");
6 changes: 6 additions & 0 deletions drivers/clk/imx/clk.h
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,13 @@ extern spinlock_t imx_ccm_lock;

void imx_check_clocks(struct clk *clks[], unsigned int count);
void imx_check_clk_hws(struct clk_hw *clks[], unsigned int count);
#ifndef MODULE
void imx_register_uart_clocks(struct clk ** const clks[]);
#else
static inline void imx_register_uart_clocks(struct clk ** const clks[])
{
}
#endif
void imx_mmdc_mask_handshake(void __iomem *ccm_base, unsigned int chn);
void imx_unregister_clocks(struct clk *clks[], unsigned int count);
void imx_unregister_hw_clocks(struct clk_hw *hws[], unsigned int count);
Expand Down

0 comments on commit 870ed5e

Please sign in to comment.