Merge branches 'clk-microchip', 'clk-allwinner', 'clk-mediatek', 'clk-imx' and 'clk-core' into clk-next
- Various cleanups and improvements to Mediatek clk drivers to reduce code size and modernize the drivers - Support for Mediatek MT7891 SoC clks * clk-microchip: clk: at91: do not compile dt-compat.c for sama7g5 and sam9x60 clk: at91: mark ddr clocks as critical * clk-allwinner: clk: sunxi-ng: d1: Add CAN bus gates and resets dt-bindings: clock: Add D1 CAN bus gates and resets clk: sunxi-ng: d1: Mark cpux clock as critical clk: sunxi-ng: d1: Allow building for R528/T113 clk: sunxi-ng: Move SoC driver conditions to dependencies clk: sunxi-ng: Remove duplicate ARCH_SUNXI dependencies clk: sunxi-ng: Avoid computing the rate twice clk: sunxi-ng: h3/h5: Model H3 CLK_DRAM as a fixed clock clk: sunxi-ng: fix ccu_mmc_timing.c kernel-doc issues * clk-mediatek: (29 commits) clk: mediatek: clk-mtk: Remove unneeded semicolon clk: mediatek: remove MT8195 vppsys/0/1 simple_probe dt-bindings: arm: mediatek: migrate MT8195 vppsys0/1 to mtk-mmsys driver clk: mediatek: add MT7981 clock support dt-bindings: clock: mediatek: add mt7981 clock IDs dt-bindings: clock: Add compatibles for MT7981 clk: mediatek: clk-mt7986-topckgen: Migrate to mtk_clk_simple_probe() clk: mediatek: clk-mt7986-topckgen: Properly keep some clocks enabled clk: mediatek: clk-mt6795-topckgen: Migrate to mtk_clk_simple_probe() clk: mediatek: clk-mt8186-topckgen: Migrate to mtk_clk_simple_probe() clk: mediatek: clk-mt8192: Migrate topckgen to mtk_clk_simple_probe() clk: mediatek: clk-mtk: Register MFG notifier in mtk_clk_simple_probe() clk: mediatek: clk-mt8183: Join top_aud_muxes and top_aud_divs clk: mediatek: mt8186: Join top_adj_div and top_muxes clk: mediatek: mt8192: Join top_adj_divs and top_muxes clk: mediatek: clk-mt8192: Move CLK_TOP_CSW_F26M_D2 in top_divs clk: mediatek: mt8173: Migrate pericfg/topckgen to mtk_clk_simple_probe() clk: mediatek: clk-mtk: Extend mtk_clk_simple_probe() clk: mediatek: Switch to mtk_clk_simple_probe() where possible clk: mediatek: mt8173: Break down clock drivers and allow module build ... * clk-imx: clk: imx: pll14xx: fix recalc_rate for negative kdiv MAINTAINERS: clk: imx: Add Peng Fan as reviewer clk: imx: fix compile testing imxrt1050 clk: imx: set imx_clk_gpr_mux_ops storage-class-specifier to static clk: imx6ul: add ethernet refclock mux support clk: imx6ul: fix enet1 gate configuration clk: imx: add imx_obtain_fixed_of_clock() clk: imx6q: add ethernet refclock mux support clk: imx: add clk-gpr-mux driver dt-bindings: imx8ulp: clock: no spaces before tabs clk: imx6sll: add proper spdx license identifier clk: imx: imx93: invoke imx_register_uart_clocks clk: imx: remove clk_count of imx_register_uart_clocks clk: imx: get stdout clk count from device tree clk: imx: avoid memory leak * clk-core: clk: Honor CLK_OPS_PARENT_ENABLE in clk_core_is_enabled()
This commit is contained in:
commit
60950df7b4
|
@ -10,6 +10,7 @@ Required Properties:
|
|||
- "mediatek,mt7622-ethsys", "syscon"
|
||||
- "mediatek,mt7623-ethsys", "mediatek,mt2701-ethsys", "syscon"
|
||||
- "mediatek,mt7629-ethsys", "syscon"
|
||||
- "mediatek,mt7981-ethsys", "syscon"
|
||||
- "mediatek,mt7986-ethsys", "syscon"
|
||||
- #clock-cells: Must be 1
|
||||
- #reset-cells: Must be 1
|
||||
|
|
|
@ -28,6 +28,7 @@ properties:
|
|||
- mediatek,mt6797-infracfg
|
||||
- mediatek,mt7622-infracfg
|
||||
- mediatek,mt7629-infracfg
|
||||
- mediatek,mt7981-infracfg
|
||||
- mediatek,mt7986-infracfg
|
||||
- mediatek,mt8135-infracfg
|
||||
- mediatek,mt8167-infracfg
|
||||
|
|
|
@ -28,11 +28,9 @@ properties:
|
|||
- mediatek,mt8195-imp_iic_wrap_s
|
||||
- mediatek,mt8195-imp_iic_wrap_w
|
||||
- mediatek,mt8195-mfgcfg
|
||||
- mediatek,mt8195-vppsys0
|
||||
- mediatek,mt8195-wpesys
|
||||
- mediatek,mt8195-wpesys_vpp0
|
||||
- mediatek,mt8195-wpesys_vpp1
|
||||
- mediatek,mt8195-vppsys1
|
||||
- mediatek,mt8195-imgsys
|
||||
- mediatek,mt8195-imgsys1_dip_top
|
||||
- mediatek,mt8195-imgsys1_dip_nr
|
||||
|
@ -92,13 +90,6 @@ examples:
|
|||
#clock-cells = <1>;
|
||||
};
|
||||
|
||||
- |
|
||||
vppsys0: clock-controller@14000000 {
|
||||
compatible = "mediatek,mt8195-vppsys0";
|
||||
reg = <0x14000000 0x1000>;
|
||||
#clock-cells = <1>;
|
||||
};
|
||||
|
||||
- |
|
||||
wpesys: clock-controller@14e00000 {
|
||||
compatible = "mediatek,mt8195-wpesys";
|
||||
|
@ -120,13 +111,6 @@ examples:
|
|||
#clock-cells = <1>;
|
||||
};
|
||||
|
||||
- |
|
||||
vppsys1: clock-controller@14f00000 {
|
||||
compatible = "mediatek,mt8195-vppsys1";
|
||||
reg = <0x14f00000 0x1000>;
|
||||
#clock-cells = <1>;
|
||||
};
|
||||
|
||||
- |
|
||||
imgsys: clock-controller@15000000 {
|
||||
compatible = "mediatek,mt8195-imgsys";
|
||||
|
|
|
@ -8,6 +8,8 @@ Required Properties:
|
|||
- compatible: Should be:
|
||||
- "mediatek,mt7622-sgmiisys", "syscon"
|
||||
- "mediatek,mt7629-sgmiisys", "syscon"
|
||||
- "mediatek,mt7981-sgmiisys_0", "syscon"
|
||||
- "mediatek,mt7981-sgmiisys_1", "syscon"
|
||||
- "mediatek,mt7986-sgmiisys_0", "syscon"
|
||||
- "mediatek,mt7986-sgmiisys_1", "syscon"
|
||||
- #clock-cells: Must be 1
|
||||
|
|
|
@ -20,6 +20,7 @@ properties:
|
|||
- enum:
|
||||
- mediatek,mt6797-apmixedsys
|
||||
- mediatek,mt7622-apmixedsys
|
||||
- mediatek,mt7981-apmixedsys
|
||||
- mediatek,mt7986-apmixedsys
|
||||
- mediatek,mt8135-apmixedsys
|
||||
- mediatek,mt8173-apmixedsys
|
||||
|
|
|
@ -35,6 +35,7 @@ properties:
|
|||
- mediatek,mt6779-topckgen
|
||||
- mediatek,mt6795-topckgen
|
||||
- mediatek,mt7629-topckgen
|
||||
- mediatek,mt7981-topckgen
|
||||
- mediatek,mt7986-topckgen
|
||||
- mediatek,mt8167-topckgen
|
||||
- mediatek,mt8183-topckgen
|
||||
|
|
|
@ -14993,6 +14993,7 @@ F: drivers/iio/gyro/fxas21002c_spi.c
|
|||
|
||||
NXP i.MX CLOCK DRIVERS
|
||||
M: Abel Vesa <abelvesa@kernel.org>
|
||||
R: Peng Fan <peng.fan@nxp.com>
|
||||
L: linux-clk@vger.kernel.org
|
||||
L: linux-imx@nxp.com
|
||||
S: Maintained
|
||||
|
|
|
@ -3,7 +3,7 @@
|
|||
# Makefile for at91 specific clk
|
||||
#
|
||||
|
||||
obj-y += pmc.o sckc.o dt-compat.o
|
||||
obj-y += pmc.o sckc.o
|
||||
obj-y += clk-slow.o clk-main.o clk-pll.o clk-plldiv.o clk-master.o
|
||||
obj-y += clk-system.o clk-peripheral.o clk-programmable.o
|
||||
|
||||
|
@ -15,12 +15,12 @@ obj-$(CONFIG_HAVE_AT91_H32MX) += clk-h32mx.o
|
|||
obj-$(CONFIG_HAVE_AT91_GENERATED_CLK) += clk-generated.o
|
||||
obj-$(CONFIG_HAVE_AT91_I2S_MUX_CLK) += clk-i2s-mux.o
|
||||
obj-$(CONFIG_HAVE_AT91_SAM9X60_PLL) += clk-sam9x60-pll.o
|
||||
obj-$(CONFIG_SOC_AT91RM9200) += at91rm9200.o
|
||||
obj-$(CONFIG_SOC_AT91SAM9) += at91sam9260.o at91sam9rl.o at91sam9x5.o
|
||||
obj-$(CONFIG_SOC_AT91SAM9) += at91sam9g45.o
|
||||
obj-$(CONFIG_SOC_AT91SAM9) += at91sam9n12.o at91sam9x5.o
|
||||
obj-$(CONFIG_SOC_AT91RM9200) += at91rm9200.o dt-compat.o
|
||||
obj-$(CONFIG_SOC_AT91SAM9) += at91sam9260.o at91sam9rl.o at91sam9x5.o dt-compat.o
|
||||
obj-$(CONFIG_SOC_AT91SAM9) += at91sam9g45.o dt-compat.o
|
||||
obj-$(CONFIG_SOC_AT91SAM9) += at91sam9n12.o at91sam9x5.o dt-compat.o
|
||||
obj-$(CONFIG_SOC_SAM9X60) += sam9x60.o
|
||||
obj-$(CONFIG_SOC_SAMA5D3) += sama5d3.o
|
||||
obj-$(CONFIG_SOC_SAMA5D4) += sama5d4.o
|
||||
obj-$(CONFIG_SOC_SAMA5D2) += sama5d2.o
|
||||
obj-$(CONFIG_SOC_SAMA5D3) += sama5d3.o dt-compat.o
|
||||
obj-$(CONFIG_SOC_SAMA5D4) += sama5d4.o dt-compat.o
|
||||
obj-$(CONFIG_SOC_SAMA5D2) += sama5d2.o dt-compat.o
|
||||
obj-$(CONFIG_SOC_SAMA7G5) += sama7g5.o
|
||||
|
|
|
@ -183,7 +183,7 @@ static void __init at91rm9200_pmc_setup(struct device_node *np)
|
|||
for (i = 0; i < ARRAY_SIZE(at91rm9200_systemck); i++) {
|
||||
hw = at91_clk_register_system(regmap, at91rm9200_systemck[i].n,
|
||||
at91rm9200_systemck[i].p,
|
||||
at91rm9200_systemck[i].id);
|
||||
at91rm9200_systemck[i].id, 0);
|
||||
if (IS_ERR(hw))
|
||||
goto err_free;
|
||||
|
||||
|
|
|
@ -460,7 +460,7 @@ static void __init at91sam926x_pmc_setup(struct device_node *np,
|
|||
for (i = 0; i < data->num_sck; i++) {
|
||||
hw = at91_clk_register_system(regmap, data->sck[i].n,
|
||||
data->sck[i].p,
|
||||
data->sck[i].id);
|
||||
data->sck[i].id, 0);
|
||||
if (IS_ERR(hw))
|
||||
goto err_free;
|
||||
|
||||
|
|
|
@ -40,9 +40,14 @@ static const struct clk_pll_characteristics plla_characteristics = {
|
|||
static const struct {
|
||||
char *n;
|
||||
char *p;
|
||||
unsigned long flags;
|
||||
u8 id;
|
||||
} at91sam9g45_systemck[] = {
|
||||
{ .n = "ddrck", .p = "masterck_div", .id = 2 },
|
||||
/*
|
||||
* ddrck feeds DDR controller and is enabled by bootloader thus we need
|
||||
* to keep it enabled in case there is no Linux consumer for it.
|
||||
*/
|
||||
{ .n = "ddrck", .p = "masterck_div", .id = 2, .flags = CLK_IS_CRITICAL },
|
||||
{ .n = "uhpck", .p = "usbck", .id = 6 },
|
||||
{ .n = "pck0", .p = "prog0", .id = 8 },
|
||||
{ .n = "pck1", .p = "prog1", .id = 9 },
|
||||
|
@ -198,7 +203,8 @@ static void __init at91sam9g45_pmc_setup(struct device_node *np)
|
|||
for (i = 0; i < ARRAY_SIZE(at91sam9g45_systemck); i++) {
|
||||
hw = at91_clk_register_system(regmap, at91sam9g45_systemck[i].n,
|
||||
at91sam9g45_systemck[i].p,
|
||||
at91sam9g45_systemck[i].id);
|
||||
at91sam9g45_systemck[i].id,
|
||||
at91sam9g45_systemck[i].flags);
|
||||
if (IS_ERR(hw))
|
||||
goto err_free;
|
||||
|
||||
|
|
|
@ -54,9 +54,14 @@ static const struct clk_pll_characteristics pllb_characteristics = {
|
|||
static const struct {
|
||||
char *n;
|
||||
char *p;
|
||||
unsigned long flags;
|
||||
u8 id;
|
||||
} at91sam9n12_systemck[] = {
|
||||
{ .n = "ddrck", .p = "masterck_div", .id = 2 },
|
||||
/*
|
||||
* ddrck feeds DDR controller and is enabled by bootloader thus we need
|
||||
* to keep it enabled in case there is no Linux consumer for it.
|
||||
*/
|
||||
{ .n = "ddrck", .p = "masterck_div", .id = 2, .flags = CLK_IS_CRITICAL },
|
||||
{ .n = "lcdck", .p = "masterck_div", .id = 3 },
|
||||
{ .n = "uhpck", .p = "usbck", .id = 6 },
|
||||
{ .n = "udpck", .p = "usbck", .id = 7 },
|
||||
|
@ -223,7 +228,8 @@ static void __init at91sam9n12_pmc_setup(struct device_node *np)
|
|||
for (i = 0; i < ARRAY_SIZE(at91sam9n12_systemck); i++) {
|
||||
hw = at91_clk_register_system(regmap, at91sam9n12_systemck[i].n,
|
||||
at91sam9n12_systemck[i].p,
|
||||
at91sam9n12_systemck[i].id);
|
||||
at91sam9n12_systemck[i].id,
|
||||
at91sam9n12_systemck[i].flags);
|
||||
if (IS_ERR(hw))
|
||||
goto err_free;
|
||||
|
||||
|
@ -236,7 +242,7 @@ static void __init at91sam9n12_pmc_setup(struct device_node *np)
|
|||
at91sam9n12_periphck[i].n,
|
||||
"masterck_div",
|
||||
at91sam9n12_periphck[i].id,
|
||||
&range, INT_MIN);
|
||||
&range, INT_MIN, 0);
|
||||
if (IS_ERR(hw))
|
||||
goto err_free;
|
||||
|
||||
|
|
|
@ -160,7 +160,7 @@ static void __init at91sam9rl_pmc_setup(struct device_node *np)
|
|||
for (i = 0; i < ARRAY_SIZE(at91sam9rl_systemck); i++) {
|
||||
hw = at91_clk_register_system(regmap, at91sam9rl_systemck[i].n,
|
||||
at91sam9rl_systemck[i].p,
|
||||
at91sam9rl_systemck[i].id);
|
||||
at91sam9rl_systemck[i].id, 0);
|
||||
if (IS_ERR(hw))
|
||||
goto err_free;
|
||||
|
||||
|
|
|
@ -41,9 +41,14 @@ static const struct clk_pll_characteristics plla_characteristics = {
|
|||
static const struct {
|
||||
char *n;
|
||||
char *p;
|
||||
unsigned long flags;
|
||||
u8 id;
|
||||
} at91sam9x5_systemck[] = {
|
||||
{ .n = "ddrck", .p = "masterck_div", .id = 2 },
|
||||
/*
|
||||
* ddrck feeds DDR controller and is enabled by bootloader thus we need
|
||||
* to keep it enabled in case there is no Linux consumer for it.
|
||||
*/
|
||||
{ .n = "ddrck", .p = "masterck_div", .id = 2, .flags = CLK_IS_CRITICAL },
|
||||
{ .n = "smdck", .p = "smdclk", .id = 4 },
|
||||
{ .n = "uhpck", .p = "usbck", .id = 6 },
|
||||
{ .n = "udpck", .p = "usbck", .id = 7 },
|
||||
|
@ -248,7 +253,8 @@ static void __init at91sam9x5_pmc_setup(struct device_node *np,
|
|||
for (i = 0; i < ARRAY_SIZE(at91sam9x5_systemck); i++) {
|
||||
hw = at91_clk_register_system(regmap, at91sam9x5_systemck[i].n,
|
||||
at91sam9x5_systemck[i].p,
|
||||
at91sam9x5_systemck[i].id);
|
||||
at91sam9x5_systemck[i].id,
|
||||
at91sam9x5_systemck[i].flags);
|
||||
if (IS_ERR(hw))
|
||||
goto err_free;
|
||||
|
||||
|
@ -256,7 +262,8 @@ static void __init at91sam9x5_pmc_setup(struct device_node *np,
|
|||
}
|
||||
|
||||
if (has_lcdck) {
|
||||
hw = at91_clk_register_system(regmap, "lcdck", "masterck_div", 3);
|
||||
hw = at91_clk_register_system(regmap, "lcdck", "masterck_div",
|
||||
3, 0);
|
||||
if (IS_ERR(hw))
|
||||
goto err_free;
|
||||
|
||||
|
@ -269,7 +276,7 @@ static void __init at91sam9x5_pmc_setup(struct device_node *np,
|
|||
at91sam9x5_periphck[i].n,
|
||||
"masterck_div",
|
||||
at91sam9x5_periphck[i].id,
|
||||
&range, INT_MIN);
|
||||
&range, INT_MIN, 0);
|
||||
if (IS_ERR(hw))
|
||||
goto err_free;
|
||||
|
||||
|
@ -282,7 +289,7 @@ static void __init at91sam9x5_pmc_setup(struct device_node *np,
|
|||
extra_pcks[i].n,
|
||||
"masterck_div",
|
||||
extra_pcks[i].id,
|
||||
&range, INT_MIN);
|
||||
&range, INT_MIN, 0);
|
||||
if (IS_ERR(hw))
|
||||
goto err_free;
|
||||
|
||||
|
|
|
@ -445,7 +445,7 @@ at91_clk_register_sam9x5_peripheral(struct regmap *regmap, spinlock_t *lock,
|
|||
const struct clk_pcr_layout *layout,
|
||||
const char *name, const char *parent_name,
|
||||
u32 id, const struct clk_range *range,
|
||||
int chg_pid)
|
||||
int chg_pid, unsigned long flags)
|
||||
{
|
||||
struct clk_sam9x5_peripheral *periph;
|
||||
struct clk_init_data init;
|
||||
|
@ -462,12 +462,12 @@ at91_clk_register_sam9x5_peripheral(struct regmap *regmap, spinlock_t *lock,
|
|||
init.name = name;
|
||||
init.parent_names = &parent_name;
|
||||
init.num_parents = 1;
|
||||
init.flags = flags;
|
||||
if (chg_pid < 0) {
|
||||
init.flags = 0;
|
||||
init.ops = &sam9x5_peripheral_ops;
|
||||
} else {
|
||||
init.flags = CLK_SET_RATE_GATE | CLK_SET_PARENT_GATE |
|
||||
CLK_SET_RATE_PARENT;
|
||||
init.flags |= CLK_SET_RATE_GATE | CLK_SET_PARENT_GATE |
|
||||
CLK_SET_RATE_PARENT;
|
||||
init.ops = &sam9x5_peripheral_chg_ops;
|
||||
}
|
||||
|
||||
|
|
|
@ -105,7 +105,7 @@ static const struct clk_ops system_ops = {
|
|||
|
||||
struct clk_hw * __init
|
||||
at91_clk_register_system(struct regmap *regmap, const char *name,
|
||||
const char *parent_name, u8 id)
|
||||
const char *parent_name, u8 id, unsigned long flags)
|
||||
{
|
||||
struct clk_system *sys;
|
||||
struct clk_hw *hw;
|
||||
|
@ -123,7 +123,7 @@ at91_clk_register_system(struct regmap *regmap, const char *name,
|
|||
init.ops = &system_ops;
|
||||
init.parent_names = &parent_name;
|
||||
init.num_parents = 1;
|
||||
init.flags = CLK_SET_RATE_PARENT;
|
||||
init.flags = CLK_SET_RATE_PARENT | flags;
|
||||
|
||||
sys->id = id;
|
||||
sys->hw.init = &init;
|
||||
|
|
|
@ -493,18 +493,28 @@ of_at91_clk_periph_setup(struct device_node *np, u8 type)
|
|||
parent_name, id);
|
||||
} else {
|
||||
struct clk_range range = CLK_RANGE(0, 0);
|
||||
unsigned long flags = 0;
|
||||
|
||||
of_at91_get_clk_range(periphclknp,
|
||||
"atmel,clk-output-range",
|
||||
&range);
|
||||
|
||||
/*
|
||||
* mpddr_clk feed DDR controller and is enabled by
|
||||
* bootloader thus we need to keep it enabled in case
|
||||
* there is no Linux consumer for it.
|
||||
*/
|
||||
if (!strcmp(periphclknp->name, "mpddr_clk"))
|
||||
flags = CLK_IS_CRITICAL;
|
||||
|
||||
hw = at91_clk_register_sam9x5_peripheral(regmap,
|
||||
&pmc_pcr_lock,
|
||||
&dt_pcr_layout,
|
||||
name,
|
||||
parent_name,
|
||||
id, &range,
|
||||
INT_MIN);
|
||||
INT_MIN,
|
||||
flags);
|
||||
}
|
||||
|
||||
if (IS_ERR(hw))
|
||||
|
@ -879,6 +889,8 @@ static void __init of_at91rm9200_clk_sys_setup(struct device_node *np)
|
|||
return;
|
||||
|
||||
for_each_child_of_node(np, sysclknp) {
|
||||
unsigned long flags = 0;
|
||||
|
||||
if (of_property_read_u32(sysclknp, "reg", &id))
|
||||
continue;
|
||||
|
||||
|
@ -887,7 +899,16 @@ static void __init of_at91rm9200_clk_sys_setup(struct device_node *np)
|
|||
|
||||
parent_name = of_clk_get_parent_name(sysclknp, 0);
|
||||
|
||||
hw = at91_clk_register_system(regmap, name, parent_name, id);
|
||||
/*
|
||||
* ddrck feeds DDR controller and is enabled by bootloader thus
|
||||
* we need to keep it enabled in case there is no Linux consumer
|
||||
* for it.
|
||||
*/
|
||||
if (!strcmp(sysclknp->name, "ddrck"))
|
||||
flags = CLK_IS_CRITICAL;
|
||||
|
||||
hw = at91_clk_register_system(regmap, name, parent_name, id,
|
||||
flags);
|
||||
if (IS_ERR(hw))
|
||||
continue;
|
||||
|
||||
|
|
|
@ -199,7 +199,7 @@ at91_clk_register_sam9x5_peripheral(struct regmap *regmap, spinlock_t *lock,
|
|||
const struct clk_pcr_layout *layout,
|
||||
const char *name, const char *parent_name,
|
||||
u32 id, const struct clk_range *range,
|
||||
int chg_pid);
|
||||
int chg_pid, unsigned long flags);
|
||||
|
||||
struct clk_hw * __init
|
||||
at91_clk_register_pll(struct regmap *regmap, const char *name,
|
||||
|
@ -242,7 +242,7 @@ at91sam9x5_clk_register_smd(struct regmap *regmap, const char *name,
|
|||
|
||||
struct clk_hw * __init
|
||||
at91_clk_register_system(struct regmap *regmap, const char *name,
|
||||
const char *parent_name, u8 id);
|
||||
const char *parent_name, u8 id, unsigned long flags);
|
||||
|
||||
struct clk_hw * __init
|
||||
at91sam9x5_clk_register_usb(struct regmap *regmap, const char *name,
|
||||
|
|
|
@ -75,9 +75,14 @@ static const struct clk_pcr_layout sam9x60_pcr_layout = {
|
|||
static const struct {
|
||||
char *n;
|
||||
char *p;
|
||||
unsigned long flags;
|
||||
u8 id;
|
||||
} sam9x60_systemck[] = {
|
||||
{ .n = "ddrck", .p = "masterck_div", .id = 2 },
|
||||
/*
|
||||
* ddrck feeds DDR controller and is enabled by bootloader thus we need
|
||||
* to keep it enabled in case there is no Linux consumer for it.
|
||||
*/
|
||||
{ .n = "ddrck", .p = "masterck_div", .id = 2, .flags = CLK_IS_CRITICAL },
|
||||
{ .n = "uhpck", .p = "usbck", .id = 6 },
|
||||
{ .n = "pck0", .p = "prog0", .id = 8 },
|
||||
{ .n = "pck1", .p = "prog1", .id = 9 },
|
||||
|
@ -86,6 +91,7 @@ static const struct {
|
|||
|
||||
static const struct {
|
||||
char *n;
|
||||
unsigned long flags;
|
||||
u8 id;
|
||||
} sam9x60_periphck[] = {
|
||||
{ .n = "pioA_clk", .id = 2, },
|
||||
|
@ -132,7 +138,11 @@ static const struct {
|
|||
{ .n = "pioD_clk", .id = 44, },
|
||||
{ .n = "tcb1_clk", .id = 45, },
|
||||
{ .n = "dbgu_clk", .id = 47, },
|
||||
{ .n = "mpddr_clk", .id = 49, },
|
||||
/*
|
||||
* mpddr_clk feeds DDR controller and is enabled by bootloader thus we
|
||||
* need to keep it enabled in case there is no Linux consumer for it.
|
||||
*/
|
||||
{ .n = "mpddr_clk", .id = 49, .flags = CLK_IS_CRITICAL },
|
||||
};
|
||||
|
||||
static const struct {
|
||||
|
@ -315,7 +325,8 @@ static void __init sam9x60_pmc_setup(struct device_node *np)
|
|||
for (i = 0; i < ARRAY_SIZE(sam9x60_systemck); i++) {
|
||||
hw = at91_clk_register_system(regmap, sam9x60_systemck[i].n,
|
||||
sam9x60_systemck[i].p,
|
||||
sam9x60_systemck[i].id);
|
||||
sam9x60_systemck[i].id,
|
||||
sam9x60_systemck[i].flags);
|
||||
if (IS_ERR(hw))
|
||||
goto err_free;
|
||||
|
||||
|
@ -328,7 +339,8 @@ static void __init sam9x60_pmc_setup(struct device_node *np)
|
|||
sam9x60_periphck[i].n,
|
||||
"masterck_div",
|
||||
sam9x60_periphck[i].id,
|
||||
&range, INT_MIN);
|
||||
&range, INT_MIN,
|
||||
sam9x60_periphck[i].flags);
|
||||
if (IS_ERR(hw))
|
||||
goto err_free;
|
||||
|
||||
|
|
|
@ -40,9 +40,14 @@ static const struct clk_pcr_layout sama5d2_pcr_layout = {
|
|||
static const struct {
|
||||
char *n;
|
||||
char *p;
|
||||
unsigned long flags;
|
||||
u8 id;
|
||||
} sama5d2_systemck[] = {
|
||||
{ .n = "ddrck", .p = "masterck_div", .id = 2 },
|
||||
/*
|
||||
* ddrck feeds DDR controller and is enabled by bootloader thus we need
|
||||
* to keep it enabled in case there is no Linux consumer for it.
|
||||
*/
|
||||
{ .n = "ddrck", .p = "masterck_div", .id = 2, .flags = CLK_IS_CRITICAL },
|
||||
{ .n = "lcdck", .p = "masterck_div", .id = 3 },
|
||||
{ .n = "uhpck", .p = "usbck", .id = 6 },
|
||||
{ .n = "udpck", .p = "usbck", .id = 7 },
|
||||
|
@ -97,6 +102,7 @@ static const struct {
|
|||
|
||||
static const struct {
|
||||
char *n;
|
||||
unsigned long flags;
|
||||
u8 id;
|
||||
} sama5d2_periphck[] = {
|
||||
{ .n = "dma0_clk", .id = 6, },
|
||||
|
@ -104,7 +110,11 @@ static const struct {
|
|||
{ .n = "aes_clk", .id = 9, },
|
||||
{ .n = "aesb_clk", .id = 10, },
|
||||
{ .n = "sha_clk", .id = 12, },
|
||||
{ .n = "mpddr_clk", .id = 13, },
|
||||
/*
|
||||
* mpddr_clk feeds DDR controller and is enabled by bootloader thus we
|
||||
* need to keep it enabled in case there is no Linux consumer for it.
|
||||
*/
|
||||
{ .n = "mpddr_clk", .id = 13, .flags = CLK_IS_CRITICAL },
|
||||
{ .n = "matrix0_clk", .id = 15, },
|
||||
{ .n = "sdmmc0_hclk", .id = 31, },
|
||||
{ .n = "sdmmc1_hclk", .id = 32, },
|
||||
|
@ -302,7 +312,8 @@ static void __init sama5d2_pmc_setup(struct device_node *np)
|
|||
for (i = 0; i < ARRAY_SIZE(sama5d2_systemck); i++) {
|
||||
hw = at91_clk_register_system(regmap, sama5d2_systemck[i].n,
|
||||
sama5d2_systemck[i].p,
|
||||
sama5d2_systemck[i].id);
|
||||
sama5d2_systemck[i].id,
|
||||
sama5d2_systemck[i].flags);
|
||||
if (IS_ERR(hw))
|
||||
goto err_free;
|
||||
|
||||
|
@ -315,7 +326,8 @@ static void __init sama5d2_pmc_setup(struct device_node *np)
|
|||
sama5d2_periphck[i].n,
|
||||
"masterck_div",
|
||||
sama5d2_periphck[i].id,
|
||||
&range, INT_MIN);
|
||||
&range, INT_MIN,
|
||||
sama5d2_periphck[i].flags);
|
||||
if (IS_ERR(hw))
|
||||
goto err_free;
|
||||
|
||||
|
@ -329,7 +341,7 @@ static void __init sama5d2_pmc_setup(struct device_node *np)
|
|||
"h32mxck",
|
||||
sama5d2_periph32ck[i].id,
|
||||
&sama5d2_periph32ck[i].r,
|
||||
INT_MIN);
|
||||
INT_MIN, 0);
|
||||
if (IS_ERR(hw))
|
||||
goto err_free;
|
||||
|
||||
|
|
|
@ -40,9 +40,14 @@ static const struct clk_pcr_layout sama5d3_pcr_layout = {
|
|||
static const struct {
|
||||
char *n;
|
||||
char *p;
|
||||
unsigned long flags;
|
||||
u8 id;
|
||||
} sama5d3_systemck[] = {
|
||||
{ .n = "ddrck", .p = "masterck_div", .id = 2 },
|
||||
/*
|
||||
* ddrck feeds DDR controller and is enabled by bootloader thus we need
|
||||
* to keep it enabled in case there is no Linux consumer for it.
|
||||
*/
|
||||
{ .n = "ddrck", .p = "masterck_div", .id = 2, .flags = CLK_IS_CRITICAL },
|
||||
{ .n = "lcdck", .p = "masterck_div", .id = 3 },
|
||||
{ .n = "smdck", .p = "smdclk", .id = 4 },
|
||||
{ .n = "uhpck", .p = "usbck", .id = 6 },
|
||||
|
@ -56,6 +61,7 @@ static const struct {
|
|||
char *n;
|
||||
u8 id;
|
||||
struct clk_range r;
|
||||
unsigned long flags;
|
||||
} sama5d3_periphck[] = {
|
||||
{ .n = "dbgu_clk", .id = 2, },
|
||||
{ .n = "hsmc_clk", .id = 5, },
|
||||
|
@ -99,7 +105,11 @@ static const struct {
|
|||
{ .n = "tdes_clk", .id = 44, },
|
||||
{ .n = "trng_clk", .id = 45, },
|
||||
{ .n = "fuse_clk", .id = 48, },
|
||||
{ .n = "mpddr_clk", .id = 49, },
|
||||
/*
|
||||
* mpddr_clk feeds DDR controller and is enabled by bootloader thus we
|
||||
* need to keep it enabled in case there is no Linux consumer for it.
|
||||
*/
|
||||
{ .n = "mpddr_clk", .id = 49, .flags = CLK_IS_CRITICAL },
|
||||
};
|
||||
|
||||
static void __init sama5d3_pmc_setup(struct device_node *np)
|
||||
|
@ -222,7 +232,8 @@ static void __init sama5d3_pmc_setup(struct device_node *np)
|
|||
for (i = 0; i < ARRAY_SIZE(sama5d3_systemck); i++) {
|
||||
hw = at91_clk_register_system(regmap, sama5d3_systemck[i].n,
|
||||
sama5d3_systemck[i].p,
|
||||
sama5d3_systemck[i].id);
|
||||
sama5d3_systemck[i].id,
|
||||
sama5d3_systemck[i].flags);
|
||||
if (IS_ERR(hw))
|
||||
goto err_free;
|
||||
|
||||
|
@ -236,7 +247,8 @@ static void __init sama5d3_pmc_setup(struct device_node *np)
|
|||
"masterck_div",
|
||||
sama5d3_periphck[i].id,
|
||||
&sama5d3_periphck[i].r,
|
||||
INT_MIN);
|
||||
INT_MIN,
|
||||
sama5d3_periphck[i].flags);
|
||||
if (IS_ERR(hw))
|
||||
goto err_free;
|
||||
|
||||
|
|
|
@ -39,9 +39,14 @@ static const struct clk_pcr_layout sama5d4_pcr_layout = {
|
|||
static const struct {
|
||||
char *n;
|
||||
char *p;
|
||||
unsigned long flags;
|
||||
u8 id;
|
||||
} sama5d4_systemck[] = {
|
||||
{ .n = "ddrck", .p = "masterck_div", .id = 2 },
|
||||
/*
|
||||
* ddrck feeds DDR controller and is enabled by bootloader thus we need
|
||||
* to keep it enabled in case there is no Linux consumer for it.
|
||||
*/
|
||||
{ .n = "ddrck", .p = "masterck_div", .id = 2, .flags = CLK_IS_CRITICAL },
|
||||
{ .n = "lcdck", .p = "masterck_div", .id = 3 },
|
||||
{ .n = "smdck", .p = "smdclk", .id = 4 },
|
||||
{ .n = "uhpck", .p = "usbck", .id = 6 },
|
||||
|
@ -103,12 +108,17 @@ static const struct {
|
|||
|
||||
static const struct {
|
||||
char *n;
|
||||
unsigned long flags;
|
||||
u8 id;
|
||||
} sama5d4_periphck[] = {
|
||||
{ .n = "dma0_clk", .id = 8 },
|
||||
{ .n = "cpkcc_clk", .id = 10 },
|
||||
{ .n = "aesb_clk", .id = 13 },
|
||||
{ .n = "mpddr_clk", .id = 16 },
|
||||
/*
|
||||
* mpddr_clk feeds DDR controller and is enabled by bootloader thus we
|
||||
* need to keep it enabled in case there is no Linux consumer for it.
|
||||
*/
|
||||
{ .n = "mpddr_clk", .id = 16, .flags = CLK_IS_CRITICAL },
|
||||
{ .n = "matrix0_clk", .id = 18 },
|
||||
{ .n = "vdec_clk", .id = 19 },
|
||||
{ .n = "dma1_clk", .id = 50 },
|
||||
|
@ -245,7 +255,8 @@ static void __init sama5d4_pmc_setup(struct device_node *np)
|
|||
for (i = 0; i < ARRAY_SIZE(sama5d4_systemck); i++) {
|
||||
hw = at91_clk_register_system(regmap, sama5d4_systemck[i].n,
|
||||
sama5d4_systemck[i].p,
|
||||
sama5d4_systemck[i].id);
|
||||
sama5d4_systemck[i].id,
|
||||
sama5d4_systemck[i].flags);
|
||||
if (IS_ERR(hw))
|
||||
goto err_free;
|
||||
|
||||
|
@ -258,7 +269,8 @@ static void __init sama5d4_pmc_setup(struct device_node *np)
|
|||
sama5d4_periphck[i].n,
|
||||
"masterck_div",
|
||||
sama5d4_periphck[i].id,
|
||||
&range, INT_MIN);
|
||||
&range, INT_MIN,
|
||||
sama5d4_periphck[i].flags);
|
||||
if (IS_ERR(hw))
|
||||
goto err_free;
|
||||
|
||||
|
@ -271,7 +283,7 @@ static void __init sama5d4_pmc_setup(struct device_node *np)
|
|||
sama5d4_periph32ck[i].n,
|
||||
"h32mxck",
|
||||
sama5d4_periph32ck[i].id,
|
||||
&range, INT_MIN);
|
||||
&range, INT_MIN, 0);
|
||||
if (IS_ERR(hw))
|
||||
goto err_free;
|
||||
|
||||
|
|
|
@ -1068,7 +1068,7 @@ static void __init sama7g5_pmc_setup(struct device_node *np)
|
|||
for (i = 0; i < ARRAY_SIZE(sama7g5_systemck); i++) {
|
||||
hw = at91_clk_register_system(regmap, sama7g5_systemck[i].n,
|
||||
sama7g5_systemck[i].p,
|
||||
sama7g5_systemck[i].id);
|
||||
sama7g5_systemck[i].id, 0);
|
||||
if (IS_ERR(hw))
|
||||
goto err_free;
|
||||
|
||||
|
@ -1083,7 +1083,7 @@ static void __init sama7g5_pmc_setup(struct device_node *np)
|
|||
sama7g5_periphck[i].id,
|
||||
&sama7g5_periphck[i].r,
|
||||
sama7g5_periphck[i].chgp ? 0 :
|
||||
INT_MIN);
|
||||
INT_MIN, 0);
|
||||
if (IS_ERR(hw))
|
||||
goto err_free;
|
||||
|
||||
|
|
|
@ -244,6 +244,17 @@ static bool clk_core_is_enabled(struct clk_core *core)
|
|||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* This could be called with the enable lock held, or from atomic
|
||||
* context. If the parent isn't enabled already, we can't do
|
||||
* anything here. We can also assume this clock isn't enabled.
|
||||
*/
|
||||
if ((core->flags & CLK_OPS_PARENT_ENABLE) && core->parent)
|
||||
if (!clk_core_is_enabled(core->parent)) {
|
||||
ret = false;
|
||||
goto done;
|
||||
}
|
||||
|
||||
ret = core->ops->is_enabled(core->hw);
|
||||
done:
|
||||
if (core->rpm_enabled)
|
||||
|
|
|
@ -115,7 +115,7 @@ config CLK_IMX93
|
|||
|
||||
config CLK_IMXRT1050
|
||||
tristate "IMXRT1050 CCM Clock Driver"
|
||||
depends on SOC_IMXRT
|
||||
depends on SOC_IMXRT || COMPILE_TEST
|
||||
select MXC_CLK
|
||||
help
|
||||
Build the driver for i.MXRT1050 CCM Clock Driver
|
||||
|
|
|
@ -22,6 +22,7 @@ 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
|
||||
mxc-clk-objs += clk-gpr-mux.o
|
||||
obj-$(CONFIG_MXC_CLK) += mxc-clk.o
|
||||
|
||||
obj-$(CONFIG_CLK_IMX8MM) += clk-imx8mm.o
|
||||
|
|
|
@ -0,0 +1,119 @@
|
|||
// SPDX-License-Identifier: GPL-2.0
|
||||
/*
|
||||
*/
|
||||
|
||||
#define pr_fmt(fmt) "imx:clk-gpr-mux: " fmt
|
||||
|
||||
#include <linux/module.h>
|
||||
|
||||
#include <linux/clk-provider.h>
|
||||
#include <linux/errno.h>
|
||||
#include <linux/export.h>
|
||||
#include <linux/io.h>
|
||||
#include <linux/slab.h>
|
||||
#include <linux/regmap.h>
|
||||
#include <linux/mfd/syscon.h>
|
||||
|
||||
#include "clk.h"
|
||||
|
||||
struct imx_clk_gpr {
|
||||
struct clk_hw hw;
|
||||
struct regmap *regmap;
|
||||
u32 mask;
|
||||
u32 reg;
|
||||
const u32 *mux_table;
|
||||
};
|
||||
|
||||
static struct imx_clk_gpr *to_imx_clk_gpr(struct clk_hw *hw)
|
||||
{
|
||||
return container_of(hw, struct imx_clk_gpr, hw);
|
||||
}
|
||||
|
||||
static u8 imx_clk_gpr_mux_get_parent(struct clk_hw *hw)
|
||||
{
|
||||
struct imx_clk_gpr *priv = to_imx_clk_gpr(hw);
|
||||
unsigned int val;
|
||||
int ret;
|
||||
|
||||
ret = regmap_read(priv->regmap, priv->reg, &val);
|
||||
if (ret)
|
||||
goto get_parent_err;
|
||||
|
||||
val &= priv->mask;
|
||||
|
||||
ret = clk_mux_val_to_index(hw, priv->mux_table, 0, val);
|
||||
if (ret < 0)
|
||||
goto get_parent_err;
|
||||
|
||||
return ret;
|
||||
|
||||
get_parent_err:
|
||||
pr_err("failed to get parent (%pe)\n", ERR_PTR(ret));
|
||||
|
||||
/* return some realistic non negative value. Potentially we could
|
||||
* give index to some dummy error parent.
|
||||
*/
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int imx_clk_gpr_mux_set_parent(struct clk_hw *hw, u8 index)
|
||||
{
|
||||
struct imx_clk_gpr *priv = to_imx_clk_gpr(hw);
|
||||
unsigned int val = clk_mux_index_to_val(priv->mux_table, 0, index);
|
||||
|
||||
return regmap_update_bits(priv->regmap, priv->reg, priv->mask, val);
|
||||
}
|
||||
|
||||
static int imx_clk_gpr_mux_determine_rate(struct clk_hw *hw,
|
||||
struct clk_rate_request *req)
|
||||
{
|
||||
return clk_mux_determine_rate_flags(hw, req, 0);
|
||||
}
|
||||
|
||||
static const struct clk_ops imx_clk_gpr_mux_ops = {
|
||||
.get_parent = imx_clk_gpr_mux_get_parent,
|
||||
.set_parent = imx_clk_gpr_mux_set_parent,
|
||||
.determine_rate = imx_clk_gpr_mux_determine_rate,
|
||||
};
|
||||
|
||||
struct clk_hw *imx_clk_gpr_mux(const char *name, const char *compatible,
|
||||
u32 reg, const char **parent_names,
|
||||
u8 num_parents, const u32 *mux_table, u32 mask)
|
||||
{
|
||||
struct clk_init_data init = { };
|
||||
struct imx_clk_gpr *priv;
|
||||
struct regmap *regmap;
|
||||
struct clk_hw *hw;
|
||||
int ret;
|
||||
|
||||
regmap = syscon_regmap_lookup_by_compatible(compatible);
|
||||
if (IS_ERR(regmap)) {
|
||||
pr_err("failed to find %s regmap\n", compatible);
|
||||
return ERR_CAST(regmap);
|
||||
}
|
||||
|
||||
priv = kzalloc(sizeof(*priv), GFP_KERNEL);
|
||||
if (!priv)
|
||||
return ERR_PTR(-ENOMEM);
|
||||
|
||||
init.name = name;
|
||||
init.ops = &imx_clk_gpr_mux_ops;
|
||||
init.parent_names = parent_names;
|
||||
init.num_parents = num_parents;
|
||||
init.flags = CLK_SET_RATE_GATE | CLK_SET_PARENT_GATE;
|
||||
|
||||
priv->hw.init = &init;
|
||||
priv->regmap = regmap;
|
||||
priv->mux_table = mux_table;
|
||||
priv->reg = reg;
|
||||
priv->mask = mask;
|
||||
|
||||
hw = &priv->hw;
|
||||
ret = clk_hw_register(NULL, &priv->hw);
|
||||
if (ret) {
|
||||
kfree(priv);
|
||||
hw = ERR_PTR(ret);
|
||||
}
|
||||
|
||||
return hw;
|
||||
}
|
|
@ -218,7 +218,7 @@ static int __init __mx25_clocks_init(void __iomem *ccm_base)
|
|||
*/
|
||||
clk_set_parent(clk[cko_sel], clk[ipg]);
|
||||
|
||||
imx_register_uart_clocks(6);
|
||||
imx_register_uart_clocks();
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
|
|
@ -165,7 +165,7 @@ static void __init _mx27_clocks_init(unsigned long fref)
|
|||
|
||||
clk_prepare_enable(clk[IMX27_CLK_EMI_AHB_GATE]);
|
||||
|
||||
imx_register_uart_clocks(7);
|
||||
imx_register_uart_clocks();
|
||||
|
||||
imx_print_silicon_rev("i.MX27", mx27_revision());
|
||||
}
|
||||
|
|
|
@ -235,7 +235,7 @@ static void __init _mx35_clocks_init(void)
|
|||
*/
|
||||
clk_prepare_enable(clk[scc_gate]);
|
||||
|
||||
imx_register_uart_clocks(4);
|
||||
imx_register_uart_clocks();
|
||||
|
||||
imx_print_silicon_rev("i.MX35", mx35_revision());
|
||||
}
|
||||
|
|
|
@ -358,7 +358,7 @@ static void __init mx50_clocks_init(struct device_node *np)
|
|||
r = clk_round_rate(clk[IMX5_CLK_USBOH3_PER_GATE], 54000000);
|
||||
clk_set_rate(clk[IMX5_CLK_USBOH3_PER_GATE], r);
|
||||
|
||||
imx_register_uart_clocks(5);
|
||||
imx_register_uart_clocks();
|
||||
}
|
||||
CLK_OF_DECLARE(imx50_ccm, "fsl,imx50-ccm", mx50_clocks_init);
|
||||
|
||||
|
@ -464,7 +464,7 @@ static void __init mx51_clocks_init(struct device_node *np)
|
|||
val |= 1 << 23;
|
||||
writel(val, MXC_CCM_CLPCR);
|
||||
|
||||
imx_register_uart_clocks(3);
|
||||
imx_register_uart_clocks();
|
||||
}
|
||||
CLK_OF_DECLARE(imx51_ccm, "fsl,imx51-ccm", mx51_clocks_init);
|
||||
|
||||
|
@ -609,6 +609,6 @@ static void __init mx53_clocks_init(struct device_node *np)
|
|||
r = clk_round_rate(clk[IMX5_CLK_USBOH3_PER_GATE], 54000000);
|
||||
clk_set_rate(clk[IMX5_CLK_USBOH3_PER_GATE], r);
|
||||
|
||||
imx_register_uart_clocks(5);
|
||||
imx_register_uart_clocks();
|
||||
}
|
||||
CLK_OF_DECLARE(imx53_ccm, "fsl,imx53-ccm", mx53_clocks_init);
|
||||
|
|
|
@ -12,6 +12,7 @@
|
|||
#include <linux/clk-provider.h>
|
||||
#include <linux/err.h>
|
||||
#include <linux/io.h>
|
||||
#include <linux/mfd/syscon/imx6q-iomuxc-gpr.h>
|
||||
#include <linux/of.h>
|
||||
#include <linux/of_address.h>
|
||||
#include <linux/of_irq.h>
|
||||
|
@ -115,6 +116,10 @@ static struct clk_div_table video_div_table[] = {
|
|||
{ /* sentinel */ }
|
||||
};
|
||||
|
||||
static const char * enet_ref_sels[] = { "enet_ref", "enet_ref_pad", };
|
||||
static const u32 enet_ref_sels_table[] = { IMX6Q_GPR1_ENET_CLK_SEL_ANATOP, IMX6Q_GPR1_ENET_CLK_SEL_PAD };
|
||||
static const u32 enet_ref_sels_table_mask = IMX6Q_GPR1_ENET_CLK_SEL_ANATOP;
|
||||
|
||||
static unsigned int share_count_esai;
|
||||
static unsigned int share_count_asrc;
|
||||
static unsigned int share_count_ssi1;
|
||||
|
@ -908,6 +913,12 @@ static void __init imx6q_clocks_init(struct device_node *ccm_node)
|
|||
if (clk_on_imx6q() && imx_get_soc_revision() == IMX_CHIP_REVISION_1_0)
|
||||
hws[IMX6QDL_CLK_GPT_3M] = hws[IMX6QDL_CLK_GPT_IPG_PER];
|
||||
|
||||
hws[IMX6QDL_CLK_ENET_REF_PAD] = imx6q_obtain_fixed_clk_hw(ccm_node, "enet_ref_pad", 0);
|
||||
|
||||
hws[IMX6QDL_CLK_ENET_REF_SEL] = imx_clk_gpr_mux("enet_ref_sel", "fsl,imx6q-iomuxc-gpr",
|
||||
IOMUXC_GPR1, enet_ref_sels, ARRAY_SIZE(enet_ref_sels),
|
||||
enet_ref_sels_table, enet_ref_sels_table_mask);
|
||||
|
||||
imx_check_clk_hws(hws, IMX6QDL_CLK_END);
|
||||
|
||||
of_clk_add_hw_provider(np, of_clk_hw_onecell_get, clk_hw_data);
|
||||
|
@ -974,6 +985,8 @@ static void __init imx6q_clocks_init(struct device_node *ccm_node)
|
|||
hws[IMX6QDL_CLK_PLL3_USB_OTG]->clk);
|
||||
}
|
||||
|
||||
imx_register_uart_clocks(2);
|
||||
clk_set_parent(hws[IMX6QDL_CLK_ENET_REF_SEL]->clk, hws[IMX6QDL_CLK_ENET_REF]->clk);
|
||||
|
||||
imx_register_uart_clocks();
|
||||
}
|
||||
CLK_OF_DECLARE(imx6q, "fsl,imx6q-ccm", imx6q_clocks_init);
|
||||
|
|
|
@ -440,6 +440,6 @@ static void __init imx6sl_clocks_init(struct device_node *ccm_node)
|
|||
clk_set_parent(hws[IMX6SL_CLK_LCDIF_AXI_SEL]->clk,
|
||||
hws[IMX6SL_CLK_PLL2_PFD2]->clk);
|
||||
|
||||
imx_register_uart_clocks(2);
|
||||
imx_register_uart_clocks();
|
||||
}
|
||||
CLK_OF_DECLARE(imx6sl, "fsl,imx6sl-ccm", imx6sl_clocks_init);
|
||||
|
|
|
@ -340,7 +340,7 @@ static void __init imx6sll_clocks_init(struct device_node *ccm_node)
|
|||
|
||||
of_clk_add_hw_provider(np, of_clk_hw_onecell_get, clk_hw_data);
|
||||
|
||||
imx_register_uart_clocks(5);
|
||||
imx_register_uart_clocks();
|
||||
|
||||
/* Lower the AHB clock rate before changing the clock source. */
|
||||
clk_set_rate(hws[IMX6SLL_CLK_AHB]->clk, 99000000);
|
||||
|
|
|
@ -548,6 +548,6 @@ static void __init imx6sx_clocks_init(struct device_node *ccm_node)
|
|||
clk_set_parent(hws[IMX6SX_CLK_QSPI1_SEL]->clk, hws[IMX6SX_CLK_PLL2_BUS]->clk);
|
||||
clk_set_parent(hws[IMX6SX_CLK_QSPI2_SEL]->clk, hws[IMX6SX_CLK_PLL2_BUS]->clk);
|
||||
|
||||
imx_register_uart_clocks(2);
|
||||
imx_register_uart_clocks();
|
||||
}
|
||||
CLK_OF_DECLARE(imx6sx, "fsl,imx6sx-ccm", imx6sx_clocks_init);
|
||||
|
|
|
@ -10,6 +10,7 @@
|
|||
#include <linux/err.h>
|
||||
#include <linux/init.h>
|
||||
#include <linux/io.h>
|
||||
#include <linux/mfd/syscon/imx6q-iomuxc-gpr.h>
|
||||
#include <linux/of.h>
|
||||
#include <linux/of_address.h>
|
||||
#include <linux/of_irq.h>
|
||||
|
@ -94,6 +95,17 @@ static const struct clk_div_table video_div_table[] = {
|
|||
{ }
|
||||
};
|
||||
|
||||
static const char * enet1_ref_sels[] = { "enet1_ref_125m", "enet1_ref_pad", };
|
||||
static const u32 enet1_ref_sels_table[] = { IMX6UL_GPR1_ENET1_TX_CLK_DIR,
|
||||
IMX6UL_GPR1_ENET1_CLK_SEL };
|
||||
static const u32 enet1_ref_sels_table_mask = IMX6UL_GPR1_ENET1_TX_CLK_DIR |
|
||||
IMX6UL_GPR1_ENET1_CLK_SEL;
|
||||
static const char * enet2_ref_sels[] = { "enet2_ref_125m", "enet2_ref_pad", };
|
||||
static const u32 enet2_ref_sels_table[] = { IMX6UL_GPR1_ENET2_TX_CLK_DIR,
|
||||
IMX6UL_GPR1_ENET2_CLK_SEL };
|
||||
static const u32 enet2_ref_sels_table_mask = IMX6UL_GPR1_ENET2_TX_CLK_DIR |
|
||||
IMX6UL_GPR1_ENET2_CLK_SEL;
|
||||
|
||||
static u32 share_count_asrc;
|
||||
static u32 share_count_audio;
|
||||
static u32 share_count_sai1;
|
||||
|
@ -176,7 +188,7 @@ static void __init imx6ul_clocks_init(struct device_node *ccm_node)
|
|||
hws[IMX6UL_CLK_PLL3_USB_OTG] = imx_clk_hw_gate("pll3_usb_otg", "pll3_bypass", base + 0x10, 13);
|
||||
hws[IMX6UL_CLK_PLL4_AUDIO] = imx_clk_hw_gate("pll4_audio", "pll4_bypass", base + 0x70, 13);
|
||||
hws[IMX6UL_CLK_PLL5_VIDEO] = imx_clk_hw_gate("pll5_video", "pll5_bypass", base + 0xa0, 13);
|
||||
hws[IMX6UL_CLK_PLL6_ENET] = imx_clk_hw_gate("pll6_enet", "pll6_bypass", base + 0xe0, 13);
|
||||
hws[IMX6UL_CLK_PLL6_ENET] = imx_clk_hw_fixed_factor("pll6_enet", "pll6_bypass", 1, 1);
|
||||
hws[IMX6UL_CLK_PLL7_USB_HOST] = imx_clk_hw_gate("pll7_usb_host", "pll7_bypass", base + 0x20, 13);
|
||||
|
||||
/*
|
||||
|
@ -205,12 +217,13 @@ static void __init imx6ul_clocks_init(struct device_node *ccm_node)
|
|||
hws[IMX6UL_CLK_PLL3_PFD2] = imx_clk_hw_pfd("pll3_pfd2_508m", "pll3_usb_otg", base + 0xf0, 2);
|
||||
hws[IMX6UL_CLK_PLL3_PFD3] = imx_clk_hw_pfd("pll3_pfd3_454m", "pll3_usb_otg", base + 0xf0, 3);
|
||||
|
||||
hws[IMX6UL_CLK_ENET_REF] = clk_hw_register_divider_table(NULL, "enet_ref", "pll6_enet", 0,
|
||||
hws[IMX6UL_CLK_ENET_REF] = clk_hw_register_divider_table(NULL, "enet1_ref", "pll6_enet", 0,
|
||||
base + 0xe0, 0, 2, 0, clk_enet_ref_table, &imx_ccm_lock);
|
||||
hws[IMX6UL_CLK_ENET2_REF] = clk_hw_register_divider_table(NULL, "enet2_ref", "pll6_enet", 0,
|
||||
base + 0xe0, 2, 2, 0, clk_enet_ref_table, &imx_ccm_lock);
|
||||
|
||||
hws[IMX6UL_CLK_ENET2_REF_125M] = imx_clk_hw_gate("enet_ref_125m", "enet2_ref", base + 0xe0, 20);
|
||||
hws[IMX6UL_CLK_ENET1_REF_125M] = imx_clk_hw_gate("enet1_ref_125m", "enet1_ref", base + 0xe0, 13);
|
||||
hws[IMX6UL_CLK_ENET2_REF_125M] = imx_clk_hw_gate("enet2_ref_125m", "enet2_ref", base + 0xe0, 20);
|
||||
hws[IMX6UL_CLK_ENET_PTP_REF] = imx_clk_hw_fixed_factor("enet_ptp_ref", "pll6_enet", 1, 20);
|
||||
hws[IMX6UL_CLK_ENET_PTP] = imx_clk_hw_gate("enet_ptp", "enet_ptp_ref", base + 0xe0, 21);
|
||||
|
||||
|
@ -471,6 +484,17 @@ static void __init imx6ul_clocks_init(struct device_node *ccm_node)
|
|||
/* mask handshake of mmdc */
|
||||
imx_mmdc_mask_handshake(base, 0);
|
||||
|
||||
hws[IMX6UL_CLK_ENET1_REF_PAD] = imx_obtain_fixed_of_clock(ccm_node, "enet1_ref_pad", 0);
|
||||
|
||||
hws[IMX6UL_CLK_ENET1_REF_SEL] = imx_clk_gpr_mux("enet1_ref_sel", "fsl,imx6ul-iomuxc-gpr",
|
||||
IOMUXC_GPR1, enet1_ref_sels, ARRAY_SIZE(enet1_ref_sels),
|
||||
enet1_ref_sels_table, enet1_ref_sels_table_mask);
|
||||
hws[IMX6UL_CLK_ENET2_REF_PAD] = imx_obtain_fixed_of_clock(ccm_node, "enet2_ref_pad", 0);
|
||||
|
||||
hws[IMX6UL_CLK_ENET2_REF_SEL] = imx_clk_gpr_mux("enet2_ref_sel", "fsl,imx6ul-iomuxc-gpr",
|
||||
IOMUXC_GPR1, enet2_ref_sels, ARRAY_SIZE(enet2_ref_sels),
|
||||
enet2_ref_sels_table, enet2_ref_sels_table_mask);
|
||||
|
||||
imx_check_clk_hws(hws, IMX6UL_CLK_END);
|
||||
|
||||
of_clk_add_hw_provider(np, of_clk_hw_onecell_get, clk_hw_data);
|
||||
|
@ -515,6 +539,9 @@ static void __init imx6ul_clocks_init(struct device_node *ccm_node)
|
|||
clk_set_parent(hws[IMX6ULL_CLK_EPDC_PRE_SEL]->clk, hws[IMX6UL_CLK_PLL3_PFD2]->clk);
|
||||
|
||||
clk_set_parent(hws[IMX6UL_CLK_ENFC_SEL]->clk, hws[IMX6UL_CLK_PLL2_PFD2]->clk);
|
||||
|
||||
clk_set_parent(hws[IMX6UL_CLK_ENET1_REF_SEL]->clk, hws[IMX6UL_CLK_ENET_REF]->clk);
|
||||
clk_set_parent(hws[IMX6UL_CLK_ENET2_REF_SEL]->clk, hws[IMX6UL_CLK_ENET2_REF]->clk);
|
||||
}
|
||||
|
||||
CLK_OF_DECLARE(imx6ul, "fsl,imx6ul-ccm", imx6ul_clocks_init);
|
||||
|
|
|
@ -882,7 +882,7 @@ static void __init imx7d_clocks_init(struct device_node *ccm_node)
|
|||
hws[IMX7D_USB1_MAIN_480M_CLK] = imx_clk_hw_fixed_factor("pll_usb1_main_clk", "osc", 20, 1);
|
||||
hws[IMX7D_USB_MAIN_480M_CLK] = imx_clk_hw_fixed_factor("pll_usb_main_clk", "osc", 20, 1);
|
||||
|
||||
imx_register_uart_clocks(7);
|
||||
imx_register_uart_clocks();
|
||||
|
||||
}
|
||||
CLK_OF_DECLARE(imx7d, "fsl,imx7d-ccm", imx7d_clocks_init);
|
||||
|
|
|
@ -176,7 +176,7 @@ static void __init imx7ulp_clk_pcc2_init(struct device_node *np)
|
|||
|
||||
of_clk_add_hw_provider(np, of_clk_hw_onecell_get, clk_data);
|
||||
|
||||
imx_register_uart_clocks(2);
|
||||
imx_register_uart_clocks();
|
||||
}
|
||||
CLK_OF_DECLARE(imx7ulp_clk_pcc2, "fsl,imx7ulp-pcc2", imx7ulp_clk_pcc2_init);
|
||||
|
||||
|
@ -223,7 +223,7 @@ static void __init imx7ulp_clk_pcc3_init(struct device_node *np)
|
|||
|
||||
of_clk_add_hw_provider(np, of_clk_hw_onecell_get, clk_data);
|
||||
|
||||
imx_register_uart_clocks(7);
|
||||
imx_register_uart_clocks();
|
||||
}
|
||||
CLK_OF_DECLARE(imx7ulp_clk_pcc3, "fsl,imx7ulp-pcc3", imx7ulp_clk_pcc3_init);
|
||||
|
||||
|
|
|
@ -609,7 +609,7 @@ static int imx8mm_clocks_probe(struct platform_device *pdev)
|
|||
goto unregister_hws;
|
||||
}
|
||||
|
||||
imx_register_uart_clocks(4);
|
||||
imx_register_uart_clocks();
|
||||
|
||||
return 0;
|
||||
|
||||
|
|
|
@ -602,7 +602,7 @@ static int imx8mn_clocks_probe(struct platform_device *pdev)
|
|||
goto unregister_hws;
|
||||
}
|
||||
|
||||
imx_register_uart_clocks(4);
|
||||
imx_register_uart_clocks();
|
||||
|
||||
return 0;
|
||||
|
||||
|
|
|
@ -723,7 +723,7 @@ static int imx8mp_clocks_probe(struct platform_device *pdev)
|
|||
|
||||
of_clk_add_hw_provider(np, of_clk_hw_onecell_get, clk_hw_data);
|
||||
|
||||
imx_register_uart_clocks(4);
|
||||
imx_register_uart_clocks();
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
|
|
@ -601,7 +601,7 @@ static int imx8mq_clocks_probe(struct platform_device *pdev)
|
|||
goto unregister_hws;
|
||||
}
|
||||
|
||||
imx_register_uart_clocks(4);
|
||||
imx_register_uart_clocks();
|
||||
|
||||
return 0;
|
||||
|
||||
|
|
|
@ -385,7 +385,7 @@ static int imx8ulp_clk_pcc3_init(struct platform_device *pdev)
|
|||
if (ret)
|
||||
return ret;
|
||||
|
||||
imx_register_uart_clocks(1);
|
||||
imx_register_uart_clocks();
|
||||
|
||||
/* register the pcc3 reset controller */
|
||||
return imx8ulp_pcc_reset_init(pdev, base, pcc3_resets, ARRAY_SIZE(pcc3_resets));
|
||||
|
|
|
@ -326,6 +326,8 @@ static int imx93_clocks_probe(struct platform_device *pdev)
|
|||
goto unregister_hws;
|
||||
}
|
||||
|
||||
imx_register_uart_clocks();
|
||||
|
||||
return 0;
|
||||
|
||||
unregister_hws:
|
||||
|
|
|
@ -167,3 +167,7 @@ static struct platform_driver imxrt1050_clk_driver = {
|
|||
},
|
||||
};
|
||||
module_platform_driver(imxrt1050_clk_driver);
|
||||
|
||||
MODULE_LICENSE("Dual BSD/GPL");
|
||||
MODULE_AUTHOR("Jesse Taube <Mr.Bossman075@gmail.com>");
|
||||
MODULE_AUTHOR("Giulio Benetti <giulio.benetti@benettiengineering.com>");
|
||||
|
|
|
@ -5,6 +5,7 @@
|
|||
*/
|
||||
|
||||
#include <linux/clk-provider.h>
|
||||
#include <linux/export.h>
|
||||
#include <linux/io.h>
|
||||
#include <linux/slab.h>
|
||||
#include <linux/err.h>
|
||||
|
@ -153,3 +154,4 @@ struct clk_hw *imx_clk_hw_pfd(const char *name, const char *parent_name,
|
|||
|
||||
return hw;
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(imx_clk_hw_pfd);
|
||||
|
|
|
@ -256,7 +256,7 @@ static unsigned long clk_pll14xx_recalc_rate(struct clk_hw *hw,
|
|||
|
||||
if (pll->type == PLL_1443X) {
|
||||
pll_div_ctl1 = readl_relaxed(pll->base + DIV_CTL1);
|
||||
kdiv = FIELD_GET(KDIV_MASK, pll_div_ctl1);
|
||||
kdiv = (s16)FIELD_GET(KDIV_MASK, pll_div_ctl1);
|
||||
} else {
|
||||
kdiv = 0;
|
||||
}
|
||||
|
|
|
@ -6,6 +6,7 @@
|
|||
|
||||
#include <linux/clk-provider.h>
|
||||
#include <linux/delay.h>
|
||||
#include <linux/export.h>
|
||||
#include <linux/io.h>
|
||||
#include <linux/iopoll.h>
|
||||
#include <linux/slab.h>
|
||||
|
@ -486,3 +487,4 @@ struct clk_hw *imx_clk_hw_pllv3(enum imx_pllv3_type type, const char *name,
|
|||
|
||||
return hw;
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(imx_clk_hw_pllv3);
|
||||
|
|
|
@ -110,6 +110,20 @@ struct clk_hw *imx_obtain_fixed_clock_hw(
|
|||
return __clk_get_hw(clk);
|
||||
}
|
||||
|
||||
struct clk_hw *imx_obtain_fixed_of_clock(struct device_node *np,
|
||||
const char *name, unsigned long rate)
|
||||
{
|
||||
struct clk *clk = of_clk_get_by_name(np, name);
|
||||
struct clk_hw *hw;
|
||||
|
||||
if (IS_ERR(clk))
|
||||
hw = imx_obtain_fixed_clock_hw(name, rate);
|
||||
else
|
||||
hw = __clk_get_hw(clk);
|
||||
|
||||
return hw;
|
||||
}
|
||||
|
||||
struct clk_hw *imx_get_clk_hw_by_name(struct device_node *np, const char *name)
|
||||
{
|
||||
struct clk *clk;
|
||||
|
@ -165,8 +179,10 @@ __setup_param("earlycon", imx_keep_uart_earlycon,
|
|||
__setup_param("earlyprintk", imx_keep_uart_earlyprintk,
|
||||
imx_keep_uart_clocks_param, 0);
|
||||
|
||||
void imx_register_uart_clocks(unsigned int clk_count)
|
||||
void imx_register_uart_clocks(void)
|
||||
{
|
||||
unsigned int num __maybe_unused;
|
||||
|
||||
imx_enabled_uart_clocks = 0;
|
||||
|
||||
/* i.MX boards use device trees now. For build tests without CONFIG_OF, do nothing */
|
||||
|
@ -174,14 +190,18 @@ void imx_register_uart_clocks(unsigned int clk_count)
|
|||
if (imx_keep_uart_clocks) {
|
||||
int i;
|
||||
|
||||
imx_uart_clocks = kcalloc(clk_count, sizeof(struct clk *), GFP_KERNEL);
|
||||
if (!imx_uart_clocks)
|
||||
num = of_clk_get_parent_count(of_stdout);
|
||||
if (!num)
|
||||
return;
|
||||
|
||||
if (!of_stdout)
|
||||
return;
|
||||
|
||||
for (i = 0; i < clk_count; i++) {
|
||||
imx_uart_clocks = kcalloc(num, sizeof(struct clk *), GFP_KERNEL);
|
||||
if (!imx_uart_clocks)
|
||||
return;
|
||||
|
||||
for (i = 0; i < num; i++) {
|
||||
imx_uart_clocks[imx_enabled_uart_clocks] = of_clk_get(of_stdout, i);
|
||||
|
||||
/* Stop if there are no more of_stdout references */
|
||||
|
@ -205,9 +225,10 @@ static int __init imx_clk_disable_uart(void)
|
|||
clk_disable_unprepare(imx_uart_clocks[i]);
|
||||
clk_put(imx_uart_clocks[i]);
|
||||
}
|
||||
kfree(imx_uart_clocks);
|
||||
}
|
||||
|
||||
kfree(imx_uart_clocks);
|
||||
|
||||
return 0;
|
||||
}
|
||||
late_initcall_sync(imx_clk_disable_uart);
|
||||
|
|
|
@ -12,9 +12,9 @@ extern bool mcore_booted;
|
|||
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(unsigned int clk_count);
|
||||
void imx_register_uart_clocks(void);
|
||||
#else
|
||||
static inline void imx_register_uart_clocks(unsigned int clk_count)
|
||||
static inline void imx_register_uart_clocks(void)
|
||||
{
|
||||
}
|
||||
#endif
|
||||
|
@ -288,6 +288,9 @@ struct clk * imx_obtain_fixed_clock(
|
|||
struct clk_hw *imx_obtain_fixed_clock_hw(
|
||||
const char *name, unsigned long rate);
|
||||
|
||||
struct clk_hw *imx_obtain_fixed_of_clock(struct device_node *np,
|
||||
const char *name, unsigned long rate);
|
||||
|
||||
struct clk_hw *imx_get_clk_hw_by_name(struct device_node *np, const char *name);
|
||||
|
||||
struct clk_hw *imx_clk_hw_gate_exclusive(const char *name, const char *parent,
|
||||
|
@ -458,4 +461,9 @@ struct clk_hw *imx_clk_hw_divider_gate(const char *name, const char *parent_name
|
|||
unsigned long flags, void __iomem *reg, u8 shift, u8 width,
|
||||
u8 clk_divider_flags, const struct clk_div_table *table,
|
||||
spinlock_t *lock);
|
||||
|
||||
struct clk_hw *imx_clk_gpr_mux(const char *name, const char *compatible,
|
||||
u32 reg, const char **parent_names,
|
||||
u8 num_parents, const u32 *mux_table, u32 mask);
|
||||
|
||||
#endif
|
||||
|
|
|
@ -388,6 +388,23 @@ config COMMON_CLK_MT7629_HIFSYS
|
|||
This driver supports MediaTek MT7629 HIFSYS clocks providing
|
||||
to PCI-E and USB.
|
||||
|
||||
config COMMON_CLK_MT7981
|
||||
bool "Clock driver for MediaTek MT7981"
|
||||
depends on ARCH_MEDIATEK || COMPILE_TEST
|
||||
select COMMON_CLK_MEDIATEK
|
||||
default ARCH_MEDIATEK
|
||||
help
|
||||
This driver supports MediaTek MT7981 basic clocks and clocks
|
||||
required for various peripherals found on this SoC.
|
||||
|
||||
config COMMON_CLK_MT7981_ETHSYS
|
||||
tristate "Clock driver for MediaTek MT7981 ETHSYS"
|
||||
depends on COMMON_CLK_MT7981
|
||||
default COMMON_CLK_MT7981
|
||||
help
|
||||
This driver adds support for clocks for Ethernet and SGMII
|
||||
required on MediaTek MT7981 SoC.
|
||||
|
||||
config COMMON_CLK_MT7986
|
||||
bool "Clock driver for MediaTek MT7986"
|
||||
depends on ARCH_MEDIATEK || COMPILE_TEST
|
||||
|
@ -457,19 +474,41 @@ config COMMON_CLK_MT8167_VDECSYS
|
|||
This driver supports MediaTek MT8167 vdecsys clocks.
|
||||
|
||||
config COMMON_CLK_MT8173
|
||||
bool "Clock driver for MediaTek MT8173"
|
||||
depends on ARCH_MEDIATEK || COMPILE_TEST
|
||||
tristate "Clock driver for MediaTek MT8173"
|
||||
depends on ARM64 || COMPILE_TEST
|
||||
select COMMON_CLK_MEDIATEK
|
||||
default ARCH_MEDIATEK
|
||||
help
|
||||
This driver supports MediaTek MT8173 clocks.
|
||||
This driver supports MediaTek MT8173 basic clocks and clocks
|
||||
required for various peripherals found on MediaTek.
|
||||
|
||||
config COMMON_CLK_MT8173_MMSYS
|
||||
bool "Clock driver for MediaTek MT8173 mmsys"
|
||||
config COMMON_CLK_MT8173_IMGSYS
|
||||
tristate "Clock driver for MediaTek MT8173 imgsys"
|
||||
depends on COMMON_CLK_MT8173
|
||||
default COMMON_CLK_MT8173
|
||||
help
|
||||
This driver supports MediaTek MT8173 mmsys clocks.
|
||||
This driver supports MediaTek MT8173 imgsys clocks.
|
||||
|
||||
config COMMON_CLK_MT8173_MMSYS
|
||||
tristate "Clock driver for MediaTek MT8173 mmsys"
|
||||
depends on COMMON_CLK_MT8173
|
||||
default COMMON_CLK_MT8173
|
||||
help
|
||||
This driver supports MediaTek MT8173 mmsys clocks.
|
||||
|
||||
config COMMON_CLK_MT8173_VDECSYS
|
||||
tristate "Clock driver for MediaTek MT8173 VDECSYS"
|
||||
depends on COMMON_CLK_MT8173
|
||||
default COMMON_CLK_MT8173
|
||||
help
|
||||
This driver supports MediaTek MT8173 vdecsys clocks.
|
||||
|
||||
config COMMON_CLK_MT8173_VENCSYS
|
||||
tristate "Clock driver for MediaTek MT8173 VENCSYS"
|
||||
depends on COMMON_CLK_MT8173
|
||||
default COMMON_CLK_MT8173
|
||||
help
|
||||
This driver supports MediaTek MT8173 vencsys clocks.
|
||||
|
||||
config COMMON_CLK_MT8183
|
||||
bool "Clock driver for MediaTek MT8183"
|
||||
|
|
|
@ -53,6 +53,10 @@ obj-$(CONFIG_COMMON_CLK_MT7622_AUDSYS) += clk-mt7622-aud.o
|
|||
obj-$(CONFIG_COMMON_CLK_MT7629) += clk-mt7629.o
|
||||
obj-$(CONFIG_COMMON_CLK_MT7629_ETHSYS) += clk-mt7629-eth.o
|
||||
obj-$(CONFIG_COMMON_CLK_MT7629_HIFSYS) += clk-mt7629-hif.o
|
||||
obj-$(CONFIG_COMMON_CLK_MT7981) += clk-mt7981-apmixed.o
|
||||
obj-$(CONFIG_COMMON_CLK_MT7981) += clk-mt7981-topckgen.o
|
||||
obj-$(CONFIG_COMMON_CLK_MT7981) += clk-mt7981-infracfg.o
|
||||
obj-$(CONFIG_COMMON_CLK_MT7981_ETHSYS) += clk-mt7981-eth.o
|
||||
obj-$(CONFIG_COMMON_CLK_MT7986) += clk-mt7986-apmixed.o
|
||||
obj-$(CONFIG_COMMON_CLK_MT7986) += clk-mt7986-topckgen.o
|
||||
obj-$(CONFIG_COMMON_CLK_MT7986) += clk-mt7986-infracfg.o
|
||||
|
@ -64,8 +68,12 @@ obj-$(CONFIG_COMMON_CLK_MT8167_IMGSYS) += clk-mt8167-img.o
|
|||
obj-$(CONFIG_COMMON_CLK_MT8167_MFGCFG) += clk-mt8167-mfgcfg.o
|
||||
obj-$(CONFIG_COMMON_CLK_MT8167_MMSYS) += clk-mt8167-mm.o
|
||||
obj-$(CONFIG_COMMON_CLK_MT8167_VDECSYS) += clk-mt8167-vdec.o
|
||||
obj-$(CONFIG_COMMON_CLK_MT8173) += clk-mt8173.o
|
||||
obj-$(CONFIG_COMMON_CLK_MT8173) += clk-mt8173-apmixedsys.o clk-mt8173-infracfg.o \
|
||||
clk-mt8173-pericfg.o clk-mt8173-topckgen.o
|
||||
obj-$(CONFIG_COMMON_CLK_MT8173_IMGSYS) += clk-mt8173-img.o
|
||||
obj-$(CONFIG_COMMON_CLK_MT8173_MMSYS) += clk-mt8173-mm.o
|
||||
obj-$(CONFIG_COMMON_CLK_MT8173_VDECSYS) += clk-mt8173-vdecsys.o
|
||||
obj-$(CONFIG_COMMON_CLK_MT8173_VENCSYS) += clk-mt8173-vencsys.o
|
||||
obj-$(CONFIG_COMMON_CLK_MT8183) += clk-mt8183.o
|
||||
obj-$(CONFIG_COMMON_CLK_MT8183_AUDIOSYS) += clk-mt8183-audio.o
|
||||
obj-$(CONFIG_COMMON_CLK_MT8183_CAMSYS) += clk-mt8183-cam.o
|
||||
|
|
|
@ -58,7 +58,7 @@ static const struct clk_ops clk_cpumux_ops = {
|
|||
};
|
||||
|
||||
static struct clk_hw *
|
||||
mtk_clk_register_cpumux(const struct mtk_composite *mux,
|
||||
mtk_clk_register_cpumux(struct device *dev, const struct mtk_composite *mux,
|
||||
struct regmap *regmap)
|
||||
{
|
||||
struct mtk_clk_cpumux *cpumux;
|
||||
|
@ -81,7 +81,7 @@ mtk_clk_register_cpumux(const struct mtk_composite *mux,
|
|||
cpumux->regmap = regmap;
|
||||
cpumux->hw.init = &init;
|
||||
|
||||
ret = clk_hw_register(NULL, &cpumux->hw);
|
||||
ret = clk_hw_register(dev, &cpumux->hw);
|
||||
if (ret) {
|
||||
kfree(cpumux);
|
||||
return ERR_PTR(ret);
|
||||
|
@ -102,7 +102,7 @@ static void mtk_clk_unregister_cpumux(struct clk_hw *hw)
|
|||
kfree(cpumux);
|
||||
}
|
||||
|
||||
int mtk_clk_register_cpumuxes(struct device_node *node,
|
||||
int mtk_clk_register_cpumuxes(struct device *dev, struct device_node *node,
|
||||
const struct mtk_composite *clks, int num,
|
||||
struct clk_hw_onecell_data *clk_data)
|
||||
{
|
||||
|
@ -125,7 +125,7 @@ int mtk_clk_register_cpumuxes(struct device_node *node,
|
|||
continue;
|
||||
}
|
||||
|
||||
hw = mtk_clk_register_cpumux(mux, regmap);
|
||||
hw = mtk_clk_register_cpumux(dev, mux, regmap);
|
||||
if (IS_ERR(hw)) {
|
||||
pr_err("Failed to register clk %s: %pe\n", mux->name,
|
||||
hw);
|
||||
|
|
|
@ -11,7 +11,7 @@ struct clk_hw_onecell_data;
|
|||
struct device_node;
|
||||
struct mtk_composite;
|
||||
|
||||
int mtk_clk_register_cpumuxes(struct device_node *node,
|
||||
int mtk_clk_register_cpumuxes(struct device *dev, struct device_node *node,
|
||||
const struct mtk_composite *clks, int num,
|
||||
struct clk_hw_onecell_data *clk_data);
|
||||
|
||||
|
|
|
@ -152,12 +152,12 @@ const struct clk_ops mtk_clk_gate_ops_no_setclr_inv = {
|
|||
};
|
||||
EXPORT_SYMBOL_GPL(mtk_clk_gate_ops_no_setclr_inv);
|
||||
|
||||
static struct clk_hw *mtk_clk_register_gate(const char *name,
|
||||
static struct clk_hw *mtk_clk_register_gate(struct device *dev, const char *name,
|
||||
const char *parent_name,
|
||||
struct regmap *regmap, int set_ofs,
|
||||
int clr_ofs, int sta_ofs, u8 bit,
|
||||
const struct clk_ops *ops,
|
||||
unsigned long flags, struct device *dev)
|
||||
unsigned long flags)
|
||||
{
|
||||
struct mtk_clk_gate *cg;
|
||||
int ret;
|
||||
|
@ -202,10 +202,9 @@ static void mtk_clk_unregister_gate(struct clk_hw *hw)
|
|||
kfree(cg);
|
||||
}
|
||||
|
||||
int mtk_clk_register_gates_with_dev(struct device_node *node,
|
||||
const struct mtk_gate *clks, int num,
|
||||
struct clk_hw_onecell_data *clk_data,
|
||||
struct device *dev)
|
||||
int mtk_clk_register_gates(struct device *dev, struct device_node *node,
|
||||
const struct mtk_gate *clks, int num,
|
||||
struct clk_hw_onecell_data *clk_data)
|
||||
{
|
||||
int i;
|
||||
struct clk_hw *hw;
|
||||
|
@ -229,13 +228,13 @@ int mtk_clk_register_gates_with_dev(struct device_node *node,
|
|||
continue;
|
||||
}
|
||||
|
||||
hw = mtk_clk_register_gate(gate->name, gate->parent_name,
|
||||
hw = mtk_clk_register_gate(dev, gate->name, gate->parent_name,
|
||||
regmap,
|
||||
gate->regs->set_ofs,
|
||||
gate->regs->clr_ofs,
|
||||
gate->regs->sta_ofs,
|
||||
gate->shift, gate->ops,
|
||||
gate->flags, dev);
|
||||
gate->flags);
|
||||
|
||||
if (IS_ERR(hw)) {
|
||||
pr_err("Failed to register clk %s: %pe\n", gate->name,
|
||||
|
@ -261,14 +260,6 @@ err:
|
|||
|
||||
return PTR_ERR(hw);
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(mtk_clk_register_gates_with_dev);
|
||||
|
||||
int mtk_clk_register_gates(struct device_node *node,
|
||||
const struct mtk_gate *clks, int num,
|
||||
struct clk_hw_onecell_data *clk_data)
|
||||
{
|
||||
return mtk_clk_register_gates_with_dev(node, clks, num, clk_data, NULL);
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(mtk_clk_register_gates);
|
||||
|
||||
void mtk_clk_unregister_gates(const struct mtk_gate *clks, int num,
|
||||
|
|
|
@ -50,15 +50,10 @@ struct mtk_gate {
|
|||
#define GATE_MTK(_id, _name, _parent, _regs, _shift, _ops) \
|
||||
GATE_MTK_FLAGS(_id, _name, _parent, _regs, _shift, _ops, 0)
|
||||
|
||||
int mtk_clk_register_gates(struct device_node *node,
|
||||
int mtk_clk_register_gates(struct device *dev, struct device_node *node,
|
||||
const struct mtk_gate *clks, int num,
|
||||
struct clk_hw_onecell_data *clk_data);
|
||||
|
||||
int mtk_clk_register_gates_with_dev(struct device_node *node,
|
||||
const struct mtk_gate *clks, int num,
|
||||
struct clk_hw_onecell_data *clk_data,
|
||||
struct device *dev);
|
||||
|
||||
void mtk_clk_unregister_gates(const struct mtk_gate *clks, int num,
|
||||
struct clk_hw_onecell_data *clk_data);
|
||||
|
||||
|
|
|
@ -76,6 +76,7 @@ static const struct mtk_gate_regs audio3_cg_regs = {
|
|||
};
|
||||
|
||||
static const struct mtk_gate audio_clks[] = {
|
||||
GATE_DUMMY(CLK_DUMMY, "aud_dummy"),
|
||||
/* AUDIO0 */
|
||||
GATE_AUDIO0(CLK_AUD_AFE, "audio_afe", "aud_intbus_sel", 2),
|
||||
GATE_AUDIO0(CLK_AUD_HDMI, "audio_hdmi", "audpll_sel", 20),
|
||||
|
@ -138,29 +139,27 @@ static const struct mtk_gate audio_clks[] = {
|
|||
GATE_AUDIO3(CLK_AUD_MEM_ASRC5, "audio_mem_asrc5", "asm_h_sel", 14),
|
||||
};
|
||||
|
||||
static const struct mtk_clk_desc audio_desc = {
|
||||
.clks = audio_clks,
|
||||
.num_clks = ARRAY_SIZE(audio_clks),
|
||||
};
|
||||
|
||||
static const struct of_device_id of_match_clk_mt2701_aud[] = {
|
||||
{ .compatible = "mediatek,mt2701-audsys", },
|
||||
{}
|
||||
{ .compatible = "mediatek,mt2701-audsys", .data = &audio_desc },
|
||||
{ /* sentinel */ }
|
||||
};
|
||||
|
||||
static int clk_mt2701_aud_probe(struct platform_device *pdev)
|
||||
{
|
||||
struct clk_hw_onecell_data *clk_data;
|
||||
struct device_node *node = pdev->dev.of_node;
|
||||
int r;
|
||||
|
||||
clk_data = mtk_alloc_clk_data(CLK_AUD_NR);
|
||||
|
||||
mtk_clk_register_gates(node, audio_clks, ARRAY_SIZE(audio_clks),
|
||||
clk_data);
|
||||
|
||||
r = of_clk_add_hw_provider(node, of_clk_hw_onecell_get, clk_data);
|
||||
r = mtk_clk_simple_probe(pdev);
|
||||
if (r) {
|
||||
dev_err(&pdev->dev,
|
||||
"could not register clock provider: %s: %d\n",
|
||||
pdev->name, r);
|
||||
|
||||
goto err_clk_provider;
|
||||
return r;
|
||||
}
|
||||
|
||||
r = devm_of_platform_populate(&pdev->dev);
|
||||
|
@ -170,13 +169,19 @@ static int clk_mt2701_aud_probe(struct platform_device *pdev)
|
|||
return 0;
|
||||
|
||||
err_plat_populate:
|
||||
of_clk_del_provider(node);
|
||||
err_clk_provider:
|
||||
mtk_clk_simple_remove(pdev);
|
||||
return r;
|
||||
}
|
||||
|
||||
static int clk_mt2701_aud_remove(struct platform_device *pdev)
|
||||
{
|
||||
of_platform_depopulate(&pdev->dev);
|
||||
return mtk_clk_simple_remove(pdev);
|
||||
}
|
||||
|
||||
static struct platform_driver clk_mt2701_aud_drv = {
|
||||
.probe = clk_mt2701_aud_probe,
|
||||
.remove = clk_mt2701_aud_remove,
|
||||
.driver = {
|
||||
.name = "clk-mt2701-aud",
|
||||
.of_match_table = of_match_clk_mt2701_aud,
|
||||
|
|
|
@ -26,6 +26,7 @@ static const struct mtk_gate_regs eth_cg_regs = {
|
|||
}
|
||||
|
||||
static const struct mtk_gate eth_clks[] = {
|
||||
GATE_DUMMY(CLK_DUMMY, "eth_dummy"),
|
||||
GATE_ETH(CLK_ETHSYS_HSDMA, "hsdma_clk", "ethif_sel", 5),
|
||||
GATE_ETH(CLK_ETHSYS_ESW, "esw_clk", "ethpll_500m_ck", 6),
|
||||
GATE_ETH(CLK_ETHSYS_GP2, "gp2_clk", "trgpll", 7),
|
||||
|
@ -44,35 +45,20 @@ static const struct mtk_clk_rst_desc clk_rst_desc = {
|
|||
.rst_bank_nr = ARRAY_SIZE(rst_ofs),
|
||||
};
|
||||
|
||||
static const struct of_device_id of_match_clk_mt2701_eth[] = {
|
||||
{ .compatible = "mediatek,mt2701-ethsys", },
|
||||
{}
|
||||
static const struct mtk_clk_desc eth_desc = {
|
||||
.clks = eth_clks,
|
||||
.num_clks = ARRAY_SIZE(eth_clks),
|
||||
.rst_desc = &clk_rst_desc,
|
||||
};
|
||||
|
||||
static int clk_mt2701_eth_probe(struct platform_device *pdev)
|
||||
{
|
||||
struct clk_hw_onecell_data *clk_data;
|
||||
int r;
|
||||
struct device_node *node = pdev->dev.of_node;
|
||||
|
||||
clk_data = mtk_alloc_clk_data(CLK_ETHSYS_NR);
|
||||
|
||||
mtk_clk_register_gates(node, eth_clks, ARRAY_SIZE(eth_clks),
|
||||
clk_data);
|
||||
|
||||
r = of_clk_add_hw_provider(node, of_clk_hw_onecell_get, clk_data);
|
||||
if (r)
|
||||
dev_err(&pdev->dev,
|
||||
"could not register clock provider: %s: %d\n",
|
||||
pdev->name, r);
|
||||
|
||||
mtk_register_reset_controller_with_dev(&pdev->dev, &clk_rst_desc);
|
||||
|
||||
return r;
|
||||
}
|
||||
static const struct of_device_id of_match_clk_mt2701_eth[] = {
|
||||
{ .compatible = "mediatek,mt2701-ethsys", .data = ð_desc },
|
||||
{ /* sentinel */ }
|
||||
};
|
||||
|
||||
static struct platform_driver clk_mt2701_eth_drv = {
|
||||
.probe = clk_mt2701_eth_probe,
|
||||
.probe = mtk_clk_simple_probe,
|
||||
.remove = mtk_clk_simple_remove,
|
||||
.driver = {
|
||||
.name = "clk-mt2701-eth",
|
||||
.of_match_table = of_match_clk_mt2701_eth,
|
||||
|
|
|
@ -32,6 +32,7 @@ static const struct mtk_gate_regs g3d_cg_regs = {
|
|||
};
|
||||
|
||||
static const struct mtk_gate g3d_clks[] = {
|
||||
GATE_DUMMY(CLK_DUMMY, "g3d_dummy"),
|
||||
GATE_G3D(CLK_G3DSYS_CORE, "g3d_core", "mfg_sel", 0),
|
||||
};
|
||||
|
||||
|
@ -43,57 +44,20 @@ static const struct mtk_clk_rst_desc clk_rst_desc = {
|
|||
.rst_bank_nr = ARRAY_SIZE(rst_ofs),
|
||||
};
|
||||
|
||||
static int clk_mt2701_g3dsys_init(struct platform_device *pdev)
|
||||
{
|
||||
struct clk_hw_onecell_data *clk_data;
|
||||
struct device_node *node = pdev->dev.of_node;
|
||||
int r;
|
||||
|
||||
clk_data = mtk_alloc_clk_data(CLK_G3DSYS_NR);
|
||||
|
||||
mtk_clk_register_gates(node, g3d_clks, ARRAY_SIZE(g3d_clks),
|
||||
clk_data);
|
||||
|
||||
r = of_clk_add_hw_provider(node, of_clk_hw_onecell_get, clk_data);
|
||||
if (r)
|
||||
dev_err(&pdev->dev,
|
||||
"could not register clock provider: %s: %d\n",
|
||||
pdev->name, r);
|
||||
|
||||
mtk_register_reset_controller_with_dev(&pdev->dev, &clk_rst_desc);
|
||||
|
||||
return r;
|
||||
}
|
||||
|
||||
static const struct of_device_id of_match_clk_mt2701_g3d[] = {
|
||||
{
|
||||
.compatible = "mediatek,mt2701-g3dsys",
|
||||
.data = clk_mt2701_g3dsys_init,
|
||||
}, {
|
||||
/* sentinel */
|
||||
}
|
||||
static const struct mtk_clk_desc g3d_desc = {
|
||||
.clks = g3d_clks,
|
||||
.num_clks = ARRAY_SIZE(g3d_clks),
|
||||
.rst_desc = &clk_rst_desc,
|
||||
};
|
||||
|
||||
static int clk_mt2701_g3d_probe(struct platform_device *pdev)
|
||||
{
|
||||
int (*clk_init)(struct platform_device *);
|
||||
int r;
|
||||
|
||||
clk_init = of_device_get_match_data(&pdev->dev);
|
||||
if (!clk_init)
|
||||
return -EINVAL;
|
||||
|
||||
r = clk_init(pdev);
|
||||
if (r)
|
||||
dev_err(&pdev->dev,
|
||||
"could not register clock provider: %s: %d\n",
|
||||
pdev->name, r);
|
||||
|
||||
return r;
|
||||
}
|
||||
static const struct of_device_id of_match_clk_mt2701_g3d[] = {
|
||||
{ .compatible = "mediatek,mt2701-g3dsys", .data = &g3d_desc },
|
||||
{ /* sentinel */ }
|
||||
};
|
||||
|
||||
static struct platform_driver clk_mt2701_g3d_drv = {
|
||||
.probe = clk_mt2701_g3d_probe,
|
||||
.probe = mtk_clk_simple_probe,
|
||||
.remove = mtk_clk_simple_remove,
|
||||
.driver = {
|
||||
.name = "clk-mt2701-g3d",
|
||||
.of_match_table = of_match_clk_mt2701_g3d,
|
||||
|
|
|
@ -26,6 +26,7 @@ static const struct mtk_gate_regs hif_cg_regs = {
|
|||
}
|
||||
|
||||
static const struct mtk_gate hif_clks[] = {
|
||||
GATE_DUMMY(CLK_DUMMY, "hif_dummy"),
|
||||
GATE_HIF(CLK_HIFSYS_USB0PHY, "usb0_phy_clk", "ethpll_500m_ck", 21),
|
||||
GATE_HIF(CLK_HIFSYS_USB1PHY, "usb1_phy_clk", "ethpll_500m_ck", 22),
|
||||
GATE_HIF(CLK_HIFSYS_PCIE0, "pcie0_clk", "ethpll_500m_ck", 24),
|
||||
|
@ -41,37 +42,20 @@ static const struct mtk_clk_rst_desc clk_rst_desc = {
|
|||
.rst_bank_nr = ARRAY_SIZE(rst_ofs),
|
||||
};
|
||||
|
||||
static const struct of_device_id of_match_clk_mt2701_hif[] = {
|
||||
{ .compatible = "mediatek,mt2701-hifsys", },
|
||||
{}
|
||||
static const struct mtk_clk_desc hif_desc = {
|
||||
.clks = hif_clks,
|
||||
.num_clks = ARRAY_SIZE(hif_clks),
|
||||
.rst_desc = &clk_rst_desc,
|
||||
};
|
||||
|
||||
static int clk_mt2701_hif_probe(struct platform_device *pdev)
|
||||
{
|
||||
struct clk_hw_onecell_data *clk_data;
|
||||
int r;
|
||||
struct device_node *node = pdev->dev.of_node;
|
||||
|
||||
clk_data = mtk_alloc_clk_data(CLK_HIFSYS_NR);
|
||||
|
||||
mtk_clk_register_gates(node, hif_clks, ARRAY_SIZE(hif_clks),
|
||||
clk_data);
|
||||
|
||||
r = of_clk_add_hw_provider(node, of_clk_hw_onecell_get, clk_data);
|
||||
if (r) {
|
||||
dev_err(&pdev->dev,
|
||||
"could not register clock provider: %s: %d\n",
|
||||
pdev->name, r);
|
||||
return r;
|
||||
}
|
||||
|
||||
mtk_register_reset_controller_with_dev(&pdev->dev, &clk_rst_desc);
|
||||
|
||||
return 0;
|
||||
}
|
||||
static const struct of_device_id of_match_clk_mt2701_hif[] = {
|
||||
{ .compatible = "mediatek,mt2701-hifsys", .data = &hif_desc },
|
||||
{ /* sentinel */ }
|
||||
};
|
||||
|
||||
static struct platform_driver clk_mt2701_hif_drv = {
|
||||
.probe = clk_mt2701_hif_probe,
|
||||
.probe = mtk_clk_simple_probe,
|
||||
.remove = mtk_clk_simple_remove,
|
||||
.driver = {
|
||||
.name = "clk-mt2701-hif",
|
||||
.of_match_table = of_match_clk_mt2701_hif,
|
||||
|
|
|
@ -88,8 +88,8 @@ static int clk_mt2701_mm_probe(struct platform_device *pdev)
|
|||
|
||||
clk_data = mtk_alloc_clk_data(CLK_MM_NR);
|
||||
|
||||
mtk_clk_register_gates(node, mm_clks, ARRAY_SIZE(mm_clks),
|
||||
clk_data);
|
||||
mtk_clk_register_gates(&pdev->dev, node, mm_clks,
|
||||
ARRAY_SIZE(mm_clks), clk_data);
|
||||
|
||||
r = of_clk_add_hw_provider(node, of_clk_hw_onecell_get, clk_data);
|
||||
if (r)
|
||||
|
|
|
@ -683,14 +683,15 @@ static int mtk_topckgen_init(struct platform_device *pdev)
|
|||
mtk_clk_register_factors(top_fixed_divs, ARRAY_SIZE(top_fixed_divs),
|
||||
clk_data);
|
||||
|
||||
mtk_clk_register_composites(top_muxes, ARRAY_SIZE(top_muxes),
|
||||
base, &mt2701_clk_lock, clk_data);
|
||||
mtk_clk_register_composites(&pdev->dev, top_muxes,
|
||||
ARRAY_SIZE(top_muxes), base,
|
||||
&mt2701_clk_lock, clk_data);
|
||||
|
||||
mtk_clk_register_dividers(top_adj_divs, ARRAY_SIZE(top_adj_divs),
|
||||
base, &mt2701_clk_lock, clk_data);
|
||||
|
||||
mtk_clk_register_gates(node, top_clks, ARRAY_SIZE(top_clks),
|
||||
clk_data);
|
||||
mtk_clk_register_gates(&pdev->dev, node, top_clks,
|
||||
ARRAY_SIZE(top_clks), clk_data);
|
||||
|
||||
return of_clk_add_hw_provider(node, of_clk_hw_onecell_get, clk_data);
|
||||
}
|
||||
|
@ -769,7 +770,7 @@ static void __init mtk_infrasys_init_early(struct device_node *node)
|
|||
mtk_clk_register_factors(infra_fixed_divs, ARRAY_SIZE(infra_fixed_divs),
|
||||
infra_clk_data);
|
||||
|
||||
mtk_clk_register_cpumuxes(node, cpu_muxes, ARRAY_SIZE(cpu_muxes),
|
||||
mtk_clk_register_cpumuxes(NULL, node, cpu_muxes, ARRAY_SIZE(cpu_muxes),
|
||||
infra_clk_data);
|
||||
|
||||
r = of_clk_add_hw_provider(node, of_clk_hw_onecell_get,
|
||||
|
@ -795,8 +796,8 @@ static int mtk_infrasys_init(struct platform_device *pdev)
|
|||
}
|
||||
}
|
||||
|
||||
mtk_clk_register_gates(node, infra_clks, ARRAY_SIZE(infra_clks),
|
||||
infra_clk_data);
|
||||
mtk_clk_register_gates(&pdev->dev, node, infra_clks,
|
||||
ARRAY_SIZE(infra_clks), infra_clk_data);
|
||||
mtk_clk_register_factors(infra_fixed_divs, ARRAY_SIZE(infra_fixed_divs),
|
||||
infra_clk_data);
|
||||
|
||||
|
@ -918,11 +919,12 @@ static int mtk_pericfg_init(struct platform_device *pdev)
|
|||
|
||||
clk_data = mtk_alloc_clk_data(CLK_PERI_NR);
|
||||
|
||||
mtk_clk_register_gates(node, peri_clks, ARRAY_SIZE(peri_clks),
|
||||
clk_data);
|
||||
mtk_clk_register_gates(&pdev->dev, node, peri_clks,
|
||||
ARRAY_SIZE(peri_clks), clk_data);
|
||||
|
||||
mtk_clk_register_composites(peri_muxs, ARRAY_SIZE(peri_muxs), base,
|
||||
&mt2701_clk_lock, clk_data);
|
||||
mtk_clk_register_composites(&pdev->dev, peri_muxs,
|
||||
ARRAY_SIZE(peri_muxs), base,
|
||||
&mt2701_clk_lock, clk_data);
|
||||
|
||||
r = of_clk_add_hw_provider(node, of_clk_hw_onecell_get, clk_data);
|
||||
if (r)
|
||||
|
|
|
@ -135,8 +135,8 @@ static int clk_mt2712_mm_probe(struct platform_device *pdev)
|
|||
|
||||
clk_data = mtk_alloc_clk_data(CLK_MM_NR_CLK);
|
||||
|
||||
mtk_clk_register_gates(node, mm_clks, ARRAY_SIZE(mm_clks),
|
||||
clk_data);
|
||||
mtk_clk_register_gates(&pdev->dev, node, mm_clks,
|
||||
ARRAY_SIZE(mm_clks), clk_data);
|
||||
|
||||
r = of_clk_add_hw_provider(node, of_clk_hw_onecell_get, clk_data);
|
||||
|
||||
|
|
|
@ -1346,12 +1346,13 @@ static int clk_mt2712_top_probe(struct platform_device *pdev)
|
|||
mtk_clk_register_factors(top_early_divs, ARRAY_SIZE(top_early_divs),
|
||||
top_clk_data);
|
||||
mtk_clk_register_factors(top_divs, ARRAY_SIZE(top_divs), top_clk_data);
|
||||
mtk_clk_register_composites(top_muxes, ARRAY_SIZE(top_muxes), base,
|
||||
&mt2712_clk_lock, top_clk_data);
|
||||
mtk_clk_register_composites(&pdev->dev, top_muxes,
|
||||
ARRAY_SIZE(top_muxes), base,
|
||||
&mt2712_clk_lock, top_clk_data);
|
||||
mtk_clk_register_dividers(top_adj_divs, ARRAY_SIZE(top_adj_divs), base,
|
||||
&mt2712_clk_lock, top_clk_data);
|
||||
mtk_clk_register_gates(node, top_clks, ARRAY_SIZE(top_clks),
|
||||
top_clk_data);
|
||||
mtk_clk_register_gates(&pdev->dev, node, top_clks,
|
||||
ARRAY_SIZE(top_clks), top_clk_data);
|
||||
|
||||
r = of_clk_add_hw_provider(node, of_clk_hw_onecell_get, top_clk_data);
|
||||
|
||||
|
@ -1362,50 +1363,6 @@ static int clk_mt2712_top_probe(struct platform_device *pdev)
|
|||
return r;
|
||||
}
|
||||
|
||||
static int clk_mt2712_infra_probe(struct platform_device *pdev)
|
||||
{
|
||||
struct clk_hw_onecell_data *clk_data;
|
||||
int r;
|
||||
struct device_node *node = pdev->dev.of_node;
|
||||
|
||||
clk_data = mtk_alloc_clk_data(CLK_INFRA_NR_CLK);
|
||||
|
||||
mtk_clk_register_gates(node, infra_clks, ARRAY_SIZE(infra_clks),
|
||||
clk_data);
|
||||
|
||||
r = of_clk_add_hw_provider(node, of_clk_hw_onecell_get, clk_data);
|
||||
|
||||
if (r != 0)
|
||||
pr_err("%s(): could not register clock provider: %d\n",
|
||||
__func__, r);
|
||||
|
||||
mtk_register_reset_controller_with_dev(&pdev->dev, &clk_rst_desc[0]);
|
||||
|
||||
return r;
|
||||
}
|
||||
|
||||
static int clk_mt2712_peri_probe(struct platform_device *pdev)
|
||||
{
|
||||
struct clk_hw_onecell_data *clk_data;
|
||||
int r;
|
||||
struct device_node *node = pdev->dev.of_node;
|
||||
|
||||
clk_data = mtk_alloc_clk_data(CLK_PERI_NR_CLK);
|
||||
|
||||
mtk_clk_register_gates(node, peri_clks, ARRAY_SIZE(peri_clks),
|
||||
clk_data);
|
||||
|
||||
r = of_clk_add_hw_provider(node, of_clk_hw_onecell_get, clk_data);
|
||||
|
||||
if (r != 0)
|
||||
pr_err("%s(): could not register clock provider: %d\n",
|
||||
__func__, r);
|
||||
|
||||
mtk_register_reset_controller_with_dev(&pdev->dev, &clk_rst_desc[1]);
|
||||
|
||||
return r;
|
||||
}
|
||||
|
||||
static int clk_mt2712_mcu_probe(struct platform_device *pdev)
|
||||
{
|
||||
struct clk_hw_onecell_data *clk_data;
|
||||
|
@ -1421,8 +1378,11 @@ static int clk_mt2712_mcu_probe(struct platform_device *pdev)
|
|||
|
||||
clk_data = mtk_alloc_clk_data(CLK_MCU_NR_CLK);
|
||||
|
||||
mtk_clk_register_composites(mcu_muxes, ARRAY_SIZE(mcu_muxes), base,
|
||||
&mt2712_clk_lock, clk_data);
|
||||
r = mtk_clk_register_composites(&pdev->dev, mcu_muxes,
|
||||
ARRAY_SIZE(mcu_muxes), base,
|
||||
&mt2712_clk_lock, clk_data);
|
||||
if (r)
|
||||
dev_err(&pdev->dev, "Could not register composites: %d\n", r);
|
||||
|
||||
r = of_clk_add_hw_provider(node, of_clk_hw_onecell_get, clk_data);
|
||||
|
||||
|
@ -1440,12 +1400,6 @@ static const struct of_device_id of_match_clk_mt2712[] = {
|
|||
}, {
|
||||
.compatible = "mediatek,mt2712-topckgen",
|
||||
.data = clk_mt2712_top_probe,
|
||||
}, {
|
||||
.compatible = "mediatek,mt2712-infracfg",
|
||||
.data = clk_mt2712_infra_probe,
|
||||
}, {
|
||||
.compatible = "mediatek,mt2712-pericfg",
|
||||
.data = clk_mt2712_peri_probe,
|
||||
}, {
|
||||
.compatible = "mediatek,mt2712-mcucfg",
|
||||
.data = clk_mt2712_mcu_probe,
|
||||
|
@ -1472,6 +1426,33 @@ static int clk_mt2712_probe(struct platform_device *pdev)
|
|||
return r;
|
||||
}
|
||||
|
||||
static const struct mtk_clk_desc infra_desc = {
|
||||
.clks = infra_clks,
|
||||
.num_clks = ARRAY_SIZE(infra_clks),
|
||||
.rst_desc = &clk_rst_desc[0],
|
||||
};
|
||||
|
||||
static const struct mtk_clk_desc peri_desc = {
|
||||
.clks = peri_clks,
|
||||
.num_clks = ARRAY_SIZE(peri_clks),
|
||||
.rst_desc = &clk_rst_desc[1],
|
||||
};
|
||||
|
||||
static const struct of_device_id of_match_clk_mt2712_simple[] = {
|
||||
{ .compatible = "mediatek,mt2712-infracfg", .data = &infra_desc },
|
||||
{ .compatible = "mediatek,mt2712-pericfg", .data = &peri_desc, },
|
||||
{ /* sentinel */ }
|
||||
};
|
||||
|
||||
static struct platform_driver clk_mt2712_simple_drv = {
|
||||
.probe = mtk_clk_simple_probe,
|
||||
.remove = mtk_clk_simple_remove,
|
||||
.driver = {
|
||||
.name = "clk-mt2712-simple",
|
||||
.of_match_table = of_match_clk_mt2712_simple,
|
||||
},
|
||||
};
|
||||
|
||||
static struct platform_driver clk_mt2712_drv = {
|
||||
.probe = clk_mt2712_probe,
|
||||
.driver = {
|
||||
|
@ -1482,7 +1463,11 @@ static struct platform_driver clk_mt2712_drv = {
|
|||
|
||||
static int __init clk_mt2712_init(void)
|
||||
{
|
||||
return platform_driver_register(&clk_mt2712_drv);
|
||||
int ret = platform_driver_register(&clk_mt2712_drv);
|
||||
|
||||
if (ret)
|
||||
return ret;
|
||||
return platform_driver_register(&clk_mt2712_simple_drv);
|
||||
}
|
||||
|
||||
arch_initcall(clk_mt2712_init);
|
||||
|
|
|
@ -789,7 +789,7 @@ static int clk_mt6765_apmixed_probe(struct platform_device *pdev)
|
|||
|
||||
mtk_clk_register_plls(node, plls, ARRAY_SIZE(plls), clk_data);
|
||||
|
||||
mtk_clk_register_gates(node, apmixed_clks,
|
||||
mtk_clk_register_gates(&pdev->dev, node, apmixed_clks,
|
||||
ARRAY_SIZE(apmixed_clks), clk_data);
|
||||
r = of_clk_add_hw_provider(node, of_clk_hw_onecell_get, clk_data);
|
||||
|
||||
|
@ -826,10 +826,11 @@ static int clk_mt6765_top_probe(struct platform_device *pdev)
|
|||
clk_data);
|
||||
mtk_clk_register_factors(top_divs, ARRAY_SIZE(top_divs),
|
||||
clk_data);
|
||||
mtk_clk_register_muxes(top_muxes, ARRAY_SIZE(top_muxes), node,
|
||||
mtk_clk_register_muxes(&pdev->dev, top_muxes,
|
||||
ARRAY_SIZE(top_muxes), node,
|
||||
&mt6765_clk_lock, clk_data);
|
||||
mtk_clk_register_gates(node, top_clks, ARRAY_SIZE(top_clks),
|
||||
clk_data);
|
||||
mtk_clk_register_gates(&pdev->dev, node, top_clks,
|
||||
ARRAY_SIZE(top_clks), clk_data);
|
||||
|
||||
r = of_clk_add_hw_provider(node, of_clk_hw_onecell_get, clk_data);
|
||||
|
||||
|
@ -862,8 +863,8 @@ static int clk_mt6765_ifr_probe(struct platform_device *pdev)
|
|||
|
||||
clk_data = mtk_alloc_clk_data(CLK_IFR_NR_CLK);
|
||||
|
||||
mtk_clk_register_gates(node, ifr_clks, ARRAY_SIZE(ifr_clks),
|
||||
clk_data);
|
||||
mtk_clk_register_gates(&pdev->dev, node, ifr_clks,
|
||||
ARRAY_SIZE(ifr_clks), clk_data);
|
||||
r = of_clk_add_hw_provider(node, of_clk_hw_onecell_get, clk_data);
|
||||
|
||||
if (r)
|
||||
|
|
|
@ -93,8 +93,8 @@ static int clk_mt6779_mm_probe(struct platform_device *pdev)
|
|||
|
||||
clk_data = mtk_alloc_clk_data(CLK_MM_NR_CLK);
|
||||
|
||||
mtk_clk_register_gates(node, mm_clks, ARRAY_SIZE(mm_clks),
|
||||
clk_data);
|
||||
mtk_clk_register_gates(&pdev->dev, node, mm_clks,
|
||||
ARRAY_SIZE(mm_clks), clk_data);
|
||||
|
||||
return of_clk_add_hw_provider(node, of_clk_hw_onecell_get, clk_data);
|
||||
}
|
||||
|
|
|
@ -880,6 +880,7 @@ static const struct mtk_gate_regs infra3_cg_regs = {
|
|||
&mtk_clk_gate_ops_setclr)
|
||||
|
||||
static const struct mtk_gate infra_clks[] = {
|
||||
GATE_DUMMY(CLK_DUMMY, "ifa_dummy"),
|
||||
/* INFRA0 */
|
||||
GATE_INFRA0(CLK_INFRA_PMIC_TMR, "infra_pmic_tmr",
|
||||
"axi_sel", 0),
|
||||
|
@ -1221,7 +1222,7 @@ static int clk_mt6779_apmixed_probe(struct platform_device *pdev)
|
|||
|
||||
mtk_clk_register_plls(node, plls, ARRAY_SIZE(plls), clk_data);
|
||||
|
||||
mtk_clk_register_gates(node, apmixed_clks,
|
||||
mtk_clk_register_gates(&pdev->dev, node, apmixed_clks,
|
||||
ARRAY_SIZE(apmixed_clks), clk_data);
|
||||
|
||||
return of_clk_add_hw_provider(node, of_clk_hw_onecell_get, clk_data);
|
||||
|
@ -1244,27 +1245,17 @@ static int clk_mt6779_top_probe(struct platform_device *pdev)
|
|||
|
||||
mtk_clk_register_factors(top_divs, ARRAY_SIZE(top_divs), clk_data);
|
||||
|
||||
mtk_clk_register_muxes(top_muxes, ARRAY_SIZE(top_muxes),
|
||||
node, &mt6779_clk_lock, clk_data);
|
||||
mtk_clk_register_muxes(&pdev->dev, top_muxes,
|
||||
ARRAY_SIZE(top_muxes), node,
|
||||
&mt6779_clk_lock, clk_data);
|
||||
|
||||
mtk_clk_register_composites(top_aud_muxes, ARRAY_SIZE(top_aud_muxes),
|
||||
base, &mt6779_clk_lock, clk_data);
|
||||
mtk_clk_register_composites(&pdev->dev, top_aud_muxes,
|
||||
ARRAY_SIZE(top_aud_muxes), base,
|
||||
&mt6779_clk_lock, clk_data);
|
||||
|
||||
mtk_clk_register_composites(top_aud_divs, ARRAY_SIZE(top_aud_divs),
|
||||
base, &mt6779_clk_lock, clk_data);
|
||||
|
||||
return of_clk_add_hw_provider(node, of_clk_hw_onecell_get, clk_data);
|
||||
}
|
||||
|
||||
static int clk_mt6779_infra_probe(struct platform_device *pdev)
|
||||
{
|
||||
struct clk_hw_onecell_data *clk_data;
|
||||
struct device_node *node = pdev->dev.of_node;
|
||||
|
||||
clk_data = mtk_alloc_clk_data(CLK_INFRA_NR_CLK);
|
||||
|
||||
mtk_clk_register_gates(node, infra_clks, ARRAY_SIZE(infra_clks),
|
||||
clk_data);
|
||||
mtk_clk_register_composites(&pdev->dev, top_aud_divs,
|
||||
ARRAY_SIZE(top_aud_divs), base,
|
||||
&mt6779_clk_lock, clk_data);
|
||||
|
||||
return of_clk_add_hw_provider(node, of_clk_hw_onecell_get, clk_data);
|
||||
}
|
||||
|
@ -1276,9 +1267,6 @@ static const struct of_device_id of_match_clk_mt6779[] = {
|
|||
}, {
|
||||
.compatible = "mediatek,mt6779-topckgen",
|
||||
.data = clk_mt6779_top_probe,
|
||||
}, {
|
||||
.compatible = "mediatek,mt6779-infracfg_ao",
|
||||
.data = clk_mt6779_infra_probe,
|
||||
}, {
|
||||
/* sentinel */
|
||||
}
|
||||
|
@ -1302,6 +1290,25 @@ static int clk_mt6779_probe(struct platform_device *pdev)
|
|||
return r;
|
||||
}
|
||||
|
||||
static const struct mtk_clk_desc infra_desc = {
|
||||
.clks = infra_clks,
|
||||
.num_clks = ARRAY_SIZE(infra_clks),
|
||||
};
|
||||
|
||||
static const struct of_device_id of_match_clk_mt6779_infra[] = {
|
||||
{ .compatible = "mediatek,mt6779-infracfg_ao", .data = &infra_desc },
|
||||
{ /* sentinel */ }
|
||||
};
|
||||
|
||||
static struct platform_driver clk_mt6779_infra_drv = {
|
||||
.probe = mtk_clk_simple_probe,
|
||||
.remove = mtk_clk_simple_remove,
|
||||
.driver = {
|
||||
.name = "clk-mt6779-infra",
|
||||
.of_match_table = of_match_clk_mt6779_infra,
|
||||
},
|
||||
};
|
||||
|
||||
static struct platform_driver clk_mt6779_drv = {
|
||||
.probe = clk_mt6779_probe,
|
||||
.driver = {
|
||||
|
@ -1312,7 +1319,11 @@ static struct platform_driver clk_mt6779_drv = {
|
|||
|
||||
static int __init clk_mt6779_init(void)
|
||||
{
|
||||
return platform_driver_register(&clk_mt6779_drv);
|
||||
int ret = platform_driver_register(&clk_mt6779_drv);
|
||||
|
||||
if (ret)
|
||||
return ret;
|
||||
return platform_driver_register(&clk_mt6779_infra_drv);
|
||||
}
|
||||
|
||||
arch_initcall(clk_mt6779_init);
|
||||
|
|
|
@ -101,11 +101,13 @@ static int clk_mt6795_infracfg_probe(struct platform_device *pdev)
|
|||
if (ret)
|
||||
goto free_clk_data;
|
||||
|
||||
ret = mtk_clk_register_gates(node, infra_gates, ARRAY_SIZE(infra_gates), clk_data);
|
||||
ret = mtk_clk_register_gates(&pdev->dev, node, infra_gates,
|
||||
ARRAY_SIZE(infra_gates), clk_data);
|
||||
if (ret)
|
||||
goto free_clk_data;
|
||||
|
||||
ret = mtk_clk_register_cpumuxes(node, cpu_muxes, ARRAY_SIZE(cpu_muxes), clk_data);
|
||||
ret = mtk_clk_register_cpumuxes(&pdev->dev, node, cpu_muxes,
|
||||
ARRAY_SIZE(cpu_muxes), clk_data);
|
||||
if (ret)
|
||||
goto unregister_gates;
|
||||
|
||||
|
|
|
@ -87,7 +87,8 @@ static int clk_mt6795_mm_probe(struct platform_device *pdev)
|
|||
if (!clk_data)
|
||||
return -ENOMEM;
|
||||
|
||||
ret = mtk_clk_register_gates(node, mm_gates, ARRAY_SIZE(mm_gates), clk_data);
|
||||
ret = mtk_clk_register_gates(&pdev->dev, node, mm_gates,
|
||||
ARRAY_SIZE(mm_gates), clk_data);
|
||||
if (ret)
|
||||
goto free_clk_data;
|
||||
|
||||
|
|
|
@ -109,11 +109,13 @@ static int clk_mt6795_pericfg_probe(struct platform_device *pdev)
|
|||
if (ret)
|
||||
goto free_clk_data;
|
||||
|
||||
ret = mtk_clk_register_gates(node, peri_gates, ARRAY_SIZE(peri_gates), clk_data);
|
||||
ret = mtk_clk_register_gates(&pdev->dev, node, peri_gates,
|
||||
ARRAY_SIZE(peri_gates), clk_data);
|
||||
if (ret)
|
||||
goto free_clk_data;
|
||||
|
||||
ret = mtk_clk_register_composites(peri_clks, ARRAY_SIZE(peri_clks), base,
|
||||
ret = mtk_clk_register_composites(&pdev->dev, peri_clks,
|
||||
ARRAY_SIZE(peri_clks), base,
|
||||
&mt6795_peri_clk_lock, clk_data);
|
||||
if (ret)
|
||||
goto unregister_gates;
|
||||
|
|
|
@ -523,86 +523,30 @@ static struct mtk_composite top_aud_divs[] = {
|
|||
DIV_GATE(CLK_TOP_APLL2_DIV5, "apll2_div5", "apll2_div4", 0x12c, 21, 0x12c, 4, 4),
|
||||
};
|
||||
|
||||
|
||||
static const struct of_device_id of_match_clk_mt6795_topckgen[] = {
|
||||
{ .compatible = "mediatek,mt6795-topckgen" },
|
||||
{ /* sentinel */ }
|
||||
static const struct mtk_clk_desc topck_desc = {
|
||||
.fixed_clks = fixed_clks,
|
||||
.num_fixed_clks = ARRAY_SIZE(fixed_clks),
|
||||
.factor_clks = top_divs,
|
||||
.num_factor_clks = ARRAY_SIZE(top_divs),
|
||||
.mux_clks = top_muxes,
|
||||
.num_mux_clks = ARRAY_SIZE(top_muxes),
|
||||
.composite_clks = top_aud_divs,
|
||||
.num_composite_clks = ARRAY_SIZE(top_aud_divs),
|
||||
.clk_lock = &mt6795_top_clk_lock,
|
||||
};
|
||||
|
||||
static int clk_mt6795_topckgen_probe(struct platform_device *pdev)
|
||||
{
|
||||
struct clk_hw_onecell_data *clk_data;
|
||||
struct device_node *node = pdev->dev.of_node;
|
||||
void __iomem *base;
|
||||
int ret;
|
||||
|
||||
base = devm_platform_ioremap_resource(pdev, 0);
|
||||
if (IS_ERR(base))
|
||||
return PTR_ERR(base);
|
||||
|
||||
clk_data = mtk_alloc_clk_data(CLK_TOP_NR_CLK);
|
||||
if (!clk_data)
|
||||
return -ENOMEM;
|
||||
|
||||
ret = mtk_clk_register_fixed_clks(fixed_clks, ARRAY_SIZE(fixed_clks), clk_data);
|
||||
if (ret)
|
||||
goto free_clk_data;
|
||||
|
||||
ret = mtk_clk_register_factors(top_divs, ARRAY_SIZE(top_divs), clk_data);
|
||||
if (ret)
|
||||
goto unregister_fixed_clks;
|
||||
|
||||
ret = mtk_clk_register_muxes(top_muxes, ARRAY_SIZE(top_muxes), node,
|
||||
&mt6795_top_clk_lock, clk_data);
|
||||
if (ret)
|
||||
goto unregister_factors;
|
||||
|
||||
ret = mtk_clk_register_composites(top_aud_divs, ARRAY_SIZE(top_aud_divs), base,
|
||||
&mt6795_top_clk_lock, clk_data);
|
||||
if (ret)
|
||||
goto unregister_muxes;
|
||||
|
||||
ret = of_clk_add_hw_provider(node, of_clk_hw_onecell_get, clk_data);
|
||||
if (ret)
|
||||
goto unregister_composites;
|
||||
|
||||
return 0;
|
||||
|
||||
unregister_composites:
|
||||
mtk_clk_unregister_composites(top_aud_divs, ARRAY_SIZE(top_aud_divs), clk_data);
|
||||
unregister_muxes:
|
||||
mtk_clk_unregister_muxes(top_muxes, ARRAY_SIZE(top_muxes), clk_data);
|
||||
unregister_factors:
|
||||
mtk_clk_unregister_factors(top_divs, ARRAY_SIZE(top_divs), clk_data);
|
||||
unregister_fixed_clks:
|
||||
mtk_clk_unregister_fixed_clks(fixed_clks, ARRAY_SIZE(fixed_clks), clk_data);
|
||||
free_clk_data:
|
||||
mtk_free_clk_data(clk_data);
|
||||
return ret;
|
||||
}
|
||||
|
||||
static int clk_mt6795_topckgen_remove(struct platform_device *pdev)
|
||||
{
|
||||
struct device_node *node = pdev->dev.of_node;
|
||||
struct clk_hw_onecell_data *clk_data = platform_get_drvdata(pdev);
|
||||
|
||||
of_clk_del_provider(node);
|
||||
mtk_clk_unregister_composites(top_aud_divs, ARRAY_SIZE(top_aud_divs), clk_data);
|
||||
mtk_clk_unregister_muxes(top_muxes, ARRAY_SIZE(top_muxes), clk_data);
|
||||
mtk_clk_unregister_factors(top_divs, ARRAY_SIZE(top_divs), clk_data);
|
||||
mtk_clk_unregister_fixed_clks(fixed_clks, ARRAY_SIZE(fixed_clks), clk_data);
|
||||
mtk_free_clk_data(clk_data);
|
||||
|
||||
return 0;
|
||||
}
|
||||
static const struct of_device_id of_match_clk_mt6795_topckgen[] = {
|
||||
{ .compatible = "mediatek,mt6795-topckgen", .data = &topck_desc },
|
||||
{ /* sentinel */ }
|
||||
};
|
||||
|
||||
static struct platform_driver clk_mt6795_topckgen_drv = {
|
||||
.driver = {
|
||||
.name = "clk-mt6795-topckgen",
|
||||
.of_match_table = of_match_clk_mt6795_topckgen,
|
||||
},
|
||||
.probe = clk_mt6795_topckgen_probe,
|
||||
.remove = clk_mt6795_topckgen_remove,
|
||||
.probe = mtk_clk_simple_probe,
|
||||
.remove = mtk_clk_simple_remove,
|
||||
};
|
||||
module_platform_driver(clk_mt6795_topckgen_drv);
|
||||
|
||||
|
|
|
@ -101,8 +101,8 @@ static int clk_mt6797_mm_probe(struct platform_device *pdev)
|
|||
|
||||
clk_data = mtk_alloc_clk_data(CLK_MM_NR);
|
||||
|
||||
mtk_clk_register_gates(node, mm_clks, ARRAY_SIZE(mm_clks),
|
||||
clk_data);
|
||||
mtk_clk_register_gates(&pdev->dev, node, mm_clks,
|
||||
ARRAY_SIZE(mm_clks), clk_data);
|
||||
|
||||
r = of_clk_add_hw_provider(node, of_clk_hw_onecell_get, clk_data);
|
||||
if (r)
|
||||
|
|
|
@ -396,7 +396,8 @@ static int mtk_topckgen_init(struct platform_device *pdev)
|
|||
mtk_clk_register_factors(top_fixed_divs, ARRAY_SIZE(top_fixed_divs),
|
||||
clk_data);
|
||||
|
||||
mtk_clk_register_composites(top_muxes, ARRAY_SIZE(top_muxes), base,
|
||||
mtk_clk_register_composites(&pdev->dev, top_muxes,
|
||||
ARRAY_SIZE(top_muxes), base,
|
||||
&mt6797_clk_lock, clk_data);
|
||||
|
||||
return of_clk_add_hw_provider(node, of_clk_hw_onecell_get, clk_data);
|
||||
|
@ -596,8 +597,8 @@ static int mtk_infrasys_init(struct platform_device *pdev)
|
|||
}
|
||||
}
|
||||
|
||||
mtk_clk_register_gates(node, infra_clks, ARRAY_SIZE(infra_clks),
|
||||
infra_clk_data);
|
||||
mtk_clk_register_gates(&pdev->dev, node, infra_clks,
|
||||
ARRAY_SIZE(infra_clks), infra_clk_data);
|
||||
mtk_clk_register_factors(infra_fixed_divs, ARRAY_SIZE(infra_fixed_divs),
|
||||
infra_clk_data);
|
||||
|
||||
|
|
|
@ -130,24 +130,22 @@ static const struct mtk_gate audio_clks[] = {
|
|||
GATE_AUDIO3(CLK_AUDIO_MEM_ASRC5, "audio_mem_asrc5", "asm_h_sel", 14),
|
||||
};
|
||||
|
||||
static int clk_mt7622_audiosys_init(struct platform_device *pdev)
|
||||
static const struct mtk_clk_desc audio_desc = {
|
||||
.clks = audio_clks,
|
||||
.num_clks = ARRAY_SIZE(audio_clks),
|
||||
};
|
||||
|
||||
static int clk_mt7622_aud_probe(struct platform_device *pdev)
|
||||
{
|
||||
struct clk_hw_onecell_data *clk_data;
|
||||
struct device_node *node = pdev->dev.of_node;
|
||||
int r;
|
||||
|
||||
clk_data = mtk_alloc_clk_data(CLK_AUDIO_NR_CLK);
|
||||
|
||||
mtk_clk_register_gates(node, audio_clks, ARRAY_SIZE(audio_clks),
|
||||
clk_data);
|
||||
|
||||
r = of_clk_add_hw_provider(node, of_clk_hw_onecell_get, clk_data);
|
||||
r = mtk_clk_simple_probe(pdev);
|
||||
if (r) {
|
||||
dev_err(&pdev->dev,
|
||||
"could not register clock provider: %s: %d\n",
|
||||
pdev->name, r);
|
||||
|
||||
goto err_clk_provider;
|
||||
return r;
|
||||
}
|
||||
|
||||
r = devm_of_platform_populate(&pdev->dev);
|
||||
|
@ -157,40 +155,24 @@ static int clk_mt7622_audiosys_init(struct platform_device *pdev)
|
|||
return 0;
|
||||
|
||||
err_plat_populate:
|
||||
of_clk_del_provider(node);
|
||||
err_clk_provider:
|
||||
mtk_clk_simple_remove(pdev);
|
||||
return r;
|
||||
}
|
||||
|
||||
static int clk_mt7622_aud_remove(struct platform_device *pdev)
|
||||
{
|
||||
of_platform_depopulate(&pdev->dev);
|
||||
return mtk_clk_simple_remove(pdev);
|
||||
}
|
||||
|
||||
static const struct of_device_id of_match_clk_mt7622_aud[] = {
|
||||
{
|
||||
.compatible = "mediatek,mt7622-audsys",
|
||||
.data = clk_mt7622_audiosys_init,
|
||||
}, {
|
||||
/* sentinel */
|
||||
}
|
||||
{ .compatible = "mediatek,mt7622-audsys", .data = &audio_desc },
|
||||
{ /* sentinel */ }
|
||||
};
|
||||
|
||||
static int clk_mt7622_aud_probe(struct platform_device *pdev)
|
||||
{
|
||||
int (*clk_init)(struct platform_device *);
|
||||
int r;
|
||||
|
||||
clk_init = of_device_get_match_data(&pdev->dev);
|
||||
if (!clk_init)
|
||||
return -EINVAL;
|
||||
|
||||
r = clk_init(pdev);
|
||||
if (r)
|
||||
dev_err(&pdev->dev,
|
||||
"could not register clock provider: %s: %d\n",
|
||||
pdev->name, r);
|
||||
|
||||
return r;
|
||||
}
|
||||
|
||||
static struct platform_driver clk_mt7622_aud_drv = {
|
||||
.probe = clk_mt7622_aud_probe,
|
||||
.remove = clk_mt7622_aud_remove,
|
||||
.driver = {
|
||||
.name = "clk-mt7622-aud",
|
||||
.of_match_table = of_match_clk_mt7622_aud,
|
||||
|
|
|
@ -73,80 +73,26 @@ static const struct mtk_clk_rst_desc clk_rst_desc = {
|
|||
.rst_bank_nr = ARRAY_SIZE(rst_ofs),
|
||||
};
|
||||
|
||||
static int clk_mt7622_ethsys_init(struct platform_device *pdev)
|
||||
{
|
||||
struct clk_hw_onecell_data *clk_data;
|
||||
struct device_node *node = pdev->dev.of_node;
|
||||
int r;
|
||||
|
||||
clk_data = mtk_alloc_clk_data(CLK_ETH_NR_CLK);
|
||||
|
||||
mtk_clk_register_gates(node, eth_clks, ARRAY_SIZE(eth_clks),
|
||||
clk_data);
|
||||
|
||||
r = of_clk_add_hw_provider(node, of_clk_hw_onecell_get, clk_data);
|
||||
if (r)
|
||||
dev_err(&pdev->dev,
|
||||
"could not register clock provider: %s: %d\n",
|
||||
pdev->name, r);
|
||||
|
||||
mtk_register_reset_controller_with_dev(&pdev->dev, &clk_rst_desc);
|
||||
|
||||
return r;
|
||||
}
|
||||
|
||||
static int clk_mt7622_sgmiisys_init(struct platform_device *pdev)
|
||||
{
|
||||
struct clk_hw_onecell_data *clk_data;
|
||||
struct device_node *node = pdev->dev.of_node;
|
||||
int r;
|
||||
|
||||
clk_data = mtk_alloc_clk_data(CLK_SGMII_NR_CLK);
|
||||
|
||||
mtk_clk_register_gates(node, sgmii_clks, ARRAY_SIZE(sgmii_clks),
|
||||
clk_data);
|
||||
|
||||
r = of_clk_add_hw_provider(node, of_clk_hw_onecell_get, clk_data);
|
||||
if (r)
|
||||
dev_err(&pdev->dev,
|
||||
"could not register clock provider: %s: %d\n",
|
||||
pdev->name, r);
|
||||
|
||||
return r;
|
||||
}
|
||||
|
||||
static const struct of_device_id of_match_clk_mt7622_eth[] = {
|
||||
{
|
||||
.compatible = "mediatek,mt7622-ethsys",
|
||||
.data = clk_mt7622_ethsys_init,
|
||||
}, {
|
||||
.compatible = "mediatek,mt7622-sgmiisys",
|
||||
.data = clk_mt7622_sgmiisys_init,
|
||||
}, {
|
||||
/* sentinel */
|
||||
}
|
||||
static const struct mtk_clk_desc eth_desc = {
|
||||
.clks = eth_clks,
|
||||
.num_clks = ARRAY_SIZE(eth_clks),
|
||||
.rst_desc = &clk_rst_desc,
|
||||
};
|
||||
|
||||
static int clk_mt7622_eth_probe(struct platform_device *pdev)
|
||||
{
|
||||
int (*clk_init)(struct platform_device *);
|
||||
int r;
|
||||
static const struct mtk_clk_desc sgmii_desc = {
|
||||
.clks = sgmii_clks,
|
||||
.num_clks = ARRAY_SIZE(sgmii_clks),
|
||||
};
|
||||
|
||||
clk_init = of_device_get_match_data(&pdev->dev);
|
||||
if (!clk_init)
|
||||
return -EINVAL;
|
||||
|
||||
r = clk_init(pdev);
|
||||
if (r)
|
||||
dev_err(&pdev->dev,
|
||||
"could not register clock provider: %s: %d\n",
|
||||
pdev->name, r);
|
||||
|
||||
return r;
|
||||
}
|
||||
static const struct of_device_id of_match_clk_mt7622_eth[] = {
|
||||
{ .compatible = "mediatek,mt7622-ethsys", .data = ð_desc },
|
||||
{ .compatible = "mediatek,mt7622-sgmiisys", .data = &sgmii_desc },
|
||||
{ /* sentinel */ }
|
||||
};
|
||||
|
||||
static struct platform_driver clk_mt7622_eth_drv = {
|
||||
.probe = clk_mt7622_eth_probe,
|
||||
.probe = mtk_clk_simple_probe,
|
||||
.remove = mtk_clk_simple_remove,
|
||||
.driver = {
|
||||
.name = "clk-mt7622-eth",
|
||||
.of_match_table = of_match_clk_mt7622_eth,
|
||||
|
|
|
@ -84,82 +84,27 @@ static const struct mtk_clk_rst_desc clk_rst_desc = {
|
|||
.rst_bank_nr = ARRAY_SIZE(rst_ofs),
|
||||
};
|
||||
|
||||
static int clk_mt7622_ssusbsys_init(struct platform_device *pdev)
|
||||
{
|
||||
struct clk_hw_onecell_data *clk_data;
|
||||
struct device_node *node = pdev->dev.of_node;
|
||||
int r;
|
||||
|
||||
clk_data = mtk_alloc_clk_data(CLK_SSUSB_NR_CLK);
|
||||
|
||||
mtk_clk_register_gates(node, ssusb_clks, ARRAY_SIZE(ssusb_clks),
|
||||
clk_data);
|
||||
|
||||
r = of_clk_add_hw_provider(node, of_clk_hw_onecell_get, clk_data);
|
||||
if (r)
|
||||
dev_err(&pdev->dev,
|
||||
"could not register clock provider: %s: %d\n",
|
||||
pdev->name, r);
|
||||
|
||||
mtk_register_reset_controller_with_dev(&pdev->dev, &clk_rst_desc);
|
||||
|
||||
return r;
|
||||
}
|
||||
|
||||
static int clk_mt7622_pciesys_init(struct platform_device *pdev)
|
||||
{
|
||||
struct clk_hw_onecell_data *clk_data;
|
||||
struct device_node *node = pdev->dev.of_node;
|
||||
int r;
|
||||
|
||||
clk_data = mtk_alloc_clk_data(CLK_PCIE_NR_CLK);
|
||||
|
||||
mtk_clk_register_gates(node, pcie_clks, ARRAY_SIZE(pcie_clks),
|
||||
clk_data);
|
||||
|
||||
r = of_clk_add_hw_provider(node, of_clk_hw_onecell_get, clk_data);
|
||||
if (r)
|
||||
dev_err(&pdev->dev,
|
||||
"could not register clock provider: %s: %d\n",
|
||||
pdev->name, r);
|
||||
|
||||
mtk_register_reset_controller_with_dev(&pdev->dev, &clk_rst_desc);
|
||||
|
||||
return r;
|
||||
}
|
||||
|
||||
static const struct of_device_id of_match_clk_mt7622_hif[] = {
|
||||
{
|
||||
.compatible = "mediatek,mt7622-pciesys",
|
||||
.data = clk_mt7622_pciesys_init,
|
||||
}, {
|
||||
.compatible = "mediatek,mt7622-ssusbsys",
|
||||
.data = clk_mt7622_ssusbsys_init,
|
||||
}, {
|
||||
/* sentinel */
|
||||
}
|
||||
static const struct mtk_clk_desc ssusb_desc = {
|
||||
.clks = ssusb_clks,
|
||||
.num_clks = ARRAY_SIZE(ssusb_clks),
|
||||
.rst_desc = &clk_rst_desc,
|
||||
};
|
||||
|
||||
static int clk_mt7622_hif_probe(struct platform_device *pdev)
|
||||
{
|
||||
int (*clk_init)(struct platform_device *);
|
||||
int r;
|
||||
static const struct mtk_clk_desc pcie_desc = {
|
||||
.clks = pcie_clks,
|
||||
.num_clks = ARRAY_SIZE(pcie_clks),
|
||||
.rst_desc = &clk_rst_desc,
|
||||
};
|
||||
|
||||
clk_init = of_device_get_match_data(&pdev->dev);
|
||||
if (!clk_init)
|
||||
return -EINVAL;
|
||||
|
||||
r = clk_init(pdev);
|
||||
if (r)
|
||||
dev_err(&pdev->dev,
|
||||
"could not register clock provider: %s: %d\n",
|
||||
pdev->name, r);
|
||||
|
||||
return r;
|
||||
}
|
||||
static const struct of_device_id of_match_clk_mt7622_hif[] = {
|
||||
{ .compatible = "mediatek,mt7622-pciesys", .data = &pcie_desc },
|
||||
{ .compatible = "mediatek,mt7622-ssusbsys", .data = &ssusb_desc },
|
||||
{ /* sentinel */ }
|
||||
};
|
||||
|
||||
static struct platform_driver clk_mt7622_hif_drv = {
|
||||
.probe = clk_mt7622_hif_probe,
|
||||
.probe = mtk_clk_simple_probe,
|
||||
.remove = mtk_clk_simple_remove,
|
||||
.driver = {
|
||||
.name = "clk-mt7622-hif",
|
||||
.of_match_table = of_match_clk_mt7622_hif,
|
||||
|
|
|
@ -646,14 +646,15 @@ static int mtk_topckgen_init(struct platform_device *pdev)
|
|||
mtk_clk_register_factors(top_divs, ARRAY_SIZE(top_divs),
|
||||
clk_data);
|
||||
|
||||
mtk_clk_register_composites(top_muxes, ARRAY_SIZE(top_muxes),
|
||||
base, &mt7622_clk_lock, clk_data);
|
||||
mtk_clk_register_composites(&pdev->dev, top_muxes,
|
||||
ARRAY_SIZE(top_muxes), base,
|
||||
&mt7622_clk_lock, clk_data);
|
||||
|
||||
mtk_clk_register_dividers(top_adj_divs, ARRAY_SIZE(top_adj_divs),
|
||||
base, &mt7622_clk_lock, clk_data);
|
||||
|
||||
mtk_clk_register_gates(node, top_clks, ARRAY_SIZE(top_clks),
|
||||
clk_data);
|
||||
mtk_clk_register_gates(&pdev->dev, node, top_clks,
|
||||
ARRAY_SIZE(top_clks), clk_data);
|
||||
|
||||
clk_prepare_enable(clk_data->hws[CLK_TOP_AXI_SEL]->clk);
|
||||
clk_prepare_enable(clk_data->hws[CLK_TOP_MEM_SEL]->clk);
|
||||
|
@ -670,11 +671,11 @@ static int mtk_infrasys_init(struct platform_device *pdev)
|
|||
|
||||
clk_data = mtk_alloc_clk_data(CLK_INFRA_NR_CLK);
|
||||
|
||||
mtk_clk_register_gates(node, infra_clks, ARRAY_SIZE(infra_clks),
|
||||
clk_data);
|
||||
mtk_clk_register_gates(&pdev->dev, node, infra_clks,
|
||||
ARRAY_SIZE(infra_clks), clk_data);
|
||||
|
||||
mtk_clk_register_cpumuxes(node, infra_muxes, ARRAY_SIZE(infra_muxes),
|
||||
clk_data);
|
||||
mtk_clk_register_cpumuxes(&pdev->dev, node, infra_muxes,
|
||||
ARRAY_SIZE(infra_muxes), clk_data);
|
||||
|
||||
r = of_clk_add_hw_provider(node, of_clk_hw_onecell_get,
|
||||
clk_data);
|
||||
|
@ -698,7 +699,7 @@ static int mtk_apmixedsys_init(struct platform_device *pdev)
|
|||
mtk_clk_register_plls(node, plls, ARRAY_SIZE(plls),
|
||||
clk_data);
|
||||
|
||||
mtk_clk_register_gates(node, apmixed_clks,
|
||||
mtk_clk_register_gates(&pdev->dev, node, apmixed_clks,
|
||||
ARRAY_SIZE(apmixed_clks), clk_data);
|
||||
|
||||
clk_prepare_enable(clk_data->hws[CLK_APMIXED_ARMPLL]->clk);
|
||||
|
@ -720,10 +721,11 @@ static int mtk_pericfg_init(struct platform_device *pdev)
|
|||
|
||||
clk_data = mtk_alloc_clk_data(CLK_PERI_NR_CLK);
|
||||
|
||||
mtk_clk_register_gates(node, peri_clks, ARRAY_SIZE(peri_clks),
|
||||
clk_data);
|
||||
mtk_clk_register_gates(&pdev->dev, node, peri_clks,
|
||||
ARRAY_SIZE(peri_clks), clk_data);
|
||||
|
||||
mtk_clk_register_composites(peri_muxes, ARRAY_SIZE(peri_muxes), base,
|
||||
mtk_clk_register_composites(&pdev->dev, peri_muxes,
|
||||
ARRAY_SIZE(peri_muxes), base,
|
||||
&mt7622_clk_lock, clk_data);
|
||||
|
||||
r = of_clk_add_hw_provider(node, of_clk_hw_onecell_get, clk_data);
|
||||
|
|
|
@ -92,7 +92,8 @@ static int clk_mt7629_ethsys_init(struct platform_device *pdev)
|
|||
|
||||
clk_data = mtk_alloc_clk_data(CLK_ETH_NR_CLK);
|
||||
|
||||
mtk_clk_register_gates(node, eth_clks, CLK_ETH_NR_CLK, clk_data);
|
||||
mtk_clk_register_gates(&pdev->dev, node, eth_clks,
|
||||
CLK_ETH_NR_CLK, clk_data);
|
||||
|
||||
r = of_clk_add_hw_provider(node, of_clk_hw_onecell_get, clk_data);
|
||||
if (r)
|
||||
|
@ -114,8 +115,8 @@ static int clk_mt7629_sgmiisys_init(struct platform_device *pdev)
|
|||
|
||||
clk_data = mtk_alloc_clk_data(CLK_SGMII_NR_CLK);
|
||||
|
||||
mtk_clk_register_gates(node, sgmii_clks[id++], CLK_SGMII_NR_CLK,
|
||||
clk_data);
|
||||
mtk_clk_register_gates(&pdev->dev, node, sgmii_clks[id++],
|
||||
CLK_SGMII_NR_CLK, clk_data);
|
||||
|
||||
r = of_clk_add_hw_provider(node, of_clk_hw_onecell_get, clk_data);
|
||||
if (r)
|
||||
|
|
|
@ -79,82 +79,27 @@ static const struct mtk_clk_rst_desc clk_rst_desc = {
|
|||
.rst_bank_nr = ARRAY_SIZE(rst_ofs),
|
||||
};
|
||||
|
||||
static int clk_mt7629_ssusbsys_init(struct platform_device *pdev)
|
||||
{
|
||||
struct clk_hw_onecell_data *clk_data;
|
||||
struct device_node *node = pdev->dev.of_node;
|
||||
int r;
|
||||
|
||||
clk_data = mtk_alloc_clk_data(CLK_SSUSB_NR_CLK);
|
||||
|
||||
mtk_clk_register_gates(node, ssusb_clks, ARRAY_SIZE(ssusb_clks),
|
||||
clk_data);
|
||||
|
||||
r = of_clk_add_hw_provider(node, of_clk_hw_onecell_get, clk_data);
|
||||
if (r)
|
||||
dev_err(&pdev->dev,
|
||||
"could not register clock provider: %s: %d\n",
|
||||
pdev->name, r);
|
||||
|
||||
mtk_register_reset_controller_with_dev(&pdev->dev, &clk_rst_desc);
|
||||
|
||||
return r;
|
||||
}
|
||||
|
||||
static int clk_mt7629_pciesys_init(struct platform_device *pdev)
|
||||
{
|
||||
struct clk_hw_onecell_data *clk_data;
|
||||
struct device_node *node = pdev->dev.of_node;
|
||||
int r;
|
||||
|
||||
clk_data = mtk_alloc_clk_data(CLK_PCIE_NR_CLK);
|
||||
|
||||
mtk_clk_register_gates(node, pcie_clks, ARRAY_SIZE(pcie_clks),
|
||||
clk_data);
|
||||
|
||||
r = of_clk_add_hw_provider(node, of_clk_hw_onecell_get, clk_data);
|
||||
if (r)
|
||||
dev_err(&pdev->dev,
|
||||
"could not register clock provider: %s: %d\n",
|
||||
pdev->name, r);
|
||||
|
||||
mtk_register_reset_controller_with_dev(&pdev->dev, &clk_rst_desc);
|
||||
|
||||
return r;
|
||||
}
|
||||
|
||||
static const struct of_device_id of_match_clk_mt7629_hif[] = {
|
||||
{
|
||||
.compatible = "mediatek,mt7629-pciesys",
|
||||
.data = clk_mt7629_pciesys_init,
|
||||
}, {
|
||||
.compatible = "mediatek,mt7629-ssusbsys",
|
||||
.data = clk_mt7629_ssusbsys_init,
|
||||
}, {
|
||||
/* sentinel */
|
||||
}
|
||||
static const struct mtk_clk_desc ssusb_desc = {
|
||||
.clks = ssusb_clks,
|
||||
.num_clks = ARRAY_SIZE(ssusb_clks),
|
||||
.rst_desc = &clk_rst_desc,
|
||||
};
|
||||
|
||||
static int clk_mt7629_hif_probe(struct platform_device *pdev)
|
||||
{
|
||||
int (*clk_init)(struct platform_device *);
|
||||
int r;
|
||||
static const struct mtk_clk_desc pcie_desc = {
|
||||
.clks = pcie_clks,
|
||||
.num_clks = ARRAY_SIZE(pcie_clks),
|
||||
.rst_desc = &clk_rst_desc,
|
||||
};
|
||||
|
||||
clk_init = of_device_get_match_data(&pdev->dev);
|
||||
if (!clk_init)
|
||||
return -EINVAL;
|
||||
|
||||
r = clk_init(pdev);
|
||||
if (r)
|
||||
dev_err(&pdev->dev,
|
||||
"could not register clock provider: %s: %d\n",
|
||||
pdev->name, r);
|
||||
|
||||
return r;
|
||||
}
|
||||
static const struct of_device_id of_match_clk_mt7629_hif[] = {
|
||||
{ .compatible = "mediatek,mt7629-pciesys", .data = &pcie_desc },
|
||||
{ .compatible = "mediatek,mt7629-ssusbsys", .data = &ssusb_desc },
|
||||
{ /* sentinel */ }
|
||||
};
|
||||
|
||||
static struct platform_driver clk_mt7629_hif_drv = {
|
||||
.probe = clk_mt7629_hif_probe,
|
||||
.probe = mtk_clk_simple_probe,
|
||||
.remove = mtk_clk_simple_remove,
|
||||
.driver = {
|
||||
.name = "clk-mt7629-hif",
|
||||
.of_match_table = of_match_clk_mt7629_hif,
|
||||
|
|
|
@ -588,8 +588,9 @@ static int mtk_topckgen_init(struct platform_device *pdev)
|
|||
mtk_clk_register_factors(top_divs, ARRAY_SIZE(top_divs),
|
||||
clk_data);
|
||||
|
||||
mtk_clk_register_composites(top_muxes, ARRAY_SIZE(top_muxes),
|
||||
base, &mt7629_clk_lock, clk_data);
|
||||
mtk_clk_register_composites(&pdev->dev, top_muxes,
|
||||
ARRAY_SIZE(top_muxes), base,
|
||||
&mt7629_clk_lock, clk_data);
|
||||
|
||||
clk_prepare_enable(clk_data->hws[CLK_TOP_AXI_SEL]->clk);
|
||||
clk_prepare_enable(clk_data->hws[CLK_TOP_MEM_SEL]->clk);
|
||||
|
@ -605,11 +606,11 @@ static int mtk_infrasys_init(struct platform_device *pdev)
|
|||
|
||||
clk_data = mtk_alloc_clk_data(CLK_INFRA_NR_CLK);
|
||||
|
||||
mtk_clk_register_gates(node, infra_clks, ARRAY_SIZE(infra_clks),
|
||||
clk_data);
|
||||
mtk_clk_register_gates(&pdev->dev, node, infra_clks,
|
||||
ARRAY_SIZE(infra_clks), clk_data);
|
||||
|
||||
mtk_clk_register_cpumuxes(node, infra_muxes, ARRAY_SIZE(infra_muxes),
|
||||
clk_data);
|
||||
mtk_clk_register_cpumuxes(&pdev->dev, node, infra_muxes,
|
||||
ARRAY_SIZE(infra_muxes), clk_data);
|
||||
|
||||
return of_clk_add_hw_provider(node, of_clk_hw_onecell_get,
|
||||
clk_data);
|
||||
|
@ -628,10 +629,11 @@ static int mtk_pericfg_init(struct platform_device *pdev)
|
|||
|
||||
clk_data = mtk_alloc_clk_data(CLK_PERI_NR_CLK);
|
||||
|
||||
mtk_clk_register_gates(node, peri_clks, ARRAY_SIZE(peri_clks),
|
||||
clk_data);
|
||||
mtk_clk_register_gates(&pdev->dev, node, peri_clks,
|
||||
ARRAY_SIZE(peri_clks), clk_data);
|
||||
|
||||
mtk_clk_register_composites(peri_muxes, ARRAY_SIZE(peri_muxes), base,
|
||||
mtk_clk_register_composites(&pdev->dev, peri_muxes,
|
||||
ARRAY_SIZE(peri_muxes), base,
|
||||
&mt7629_clk_lock, clk_data);
|
||||
|
||||
r = of_clk_add_hw_provider(node, of_clk_hw_onecell_get, clk_data);
|
||||
|
@ -655,7 +657,7 @@ static int mtk_apmixedsys_init(struct platform_device *pdev)
|
|||
mtk_clk_register_plls(node, plls, ARRAY_SIZE(plls),
|
||||
clk_data);
|
||||
|
||||
mtk_clk_register_gates(node, apmixed_clks,
|
||||
mtk_clk_register_gates(&pdev->dev, node, apmixed_clks,
|
||||
ARRAY_SIZE(apmixed_clks), clk_data);
|
||||
|
||||
clk_prepare_enable(clk_data->hws[CLK_APMIXED_ARMPLL]->clk);
|
||||
|
|
|
@ -0,0 +1,102 @@
|
|||
// SPDX-License-Identifier: GPL-2.0
|
||||
/*
|
||||
* Copyright (c) 2021 MediaTek Inc.
|
||||
* Author: Sam Shih <sam.shih@mediatek.com>
|
||||
* Author: Wenzhen Yu <wenzhen.yu@mediatek.com>
|
||||
* Author: Jianhui Zhao <zhaojh329@gmail.com>
|
||||
* Author: Daniel Golle <daniel@makrotopia.org>
|
||||
*/
|
||||
|
||||
#include <linux/clk-provider.h>
|
||||
#include <linux/of.h>
|
||||
#include <linux/of_address.h>
|
||||
#include <linux/of_device.h>
|
||||
#include <linux/platform_device.h>
|
||||
|
||||
#include "clk-gate.h"
|
||||
#include "clk-mtk.h"
|
||||
#include "clk-mux.h"
|
||||
#include "clk-pll.h"
|
||||
|
||||
#include <dt-bindings/clock/mediatek,mt7981-clk.h>
|
||||
#include <linux/clk.h>
|
||||
|
||||
#define MT7981_PLL_FMAX (2500UL * MHZ)
|
||||
#define CON0_MT7981_RST_BAR BIT(27)
|
||||
|
||||
#define PLL_xtal(_id, _name, _reg, _pwr_reg, _en_mask, _flags, _pcwbits, \
|
||||
_pd_reg, _pd_shift, _tuner_reg, _pcw_reg, _pcw_shift, \
|
||||
_div_table, _parent_name) \
|
||||
{ \
|
||||
.id = _id, .name = _name, .reg = _reg, .pwr_reg = _pwr_reg, \
|
||||
.en_mask = _en_mask, .flags = _flags, \
|
||||
.rst_bar_mask = CON0_MT7981_RST_BAR, .fmax = MT7981_PLL_FMAX, \
|
||||
.pcwbits = _pcwbits, .pd_reg = _pd_reg, .pd_shift = _pd_shift, \
|
||||
.tuner_reg = _tuner_reg, .pcw_reg = _pcw_reg, \
|
||||
.pcw_shift = _pcw_shift, .div_table = _div_table, \
|
||||
.parent_name = _parent_name, \
|
||||
}
|
||||
|
||||
#define PLL(_id, _name, _reg, _pwr_reg, _en_mask, _flags, _pcwbits, _pd_reg, \
|
||||
_pd_shift, _tuner_reg, _pcw_reg, _pcw_shift) \
|
||||
PLL_xtal(_id, _name, _reg, _pwr_reg, _en_mask, _flags, _pcwbits, \
|
||||
_pd_reg, _pd_shift, _tuner_reg, _pcw_reg, _pcw_shift, NULL, \
|
||||
"clkxtal")
|
||||
|
||||
static const struct mtk_pll_data plls[] = {
|
||||
PLL(CLK_APMIXED_ARMPLL, "armpll", 0x0200, 0x020C, 0x00000001, PLL_AO,
|
||||
32, 0x0200, 4, 0, 0x0204, 0),
|
||||
PLL(CLK_APMIXED_NET2PLL, "net2pll", 0x0210, 0x021C, 0x00000001, 0, 32,
|
||||
0x0210, 4, 0, 0x0214, 0),
|
||||
PLL(CLK_APMIXED_MMPLL, "mmpll", 0x0220, 0x022C, 0x00000001, 0, 32,
|
||||
0x0220, 4, 0, 0x0224, 0),
|
||||
PLL(CLK_APMIXED_SGMPLL, "sgmpll", 0x0230, 0x023C, 0x00000001, 0, 32,
|
||||
0x0230, 4, 0, 0x0234, 0),
|
||||
PLL(CLK_APMIXED_WEDMCUPLL, "wedmcupll", 0x0240, 0x024C, 0x00000001, 0, 32,
|
||||
0x0240, 4, 0, 0x0244, 0),
|
||||
PLL(CLK_APMIXED_NET1PLL, "net1pll", 0x0250, 0x025C, 0x00000001, 0, 32,
|
||||
0x0250, 4, 0, 0x0254, 0),
|
||||
PLL(CLK_APMIXED_MPLL, "mpll", 0x0260, 0x0270, 0x00000001, 0, 32,
|
||||
0x0260, 4, 0, 0x0264, 0),
|
||||
PLL(CLK_APMIXED_APLL2, "apll2", 0x0278, 0x0288, 0x00000001, 0, 32,
|
||||
0x0278, 4, 0, 0x027C, 0),
|
||||
};
|
||||
|
||||
static const struct of_device_id of_match_clk_mt7981_apmixed[] = {
|
||||
{ .compatible = "mediatek,mt7981-apmixedsys", },
|
||||
{ /* sentinel */ }
|
||||
};
|
||||
|
||||
static int clk_mt7981_apmixed_probe(struct platform_device *pdev)
|
||||
{
|
||||
struct clk_hw_onecell_data *clk_data;
|
||||
struct device_node *node = pdev->dev.of_node;
|
||||
int r;
|
||||
|
||||
clk_data = mtk_alloc_clk_data(ARRAY_SIZE(plls));
|
||||
if (!clk_data)
|
||||
return -ENOMEM;
|
||||
|
||||
mtk_clk_register_plls(node, plls, ARRAY_SIZE(plls), clk_data);
|
||||
|
||||
r = of_clk_add_hw_provider(node, of_clk_hw_onecell_get, clk_data);
|
||||
if (r) {
|
||||
pr_err("%s(): could not register clock provider: %d\n",
|
||||
__func__, r);
|
||||
goto free_apmixed_data;
|
||||
}
|
||||
return r;
|
||||
|
||||
free_apmixed_data:
|
||||
mtk_free_clk_data(clk_data);
|
||||
return r;
|
||||
}
|
||||
|
||||
static struct platform_driver clk_mt7981_apmixed_drv = {
|
||||
.probe = clk_mt7981_apmixed_probe,
|
||||
.driver = {
|
||||
.name = "clk-mt7981-apmixed",
|
||||
.of_match_table = of_match_clk_mt7981_apmixed,
|
||||
},
|
||||
};
|
||||
builtin_platform_driver(clk_mt7981_apmixed_drv);
|
|
@ -0,0 +1,118 @@
|
|||
// SPDX-License-Identifier: GPL-2.0
|
||||
/*
|
||||
* Copyright (c) 2021 MediaTek Inc.
|
||||
* Author: Sam Shih <sam.shih@mediatek.com>
|
||||
* Author: Wenzhen Yu <wenzhen.yu@mediatek.com>
|
||||
* Author: Jianhui Zhao <zhaojh329@gmail.com>
|
||||
* Author: Daniel Golle <daniel@makrotopia.org>
|
||||
*/
|
||||
|
||||
#include <linux/clk-provider.h>
|
||||
#include <linux/of.h>
|
||||
#include <linux/of_address.h>
|
||||
#include <linux/of_device.h>
|
||||
#include <linux/platform_device.h>
|
||||
|
||||
#include "clk-mtk.h"
|
||||
#include "clk-gate.h"
|
||||
|
||||
#include <dt-bindings/clock/mediatek,mt7981-clk.h>
|
||||
|
||||
static const struct mtk_gate_regs sgmii0_cg_regs = {
|
||||
.set_ofs = 0xE4,
|
||||
.clr_ofs = 0xE4,
|
||||
.sta_ofs = 0xE4,
|
||||
};
|
||||
|
||||
#define GATE_SGMII0(_id, _name, _parent, _shift) { \
|
||||
.id = _id, \
|
||||
.name = _name, \
|
||||
.parent_name = _parent, \
|
||||
.regs = &sgmii0_cg_regs, \
|
||||
.shift = _shift, \
|
||||
.ops = &mtk_clk_gate_ops_no_setclr_inv, \
|
||||
}
|
||||
|
||||
static const struct mtk_gate sgmii0_clks[] __initconst = {
|
||||
GATE_SGMII0(CLK_SGM0_TX_EN, "sgm0_tx_en", "usb_tx250m", 2),
|
||||
GATE_SGMII0(CLK_SGM0_RX_EN, "sgm0_rx_en", "usb_eq_rx250m", 3),
|
||||
GATE_SGMII0(CLK_SGM0_CK0_EN, "sgm0_ck0_en", "usb_ln0", 4),
|
||||
GATE_SGMII0(CLK_SGM0_CDR_CK0_EN, "sgm0_cdr_ck0_en", "usb_cdr", 5),
|
||||
};
|
||||
|
||||
static const struct mtk_gate_regs sgmii1_cg_regs = {
|
||||
.set_ofs = 0xE4,
|
||||
.clr_ofs = 0xE4,
|
||||
.sta_ofs = 0xE4,
|
||||
};
|
||||
|
||||
#define GATE_SGMII1(_id, _name, _parent, _shift) { \
|
||||
.id = _id, \
|
||||
.name = _name, \
|
||||
.parent_name = _parent, \
|
||||
.regs = &sgmii1_cg_regs, \
|
||||
.shift = _shift, \
|
||||
.ops = &mtk_clk_gate_ops_no_setclr_inv, \
|
||||
}
|
||||
|
||||
static const struct mtk_gate sgmii1_clks[] __initconst = {
|
||||
GATE_SGMII1(CLK_SGM1_TX_EN, "sgm1_tx_en", "usb_tx250m", 2),
|
||||
GATE_SGMII1(CLK_SGM1_RX_EN, "sgm1_rx_en", "usb_eq_rx250m", 3),
|
||||
GATE_SGMII1(CLK_SGM1_CK1_EN, "sgm1_ck1_en", "usb_ln0", 4),
|
||||
GATE_SGMII1(CLK_SGM1_CDR_CK1_EN, "sgm1_cdr_ck1_en", "usb_cdr", 5),
|
||||
};
|
||||
|
||||
static const struct mtk_gate_regs eth_cg_regs = {
|
||||
.set_ofs = 0x30,
|
||||
.clr_ofs = 0x30,
|
||||
.sta_ofs = 0x30,
|
||||
};
|
||||
|
||||
#define GATE_ETH(_id, _name, _parent, _shift) { \
|
||||
.id = _id, \
|
||||
.name = _name, \
|
||||
.parent_name = _parent, \
|
||||
.regs = ð_cg_regs, \
|
||||
.shift = _shift, \
|
||||
.ops = &mtk_clk_gate_ops_no_setclr_inv, \
|
||||
}
|
||||
|
||||
static const struct mtk_gate eth_clks[] __initconst = {
|
||||
GATE_ETH(CLK_ETH_FE_EN, "eth_fe_en", "netsys_2x", 6),
|
||||
GATE_ETH(CLK_ETH_GP2_EN, "eth_gp2_en", "sgm_325m", 7),
|
||||
GATE_ETH(CLK_ETH_GP1_EN, "eth_gp1_en", "sgm_325m", 8),
|
||||
GATE_ETH(CLK_ETH_WOCPU0_EN, "eth_wocpu0_en", "netsys_wed_mcu", 15),
|
||||
};
|
||||
|
||||
static const struct mtk_clk_desc eth_desc = {
|
||||
.clks = eth_clks,
|
||||
.num_clks = ARRAY_SIZE(eth_clks),
|
||||
};
|
||||
|
||||
static const struct mtk_clk_desc sgmii0_desc = {
|
||||
.clks = sgmii0_clks,
|
||||
.num_clks = ARRAY_SIZE(sgmii0_clks),
|
||||
};
|
||||
|
||||
static const struct mtk_clk_desc sgmii1_desc = {
|
||||
.clks = sgmii1_clks,
|
||||
.num_clks = ARRAY_SIZE(sgmii1_clks),
|
||||
};
|
||||
|
||||
static const struct of_device_id of_match_clk_mt7981_eth[] = {
|
||||
{ .compatible = "mediatek,mt7981-ethsys", .data = ð_desc },
|
||||
{ .compatible = "mediatek,mt7981-sgmiisys_0", .data = &sgmii0_desc },
|
||||
{ .compatible = "mediatek,mt7981-sgmiisys_1", .data = &sgmii1_desc },
|
||||
{ /* sentinel */ }
|
||||
};
|
||||
|
||||
static struct platform_driver clk_mt7981_eth_drv = {
|
||||
.probe = mtk_clk_simple_probe,
|
||||
.remove = mtk_clk_simple_remove,
|
||||
.driver = {
|
||||
.name = "clk-mt7981-eth",
|
||||
.of_match_table = of_match_clk_mt7981_eth,
|
||||
},
|
||||
};
|
||||
module_platform_driver(clk_mt7981_eth_drv);
|
||||
MODULE_LICENSE("GPL v2");
|
|
@ -0,0 +1,207 @@
|
|||
// SPDX-License-Identifier: GPL-2.0
|
||||
/*
|
||||
* Copyright (c) 2021 MediaTek Inc.
|
||||
* Author: Sam Shih <sam.shih@mediatek.com>
|
||||
* Author: Wenzhen Yu <wenzhen.yu@mediatek.com>
|
||||
* Author: Jianhui Zhao <zhaojh329@gmail.com>
|
||||
* Author: Daniel Golle <daniel@makrotopia.org>
|
||||
*/
|
||||
|
||||
#include <linux/clk-provider.h>
|
||||
#include <linux/of.h>
|
||||
#include <linux/of_address.h>
|
||||
#include <linux/of_device.h>
|
||||
#include <linux/platform_device.h>
|
||||
#include "clk-mtk.h"
|
||||
#include "clk-gate.h"
|
||||
#include "clk-mux.h"
|
||||
|
||||
#include <dt-bindings/clock/mediatek,mt7981-clk.h>
|
||||
#include <linux/clk.h>
|
||||
|
||||
static DEFINE_SPINLOCK(mt7981_clk_lock);
|
||||
|
||||
static const struct mtk_fixed_factor infra_divs[] = {
|
||||
FACTOR(CLK_INFRA_66M_MCK, "infra_66m_mck", "sysaxi_sel", 1, 2),
|
||||
};
|
||||
|
||||
static const char *const infra_uart_parent[] __initconst = { "csw_f26m_sel",
|
||||
"uart_sel" };
|
||||
|
||||
static const char *const infra_spi0_parents[] __initconst = { "i2c_sel",
|
||||
"spi_sel" };
|
||||
|
||||
static const char *const infra_spi1_parents[] __initconst = { "i2c_sel",
|
||||
"spim_mst_sel" };
|
||||
|
||||
static const char *const infra_pwm1_parents[] __initconst = { "pwm_sel" };
|
||||
|
||||
static const char *const infra_pwm_bsel_parents[] __initconst = {
|
||||
"cb_rtc_32p7k", "csw_f26m_sel", "infra_66m_mck", "pwm_sel"
|
||||
};
|
||||
|
||||
static const char *const infra_pcie_parents[] __initconst = {
|
||||
"cb_rtc_32p7k", "csw_f26m_sel", "cb_cksq_40m", "pextp_tl_ck_sel"
|
||||
};
|
||||
|
||||
static const struct mtk_mux infra_muxes[] = {
|
||||
/* MODULE_CLK_SEL_0 */
|
||||
MUX_GATE_CLR_SET_UPD(CLK_INFRA_UART0_SEL, "infra_uart0_sel",
|
||||
infra_uart_parent, 0x0018, 0x0010, 0x0014, 0, 1,
|
||||
-1, -1, -1),
|
||||
MUX_GATE_CLR_SET_UPD(CLK_INFRA_UART1_SEL, "infra_uart1_sel",
|
||||
infra_uart_parent, 0x0018, 0x0010, 0x0014, 1, 1,
|
||||
-1, -1, -1),
|
||||
MUX_GATE_CLR_SET_UPD(CLK_INFRA_UART2_SEL, "infra_uart2_sel",
|
||||
infra_uart_parent, 0x0018, 0x0010, 0x0014, 2, 1,
|
||||
-1, -1, -1),
|
||||
MUX_GATE_CLR_SET_UPD(CLK_INFRA_SPI0_SEL, "infra_spi0_sel",
|
||||
infra_spi0_parents, 0x0018, 0x0010, 0x0014, 4, 1,
|
||||
-1, -1, -1),
|
||||
MUX_GATE_CLR_SET_UPD(CLK_INFRA_SPI1_SEL, "infra_spi1_sel",
|
||||
infra_spi1_parents, 0x0018, 0x0010, 0x0014, 5, 1,
|
||||
-1, -1, -1),
|
||||
MUX_GATE_CLR_SET_UPD(CLK_INFRA_SPI2_SEL, "infra_spi2_sel",
|
||||
infra_spi0_parents, 0x0018, 0x0010, 0x0014, 6, 1,
|
||||
-1, -1, -1),
|
||||
MUX_GATE_CLR_SET_UPD(CLK_INFRA_PWM1_SEL, "infra_pwm1_sel",
|
||||
infra_pwm1_parents, 0x0018, 0x0010, 0x0014, 9, 1,
|
||||
-1, -1, -1),
|
||||
MUX_GATE_CLR_SET_UPD(CLK_INFRA_PWM2_SEL, "infra_pwm2_sel",
|
||||
infra_pwm1_parents, 0x0018, 0x0010, 0x0014, 11, 1,
|
||||
-1, -1, -1),
|
||||
MUX_GATE_CLR_SET_UPD(CLK_INFRA_PWM3_SEL, "infra_pwm3_sel",
|
||||
infra_pwm1_parents, 0x0018, 0x0010, 0x0014, 15, 1,
|
||||
-1, -1, -1),
|
||||
MUX_GATE_CLR_SET_UPD(CLK_INFRA_PWM_BSEL, "infra_pwm_bsel",
|
||||
infra_pwm_bsel_parents, 0x0018, 0x0010, 0x0014, 13,
|
||||
2, -1, -1, -1),
|
||||
/* MODULE_CLK_SEL_1 */
|
||||
MUX_GATE_CLR_SET_UPD(CLK_INFRA_PCIE_SEL, "infra_pcie_sel",
|
||||
infra_pcie_parents, 0x0028, 0x0020, 0x0024, 0, 2,
|
||||
-1, -1, -1),
|
||||
};
|
||||
|
||||
static const struct mtk_gate_regs infra0_cg_regs = {
|
||||
.set_ofs = 0x40,
|
||||
.clr_ofs = 0x44,
|
||||
.sta_ofs = 0x48,
|
||||
};
|
||||
|
||||
static const struct mtk_gate_regs infra1_cg_regs = {
|
||||
.set_ofs = 0x50,
|
||||
.clr_ofs = 0x54,
|
||||
.sta_ofs = 0x58,
|
||||
};
|
||||
|
||||
static const struct mtk_gate_regs infra2_cg_regs = {
|
||||
.set_ofs = 0x60,
|
||||
.clr_ofs = 0x64,
|
||||
.sta_ofs = 0x68,
|
||||
};
|
||||
|
||||
#define GATE_INFRA0(_id, _name, _parent, _shift) \
|
||||
{ \
|
||||
.id = _id, .name = _name, .parent_name = _parent, \
|
||||
.regs = &infra0_cg_regs, .shift = _shift, \
|
||||
.ops = &mtk_clk_gate_ops_setclr, \
|
||||
}
|
||||
|
||||
#define GATE_INFRA1(_id, _name, _parent, _shift) \
|
||||
{ \
|
||||
.id = _id, .name = _name, .parent_name = _parent, \
|
||||
.regs = &infra1_cg_regs, .shift = _shift, \
|
||||
.ops = &mtk_clk_gate_ops_setclr, \
|
||||
}
|
||||
|
||||
#define GATE_INFRA2(_id, _name, _parent, _shift) \
|
||||
{ \
|
||||
.id = _id, .name = _name, .parent_name = _parent, \
|
||||
.regs = &infra2_cg_regs, .shift = _shift, \
|
||||
.ops = &mtk_clk_gate_ops_setclr, \
|
||||
}
|
||||
|
||||
static const struct mtk_gate infra_clks[] = {
|
||||
/* INFRA0 */
|
||||
GATE_INFRA0(CLK_INFRA_GPT_STA, "infra_gpt_sta", "infra_66m_mck", 0),
|
||||
GATE_INFRA0(CLK_INFRA_PWM_HCK, "infra_pwm_hck", "infra_66m_mck", 1),
|
||||
GATE_INFRA0(CLK_INFRA_PWM_STA, "infra_pwm_sta", "infra_pwm_bsel", 2),
|
||||
GATE_INFRA0(CLK_INFRA_PWM1_CK, "infra_pwm1", "infra_pwm1_sel", 3),
|
||||
GATE_INFRA0(CLK_INFRA_PWM2_CK, "infra_pwm2", "infra_pwm2_sel", 4),
|
||||
GATE_INFRA0(CLK_INFRA_CQ_DMA_CK, "infra_cq_dma", "sysaxi", 6),
|
||||
|
||||
GATE_INFRA0(CLK_INFRA_AUD_BUS_CK, "infra_aud_bus", "sysaxi", 8),
|
||||
GATE_INFRA0(CLK_INFRA_AUD_26M_CK, "infra_aud_26m", "csw_f26m_sel", 9),
|
||||
GATE_INFRA0(CLK_INFRA_AUD_L_CK, "infra_aud_l", "aud_l", 10),
|
||||
GATE_INFRA0(CLK_INFRA_AUD_AUD_CK, "infra_aud_aud", "a1sys", 11),
|
||||
GATE_INFRA0(CLK_INFRA_AUD_EG2_CK, "infra_aud_eg2", "a_tuner", 13),
|
||||
GATE_INFRA0(CLK_INFRA_DRAMC_26M_CK, "infra_dramc_26m", "csw_f26m_sel",
|
||||
14),
|
||||
GATE_INFRA0(CLK_INFRA_DBG_CK, "infra_dbg", "infra_66m_mck", 15),
|
||||
GATE_INFRA0(CLK_INFRA_AP_DMA_CK, "infra_ap_dma", "infra_66m_mck", 16),
|
||||
GATE_INFRA0(CLK_INFRA_SEJ_CK, "infra_sej", "infra_66m_mck", 24),
|
||||
GATE_INFRA0(CLK_INFRA_SEJ_13M_CK, "infra_sej_13m", "csw_f26m_sel", 25),
|
||||
GATE_INFRA0(CLK_INFRA_PWM3_CK, "infra_pwm3", "infra_pwm3_sel", 27),
|
||||
/* INFRA1 */
|
||||
GATE_INFRA1(CLK_INFRA_THERM_CK, "infra_therm", "csw_f26m_sel", 0),
|
||||
GATE_INFRA1(CLK_INFRA_I2C0_CK, "infra_i2c0", "i2c_bck", 1),
|
||||
GATE_INFRA1(CLK_INFRA_UART0_CK, "infra_uart0", "infra_uart0_sel", 2),
|
||||
GATE_INFRA1(CLK_INFRA_UART1_CK, "infra_uart1", "infra_uart1_sel", 3),
|
||||
GATE_INFRA1(CLK_INFRA_UART2_CK, "infra_uart2", "infra_uart2_sel", 4),
|
||||
GATE_INFRA1(CLK_INFRA_SPI2_CK, "infra_spi2", "infra_spi2_sel", 6),
|
||||
GATE_INFRA1(CLK_INFRA_SPI2_HCK_CK, "infra_spi2_hck", "infra_66m_mck", 7),
|
||||
GATE_INFRA1(CLK_INFRA_NFI1_CK, "infra_nfi1", "nfi1x", 8),
|
||||
GATE_INFRA1(CLK_INFRA_SPINFI1_CK, "infra_spinfi1", "spinfi_bck", 9),
|
||||
GATE_INFRA1(CLK_INFRA_NFI_HCK_CK, "infra_nfi_hck", "infra_66m_mck", 10),
|
||||
GATE_INFRA1(CLK_INFRA_SPI0_CK, "infra_spi0", "infra_spi0_sel", 11),
|
||||
GATE_INFRA1(CLK_INFRA_SPI1_CK, "infra_spi1", "infra_spi1_sel", 12),
|
||||
GATE_INFRA1(CLK_INFRA_SPI0_HCK_CK, "infra_spi0_hck", "infra_66m_mck",
|
||||
13),
|
||||
GATE_INFRA1(CLK_INFRA_SPI1_HCK_CK, "infra_spi1_hck", "infra_66m_mck",
|
||||
14),
|
||||
GATE_INFRA1(CLK_INFRA_FRTC_CK, "infra_frtc", "cb_rtc_32k", 15),
|
||||
GATE_INFRA1(CLK_INFRA_MSDC_CK, "infra_msdc", "emmc_400m", 16),
|
||||
GATE_INFRA1(CLK_INFRA_MSDC_HCK_CK, "infra_msdc_hck", "emmc_208m", 17),
|
||||
GATE_INFRA1(CLK_INFRA_MSDC_133M_CK, "infra_msdc_133m", "sysaxi", 18),
|
||||
GATE_INFRA1(CLK_INFRA_MSDC_66M_CK, "infra_msdc_66m", "sysaxi", 19),
|
||||
GATE_INFRA1(CLK_INFRA_ADC_26M_CK, "infra_adc_26m", "infra_adc_frc", 20),
|
||||
GATE_INFRA1(CLK_INFRA_ADC_FRC_CK, "infra_adc_frc", "csw_f26m", 21),
|
||||
GATE_INFRA1(CLK_INFRA_FBIST2FPC_CK, "infra_fbist2fpc", "nfi1x", 23),
|
||||
GATE_INFRA1(CLK_INFRA_I2C_MCK_CK, "infra_i2c_mck", "sysaxi", 25),
|
||||
GATE_INFRA1(CLK_INFRA_I2C_PCK_CK, "infra_i2c_pck", "infra_66m_mck", 26),
|
||||
/* INFRA2 */
|
||||
GATE_INFRA2(CLK_INFRA_IUSB_133_CK, "infra_iusb_133", "sysaxi", 0),
|
||||
GATE_INFRA2(CLK_INFRA_IUSB_66M_CK, "infra_iusb_66m", "sysaxi", 1),
|
||||
GATE_INFRA2(CLK_INFRA_IUSB_SYS_CK, "infra_iusb_sys", "u2u3_sys", 2),
|
||||
GATE_INFRA2(CLK_INFRA_IUSB_CK, "infra_iusb", "u2u3_ref", 3),
|
||||
GATE_INFRA2(CLK_INFRA_IPCIE_CK, "infra_ipcie", "pextp_tl", 12),
|
||||
GATE_INFRA2(CLK_INFRA_IPCIE_PIPE_CK, "infra_ipcie_pipe", "cb_cksq_40m",
|
||||
13),
|
||||
GATE_INFRA2(CLK_INFRA_IPCIER_CK, "infra_ipcier", "csw_f26m", 14),
|
||||
GATE_INFRA2(CLK_INFRA_IPCIEB_CK, "infra_ipcieb", "sysaxi", 15),
|
||||
};
|
||||
|
||||
static const struct mtk_clk_desc infracfg_desc = {
|
||||
.factor_clks = infra_divs,
|
||||
.num_factor_clks = ARRAY_SIZE(infra_divs),
|
||||
.mux_clks = infra_muxes,
|
||||
.num_mux_clks = ARRAY_SIZE(infra_muxes),
|
||||
.clks = infra_clks,
|
||||
.num_clks = ARRAY_SIZE(infra_clks),
|
||||
.clk_lock = &mt7981_clk_lock,
|
||||
};
|
||||
|
||||
static const struct of_device_id of_match_clk_mt7981_infracfg[] = {
|
||||
{ .compatible = "mediatek,mt7981-infracfg", .data = &infracfg_desc },
|
||||
{ /* sentinel */ }
|
||||
};
|
||||
|
||||
static struct platform_driver clk_mt7981_infracfg_drv = {
|
||||
.probe = mtk_clk_simple_probe,
|
||||
.remove = mtk_clk_simple_remove,
|
||||
.driver = {
|
||||
.name = "clk-mt7981-infracfg",
|
||||
.of_match_table = of_match_clk_mt7981_infracfg,
|
||||
},
|
||||
};
|
||||
builtin_platform_driver(clk_mt7981_infracfg_drv);
|
|
@ -0,0 +1,422 @@
|
|||
// SPDX-License-Identifier: GPL-2.0
|
||||
/*
|
||||
* Copyright (c) 2021 MediaTek Inc.
|
||||
* Author: Sam Shih <sam.shih@mediatek.com>
|
||||
* Author: Wenzhen Yu <wenzhen.yu@mediatek.com>
|
||||
* Author: Jianhui Zhao <zhaojh329@gmail.com>
|
||||
*/
|
||||
|
||||
|
||||
#include <linux/clk-provider.h>
|
||||
#include <linux/of.h>
|
||||
#include <linux/of_address.h>
|
||||
#include <linux/of_device.h>
|
||||
#include <linux/platform_device.h>
|
||||
#include "clk-mtk.h"
|
||||
#include "clk-gate.h"
|
||||
#include "clk-mux.h"
|
||||
|
||||
#include <dt-bindings/clock/mediatek,mt7981-clk.h>
|
||||
#include <linux/clk.h>
|
||||
|
||||
static DEFINE_SPINLOCK(mt7981_clk_lock);
|
||||
|
||||
static const struct mtk_fixed_factor top_divs[] = {
|
||||
FACTOR(CLK_TOP_CB_CKSQ_40M, "cb_cksq_40m", "clkxtal", 1, 1),
|
||||
FACTOR(CLK_TOP_CB_M_416M, "cb_m_416m", "mpll", 1, 1),
|
||||
FACTOR(CLK_TOP_CB_M_D2, "cb_m_d2", "mpll", 1, 2),
|
||||
FACTOR(CLK_TOP_CB_M_D3, "cb_m_d3", "mpll", 1, 3),
|
||||
FACTOR(CLK_TOP_M_D3_D2, "m_d3_d2", "mpll", 1, 2),
|
||||
FACTOR(CLK_TOP_CB_M_D4, "cb_m_d4", "mpll", 1, 4),
|
||||
FACTOR(CLK_TOP_CB_M_D8, "cb_m_d8", "mpll", 1, 8),
|
||||
FACTOR(CLK_TOP_M_D8_D2, "m_d8_d2", "mpll", 1, 16),
|
||||
FACTOR(CLK_TOP_CB_MM_720M, "cb_mm_720m", "mmpll", 1, 1),
|
||||
FACTOR(CLK_TOP_CB_MM_D2, "cb_mm_d2", "mmpll", 1, 2),
|
||||
FACTOR(CLK_TOP_CB_MM_D3, "cb_mm_d3", "mmpll", 1, 3),
|
||||
FACTOR(CLK_TOP_CB_MM_D3_D5, "cb_mm_d3_d5", "mmpll", 1, 15),
|
||||
FACTOR(CLK_TOP_CB_MM_D4, "cb_mm_d4", "mmpll", 1, 4),
|
||||
FACTOR(CLK_TOP_CB_MM_D6, "cb_mm_d6", "mmpll", 1, 6),
|
||||
FACTOR(CLK_TOP_MM_D6_D2, "mm_d6_d2", "mmpll", 1, 12),
|
||||
FACTOR(CLK_TOP_CB_MM_D8, "cb_mm_d8", "mmpll", 1, 8),
|
||||
FACTOR(CLK_TOP_CB_APLL2_196M, "cb_apll2_196m", "apll2", 1, 1),
|
||||
FACTOR(CLK_TOP_APLL2_D2, "apll2_d2", "apll2", 1, 2),
|
||||
FACTOR(CLK_TOP_APLL2_D4, "apll2_d4", "apll2", 1, 4),
|
||||
FACTOR(CLK_TOP_NET1_2500M, "net1_2500m", "net1pll", 1, 1),
|
||||
FACTOR(CLK_TOP_CB_NET1_D4, "cb_net1_d4", "net1pll", 1, 4),
|
||||
FACTOR(CLK_TOP_CB_NET1_D5, "cb_net1_d5", "net1pll", 1, 5),
|
||||
FACTOR(CLK_TOP_NET1_D5_D2, "net1_d5_d2", "net1pll", 1, 10),
|
||||
FACTOR(CLK_TOP_NET1_D5_D4, "net1_d5_d4", "net1pll", 1, 20),
|
||||
FACTOR(CLK_TOP_CB_NET1_D8, "cb_net1_d8", "net1pll", 1, 8),
|
||||
FACTOR(CLK_TOP_NET1_D8_D2, "net1_d8_d2", "net1pll", 1, 16),
|
||||
FACTOR(CLK_TOP_NET1_D8_D4, "net1_d8_d4", "net1pll", 1, 32),
|
||||
FACTOR(CLK_TOP_CB_NET2_800M, "cb_net2_800m", "net2pll", 1, 1),
|
||||
FACTOR(CLK_TOP_CB_NET2_D2, "cb_net2_d2", "net2pll", 1, 2),
|
||||
FACTOR(CLK_TOP_CB_NET2_D4, "cb_net2_d4", "net2pll", 1, 4),
|
||||
FACTOR(CLK_TOP_NET2_D4_D2, "net2_d4_d2", "net2pll", 1, 8),
|
||||
FACTOR(CLK_TOP_NET2_D4_D4, "net2_d4_d4", "net2pll", 1, 16),
|
||||
FACTOR(CLK_TOP_CB_NET2_D6, "cb_net2_d6", "net2pll", 1, 6),
|
||||
FACTOR(CLK_TOP_CB_WEDMCU_208M, "cb_wedmcu_208m", "wedmcupll", 1, 1),
|
||||
FACTOR(CLK_TOP_CB_SGM_325M, "cb_sgm_325m", "sgmpll", 1, 1),
|
||||
FACTOR(CLK_TOP_CKSQ_40M_D2, "cksq_40m_d2", "cb_cksq_40m", 1, 2),
|
||||
FACTOR(CLK_TOP_CB_RTC_32K, "cb_rtc_32k", "cb_cksq_40m", 1, 1250),
|
||||
FACTOR(CLK_TOP_CB_RTC_32P7K, "cb_rtc_32p7k", "cb_cksq_40m", 1, 1220),
|
||||
FACTOR(CLK_TOP_USB_TX250M, "usb_tx250m", "cb_cksq_40m", 1, 1),
|
||||
FACTOR(CLK_TOP_FAUD, "faud", "aud_sel", 1, 1),
|
||||
FACTOR(CLK_TOP_NFI1X, "nfi1x", "nfi1x_sel", 1, 1),
|
||||
FACTOR(CLK_TOP_USB_EQ_RX250M, "usb_eq_rx250m", "cb_cksq_40m", 1, 1),
|
||||
FACTOR(CLK_TOP_USB_CDR_CK, "usb_cdr", "cb_cksq_40m", 1, 1),
|
||||
FACTOR(CLK_TOP_USB_LN0_CK, "usb_ln0", "cb_cksq_40m", 1, 1),
|
||||
FACTOR(CLK_TOP_SPINFI_BCK, "spinfi_bck", "spinfi_sel", 1, 1),
|
||||
FACTOR(CLK_TOP_SPI, "spi", "spi_sel", 1, 1),
|
||||
FACTOR(CLK_TOP_SPIM_MST, "spim_mst", "spim_mst_sel", 1, 1),
|
||||
FACTOR(CLK_TOP_UART_BCK, "uart_bck", "uart_sel", 1, 1),
|
||||
FACTOR(CLK_TOP_PWM_BCK, "pwm_bck", "pwm_sel", 1, 1),
|
||||
FACTOR(CLK_TOP_I2C_BCK, "i2c_bck", "i2c_sel", 1, 1),
|
||||
FACTOR(CLK_TOP_PEXTP_TL, "pextp_tl", "pextp_tl_ck_sel", 1, 1),
|
||||
FACTOR(CLK_TOP_EMMC_208M, "emmc_208m", "emmc_208m_sel", 1, 1),
|
||||
FACTOR(CLK_TOP_EMMC_400M, "emmc_400m", "emmc_400m_sel", 1, 1),
|
||||
FACTOR(CLK_TOP_DRAMC_REF, "dramc_ref", "dramc_sel", 1, 1),
|
||||
FACTOR(CLK_TOP_DRAMC_MD32, "dramc_md32", "dramc_md32_sel", 1, 1),
|
||||
FACTOR(CLK_TOP_SYSAXI, "sysaxi", "sysaxi_sel", 1, 1),
|
||||
FACTOR(CLK_TOP_SYSAPB, "sysapb", "sysapb_sel", 1, 1),
|
||||
FACTOR(CLK_TOP_ARM_DB_MAIN, "arm_db_main", "arm_db_main_sel", 1, 1),
|
||||
FACTOR(CLK_TOP_AP2CNN_HOST, "ap2cnn_host", "ap2cnn_host_sel", 1, 1),
|
||||
FACTOR(CLK_TOP_NETSYS, "netsys", "netsys_sel", 1, 1),
|
||||
FACTOR(CLK_TOP_NETSYS_500M, "netsys_500m", "netsys_500m_sel", 1, 1),
|
||||
FACTOR(CLK_TOP_NETSYS_WED_MCU, "netsys_wed_mcu", "netsys_mcu_sel", 1, 1),
|
||||
FACTOR(CLK_TOP_NETSYS_2X, "netsys_2x", "netsys_2x_sel", 1, 1),
|
||||
FACTOR(CLK_TOP_SGM_325M, "sgm_325m", "sgm_325m_sel", 1, 1),
|
||||
FACTOR(CLK_TOP_SGM_REG, "sgm_reg", "sgm_reg_sel", 1, 1),
|
||||
FACTOR(CLK_TOP_F26M, "csw_f26m", "csw_f26m_sel", 1, 1),
|
||||
FACTOR(CLK_TOP_EIP97B, "eip97b", "eip97b_sel", 1, 1),
|
||||
FACTOR(CLK_TOP_USB3_PHY, "usb3_phy", "usb3_phy_sel", 1, 1),
|
||||
FACTOR(CLK_TOP_AUD, "aud", "faud", 1, 1),
|
||||
FACTOR(CLK_TOP_A1SYS, "a1sys", "a1sys_sel", 1, 1),
|
||||
FACTOR(CLK_TOP_AUD_L, "aud_l", "aud_l_sel", 1, 1),
|
||||
FACTOR(CLK_TOP_A_TUNER, "a_tuner", "a_tuner_sel", 1, 1),
|
||||
FACTOR(CLK_TOP_U2U3_REF, "u2u3_ref", "u2u3_sel", 1, 1),
|
||||
FACTOR(CLK_TOP_U2U3_SYS, "u2u3_sys", "u2u3_sys_sel", 1, 1),
|
||||
FACTOR(CLK_TOP_U2U3_XHCI, "u2u3_xhci", "u2u3_xhci_sel", 1, 1),
|
||||
FACTOR(CLK_TOP_USB_FRMCNT, "usb_frmcnt", "usb_frmcnt_sel", 1, 1),
|
||||
};
|
||||
|
||||
static const char * const nfi1x_parents[] __initconst = {
|
||||
"cb_cksq_40m",
|
||||
"cb_mm_d4",
|
||||
"net1_d8_d2",
|
||||
"cb_net2_d6",
|
||||
"cb_m_d4",
|
||||
"cb_mm_d8",
|
||||
"net1_d8_d4",
|
||||
"cb_m_d8"
|
||||
};
|
||||
|
||||
static const char * const spinfi_parents[] __initconst = {
|
||||
"cksq_40m_d2",
|
||||
"cb_cksq_40m",
|
||||
"net1_d5_d4",
|
||||
"cb_m_d4",
|
||||
"cb_mm_d8",
|
||||
"net1_d8_d4",
|
||||
"mm_d6_d2",
|
||||
"cb_m_d8"
|
||||
};
|
||||
|
||||
static const char * const spi_parents[] __initconst = {
|
||||
"cb_cksq_40m",
|
||||
"cb_m_d2",
|
||||
"cb_mm_d4",
|
||||
"net1_d8_d2",
|
||||
"cb_net2_d6",
|
||||
"net1_d5_d4",
|
||||
"cb_m_d4",
|
||||
"net1_d8_d4"
|
||||
};
|
||||
|
||||
static const char * const uart_parents[] __initconst = {
|
||||
"cb_cksq_40m",
|
||||
"cb_m_d8",
|
||||
"m_d8_d2"
|
||||
};
|
||||
|
||||
static const char * const pwm_parents[] __initconst = {
|
||||
"cb_cksq_40m",
|
||||
"net1_d8_d2",
|
||||
"net1_d5_d4",
|
||||
"cb_m_d4",
|
||||
"m_d8_d2",
|
||||
"cb_rtc_32k"
|
||||
};
|
||||
|
||||
static const char * const i2c_parents[] __initconst = {
|
||||
"cb_cksq_40m",
|
||||
"net1_d5_d4",
|
||||
"cb_m_d4",
|
||||
"net1_d8_d4"
|
||||
};
|
||||
|
||||
static const char * const pextp_tl_ck_parents[] __initconst = {
|
||||
"cb_cksq_40m",
|
||||
"net1_d5_d4",
|
||||
"cb_m_d4",
|
||||
"cb_rtc_32k"
|
||||
};
|
||||
|
||||
static const char * const emmc_208m_parents[] __initconst = {
|
||||
"cb_cksq_40m",
|
||||
"cb_m_d2",
|
||||
"cb_net2_d4",
|
||||
"cb_apll2_196m",
|
||||
"cb_mm_d4",
|
||||
"net1_d8_d2",
|
||||
"cb_mm_d6"
|
||||
};
|
||||
|
||||
static const char * const emmc_400m_parents[] __initconst = {
|
||||
"cb_cksq_40m",
|
||||
"cb_net2_d2",
|
||||
"cb_mm_d2",
|
||||
"cb_net2_d2"
|
||||
};
|
||||
|
||||
static const char * const csw_f26m_parents[] __initconst = {
|
||||
"cksq_40m_d2",
|
||||
"m_d8_d2"
|
||||
};
|
||||
|
||||
static const char * const dramc_md32_parents[] __initconst = {
|
||||
"cb_cksq_40m",
|
||||
"cb_m_d2",
|
||||
"cb_wedmcu_208m"
|
||||
};
|
||||
|
||||
static const char * const sysaxi_parents[] __initconst = {
|
||||
"cb_cksq_40m",
|
||||
"net1_d8_d2"
|
||||
};
|
||||
|
||||
static const char * const sysapb_parents[] __initconst = {
|
||||
"cb_cksq_40m",
|
||||
"m_d3_d2"
|
||||
};
|
||||
|
||||
static const char * const arm_db_main_parents[] __initconst = {
|
||||
"cb_cksq_40m",
|
||||
"cb_net2_d6"
|
||||
};
|
||||
|
||||
static const char * const ap2cnn_host_parents[] __initconst = {
|
||||
"cb_cksq_40m",
|
||||
"net1_d8_d4"
|
||||
};
|
||||
|
||||
static const char * const netsys_parents[] __initconst = {
|
||||
"cb_cksq_40m",
|
||||
"cb_mm_d2"
|
||||
};
|
||||
|
||||
static const char * const netsys_500m_parents[] __initconst = {
|
||||
"cb_cksq_40m",
|
||||
"cb_net1_d5"
|
||||
};
|
||||
|
||||
static const char * const netsys_mcu_parents[] __initconst = {
|
||||
"cb_cksq_40m",
|
||||
"cb_mm_720m",
|
||||
"cb_net1_d4",
|
||||
"cb_net1_d5",
|
||||
"cb_m_416m"
|
||||
};
|
||||
|
||||
static const char * const netsys_2x_parents[] __initconst = {
|
||||
"cb_cksq_40m",
|
||||
"cb_net2_800m",
|
||||
"cb_mm_720m"
|
||||
};
|
||||
|
||||
static const char * const sgm_325m_parents[] __initconst = {
|
||||
"cb_cksq_40m",
|
||||
"cb_sgm_325m"
|
||||
};
|
||||
|
||||
static const char * const sgm_reg_parents[] __initconst = {
|
||||
"cb_cksq_40m",
|
||||
"cb_net2_d4"
|
||||
};
|
||||
|
||||
static const char * const eip97b_parents[] __initconst = {
|
||||
"cb_cksq_40m",
|
||||
"cb_net1_d5",
|
||||
"cb_m_416m",
|
||||
"cb_mm_d2",
|
||||
"net1_d5_d2"
|
||||
};
|
||||
|
||||
static const char * const aud_parents[] __initconst = {
|
||||
"cb_cksq_40m",
|
||||
"cb_apll2_196m"
|
||||
};
|
||||
|
||||
static const char * const a1sys_parents[] __initconst = {
|
||||
"cb_cksq_40m",
|
||||
"apll2_d4"
|
||||
};
|
||||
|
||||
static const char * const aud_l_parents[] __initconst = {
|
||||
"cb_cksq_40m",
|
||||
"cb_apll2_196m",
|
||||
"m_d8_d2"
|
||||
};
|
||||
|
||||
static const char * const a_tuner_parents[] __initconst = {
|
||||
"cb_cksq_40m",
|
||||
"apll2_d4",
|
||||
"m_d8_d2"
|
||||
};
|
||||
|
||||
static const char * const u2u3_parents[] __initconst = {
|
||||
"cb_cksq_40m",
|
||||
"m_d8_d2"
|
||||
};
|
||||
|
||||
static const char * const u2u3_sys_parents[] __initconst = {
|
||||
"cb_cksq_40m",
|
||||
"net1_d5_d4"
|
||||
};
|
||||
|
||||
static const char * const usb_frmcnt_parents[] __initconst = {
|
||||
"cb_cksq_40m",
|
||||
"cb_mm_d3_d5"
|
||||
};
|
||||
|
||||
static const struct mtk_mux top_muxes[] = {
|
||||
/* CLK_CFG_0 */
|
||||
MUX_GATE_CLR_SET_UPD(CLK_TOP_NFI1X_SEL, "nfi1x_sel", nfi1x_parents,
|
||||
0x000, 0x004, 0x008, 0, 3, 7, 0x1C0, 0),
|
||||
MUX_GATE_CLR_SET_UPD(CLK_TOP_SPINFI_SEL, "spinfi_sel", spinfi_parents,
|
||||
0x000, 0x004, 0x008, 8, 3, 15, 0x1C0, 1),
|
||||
MUX_GATE_CLR_SET_UPD(CLK_TOP_SPI_SEL, "spi_sel", spi_parents,
|
||||
0x000, 0x004, 0x008, 16, 3, 23, 0x1C0, 2),
|
||||
MUX_GATE_CLR_SET_UPD(CLK_TOP_SPIM_MST_SEL, "spim_mst_sel", spi_parents,
|
||||
0x000, 0x004, 0x008, 24, 3, 31, 0x1C0, 3),
|
||||
/* CLK_CFG_1 */
|
||||
MUX_GATE_CLR_SET_UPD(CLK_TOP_UART_SEL, "uart_sel", uart_parents,
|
||||
0x010, 0x014, 0x018, 0, 2, 7, 0x1C0, 4),
|
||||
MUX_GATE_CLR_SET_UPD(CLK_TOP_PWM_SEL, "pwm_sel", pwm_parents,
|
||||
0x010, 0x014, 0x018, 8, 3, 15, 0x1C0, 5),
|
||||
MUX_GATE_CLR_SET_UPD(CLK_TOP_I2C_SEL, "i2c_sel", i2c_parents,
|
||||
0x010, 0x014, 0x018, 16, 2, 23, 0x1C0, 6),
|
||||
MUX_GATE_CLR_SET_UPD(CLK_TOP_PEXTP_TL_SEL, "pextp_tl_ck_sel",
|
||||
pextp_tl_ck_parents, 0x010, 0x014, 0x018, 24, 2, 31,
|
||||
0x1C0, 7),
|
||||
/* CLK_CFG_2 */
|
||||
MUX_GATE_CLR_SET_UPD(CLK_TOP_EMMC_208M_SEL, "emmc_208m_sel",
|
||||
emmc_208m_parents, 0x020, 0x024, 0x028, 0, 3, 7,
|
||||
0x1C0, 8),
|
||||
MUX_GATE_CLR_SET_UPD(CLK_TOP_EMMC_400M_SEL, "emmc_400m_sel",
|
||||
emmc_400m_parents, 0x020, 0x024, 0x028, 8, 2, 15,
|
||||
0x1C0, 9),
|
||||
MUX_GATE_CLR_SET_UPD_FLAGS(CLK_TOP_F26M_SEL, "csw_f26m_sel",
|
||||
csw_f26m_parents, 0x020, 0x024, 0x028, 16, 1, 23,
|
||||
0x1C0, 10,
|
||||
CLK_IS_CRITICAL | CLK_SET_RATE_PARENT),
|
||||
MUX_GATE_CLR_SET_UPD_FLAGS(CLK_TOP_DRAMC_SEL, "dramc_sel",
|
||||
csw_f26m_parents, 0x020, 0x024, 0x028, 24, 1,
|
||||
31, 0x1C0, 11,
|
||||
CLK_IS_CRITICAL | CLK_SET_RATE_PARENT),
|
||||
/* CLK_CFG_3 */
|
||||
MUX_GATE_CLR_SET_UPD_FLAGS(CLK_TOP_DRAMC_MD32_SEL, "dramc_md32_sel",
|
||||
dramc_md32_parents, 0x030, 0x034, 0x038, 0, 2,
|
||||
7, 0x1C0, 12,
|
||||
CLK_IS_CRITICAL | CLK_SET_RATE_PARENT),
|
||||
MUX_GATE_CLR_SET_UPD_FLAGS(CLK_TOP_SYSAXI_SEL, "sysaxi_sel",
|
||||
sysaxi_parents, 0x030, 0x034, 0x038, 8, 1, 15,
|
||||
0x1C0, 13,
|
||||
CLK_IS_CRITICAL | CLK_SET_RATE_PARENT),
|
||||
MUX_GATE_CLR_SET_UPD_FLAGS(CLK_TOP_SYSAPB_SEL, "sysapb_sel",
|
||||
sysapb_parents, 0x030, 0x034, 0x038, 16, 1,
|
||||
23, 0x1C0, 14,
|
||||
CLK_IS_CRITICAL | CLK_SET_RATE_PARENT),
|
||||
MUX_GATE_CLR_SET_UPD(CLK_TOP_ARM_DB_MAIN_SEL, "arm_db_main_sel",
|
||||
arm_db_main_parents, 0x030, 0x034, 0x038, 24, 1, 31,
|
||||
0x1C0, 15),
|
||||
/* CLK_CFG_4 */
|
||||
MUX_GATE_CLR_SET_UPD(CLK_TOP_AP2CNN_HOST_SEL, "ap2cnn_host_sel",
|
||||
ap2cnn_host_parents, 0x040, 0x044, 0x048, 0, 1, 7,
|
||||
0x1C0, 16),
|
||||
MUX_GATE_CLR_SET_UPD(CLK_TOP_NETSYS_SEL, "netsys_sel", netsys_parents,
|
||||
0x040, 0x044, 0x048, 8, 1, 15, 0x1C0, 17),
|
||||
MUX_GATE_CLR_SET_UPD(CLK_TOP_NETSYS_500M_SEL, "netsys_500m_sel",
|
||||
netsys_500m_parents, 0x040, 0x044, 0x048, 16, 1, 23,
|
||||
0x1C0, 18),
|
||||
MUX_GATE_CLR_SET_UPD(CLK_TOP_NETSYS_MCU_SEL, "netsys_mcu_sel",
|
||||
netsys_mcu_parents, 0x040, 0x044, 0x048, 24, 3, 31,
|
||||
0x1C0, 19),
|
||||
/* CLK_CFG_5 */
|
||||
MUX_GATE_CLR_SET_UPD(CLK_TOP_NETSYS_2X_SEL, "netsys_2x_sel",
|
||||
netsys_2x_parents, 0x050, 0x054, 0x058, 0, 2, 7,
|
||||
0x1C0, 20),
|
||||
MUX_GATE_CLR_SET_UPD(CLK_TOP_SGM_325M_SEL, "sgm_325m_sel",
|
||||
sgm_325m_parents, 0x050, 0x054, 0x058, 8, 1, 15,
|
||||
0x1C0, 21),
|
||||
MUX_GATE_CLR_SET_UPD(CLK_TOP_SGM_REG_SEL, "sgm_reg_sel", sgm_reg_parents,
|
||||
0x050, 0x054, 0x058, 16, 1, 23, 0x1C0, 22),
|
||||
MUX_GATE_CLR_SET_UPD(CLK_TOP_EIP97B_SEL, "eip97b_sel", eip97b_parents,
|
||||
0x050, 0x054, 0x058, 24, 3, 31, 0x1C0, 23),
|
||||
/* CLK_CFG_6 */
|
||||
MUX_GATE_CLR_SET_UPD(CLK_TOP_USB3_PHY_SEL, "usb3_phy_sel",
|
||||
csw_f26m_parents, 0x060, 0x064, 0x068, 0, 1,
|
||||
7, 0x1C0, 24),
|
||||
MUX_GATE_CLR_SET_UPD(CLK_TOP_AUD_SEL, "aud_sel", aud_parents, 0x060,
|
||||
0x064, 0x068, 8, 1, 15, 0x1C0, 25),
|
||||
MUX_GATE_CLR_SET_UPD(CLK_TOP_A1SYS_SEL, "a1sys_sel", a1sys_parents,
|
||||
0x060, 0x064, 0x068, 16, 1, 23, 0x1C0, 26),
|
||||
MUX_GATE_CLR_SET_UPD(CLK_TOP_AUD_L_SEL, "aud_l_sel", aud_l_parents,
|
||||
0x060, 0x064, 0x068, 24, 2, 31, 0x1C0, 27),
|
||||
/* CLK_CFG_7 */
|
||||
MUX_GATE_CLR_SET_UPD(CLK_TOP_A_TUNER_SEL, "a_tuner_sel",
|
||||
a_tuner_parents, 0x070, 0x074, 0x078, 0, 2, 7,
|
||||
0x1C0, 28),
|
||||
MUX_GATE_CLR_SET_UPD(CLK_TOP_U2U3_SEL, "u2u3_sel", u2u3_parents, 0x070,
|
||||
0x074, 0x078, 8, 1, 15, 0x1C0, 29),
|
||||
MUX_GATE_CLR_SET_UPD(CLK_TOP_U2U3_SYS_SEL, "u2u3_sys_sel",
|
||||
u2u3_sys_parents, 0x070, 0x074, 0x078, 16, 1, 23,
|
||||
0x1C0, 30),
|
||||
MUX_GATE_CLR_SET_UPD(CLK_TOP_U2U3_XHCI_SEL, "u2u3_xhci_sel",
|
||||
u2u3_sys_parents, 0x070, 0x074, 0x078, 24, 1, 31,
|
||||
0x1C4, 0),
|
||||
/* CLK_CFG_8 */
|
||||
MUX_GATE_CLR_SET_UPD(CLK_TOP_USB_FRMCNT_SEL, "usb_frmcnt_sel",
|
||||
usb_frmcnt_parents, 0x080, 0x084, 0x088, 0, 1, 7,
|
||||
0x1C4, 1),
|
||||
};
|
||||
|
||||
static struct mtk_composite top_aud_divs[] = {
|
||||
DIV_GATE(CLK_TOP_AUD_I2S_M, "aud_i2s_m", "aud",
|
||||
0x0420, 0, 0x0420, 8, 8),
|
||||
};
|
||||
|
||||
static const struct mtk_clk_desc topck_desc = {
|
||||
.factor_clks = top_divs,
|
||||
.num_factor_clks = ARRAY_SIZE(top_divs),
|
||||
.mux_clks = top_muxes,
|
||||
.num_mux_clks = ARRAY_SIZE(top_muxes),
|
||||
.composite_clks = top_aud_divs,
|
||||
.num_composite_clks = ARRAY_SIZE(top_aud_divs),
|
||||
.clk_lock = &mt7981_clk_lock,
|
||||
};
|
||||
|
||||
static const struct of_device_id of_match_clk_mt7981_topckgen[] = {
|
||||
{ .compatible = "mediatek,mt7981-topckgen", .data = &topck_desc },
|
||||
{ /* sentinel */ }
|
||||
};
|
||||
|
||||
static struct platform_driver clk_mt7981_topckgen_drv = {
|
||||
.probe = mtk_clk_simple_probe,
|
||||
.remove = mtk_clk_simple_remove,
|
||||
.driver = {
|
||||
.name = "clk-mt7981-topckgen",
|
||||
.of_match_table = of_match_clk_mt7981_topckgen,
|
||||
},
|
||||
};
|
||||
builtin_platform_driver(clk_mt7981_topckgen_drv);
|
|
@ -84,8 +84,8 @@ static void __init mtk_sgmiisys_0_init(struct device_node *node)
|
|||
|
||||
clk_data = mtk_alloc_clk_data(ARRAY_SIZE(sgmii0_clks));
|
||||
|
||||
mtk_clk_register_gates(node, sgmii0_clks, ARRAY_SIZE(sgmii0_clks),
|
||||
clk_data);
|
||||
mtk_clk_register_gates(NULL, node, sgmii0_clks,
|
||||
ARRAY_SIZE(sgmii0_clks), clk_data);
|
||||
|
||||
r = of_clk_add_hw_provider(node, of_clk_hw_onecell_get, clk_data);
|
||||
if (r)
|
||||
|
@ -102,8 +102,8 @@ static void __init mtk_sgmiisys_1_init(struct device_node *node)
|
|||
|
||||
clk_data = mtk_alloc_clk_data(ARRAY_SIZE(sgmii1_clks));
|
||||
|
||||
mtk_clk_register_gates(node, sgmii1_clks, ARRAY_SIZE(sgmii1_clks),
|
||||
clk_data);
|
||||
mtk_clk_register_gates(NULL, node, sgmii1_clks,
|
||||
ARRAY_SIZE(sgmii1_clks), clk_data);
|
||||
|
||||
r = of_clk_add_hw_provider(node, of_clk_hw_onecell_get, clk_data);
|
||||
|
||||
|
@ -121,7 +121,7 @@ static void __init mtk_ethsys_init(struct device_node *node)
|
|||
|
||||
clk_data = mtk_alloc_clk_data(ARRAY_SIZE(eth_clks));
|
||||
|
||||
mtk_clk_register_gates(node, eth_clks, ARRAY_SIZE(eth_clks), clk_data);
|
||||
mtk_clk_register_gates(NULL, node, eth_clks, ARRAY_SIZE(eth_clks), clk_data);
|
||||
|
||||
r = of_clk_add_hw_provider(node, of_clk_hw_onecell_get, clk_data);
|
||||
|
||||
|
|
|
@ -190,10 +190,11 @@ static int clk_mt7986_infracfg_probe(struct platform_device *pdev)
|
|||
return -ENOMEM;
|
||||
|
||||
mtk_clk_register_factors(infra_divs, ARRAY_SIZE(infra_divs), clk_data);
|
||||
mtk_clk_register_muxes(infra_muxes, ARRAY_SIZE(infra_muxes), node,
|
||||
mtk_clk_register_muxes(&pdev->dev, infra_muxes,
|
||||
ARRAY_SIZE(infra_muxes), node,
|
||||
&mt7986_clk_lock, clk_data);
|
||||
mtk_clk_register_gates(node, infra_clks, ARRAY_SIZE(infra_clks),
|
||||
clk_data);
|
||||
mtk_clk_register_gates(&pdev->dev, node, infra_clks,
|
||||
ARRAY_SIZE(infra_clks), clk_data);
|
||||
|
||||
r = of_clk_add_hw_provider(node, of_clk_hw_onecell_get, clk_data);
|
||||
if (r) {
|
||||
|
|
|
@ -202,16 +202,23 @@ static const struct mtk_mux top_muxes[] = {
|
|||
MUX_GATE_CLR_SET_UPD(CLK_TOP_F_26M_ADC_SEL, "f_26m_adc_sel",
|
||||
f_26m_adc_parents, 0x020, 0x024, 0x028, 16, 1, 23,
|
||||
0x1C0, 10),
|
||||
MUX_GATE_CLR_SET_UPD(CLK_TOP_DRAMC_SEL, "dramc_sel", f_26m_adc_parents,
|
||||
0x020, 0x024, 0x028, 24, 1, 31, 0x1C0, 11),
|
||||
MUX_GATE_CLR_SET_UPD_FLAGS(CLK_TOP_DRAMC_SEL, "dramc_sel",
|
||||
f_26m_adc_parents, 0x020, 0x024, 0x028,
|
||||
24, 1, 31, 0x1C0, 11,
|
||||
CLK_IS_CRITICAL | CLK_SET_RATE_PARENT),
|
||||
/* CLK_CFG_3 */
|
||||
MUX_GATE_CLR_SET_UPD(CLK_TOP_DRAMC_MD32_SEL, "dramc_md32_sel",
|
||||
dramc_md32_parents, 0x030, 0x034, 0x038, 0, 1, 7,
|
||||
0x1C0, 12),
|
||||
MUX_GATE_CLR_SET_UPD(CLK_TOP_SYSAXI_SEL, "sysaxi_sel", sysaxi_parents,
|
||||
0x030, 0x034, 0x038, 8, 2, 15, 0x1C0, 13),
|
||||
MUX_GATE_CLR_SET_UPD(CLK_TOP_SYSAPB_SEL, "sysapb_sel", sysapb_parents,
|
||||
0x030, 0x034, 0x038, 16, 2, 23, 0x1C0, 14),
|
||||
MUX_GATE_CLR_SET_UPD_FLAGS(CLK_TOP_DRAMC_MD32_SEL, "dramc_md32_sel",
|
||||
dramc_md32_parents, 0x030, 0x034, 0x038,
|
||||
0, 1, 7, 0x1C0, 12,
|
||||
CLK_IS_CRITICAL | CLK_SET_RATE_PARENT),
|
||||
MUX_GATE_CLR_SET_UPD_FLAGS(CLK_TOP_SYSAXI_SEL, "sysaxi_sel",
|
||||
sysaxi_parents, 0x030, 0x034, 0x038,
|
||||
8, 2, 15, 0x1C0, 13,
|
||||
CLK_IS_CRITICAL | CLK_SET_RATE_PARENT),
|
||||
MUX_GATE_CLR_SET_UPD_FLAGS(CLK_TOP_SYSAPB_SEL, "sysapb_sel",
|
||||
sysapb_parents, 0x030, 0x034, 0x038,
|
||||
16, 2, 23, 0x1C0, 14,
|
||||
CLK_IS_CRITICAL | CLK_SET_RATE_PARENT),
|
||||
MUX_GATE_CLR_SET_UPD(CLK_TOP_ARM_DB_MAIN_SEL, "arm_db_main_sel",
|
||||
arm_db_main_parents, 0x030, 0x034, 0x038, 24, 1,
|
||||
31, 0x1C0, 15),
|
||||
|
@ -234,9 +241,10 @@ static const struct mtk_mux top_muxes[] = {
|
|||
MUX_GATE_CLR_SET_UPD(CLK_TOP_SGM_325M_SEL, "sgm_325m_sel",
|
||||
sgm_325m_parents, 0x050, 0x054, 0x058, 8, 1, 15,
|
||||
0x1C0, 21),
|
||||
MUX_GATE_CLR_SET_UPD(CLK_TOP_SGM_REG_SEL, "sgm_reg_sel",
|
||||
sgm_reg_parents, 0x050, 0x054, 0x058, 16, 1, 23,
|
||||
0x1C0, 22),
|
||||
MUX_GATE_CLR_SET_UPD_FLAGS(CLK_TOP_SGM_REG_SEL, "sgm_reg_sel",
|
||||
sgm_reg_parents, 0x050, 0x054, 0x058,
|
||||
16, 1, 23, 0x1C0, 22,
|
||||
CLK_IS_CRITICAL | CLK_SET_RATE_PARENT),
|
||||
MUX_GATE_CLR_SET_UPD(CLK_TOP_A1SYS_SEL, "a1sys_sel", a1sys_parents,
|
||||
0x050, 0x054, 0x058, 24, 1, 31, 0x1C0, 23),
|
||||
/* CLK_CFG_6 */
|
||||
|
@ -252,9 +260,10 @@ static const struct mtk_mux top_muxes[] = {
|
|||
f_26m_adc_parents, 0x060, 0x064, 0x068, 24, 1, 31,
|
||||
0x1C0, 27),
|
||||
/* CLK_CFG_7 */
|
||||
MUX_GATE_CLR_SET_UPD(CLK_TOP_F26M_SEL, "csw_f26m_sel",
|
||||
f_26m_adc_parents, 0x070, 0x074, 0x078, 0, 1, 7,
|
||||
0x1C0, 28),
|
||||
MUX_GATE_CLR_SET_UPD_FLAGS(CLK_TOP_F26M_SEL, "csw_f26m_sel",
|
||||
f_26m_adc_parents, 0x070, 0x074, 0x078,
|
||||
0, 1, 7, 0x1C0, 28,
|
||||
CLK_IS_CRITICAL | CLK_SET_RATE_PARENT),
|
||||
MUX_GATE_CLR_SET_UPD(CLK_TOP_AUD_L_SEL, "aud_l_sel", aud_l_parents,
|
||||
0x070, 0x074, 0x078, 8, 2, 15, 0x1C0, 29),
|
||||
MUX_GATE_CLR_SET_UPD(CLK_TOP_A_TUNER_SEL, "a_tuner_sel",
|
||||
|
@ -281,59 +290,24 @@ static const struct mtk_mux top_muxes[] = {
|
|||
0x1C4, 5),
|
||||
};
|
||||
|
||||
static int clk_mt7986_topckgen_probe(struct platform_device *pdev)
|
||||
{
|
||||
struct clk_hw_onecell_data *clk_data;
|
||||
struct device_node *node = pdev->dev.of_node;
|
||||
int r;
|
||||
void __iomem *base;
|
||||
int nr = ARRAY_SIZE(top_fixed_clks) + ARRAY_SIZE(top_divs) +
|
||||
ARRAY_SIZE(top_muxes);
|
||||
|
||||
base = of_iomap(node, 0);
|
||||
if (!base) {
|
||||
pr_err("%s(): ioremap failed\n", __func__);
|
||||
return -ENOMEM;
|
||||
}
|
||||
|
||||
clk_data = mtk_alloc_clk_data(nr);
|
||||
if (!clk_data)
|
||||
return -ENOMEM;
|
||||
|
||||
mtk_clk_register_fixed_clks(top_fixed_clks, ARRAY_SIZE(top_fixed_clks),
|
||||
clk_data);
|
||||
mtk_clk_register_factors(top_divs, ARRAY_SIZE(top_divs), clk_data);
|
||||
mtk_clk_register_muxes(top_muxes, ARRAY_SIZE(top_muxes), node,
|
||||
&mt7986_clk_lock, clk_data);
|
||||
|
||||
clk_prepare_enable(clk_data->hws[CLK_TOP_SYSAXI_SEL]->clk);
|
||||
clk_prepare_enable(clk_data->hws[CLK_TOP_SYSAPB_SEL]->clk);
|
||||
clk_prepare_enable(clk_data->hws[CLK_TOP_DRAMC_SEL]->clk);
|
||||
clk_prepare_enable(clk_data->hws[CLK_TOP_DRAMC_MD32_SEL]->clk);
|
||||
clk_prepare_enable(clk_data->hws[CLK_TOP_F26M_SEL]->clk);
|
||||
clk_prepare_enable(clk_data->hws[CLK_TOP_SGM_REG_SEL]->clk);
|
||||
|
||||
r = of_clk_add_hw_provider(node, of_clk_hw_onecell_get, clk_data);
|
||||
|
||||
if (r) {
|
||||
pr_err("%s(): could not register clock provider: %d\n",
|
||||
__func__, r);
|
||||
goto free_topckgen_data;
|
||||
}
|
||||
return r;
|
||||
|
||||
free_topckgen_data:
|
||||
mtk_free_clk_data(clk_data);
|
||||
return r;
|
||||
}
|
||||
static const struct mtk_clk_desc topck_desc = {
|
||||
.fixed_clks = top_fixed_clks,
|
||||
.num_fixed_clks = ARRAY_SIZE(top_fixed_clks),
|
||||
.factor_clks = top_divs,
|
||||
.num_factor_clks = ARRAY_SIZE(top_divs),
|
||||
.mux_clks = top_muxes,
|
||||
.num_mux_clks = ARRAY_SIZE(top_muxes),
|
||||
.clk_lock = &mt7986_clk_lock,
|
||||
};
|
||||
|
||||
static const struct of_device_id of_match_clk_mt7986_topckgen[] = {
|
||||
{ .compatible = "mediatek,mt7986-topckgen", },
|
||||
{}
|
||||
{ .compatible = "mediatek,mt7986-topckgen", .data = &topck_desc },
|
||||
{ /* sentinel */ }
|
||||
};
|
||||
|
||||
static struct platform_driver clk_mt7986_topckgen_drv = {
|
||||
.probe = clk_mt7986_topckgen_probe,
|
||||
.probe = mtk_clk_simple_probe,
|
||||
.remove = mtk_clk_simple_remove,
|
||||
.driver = {
|
||||
.name = "clk-mt7986-topckgen",
|
||||
.of_match_table = of_match_clk_mt7986_topckgen,
|
||||
|
|
|
@ -548,8 +548,9 @@ static void __init mtk_topckgen_init(struct device_node *node)
|
|||
|
||||
mtk_clk_register_factors(root_clk_alias, ARRAY_SIZE(root_clk_alias), clk_data);
|
||||
mtk_clk_register_factors(top_divs, ARRAY_SIZE(top_divs), clk_data);
|
||||
mtk_clk_register_composites(top_muxes, ARRAY_SIZE(top_muxes), base,
|
||||
&mt8135_clk_lock, clk_data);
|
||||
mtk_clk_register_composites(NULL, top_muxes,
|
||||
ARRAY_SIZE(top_muxes), base,
|
||||
&mt8135_clk_lock, clk_data);
|
||||
|
||||
clk_prepare_enable(clk_data->hws[CLK_TOP_CCI_SEL]->clk);
|
||||
|
||||
|
@ -567,8 +568,8 @@ static void __init mtk_infrasys_init(struct device_node *node)
|
|||
|
||||
clk_data = mtk_alloc_clk_data(CLK_INFRA_NR_CLK);
|
||||
|
||||
mtk_clk_register_gates(node, infra_clks, ARRAY_SIZE(infra_clks),
|
||||
clk_data);
|
||||
mtk_clk_register_gates(NULL, node, infra_clks,
|
||||
ARRAY_SIZE(infra_clks), clk_data);
|
||||
|
||||
clk_prepare_enable(clk_data->hws[CLK_INFRA_M4U]->clk);
|
||||
|
||||
|
@ -595,10 +596,11 @@ static void __init mtk_pericfg_init(struct device_node *node)
|
|||
|
||||
clk_data = mtk_alloc_clk_data(CLK_PERI_NR_CLK);
|
||||
|
||||
mtk_clk_register_gates(node, peri_gates, ARRAY_SIZE(peri_gates),
|
||||
clk_data);
|
||||
mtk_clk_register_composites(peri_clks, ARRAY_SIZE(peri_clks), base,
|
||||
&mt8135_clk_lock, clk_data);
|
||||
mtk_clk_register_gates(NULL, node, peri_gates,
|
||||
ARRAY_SIZE(peri_gates), clk_data);
|
||||
mtk_clk_register_composites(NULL, peri_clks,
|
||||
ARRAY_SIZE(peri_clks), base,
|
||||
&mt8135_clk_lock, clk_data);
|
||||
|
||||
r = of_clk_add_hw_provider(node, of_clk_hw_onecell_get, clk_data);
|
||||
if (r)
|
||||
|
|
|
@ -55,7 +55,7 @@ static void __init mtk_audsys_init(struct device_node *node)
|
|||
|
||||
clk_data = mtk_alloc_clk_data(CLK_AUD_NR_CLK);
|
||||
|
||||
mtk_clk_register_gates(node, aud_clks, ARRAY_SIZE(aud_clks), clk_data);
|
||||
mtk_clk_register_gates(NULL, node, aud_clks, ARRAY_SIZE(aud_clks), clk_data);
|
||||
|
||||
r = of_clk_add_hw_provider(node, of_clk_hw_onecell_get, clk_data);
|
||||
if (r)
|
||||
|
|
|
@ -48,7 +48,7 @@ static void __init mtk_imgsys_init(struct device_node *node)
|
|||
|
||||
clk_data = mtk_alloc_clk_data(CLK_IMG_NR_CLK);
|
||||
|
||||
mtk_clk_register_gates(node, img_clks, ARRAY_SIZE(img_clks), clk_data);
|
||||
mtk_clk_register_gates(NULL, node, img_clks, ARRAY_SIZE(img_clks), clk_data);
|
||||
|
||||
r = of_clk_add_hw_provider(node, of_clk_hw_onecell_get, clk_data);
|
||||
|
||||
|
|
|
@ -46,7 +46,7 @@ static void __init mtk_mfgcfg_init(struct device_node *node)
|
|||
|
||||
clk_data = mtk_alloc_clk_data(CLK_MFG_NR_CLK);
|
||||
|
||||
mtk_clk_register_gates(node, mfg_clks, ARRAY_SIZE(mfg_clks), clk_data);
|
||||
mtk_clk_register_gates(NULL, node, mfg_clks, ARRAY_SIZE(mfg_clks), clk_data);
|
||||
|
||||
r = of_clk_add_hw_provider(node, of_clk_hw_onecell_get, clk_data);
|
||||
|
||||
|
|
|
@ -110,8 +110,8 @@ static int clk_mt8167_mm_probe(struct platform_device *pdev)
|
|||
|
||||
data = &mt8167_mmsys_driver_data;
|
||||
|
||||
ret = mtk_clk_register_gates(node, data->gates_clk, data->gates_num,
|
||||
clk_data);
|
||||
ret = mtk_clk_register_gates(&pdev->dev, node, data->gates_clk,
|
||||
data->gates_num, clk_data);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
|
|
|
@ -61,7 +61,8 @@ static void __init mtk_vdecsys_init(struct device_node *node)
|
|||
|
||||
clk_data = mtk_alloc_clk_data(CLK_VDEC_NR_CLK);
|
||||
|
||||
mtk_clk_register_gates(node, vdec_clks, ARRAY_SIZE(vdec_clks), clk_data);
|
||||
mtk_clk_register_gates(NULL, node, vdec_clks, ARRAY_SIZE(vdec_clks),
|
||||
clk_data);
|
||||
|
||||
r = of_clk_add_hw_provider(node, of_clk_hw_onecell_get, clk_data);
|
||||
|
||||
|
|
|
@ -937,11 +937,12 @@ static void __init mtk_topckgen_init(struct device_node *node)
|
|||
|
||||
mtk_clk_register_fixed_clks(fixed_clks, ARRAY_SIZE(fixed_clks),
|
||||
clk_data);
|
||||
mtk_clk_register_gates(node, top_clks, ARRAY_SIZE(top_clks), clk_data);
|
||||
mtk_clk_register_gates(NULL, node, top_clks, ARRAY_SIZE(top_clks), clk_data);
|
||||
|
||||
mtk_clk_register_factors(top_divs, ARRAY_SIZE(top_divs), clk_data);
|
||||
mtk_clk_register_composites(top_muxes, ARRAY_SIZE(top_muxes), base,
|
||||
&mt8167_clk_lock, clk_data);
|
||||
mtk_clk_register_composites(NULL, top_muxes,
|
||||
ARRAY_SIZE(top_muxes), base,
|
||||
&mt8167_clk_lock, clk_data);
|
||||
mtk_clk_register_dividers(top_adj_divs, ARRAY_SIZE(top_adj_divs),
|
||||
base, &mt8167_clk_lock, clk_data);
|
||||
|
||||
|
@ -966,8 +967,9 @@ static void __init mtk_infracfg_init(struct device_node *node)
|
|||
|
||||
clk_data = mtk_alloc_clk_data(CLK_IFR_NR_CLK);
|
||||
|
||||
mtk_clk_register_composites(ifr_muxes, ARRAY_SIZE(ifr_muxes), base,
|
||||
&mt8167_clk_lock, clk_data);
|
||||
mtk_clk_register_composites(NULL, ifr_muxes,
|
||||
ARRAY_SIZE(ifr_muxes), base,
|
||||
&mt8167_clk_lock, clk_data);
|
||||
|
||||
r = of_clk_add_hw_provider(node, of_clk_hw_onecell_get, clk_data);
|
||||
if (r)
|
||||
|
|
|
@ -0,0 +1,157 @@
|
|||
// SPDX-License-Identifier: GPL-2.0-only
|
||||
/*
|
||||
* Copyright (c) 2014 MediaTek Inc.
|
||||
* Copyright (c) 2022 Collabora Ltd.
|
||||
* Author: AngeloGioacchino Del Regno <angelogioacchino.delregno@collabora.com>
|
||||
*/
|
||||
|
||||
#include <dt-bindings/clock/mt8173-clk.h>
|
||||
#include <linux/of_address.h>
|
||||
#include <linux/module.h>
|
||||
#include <linux/platform_device.h>
|
||||
#include "clk-mtk.h"
|
||||
#include "clk-pll.h"
|
||||
|
||||
#define REGOFF_REF2USB 0x8
|
||||
#define REGOFF_HDMI_REF 0x40
|
||||
|
||||
#define MT8173_PLL_FMAX (3000UL * MHZ)
|
||||
|
||||
#define CON0_MT8173_RST_BAR BIT(24)
|
||||
|
||||
#define PLL_B(_id, _name, _reg, _pwr_reg, _en_mask, _flags, _pcwbits, \
|
||||
_pd_reg, _pd_shift, _tuner_reg, _pcw_reg, \
|
||||
_pcw_shift, _div_table) { \
|
||||
.id = _id, \
|
||||
.name = _name, \
|
||||
.reg = _reg, \
|
||||
.pwr_reg = _pwr_reg, \
|
||||
.en_mask = _en_mask, \
|
||||
.flags = _flags, \
|
||||
.rst_bar_mask = CON0_MT8173_RST_BAR, \
|
||||
.fmax = MT8173_PLL_FMAX, \
|
||||
.pcwbits = _pcwbits, \
|
||||
.pd_reg = _pd_reg, \
|
||||
.pd_shift = _pd_shift, \
|
||||
.tuner_reg = _tuner_reg, \
|
||||
.pcw_reg = _pcw_reg, \
|
||||
.pcw_shift = _pcw_shift, \
|
||||
.div_table = _div_table, \
|
||||
}
|
||||
|
||||
#define PLL(_id, _name, _reg, _pwr_reg, _en_mask, _flags, _pcwbits, \
|
||||
_pd_reg, _pd_shift, _tuner_reg, _pcw_reg, \
|
||||
_pcw_shift) \
|
||||
PLL_B(_id, _name, _reg, _pwr_reg, _en_mask, _flags, _pcwbits, \
|
||||
_pd_reg, _pd_shift, _tuner_reg, _pcw_reg, _pcw_shift, \
|
||||
NULL)
|
||||
|
||||
static const struct mtk_pll_div_table mmpll_div_table[] = {
|
||||
{ .div = 0, .freq = MT8173_PLL_FMAX },
|
||||
{ .div = 1, .freq = 1000000000 },
|
||||
{ .div = 2, .freq = 702000000 },
|
||||
{ .div = 3, .freq = 253500000 },
|
||||
{ .div = 4, .freq = 126750000 },
|
||||
{ } /* sentinel */
|
||||
};
|
||||
|
||||
static const struct mtk_pll_data plls[] = {
|
||||
PLL(CLK_APMIXED_ARMCA15PLL, "armca15pll", 0x200, 0x20c, 0, PLL_AO,
|
||||
21, 0x204, 24, 0x0, 0x204, 0),
|
||||
PLL(CLK_APMIXED_ARMCA7PLL, "armca7pll", 0x210, 0x21c, 0, PLL_AO,
|
||||
21, 0x214, 24, 0x0, 0x214, 0),
|
||||
PLL(CLK_APMIXED_MAINPLL, "mainpll", 0x220, 0x22c, 0xf0000100, HAVE_RST_BAR, 21,
|
||||
0x220, 4, 0x0, 0x224, 0),
|
||||
PLL(CLK_APMIXED_UNIVPLL, "univpll", 0x230, 0x23c, 0xfe000000, HAVE_RST_BAR, 7,
|
||||
0x230, 4, 0x0, 0x234, 14),
|
||||
PLL_B(CLK_APMIXED_MMPLL, "mmpll", 0x240, 0x24c, 0, 0, 21, 0x244, 24, 0x0,
|
||||
0x244, 0, mmpll_div_table),
|
||||
PLL(CLK_APMIXED_MSDCPLL, "msdcpll", 0x250, 0x25c, 0, 0, 21, 0x250, 4, 0x0, 0x254, 0),
|
||||
PLL(CLK_APMIXED_VENCPLL, "vencpll", 0x260, 0x26c, 0, 0, 21, 0x260, 4, 0x0, 0x264, 0),
|
||||
PLL(CLK_APMIXED_TVDPLL, "tvdpll", 0x270, 0x27c, 0, 0, 21, 0x270, 4, 0x0, 0x274, 0),
|
||||
PLL(CLK_APMIXED_MPLL, "mpll", 0x280, 0x28c, 0, 0, 21, 0x280, 4, 0x0, 0x284, 0),
|
||||
PLL(CLK_APMIXED_VCODECPLL, "vcodecpll", 0x290, 0x29c, 0, 0, 21, 0x290, 4, 0x0, 0x294, 0),
|
||||
PLL(CLK_APMIXED_APLL1, "apll1", 0x2a0, 0x2b0, 0, 0, 31, 0x2a0, 4, 0x2a4, 0x2a4, 0),
|
||||
PLL(CLK_APMIXED_APLL2, "apll2", 0x2b4, 0x2c4, 0, 0, 31, 0x2b4, 4, 0x2b8, 0x2b8, 0),
|
||||
PLL(CLK_APMIXED_LVDSPLL, "lvdspll", 0x2d0, 0x2dc, 0, 0, 21, 0x2d0, 4, 0x0, 0x2d4, 0),
|
||||
PLL(CLK_APMIXED_MSDCPLL2, "msdcpll2", 0x2f0, 0x2fc, 0, 0, 21, 0x2f0, 4, 0x0, 0x2f4, 0),
|
||||
};
|
||||
|
||||
static const struct of_device_id of_match_clk_mt8173_apmixed[] = {
|
||||
{ .compatible = "mediatek,mt8173-apmixedsys" },
|
||||
{ /* sentinel */ }
|
||||
};
|
||||
|
||||
static int clk_mt8173_apmixed_probe(struct platform_device *pdev)
|
||||
{
|
||||
struct device_node *node = pdev->dev.of_node;
|
||||
struct clk_hw_onecell_data *clk_data;
|
||||
void __iomem *base;
|
||||
struct clk_hw *hw;
|
||||
int r;
|
||||
|
||||
base = of_iomap(node, 0);
|
||||
if (!base)
|
||||
return PTR_ERR(base);
|
||||
|
||||
clk_data = mtk_alloc_clk_data(CLK_APMIXED_NR_CLK);
|
||||
if (IS_ERR_OR_NULL(clk_data))
|
||||
return -ENOMEM;
|
||||
|
||||
r = mtk_clk_register_plls(node, plls, ARRAY_SIZE(plls), clk_data);
|
||||
if (r)
|
||||
goto free_clk_data;
|
||||
|
||||
hw = mtk_clk_register_ref2usb_tx("ref2usb_tx", "clk26m", base + REGOFF_REF2USB);
|
||||
if (IS_ERR(hw)) {
|
||||
r = PTR_ERR(hw);
|
||||
dev_err(&pdev->dev, "Failed to register ref2usb_tx: %d\n", r);
|
||||
goto unregister_plls;
|
||||
}
|
||||
clk_data->hws[CLK_APMIXED_REF2USB_TX] = hw;
|
||||
|
||||
hw = devm_clk_hw_register_divider(&pdev->dev, "hdmi_ref", "tvdpll_594m", 0,
|
||||
base + REGOFF_HDMI_REF, 16, 3,
|
||||
CLK_DIVIDER_POWER_OF_TWO, NULL);
|
||||
clk_data->hws[CLK_APMIXED_HDMI_REF] = hw;
|
||||
|
||||
r = of_clk_add_hw_provider(node, of_clk_hw_onecell_get, clk_data);
|
||||
if (r)
|
||||
goto unregister_ref2usb;
|
||||
|
||||
return 0;
|
||||
|
||||
unregister_ref2usb:
|
||||
mtk_clk_unregister_ref2usb_tx(clk_data->hws[CLK_APMIXED_REF2USB_TX]);
|
||||
unregister_plls:
|
||||
mtk_clk_unregister_plls(plls, ARRAY_SIZE(plls), clk_data);
|
||||
free_clk_data:
|
||||
mtk_free_clk_data(clk_data);
|
||||
return r;
|
||||
}
|
||||
|
||||
static int clk_mt8173_apmixed_remove(struct platform_device *pdev)
|
||||
{
|
||||
struct device_node *node = pdev->dev.of_node;
|
||||
struct clk_hw_onecell_data *clk_data = platform_get_drvdata(pdev);
|
||||
|
||||
of_clk_del_provider(node);
|
||||
mtk_clk_unregister_ref2usb_tx(clk_data->hws[CLK_APMIXED_REF2USB_TX]);
|
||||
mtk_clk_unregister_plls(plls, ARRAY_SIZE(plls), clk_data);
|
||||
mtk_free_clk_data(clk_data);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static struct platform_driver clk_mt8173_apmixed_drv = {
|
||||
.probe = clk_mt8173_apmixed_probe,
|
||||
.remove = clk_mt8173_apmixed_remove,
|
||||
.driver = {
|
||||
.name = "clk-mt8173-apmixed",
|
||||
.of_match_table = of_match_clk_mt8173_apmixed,
|
||||
},
|
||||
};
|
||||
module_platform_driver(clk_mt8173_apmixed_drv);
|
||||
|
||||
MODULE_DESCRIPTION("MediaTek MT8173 apmixed clocks driver");
|
||||
MODULE_LICENSE("GPL");
|
|
@ -0,0 +1,55 @@
|
|||
// SPDX-License-Identifier: GPL-2.0-only
|
||||
/*
|
||||
* Copyright (c) 2014 MediaTek Inc.
|
||||
* Copyright (c) 2022 Collabora Ltd.
|
||||
* Author: AngeloGioacchino Del Regno <angelogioacchino.delregno@collabora.com>
|
||||
*/
|
||||
|
||||
#include <dt-bindings/clock/mt8173-clk.h>
|
||||
#include <linux/module.h>
|
||||
#include <linux/platform_device.h>
|
||||
#include "clk-gate.h"
|
||||
#include "clk-mtk.h"
|
||||
|
||||
static const struct mtk_gate_regs img_cg_regs = {
|
||||
.set_ofs = 0x0004,
|
||||
.clr_ofs = 0x0008,
|
||||
.sta_ofs = 0x0000,
|
||||
};
|
||||
|
||||
#define GATE_IMG(_id, _name, _parent, _shift) \
|
||||
GATE_MTK(_id, _name, _parent, &img_cg_regs, _shift, &mtk_clk_gate_ops_setclr)
|
||||
|
||||
static const struct mtk_gate img_clks[] = {
|
||||
GATE_DUMMY(CLK_DUMMY, "img_dummy"),
|
||||
GATE_IMG(CLK_IMG_LARB2_SMI, "img_larb2_smi", "mm_sel", 0),
|
||||
GATE_IMG(CLK_IMG_CAM_SMI, "img_cam_smi", "mm_sel", 5),
|
||||
GATE_IMG(CLK_IMG_CAM_CAM, "img_cam_cam", "mm_sel", 6),
|
||||
GATE_IMG(CLK_IMG_SEN_TG, "img_sen_tg", "camtg_sel", 7),
|
||||
GATE_IMG(CLK_IMG_SEN_CAM, "img_sen_cam", "mm_sel", 8),
|
||||
GATE_IMG(CLK_IMG_CAM_SV, "img_cam_sv", "mm_sel", 9),
|
||||
GATE_IMG(CLK_IMG_FD, "img_fd", "mm_sel", 11),
|
||||
};
|
||||
|
||||
static const struct mtk_clk_desc img_desc = {
|
||||
.clks = img_clks,
|
||||
.num_clks = ARRAY_SIZE(img_clks),
|
||||
};
|
||||
|
||||
static const struct of_device_id of_match_clk_mt8173_imgsys[] = {
|
||||
{ .compatible = "mediatek,mt8173-imgsys", .data = &img_desc },
|
||||
{ /* sentinel */ }
|
||||
};
|
||||
|
||||
static struct platform_driver clk_mt8173_vdecsys_drv = {
|
||||
.probe = mtk_clk_simple_probe,
|
||||
.remove = mtk_clk_simple_remove,
|
||||
.driver = {
|
||||
.name = "clk-mt8173-imgsys",
|
||||
.of_match_table = of_match_clk_mt8173_imgsys,
|
||||
},
|
||||
};
|
||||
module_platform_driver(clk_mt8173_vdecsys_drv);
|
||||
|
||||
MODULE_DESCRIPTION("MediaTek MT8173 vdecsys clocks driver");
|
||||
MODULE_LICENSE("GPL");
|
|
@ -0,0 +1,155 @@
|
|||
// SPDX-License-Identifier: GPL-2.0-only
|
||||
/*
|
||||
* Copyright (c) 2014 MediaTek Inc.
|
||||
* Copyright (c) 2022 Collabora Ltd.
|
||||
* Author: AngeloGioacchino Del Regno <angelogioacchino.delregno@collabora.com>
|
||||
*/
|
||||
|
||||
#include <dt-bindings/clock/mt8173-clk.h>
|
||||
#include <linux/module.h>
|
||||
#include <linux/platform_device.h>
|
||||
#include "clk-cpumux.h"
|
||||
#include "clk-gate.h"
|
||||
#include "clk-mtk.h"
|
||||
#include "reset.h"
|
||||
|
||||
#define GATE_ICG(_id, _name, _parent, _shift) \
|
||||
GATE_MTK(_id, _name, _parent, &infra_cg_regs, \
|
||||
_shift, &mtk_clk_gate_ops_setclr)
|
||||
|
||||
static struct clk_hw_onecell_data *infra_clk_data;
|
||||
|
||||
static const struct mtk_gate_regs infra_cg_regs = {
|
||||
.set_ofs = 0x0040,
|
||||
.clr_ofs = 0x0044,
|
||||
.sta_ofs = 0x0048,
|
||||
};
|
||||
|
||||
static const char * const ca53_parents[] __initconst = {
|
||||
"clk26m",
|
||||
"armca7pll",
|
||||
"mainpll",
|
||||
"univpll"
|
||||
};
|
||||
|
||||
static const char * const ca72_parents[] __initconst = {
|
||||
"clk26m",
|
||||
"armca15pll",
|
||||
"mainpll",
|
||||
"univpll"
|
||||
};
|
||||
|
||||
static const struct mtk_composite cpu_muxes[] = {
|
||||
MUX(CLK_INFRA_CA53SEL, "infra_ca53_sel", ca53_parents, 0x0000, 0, 2),
|
||||
MUX(CLK_INFRA_CA72SEL, "infra_ca72_sel", ca72_parents, 0x0000, 2, 2),
|
||||
};
|
||||
|
||||
static const struct mtk_fixed_factor infra_early_divs[] = {
|
||||
FACTOR(CLK_INFRA_CLK_13M, "clk13m", "clk26m", 1, 2),
|
||||
};
|
||||
|
||||
static const struct mtk_gate infra_gates[] = {
|
||||
GATE_ICG(CLK_INFRA_DBGCLK, "infra_dbgclk", "axi_sel", 0),
|
||||
GATE_ICG(CLK_INFRA_SMI, "infra_smi", "mm_sel", 1),
|
||||
GATE_ICG(CLK_INFRA_AUDIO, "infra_audio", "aud_intbus_sel", 5),
|
||||
GATE_ICG(CLK_INFRA_GCE, "infra_gce", "axi_sel", 6),
|
||||
GATE_ICG(CLK_INFRA_L2C_SRAM, "infra_l2c_sram", "axi_sel", 7),
|
||||
GATE_ICG(CLK_INFRA_M4U, "infra_m4u", "mem_sel", 8),
|
||||
GATE_ICG(CLK_INFRA_CPUM, "infra_cpum", "cpum_ck", 15),
|
||||
GATE_ICG(CLK_INFRA_KP, "infra_kp", "axi_sel", 16),
|
||||
GATE_ICG(CLK_INFRA_CEC, "infra_cec", "clk26m", 18),
|
||||
GATE_ICG(CLK_INFRA_PMICSPI, "infra_pmicspi", "pmicspi_sel", 22),
|
||||
GATE_ICG(CLK_INFRA_PMICWRAP, "infra_pmicwrap", "axi_sel", 23),
|
||||
};
|
||||
|
||||
static u16 infrasys_rst_ofs[] = { 0x30, 0x34 };
|
||||
|
||||
static const struct mtk_clk_rst_desc clk_rst_desc = {
|
||||
.version = MTK_RST_SIMPLE,
|
||||
.rst_bank_ofs = infrasys_rst_ofs,
|
||||
.rst_bank_nr = ARRAY_SIZE(infrasys_rst_ofs),
|
||||
};
|
||||
|
||||
static const struct of_device_id of_match_clk_mt8173_infracfg[] = {
|
||||
{ .compatible = "mediatek,mt8173-infracfg" },
|
||||
{ /* sentinel */ }
|
||||
};
|
||||
|
||||
static void clk_mt8173_infra_init_early(struct device_node *node)
|
||||
{
|
||||
int i;
|
||||
|
||||
infra_clk_data = mtk_alloc_clk_data(CLK_INFRA_NR_CLK);
|
||||
if (!infra_clk_data)
|
||||
return;
|
||||
|
||||
for (i = 0; i < CLK_INFRA_NR_CLK; i++)
|
||||
infra_clk_data->hws[i] = ERR_PTR(-EPROBE_DEFER);
|
||||
|
||||
mtk_clk_register_factors(infra_early_divs,
|
||||
ARRAY_SIZE(infra_early_divs), infra_clk_data);
|
||||
|
||||
of_clk_add_hw_provider(node, of_clk_hw_onecell_get, infra_clk_data);
|
||||
}
|
||||
CLK_OF_DECLARE_DRIVER(mtk_infrasys, "mediatek,mt8173-infracfg",
|
||||
clk_mt8173_infra_init_early);
|
||||
|
||||
static int clk_mt8173_infracfg_probe(struct platform_device *pdev)
|
||||
{
|
||||
struct device_node *node = pdev->dev.of_node;
|
||||
int r;
|
||||
|
||||
r = mtk_clk_register_gates(&pdev->dev, node, infra_gates,
|
||||
ARRAY_SIZE(infra_gates), infra_clk_data);
|
||||
if (r)
|
||||
return r;
|
||||
|
||||
r = mtk_clk_register_cpumuxes(&pdev->dev, node, cpu_muxes,
|
||||
ARRAY_SIZE(cpu_muxes), infra_clk_data);
|
||||
if (r)
|
||||
goto unregister_gates;
|
||||
|
||||
r = of_clk_add_hw_provider(node, of_clk_hw_onecell_get, infra_clk_data);
|
||||
if (r)
|
||||
goto unregister_cpumuxes;
|
||||
|
||||
r = mtk_register_reset_controller_with_dev(&pdev->dev, &clk_rst_desc);
|
||||
if (r)
|
||||
goto unregister_clk_hw;
|
||||
|
||||
return 0;
|
||||
|
||||
unregister_clk_hw:
|
||||
of_clk_del_provider(node);
|
||||
unregister_cpumuxes:
|
||||
mtk_clk_unregister_cpumuxes(cpu_muxes, ARRAY_SIZE(cpu_muxes), infra_clk_data);
|
||||
unregister_gates:
|
||||
mtk_clk_unregister_gates(infra_gates, ARRAY_SIZE(infra_gates), infra_clk_data);
|
||||
return r;
|
||||
}
|
||||
|
||||
static int clk_mt8173_infracfg_remove(struct platform_device *pdev)
|
||||
{
|
||||
struct device_node *node = pdev->dev.of_node;
|
||||
struct clk_hw_onecell_data *clk_data = platform_get_drvdata(pdev);
|
||||
|
||||
of_clk_del_provider(node);
|
||||
mtk_clk_unregister_cpumuxes(cpu_muxes, ARRAY_SIZE(cpu_muxes), clk_data);
|
||||
mtk_clk_unregister_gates(infra_gates, ARRAY_SIZE(infra_gates), clk_data);
|
||||
mtk_free_clk_data(clk_data);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static struct platform_driver clk_mt8173_infracfg_drv = {
|
||||
.driver = {
|
||||
.name = "clk-mt8173-infracfg",
|
||||
.of_match_table = of_match_clk_mt8173_infracfg,
|
||||
},
|
||||
.probe = clk_mt8173_infracfg_probe,
|
||||
.remove = clk_mt8173_infracfg_remove,
|
||||
};
|
||||
module_platform_driver(clk_mt8173_infracfg_drv);
|
||||
|
||||
MODULE_DESCRIPTION("MediaTek MT8173 infracfg clocks driver");
|
||||
MODULE_LICENSE("GPL");
|
|
@ -124,8 +124,8 @@ static int clk_mt8173_mm_probe(struct platform_device *pdev)
|
|||
|
||||
data = &mt8173_mmsys_driver_data;
|
||||
|
||||
ret = mtk_clk_register_gates(node, data->gates_clk, data->gates_num,
|
||||
clk_data);
|
||||
ret = mtk_clk_register_gates(&pdev->dev, node, data->gates_clk,
|
||||
data->gates_num, clk_data);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
|
@ -136,11 +136,29 @@ static int clk_mt8173_mm_probe(struct platform_device *pdev)
|
|||
return 0;
|
||||
}
|
||||
|
||||
static int clk_mt8173_mm_remove(struct platform_device *pdev)
|
||||
{
|
||||
struct device *dev = &pdev->dev;
|
||||
struct device_node *node = dev->parent->of_node;
|
||||
struct clk_hw_onecell_data *clk_data = platform_get_drvdata(pdev);
|
||||
const struct clk_mt8173_mm_driver_data *data = &mt8173_mmsys_driver_data;
|
||||
|
||||
of_clk_del_provider(node);
|
||||
mtk_clk_unregister_gates(data->gates_clk, data->gates_num, clk_data);
|
||||
mtk_free_clk_data(clk_data);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static struct platform_driver clk_mt8173_mm_drv = {
|
||||
.driver = {
|
||||
.name = "clk-mt8173-mm",
|
||||
},
|
||||
.probe = clk_mt8173_mm_probe,
|
||||
.remove = clk_mt8173_mm_remove,
|
||||
};
|
||||
|
||||
builtin_platform_driver(clk_mt8173_mm_drv);
|
||||
|
||||
MODULE_DESCRIPTION("MediaTek MT8173 MultiMedia clocks driver");
|
||||
MODULE_LICENSE("GPL");
|
||||
|
|
|
@ -0,0 +1,122 @@
|
|||
// SPDX-License-Identifier: GPL-2.0-only
|
||||
/*
|
||||
* Copyright (c) 2022 Collabora Ltd.
|
||||
* Author: AngeloGioacchino Del Regno <angelogioacchino.delregno@collabora.com>
|
||||
*/
|
||||
|
||||
#include <dt-bindings/clock/mt8173-clk.h>
|
||||
#include <linux/module.h>
|
||||
#include <linux/platform_device.h>
|
||||
#include "clk-gate.h"
|
||||
#include "clk-mtk.h"
|
||||
#include "reset.h"
|
||||
|
||||
#define GATE_PERI0(_id, _name, _parent, _shift) \
|
||||
GATE_MTK(_id, _name, _parent, &peri0_cg_regs, \
|
||||
_shift, &mtk_clk_gate_ops_setclr)
|
||||
|
||||
#define GATE_PERI1(_id, _name, _parent, _shift) \
|
||||
GATE_MTK(_id, _name, _parent, &peri1_cg_regs, \
|
||||
_shift, &mtk_clk_gate_ops_setclr)
|
||||
|
||||
static DEFINE_SPINLOCK(mt8173_clk_lock);
|
||||
|
||||
static const struct mtk_gate_regs peri0_cg_regs = {
|
||||
.set_ofs = 0x0008,
|
||||
.clr_ofs = 0x0010,
|
||||
.sta_ofs = 0x0018,
|
||||
};
|
||||
|
||||
static const struct mtk_gate_regs peri1_cg_regs = {
|
||||
.set_ofs = 0x000c,
|
||||
.clr_ofs = 0x0014,
|
||||
.sta_ofs = 0x001c,
|
||||
};
|
||||
|
||||
static const char * const uart_ck_sel_parents[] = {
|
||||
"clk26m",
|
||||
"uart_sel",
|
||||
};
|
||||
|
||||
static const struct mtk_composite peri_clks[] = {
|
||||
MUX(CLK_PERI_UART0_SEL, "uart0_ck_sel", uart_ck_sel_parents, 0x40c, 0, 1),
|
||||
MUX(CLK_PERI_UART1_SEL, "uart1_ck_sel", uart_ck_sel_parents, 0x40c, 1, 1),
|
||||
MUX(CLK_PERI_UART2_SEL, "uart2_ck_sel", uart_ck_sel_parents, 0x40c, 2, 1),
|
||||
MUX(CLK_PERI_UART3_SEL, "uart3_ck_sel", uart_ck_sel_parents, 0x40c, 3, 1),
|
||||
};
|
||||
|
||||
static const struct mtk_gate peri_gates[] = {
|
||||
GATE_DUMMY(CLK_DUMMY, "peri_gate_dummy"),
|
||||
/* PERI0 */
|
||||
GATE_PERI0(CLK_PERI_NFI, "peri_nfi", "axi_sel", 0),
|
||||
GATE_PERI0(CLK_PERI_THERM, "peri_therm", "axi_sel", 1),
|
||||
GATE_PERI0(CLK_PERI_PWM1, "peri_pwm1", "axi_sel", 2),
|
||||
GATE_PERI0(CLK_PERI_PWM2, "peri_pwm2", "axi_sel", 3),
|
||||
GATE_PERI0(CLK_PERI_PWM3, "peri_pwm3", "axi_sel", 4),
|
||||
GATE_PERI0(CLK_PERI_PWM4, "peri_pwm4", "axi_sel", 5),
|
||||
GATE_PERI0(CLK_PERI_PWM5, "peri_pwm5", "axi_sel", 6),
|
||||
GATE_PERI0(CLK_PERI_PWM6, "peri_pwm6", "axi_sel", 7),
|
||||
GATE_PERI0(CLK_PERI_PWM7, "peri_pwm7", "axi_sel", 8),
|
||||
GATE_PERI0(CLK_PERI_PWM, "peri_pwm", "axi_sel", 9),
|
||||
GATE_PERI0(CLK_PERI_USB0, "peri_usb0", "usb20_sel", 10),
|
||||
GATE_PERI0(CLK_PERI_USB1, "peri_usb1", "usb20_sel", 11),
|
||||
GATE_PERI0(CLK_PERI_AP_DMA, "peri_ap_dma", "axi_sel", 12),
|
||||
GATE_PERI0(CLK_PERI_MSDC30_0, "peri_msdc30_0", "msdc50_0_sel", 13),
|
||||
GATE_PERI0(CLK_PERI_MSDC30_1, "peri_msdc30_1", "msdc30_1_sel", 14),
|
||||
GATE_PERI0(CLK_PERI_MSDC30_2, "peri_msdc30_2", "msdc30_2_sel", 15),
|
||||
GATE_PERI0(CLK_PERI_MSDC30_3, "peri_msdc30_3", "msdc30_3_sel", 16),
|
||||
GATE_PERI0(CLK_PERI_NLI_ARB, "peri_nli_arb", "axi_sel", 17),
|
||||
GATE_PERI0(CLK_PERI_IRDA, "peri_irda", "irda_sel", 18),
|
||||
GATE_PERI0(CLK_PERI_UART0, "peri_uart0", "axi_sel", 19),
|
||||
GATE_PERI0(CLK_PERI_UART1, "peri_uart1", "axi_sel", 20),
|
||||
GATE_PERI0(CLK_PERI_UART2, "peri_uart2", "axi_sel", 21),
|
||||
GATE_PERI0(CLK_PERI_UART3, "peri_uart3", "axi_sel", 22),
|
||||
GATE_PERI0(CLK_PERI_I2C0, "peri_i2c0", "axi_sel", 23),
|
||||
GATE_PERI0(CLK_PERI_I2C1, "peri_i2c1", "axi_sel", 24),
|
||||
GATE_PERI0(CLK_PERI_I2C2, "peri_i2c2", "axi_sel", 25),
|
||||
GATE_PERI0(CLK_PERI_I2C3, "peri_i2c3", "axi_sel", 26),
|
||||
GATE_PERI0(CLK_PERI_I2C4, "peri_i2c4", "axi_sel", 27),
|
||||
GATE_PERI0(CLK_PERI_AUXADC, "peri_auxadc", "clk26m", 28),
|
||||
GATE_PERI0(CLK_PERI_SPI0, "peri_spi0", "spi_sel", 29),
|
||||
GATE_PERI0(CLK_PERI_I2C5, "peri_i2c5", "axi_sel", 30),
|
||||
GATE_PERI0(CLK_PERI_NFIECC, "peri_nfiecc", "axi_sel", 31),
|
||||
/* PERI1 */
|
||||
GATE_PERI1(CLK_PERI_SPI, "peri_spi", "spi_sel", 0),
|
||||
GATE_PERI1(CLK_PERI_IRRX, "peri_irrx", "spi_sel", 1),
|
||||
GATE_PERI1(CLK_PERI_I2C6, "peri_i2c6", "axi_sel", 2),
|
||||
};
|
||||
|
||||
static u16 pericfg_rst_ofs[] = { 0x0, 0x4 };
|
||||
|
||||
static const struct mtk_clk_rst_desc clk_rst_desc = {
|
||||
.version = MTK_RST_SIMPLE,
|
||||
.rst_bank_ofs = pericfg_rst_ofs,
|
||||
.rst_bank_nr = ARRAY_SIZE(pericfg_rst_ofs),
|
||||
};
|
||||
|
||||
static const struct mtk_clk_desc peri_desc = {
|
||||
.clks = peri_gates,
|
||||
.num_clks = ARRAY_SIZE(peri_gates),
|
||||
.composite_clks = peri_clks,
|
||||
.num_composite_clks = ARRAY_SIZE(peri_clks),
|
||||
.clk_lock = &mt8173_clk_lock,
|
||||
.rst_desc = &clk_rst_desc,
|
||||
};
|
||||
|
||||
static const struct of_device_id of_match_clk_mt8173_pericfg[] = {
|
||||
{ .compatible = "mediatek,mt8173-pericfg", .data = &peri_desc },
|
||||
{ /* sentinel */ }
|
||||
};
|
||||
|
||||
static struct platform_driver clk_mt8173_pericfg_drv = {
|
||||
.driver = {
|
||||
.name = "clk-mt8173-pericfg",
|
||||
.of_match_table = of_match_clk_mt8173_pericfg,
|
||||
},
|
||||
.probe = mtk_clk_simple_probe,
|
||||
.remove = mtk_clk_simple_remove,
|
||||
};
|
||||
module_platform_driver(clk_mt8173_pericfg_drv);
|
||||
|
||||
MODULE_DESCRIPTION("MediaTek MT8173 pericfg clocks driver");
|
||||
MODULE_LICENSE("GPL");
|
|
@ -0,0 +1,653 @@
|
|||
// SPDX-License-Identifier: GPL-2.0-only
|
||||
/*
|
||||
* Copyright (c) 2014 MediaTek Inc.
|
||||
* Copyright (c) 2022 Collabora Ltd.
|
||||
* Author: AngeloGioacchino Del Regno <angelogioacchino.delregno@collabora.com>
|
||||
*/
|
||||
|
||||
#include <dt-bindings/clock/mt8173-clk.h>
|
||||
#include <linux/module.h>
|
||||
#include <linux/platform_device.h>
|
||||
#include "clk-gate.h"
|
||||
#include "clk-mtk.h"
|
||||
#include "clk-mux.h"
|
||||
|
||||
/*
|
||||
* For some clocks, we don't care what their actual rates are. And these
|
||||
* clocks may change their rate on different products or different scenarios.
|
||||
* So we model these clocks' rate as 0, to denote it's not an actual rate.
|
||||
*/
|
||||
#define DUMMY_RATE 0
|
||||
|
||||
#define TOP_MUX_GATE_NOSR(_id, _name, _parents, _reg, _shift, _width, _gate, _flags) \
|
||||
MUX_GATE_CLR_SET_UPD_FLAGS(_id, _name, _parents, _reg, \
|
||||
(_reg + 0x4), (_reg + 0x8), _shift, _width, \
|
||||
_gate, 0, -1, _flags)
|
||||
|
||||
#define TOP_MUX_GATE(_id, _name, _parents, _reg, _shift, _width, _gate, _flags) \
|
||||
TOP_MUX_GATE_NOSR(_id, _name, _parents, _reg, _shift, _width, \
|
||||
_gate, CLK_SET_RATE_PARENT | _flags)
|
||||
|
||||
static DEFINE_SPINLOCK(mt8173_top_clk_lock);
|
||||
|
||||
static const char * const axi_parents[] = {
|
||||
"clk26m",
|
||||
"syspll1_d2",
|
||||
"syspll_d5",
|
||||
"syspll1_d4",
|
||||
"univpll_d5",
|
||||
"univpll2_d2",
|
||||
"dmpll_d2",
|
||||
"dmpll_d4"
|
||||
};
|
||||
|
||||
static const char * const mem_parents[] = {
|
||||
"clk26m",
|
||||
"dmpll_ck"
|
||||
};
|
||||
|
||||
static const char * const ddrphycfg_parents[] = {
|
||||
"clk26m",
|
||||
"syspll1_d8"
|
||||
};
|
||||
|
||||
static const char * const mm_parents[] = {
|
||||
"clk26m",
|
||||
"vencpll_d2",
|
||||
"main_h364m",
|
||||
"syspll1_d2",
|
||||
"syspll_d5",
|
||||
"syspll1_d4",
|
||||
"univpll1_d2",
|
||||
"univpll2_d2",
|
||||
"dmpll_d2"
|
||||
};
|
||||
|
||||
static const char * const pwm_parents[] = {
|
||||
"clk26m",
|
||||
"univpll2_d4",
|
||||
"univpll3_d2",
|
||||
"univpll1_d4"
|
||||
};
|
||||
|
||||
static const char * const vdec_parents[] = {
|
||||
"clk26m",
|
||||
"vcodecpll_ck",
|
||||
"tvdpll_445p5m",
|
||||
"univpll_d3",
|
||||
"vencpll_d2",
|
||||
"syspll_d3",
|
||||
"univpll1_d2",
|
||||
"mmpll_d2",
|
||||
"dmpll_d2",
|
||||
"dmpll_d4"
|
||||
};
|
||||
|
||||
static const char * const venc_parents[] = {
|
||||
"clk26m",
|
||||
"vcodecpll_ck",
|
||||
"tvdpll_445p5m",
|
||||
"univpll_d3",
|
||||
"vencpll_d2",
|
||||
"syspll_d3",
|
||||
"univpll1_d2",
|
||||
"univpll2_d2",
|
||||
"dmpll_d2",
|
||||
"dmpll_d4"
|
||||
};
|
||||
|
||||
static const char * const mfg_parents[] = {
|
||||
"clk26m",
|
||||
"mmpll_ck",
|
||||
"dmpll_ck",
|
||||
"clk26m",
|
||||
"clk26m",
|
||||
"clk26m",
|
||||
"clk26m",
|
||||
"clk26m",
|
||||
"clk26m",
|
||||
"syspll_d3",
|
||||
"syspll1_d2",
|
||||
"syspll_d5",
|
||||
"univpll_d3",
|
||||
"univpll1_d2",
|
||||
"univpll_d5",
|
||||
"univpll2_d2"
|
||||
};
|
||||
|
||||
static const char * const camtg_parents[] = {
|
||||
"clk26m",
|
||||
"univpll_d26",
|
||||
"univpll2_d2",
|
||||
"syspll3_d2",
|
||||
"syspll3_d4",
|
||||
"univpll1_d4"
|
||||
};
|
||||
|
||||
static const char * const uart_parents[] = {
|
||||
"clk26m",
|
||||
"univpll2_d8"
|
||||
};
|
||||
|
||||
static const char * const spi_parents[] = {
|
||||
"clk26m",
|
||||
"syspll3_d2",
|
||||
"syspll1_d4",
|
||||
"syspll4_d2",
|
||||
"univpll3_d2",
|
||||
"univpll2_d4",
|
||||
"univpll1_d8"
|
||||
};
|
||||
|
||||
static const char * const usb20_parents[] = {
|
||||
"clk26m",
|
||||
"univpll1_d8",
|
||||
"univpll3_d4"
|
||||
};
|
||||
|
||||
static const char * const usb30_parents[] = {
|
||||
"clk26m",
|
||||
"univpll3_d2",
|
||||
"usb_syspll_125m",
|
||||
"univpll2_d4"
|
||||
};
|
||||
|
||||
static const char * const msdc50_0_h_parents[] = {
|
||||
"clk26m",
|
||||
"syspll1_d2",
|
||||
"syspll2_d2",
|
||||
"syspll4_d2",
|
||||
"univpll_d5",
|
||||
"univpll1_d4"
|
||||
};
|
||||
|
||||
static const char * const msdc50_0_parents[] = {
|
||||
"clk26m",
|
||||
"msdcpll_ck",
|
||||
"msdcpll_d2",
|
||||
"univpll1_d4",
|
||||
"syspll2_d2",
|
||||
"syspll_d7",
|
||||
"msdcpll_d4",
|
||||
"vencpll_d4",
|
||||
"tvdpll_ck",
|
||||
"univpll_d2",
|
||||
"univpll1_d2",
|
||||
"mmpll_ck",
|
||||
"msdcpll2_ck",
|
||||
"msdcpll2_d2",
|
||||
"msdcpll2_d4"
|
||||
};
|
||||
|
||||
static const char * const msdc30_1_parents[] = {
|
||||
"clk26m",
|
||||
"univpll2_d2",
|
||||
"msdcpll_d4",
|
||||
"univpll1_d4",
|
||||
"syspll2_d2",
|
||||
"syspll_d7",
|
||||
"univpll_d7",
|
||||
"vencpll_d4"
|
||||
};
|
||||
|
||||
static const char * const msdc30_2_parents[] = {
|
||||
"clk26m",
|
||||
"univpll2_d2",
|
||||
"msdcpll_d4",
|
||||
"univpll1_d4",
|
||||
"syspll2_d2",
|
||||
"syspll_d7",
|
||||
"univpll_d7",
|
||||
"vencpll_d2"
|
||||
};
|
||||
|
||||
static const char * const msdc30_3_parents[] = {
|
||||
"clk26m",
|
||||
"msdcpll2_ck",
|
||||
"msdcpll2_d2",
|
||||
"univpll2_d2",
|
||||
"msdcpll2_d4",
|
||||
"msdcpll_d4",
|
||||
"univpll1_d4",
|
||||
"syspll2_d2",
|
||||
"syspll_d7",
|
||||
"univpll_d7",
|
||||
"vencpll_d4",
|
||||
"msdcpll_ck",
|
||||
"msdcpll_d2",
|
||||
"msdcpll_d4"
|
||||
};
|
||||
|
||||
static const char * const audio_parents[] = {
|
||||
"clk26m",
|
||||
"syspll3_d4",
|
||||
"syspll4_d4",
|
||||
"syspll1_d16"
|
||||
};
|
||||
|
||||
static const char * const aud_intbus_parents[] = {
|
||||
"clk26m",
|
||||
"syspll1_d4",
|
||||
"syspll4_d2",
|
||||
"univpll3_d2",
|
||||
"univpll2_d8",
|
||||
"dmpll_d4",
|
||||
"dmpll_d8"
|
||||
};
|
||||
|
||||
static const char * const pmicspi_parents[] = {
|
||||
"clk26m",
|
||||
"syspll1_d8",
|
||||
"syspll3_d4",
|
||||
"syspll1_d16",
|
||||
"univpll3_d4",
|
||||
"univpll_d26",
|
||||
"dmpll_d8",
|
||||
"dmpll_d16"
|
||||
};
|
||||
|
||||
static const char * const scp_parents[] = {
|
||||
"clk26m",
|
||||
"syspll1_d2",
|
||||
"univpll_d5",
|
||||
"syspll_d5",
|
||||
"dmpll_d2",
|
||||
"dmpll_d4"
|
||||
};
|
||||
|
||||
static const char * const atb_parents[] = {
|
||||
"clk26m",
|
||||
"syspll1_d2",
|
||||
"univpll_d5",
|
||||
"dmpll_d2"
|
||||
};
|
||||
|
||||
static const char * const venc_lt_parents[] = {
|
||||
"clk26m",
|
||||
"univpll_d3",
|
||||
"vcodecpll_ck",
|
||||
"tvdpll_445p5m",
|
||||
"vencpll_d2",
|
||||
"syspll_d3",
|
||||
"univpll1_d2",
|
||||
"univpll2_d2",
|
||||
"syspll1_d2",
|
||||
"univpll_d5",
|
||||
"vcodecpll_370p5",
|
||||
"dmpll_ck"
|
||||
};
|
||||
|
||||
static const char * const dpi0_parents[] = {
|
||||
"clk26m",
|
||||
"tvdpll_d2",
|
||||
"tvdpll_d4",
|
||||
"clk26m",
|
||||
"clk26m",
|
||||
"tvdpll_d8",
|
||||
"tvdpll_d16"
|
||||
};
|
||||
|
||||
static const char * const irda_parents[] = {
|
||||
"clk26m",
|
||||
"univpll2_d4",
|
||||
"syspll2_d4"
|
||||
};
|
||||
|
||||
static const char * const cci400_parents[] = {
|
||||
"clk26m",
|
||||
"vencpll_ck",
|
||||
"armca7pll_754m",
|
||||
"armca7pll_502m",
|
||||
"univpll_d2",
|
||||
"syspll_d2",
|
||||
"msdcpll_ck",
|
||||
"dmpll_ck"
|
||||
};
|
||||
|
||||
static const char * const aud_1_parents[] = {
|
||||
"clk26m",
|
||||
"apll1_ck",
|
||||
"univpll2_d4",
|
||||
"univpll2_d8"
|
||||
};
|
||||
|
||||
static const char * const aud_2_parents[] = {
|
||||
"clk26m",
|
||||
"apll2_ck",
|
||||
"univpll2_d4",
|
||||
"univpll2_d8"
|
||||
};
|
||||
|
||||
static const char * const mem_mfg_in_parents[] = {
|
||||
"clk26m",
|
||||
"mmpll_ck",
|
||||
"dmpll_ck",
|
||||
"clk26m"
|
||||
};
|
||||
|
||||
static const char * const axi_mfg_in_parents[] = {
|
||||
"clk26m",
|
||||
"axi_sel",
|
||||
"dmpll_d2"
|
||||
};
|
||||
|
||||
static const char * const scam_parents[] = {
|
||||
"clk26m",
|
||||
"syspll3_d2",
|
||||
"univpll2_d4",
|
||||
"dmpll_d4"
|
||||
};
|
||||
|
||||
static const char * const spinfi_ifr_parents[] = {
|
||||
"clk26m",
|
||||
"univpll2_d8",
|
||||
"univpll3_d4",
|
||||
"syspll4_d2",
|
||||
"univpll2_d4",
|
||||
"univpll3_d2",
|
||||
"syspll1_d4",
|
||||
"univpll1_d4"
|
||||
};
|
||||
|
||||
static const char * const hdmi_parents[] = {
|
||||
"clk26m",
|
||||
"hdmitx_dig_cts",
|
||||
"hdmitxpll_d2",
|
||||
"hdmitxpll_d3"
|
||||
};
|
||||
|
||||
static const char * const dpilvds_parents[] = {
|
||||
"clk26m",
|
||||
"lvdspll",
|
||||
"lvdspll_d2",
|
||||
"lvdspll_d4",
|
||||
"lvdspll_d8",
|
||||
"fpc_ck"
|
||||
};
|
||||
|
||||
static const char * const msdc50_2_h_parents[] = {
|
||||
"clk26m",
|
||||
"syspll1_d2",
|
||||
"syspll2_d2",
|
||||
"syspll4_d2",
|
||||
"univpll_d5",
|
||||
"univpll1_d4"
|
||||
};
|
||||
|
||||
static const char * const hdcp_parents[] = {
|
||||
"clk26m",
|
||||
"syspll4_d2",
|
||||
"syspll3_d4",
|
||||
"univpll2_d4"
|
||||
};
|
||||
|
||||
static const char * const hdcp_24m_parents[] = {
|
||||
"clk26m",
|
||||
"univpll_d26",
|
||||
"univpll_d52",
|
||||
"univpll2_d8"
|
||||
};
|
||||
|
||||
static const char * const rtc_parents[] = {
|
||||
"clkrtc_int",
|
||||
"clkrtc_ext",
|
||||
"clk26m",
|
||||
"univpll3_d8"
|
||||
};
|
||||
|
||||
static const char * const i2s0_m_ck_parents[] = {
|
||||
"apll1_div1",
|
||||
"apll2_div1"
|
||||
};
|
||||
|
||||
static const char * const i2s1_m_ck_parents[] = {
|
||||
"apll1_div2",
|
||||
"apll2_div2"
|
||||
};
|
||||
|
||||
static const char * const i2s2_m_ck_parents[] = {
|
||||
"apll1_div3",
|
||||
"apll2_div3"
|
||||
};
|
||||
|
||||
static const char * const i2s3_m_ck_parents[] = {
|
||||
"apll1_div4",
|
||||
"apll2_div4"
|
||||
};
|
||||
|
||||
static const char * const i2s3_b_ck_parents[] = {
|
||||
"apll1_div5",
|
||||
"apll2_div5"
|
||||
};
|
||||
|
||||
static const struct mtk_fixed_clk fixed_clks[] = {
|
||||
FIXED_CLK(CLK_DUMMY, "topck_dummy", "clk26m", DUMMY_RATE),
|
||||
FIXED_CLK(CLK_TOP_CLKPH_MCK_O, "clkph_mck_o", "clk26m", DUMMY_RATE),
|
||||
FIXED_CLK(CLK_TOP_USB_SYSPLL_125M, "usb_syspll_125m", "clk26m", 125 * MHZ),
|
||||
FIXED_CLK(CLK_TOP_DSI0_DIG, "dsi0_dig", "clk26m", DUMMY_RATE),
|
||||
FIXED_CLK(CLK_TOP_DSI1_DIG, "dsi1_dig", "clk26m", DUMMY_RATE),
|
||||
FIXED_CLK(CLK_TOP_LVDS_PXL, "lvds_pxl", "lvdspll", DUMMY_RATE),
|
||||
FIXED_CLK(CLK_TOP_LVDS_CTS, "lvds_cts", "lvdspll", DUMMY_RATE),
|
||||
};
|
||||
|
||||
static const struct mtk_fixed_factor top_divs[] = {
|
||||
FACTOR(CLK_TOP_ARMCA7PLL_754M, "armca7pll_754m", "armca7pll", 1, 2),
|
||||
FACTOR(CLK_TOP_ARMCA7PLL_502M, "armca7pll_502m", "armca7pll", 1, 3),
|
||||
|
||||
FACTOR_FLAGS(CLK_TOP_MAIN_H546M, "main_h546m", "mainpll", 1, 2, 0),
|
||||
FACTOR_FLAGS(CLK_TOP_MAIN_H364M, "main_h364m", "mainpll", 1, 3, 0),
|
||||
FACTOR_FLAGS(CLK_TOP_MAIN_H218P4M, "main_h218p4m", "mainpll", 1, 5, 0),
|
||||
FACTOR_FLAGS(CLK_TOP_MAIN_H156M, "main_h156m", "mainpll", 1, 7, 0),
|
||||
|
||||
FACTOR(CLK_TOP_TVDPLL_445P5M, "tvdpll_445p5m", "tvdpll", 1, 4),
|
||||
FACTOR(CLK_TOP_TVDPLL_594M, "tvdpll_594m", "tvdpll", 1, 3),
|
||||
|
||||
FACTOR_FLAGS(CLK_TOP_UNIV_624M, "univ_624m", "univpll", 1, 2, 0),
|
||||
FACTOR_FLAGS(CLK_TOP_UNIV_416M, "univ_416m", "univpll", 1, 3, 0),
|
||||
FACTOR_FLAGS(CLK_TOP_UNIV_249P6M, "univ_249p6m", "univpll", 1, 5, 0),
|
||||
FACTOR_FLAGS(CLK_TOP_UNIV_178P3M, "univ_178p3m", "univpll", 1, 7, 0),
|
||||
FACTOR_FLAGS(CLK_TOP_UNIV_48M, "univ_48m", "univpll", 1, 26, 0),
|
||||
|
||||
FACTOR(CLK_TOP_CLKRTC_EXT, "clkrtc_ext", "clk32k", 1, 1),
|
||||
FACTOR(CLK_TOP_CLKRTC_INT, "clkrtc_int", "clk26m", 1, 793),
|
||||
FACTOR(CLK_TOP_FPC, "fpc_ck", "clk26m", 1, 1),
|
||||
|
||||
FACTOR(CLK_TOP_HDMITXPLL_D2, "hdmitxpll_d2", "hdmitx_dig_cts", 1, 2),
|
||||
FACTOR(CLK_TOP_HDMITXPLL_D3, "hdmitxpll_d3", "hdmitx_dig_cts", 1, 3),
|
||||
|
||||
FACTOR(CLK_TOP_ARMCA7PLL_D2, "armca7pll_d2", "armca7pll_754m", 1, 1),
|
||||
FACTOR(CLK_TOP_ARMCA7PLL_D3, "armca7pll_d3", "armca7pll_502m", 1, 1),
|
||||
|
||||
FACTOR(CLK_TOP_APLL1, "apll1_ck", "apll1", 1, 1),
|
||||
FACTOR(CLK_TOP_APLL2, "apll2_ck", "apll2", 1, 1),
|
||||
|
||||
FACTOR(CLK_TOP_DMPLL, "dmpll_ck", "clkph_mck_o", 1, 1),
|
||||
FACTOR(CLK_TOP_DMPLL_D2, "dmpll_d2", "clkph_mck_o", 1, 2),
|
||||
FACTOR(CLK_TOP_DMPLL_D4, "dmpll_d4", "clkph_mck_o", 1, 4),
|
||||
FACTOR(CLK_TOP_DMPLL_D8, "dmpll_d8", "clkph_mck_o", 1, 8),
|
||||
FACTOR(CLK_TOP_DMPLL_D16, "dmpll_d16", "clkph_mck_o", 1, 16),
|
||||
|
||||
FACTOR(CLK_TOP_LVDSPLL_D2, "lvdspll_d2", "lvdspll", 1, 2),
|
||||
FACTOR(CLK_TOP_LVDSPLL_D4, "lvdspll_d4", "lvdspll", 1, 4),
|
||||
FACTOR(CLK_TOP_LVDSPLL_D8, "lvdspll_d8", "lvdspll", 1, 8),
|
||||
|
||||
FACTOR(CLK_TOP_MMPLL, "mmpll_ck", "mmpll", 1, 1),
|
||||
FACTOR(CLK_TOP_MMPLL_D2, "mmpll_d2", "mmpll", 1, 2),
|
||||
|
||||
FACTOR(CLK_TOP_MSDCPLL, "msdcpll_ck", "msdcpll", 1, 1),
|
||||
FACTOR(CLK_TOP_MSDCPLL_D2, "msdcpll_d2", "msdcpll", 1, 2),
|
||||
FACTOR(CLK_TOP_MSDCPLL_D4, "msdcpll_d4", "msdcpll", 1, 4),
|
||||
FACTOR(CLK_TOP_MSDCPLL2, "msdcpll2_ck", "msdcpll2", 1, 1),
|
||||
FACTOR(CLK_TOP_MSDCPLL2_D2, "msdcpll2_d2", "msdcpll2", 1, 2),
|
||||
FACTOR(CLK_TOP_MSDCPLL2_D4, "msdcpll2_d4", "msdcpll2", 1, 4),
|
||||
|
||||
FACTOR_FLAGS(CLK_TOP_SYSPLL_D2, "syspll_d2", "main_h546m", 1, 1, 0),
|
||||
FACTOR_FLAGS(CLK_TOP_SYSPLL1_D2, "syspll1_d2", "main_h546m", 1, 2, 0),
|
||||
FACTOR_FLAGS(CLK_TOP_SYSPLL1_D4, "syspll1_d4", "main_h546m", 1, 4, 0),
|
||||
FACTOR_FLAGS(CLK_TOP_SYSPLL1_D8, "syspll1_d8", "main_h546m", 1, 8, 0),
|
||||
FACTOR_FLAGS(CLK_TOP_SYSPLL1_D16, "syspll1_d16", "main_h546m", 1, 16, 0),
|
||||
FACTOR_FLAGS(CLK_TOP_SYSPLL_D3, "syspll_d3", "main_h364m", 1, 1, 0),
|
||||
FACTOR_FLAGS(CLK_TOP_SYSPLL2_D2, "syspll2_d2", "main_h364m", 1, 2, 0),
|
||||
FACTOR_FLAGS(CLK_TOP_SYSPLL2_D4, "syspll2_d4", "main_h364m", 1, 4, 0),
|
||||
FACTOR_FLAGS(CLK_TOP_SYSPLL_D5, "syspll_d5", "main_h218p4m", 1, 1, 0),
|
||||
FACTOR_FLAGS(CLK_TOP_SYSPLL3_D2, "syspll3_d2", "main_h218p4m", 1, 2, 0),
|
||||
FACTOR_FLAGS(CLK_TOP_SYSPLL3_D4, "syspll3_d4", "main_h218p4m", 1, 4, 0),
|
||||
FACTOR_FLAGS(CLK_TOP_SYSPLL_D7, "syspll_d7", "main_h156m", 1, 1, 0),
|
||||
FACTOR_FLAGS(CLK_TOP_SYSPLL4_D2, "syspll4_d2", "main_h156m", 1, 2, 0),
|
||||
FACTOR_FLAGS(CLK_TOP_SYSPLL4_D4, "syspll4_d4", "main_h156m", 1, 4, 0),
|
||||
|
||||
FACTOR(CLK_TOP_TVDPLL, "tvdpll_ck", "tvdpll_594m", 1, 1),
|
||||
FACTOR(CLK_TOP_TVDPLL_D2, "tvdpll_d2", "tvdpll_594m", 1, 2),
|
||||
FACTOR(CLK_TOP_TVDPLL_D4, "tvdpll_d4", "tvdpll_594m", 1, 4),
|
||||
FACTOR(CLK_TOP_TVDPLL_D8, "tvdpll_d8", "tvdpll_594m", 1, 8),
|
||||
FACTOR(CLK_TOP_TVDPLL_D16, "tvdpll_d16", "tvdpll_594m", 1, 16),
|
||||
|
||||
FACTOR_FLAGS(CLK_TOP_UNIVPLL_D2, "univpll_d2", "univ_624m", 1, 1, 0),
|
||||
FACTOR_FLAGS(CLK_TOP_UNIVPLL1_D2, "univpll1_d2", "univ_624m", 1, 2, 0),
|
||||
FACTOR_FLAGS(CLK_TOP_UNIVPLL1_D4, "univpll1_d4", "univ_624m", 1, 4, 0),
|
||||
FACTOR_FLAGS(CLK_TOP_UNIVPLL1_D8, "univpll1_d8", "univ_624m", 1, 8, 0),
|
||||
FACTOR_FLAGS(CLK_TOP_UNIVPLL_D3, "univpll_d3", "univ_416m", 1, 1, 0),
|
||||
FACTOR_FLAGS(CLK_TOP_UNIVPLL2_D2, "univpll2_d2", "univ_416m", 1, 2, 0),
|
||||
FACTOR_FLAGS(CLK_TOP_UNIVPLL2_D4, "univpll2_d4", "univ_416m", 1, 4, 0),
|
||||
FACTOR_FLAGS(CLK_TOP_UNIVPLL2_D8, "univpll2_d8", "univ_416m", 1, 8, 0),
|
||||
FACTOR_FLAGS(CLK_TOP_UNIVPLL_D5, "univpll_d5", "univ_249p6m", 1, 1, 0),
|
||||
FACTOR_FLAGS(CLK_TOP_UNIVPLL3_D2, "univpll3_d2", "univ_249p6m", 1, 2, 0),
|
||||
FACTOR_FLAGS(CLK_TOP_UNIVPLL3_D4, "univpll3_d4", "univ_249p6m", 1, 4, 0),
|
||||
FACTOR_FLAGS(CLK_TOP_UNIVPLL3_D8, "univpll3_d8", "univ_249p6m", 1, 8, 0),
|
||||
FACTOR_FLAGS(CLK_TOP_UNIVPLL_D7, "univpll_d7", "univ_178p3m", 1, 1, 0),
|
||||
FACTOR_FLAGS(CLK_TOP_UNIVPLL_D26, "univpll_d26", "univ_48m", 1, 1, 0),
|
||||
FACTOR_FLAGS(CLK_TOP_UNIVPLL_D52, "univpll_d52", "univ_48m", 1, 2, 0),
|
||||
|
||||
FACTOR(CLK_TOP_VCODECPLL, "vcodecpll_ck", "vcodecpll", 1, 3),
|
||||
FACTOR(CLK_TOP_VCODECPLL_370P5, "vcodecpll_370p5", "vcodecpll", 1, 4),
|
||||
|
||||
FACTOR(CLK_TOP_VENCPLL, "vencpll_ck", "vencpll", 1, 1),
|
||||
FACTOR(CLK_TOP_VENCPLL_D2, "vencpll_d2", "vencpll", 1, 2),
|
||||
FACTOR(CLK_TOP_VENCPLL_D4, "vencpll_d4", "vencpll", 1, 4),
|
||||
};
|
||||
|
||||
static const struct mtk_composite top_muxes[] = {
|
||||
/* CLK_CFG_0 */
|
||||
MUX(CLK_TOP_AXI_SEL, "axi_sel", axi_parents, 0x0040, 0, 3),
|
||||
MUX_FLAGS(CLK_TOP_MEM_SEL, "mem_sel", mem_parents, 0x0040, 8, 1,
|
||||
CLK_IS_CRITICAL | CLK_SET_RATE_PARENT),
|
||||
MUX_GATE_FLAGS(CLK_TOP_DDRPHYCFG_SEL, "ddrphycfg_sel",
|
||||
ddrphycfg_parents, 0x0040, 16, 1, 23,
|
||||
CLK_IS_CRITICAL | CLK_SET_RATE_PARENT),
|
||||
MUX_GATE(CLK_TOP_MM_SEL, "mm_sel", mm_parents, 0x0040, 24, 4, 31),
|
||||
/* CLK_CFG_1 */
|
||||
MUX_GATE(CLK_TOP_PWM_SEL, "pwm_sel", pwm_parents, 0x0050, 0, 2, 7),
|
||||
MUX_GATE(CLK_TOP_VDEC_SEL, "vdec_sel", vdec_parents, 0x0050, 8, 4, 15),
|
||||
MUX_GATE(CLK_TOP_VENC_SEL, "venc_sel", venc_parents, 0x0050, 16, 4, 23),
|
||||
MUX_GATE(CLK_TOP_MFG_SEL, "mfg_sel", mfg_parents, 0x0050, 24, 4, 31),
|
||||
/* CLK_CFG_2 */
|
||||
MUX_GATE(CLK_TOP_CAMTG_SEL, "camtg_sel", camtg_parents, 0x0060, 0, 3, 7),
|
||||
MUX_GATE(CLK_TOP_UART_SEL, "uart_sel", uart_parents, 0x0060, 8, 1, 15),
|
||||
MUX_GATE(CLK_TOP_SPI_SEL, "spi_sel", spi_parents, 0x0060, 16, 3, 23),
|
||||
MUX_GATE(CLK_TOP_USB20_SEL, "usb20_sel", usb20_parents, 0x0060, 24, 2, 31),
|
||||
/* CLK_CFG_3 */
|
||||
MUX_GATE(CLK_TOP_USB30_SEL, "usb30_sel", usb30_parents, 0x0070, 0, 2, 7),
|
||||
MUX_GATE(CLK_TOP_MSDC50_0_H_SEL, "msdc50_0_h_sel", msdc50_0_h_parents,
|
||||
0x0070, 8, 3, 15),
|
||||
MUX_GATE(CLK_TOP_MSDC50_0_SEL, "msdc50_0_sel", msdc50_0_parents,
|
||||
0x0070, 16, 4, 23),
|
||||
MUX_GATE(CLK_TOP_MSDC30_1_SEL, "msdc30_1_sel", msdc30_1_parents,
|
||||
0x0070, 24, 3, 31),
|
||||
/* CLK_CFG_4 */
|
||||
MUX_GATE(CLK_TOP_MSDC30_2_SEL, "msdc30_2_sel", msdc30_2_parents,
|
||||
0x0080, 0, 3, 7),
|
||||
MUX_GATE(CLK_TOP_MSDC30_3_SEL, "msdc30_3_sel", msdc30_3_parents,
|
||||
0x0080, 8, 4, 15),
|
||||
MUX_GATE(CLK_TOP_AUDIO_SEL, "audio_sel", audio_parents,
|
||||
0x0080, 16, 2, 23),
|
||||
MUX_GATE(CLK_TOP_AUD_INTBUS_SEL, "aud_intbus_sel", aud_intbus_parents,
|
||||
0x0080, 24, 3, 31),
|
||||
/* CLK_CFG_5 */
|
||||
MUX_GATE(CLK_TOP_PMICSPI_SEL, "pmicspi_sel", pmicspi_parents,
|
||||
0x0090, 0, 3, 7 /* 7:5 */),
|
||||
MUX_GATE(CLK_TOP_SCP_SEL, "scp_sel", scp_parents, 0x0090, 8, 3, 15),
|
||||
MUX_GATE(CLK_TOP_ATB_SEL, "atb_sel", atb_parents, 0x0090, 16, 2, 23),
|
||||
MUX_GATE(CLK_TOP_VENC_LT_SEL, "venclt_sel", venc_lt_parents,
|
||||
0x0090, 24, 4, 31),
|
||||
/* CLK_CFG_6 */
|
||||
/*
|
||||
* The dpi0_sel clock should not propagate rate changes to its parent
|
||||
* clock so the dpi driver can have full control over PLL and divider.
|
||||
*/
|
||||
MUX_GATE_FLAGS(CLK_TOP_DPI0_SEL, "dpi0_sel", dpi0_parents,
|
||||
0x00a0, 0, 3, 7, 0),
|
||||
MUX_GATE(CLK_TOP_IRDA_SEL, "irda_sel", irda_parents, 0x00a0, 8, 2, 15),
|
||||
MUX_GATE_FLAGS(CLK_TOP_CCI400_SEL, "cci400_sel",
|
||||
cci400_parents, 0x00a0, 16, 3, 23,
|
||||
CLK_IS_CRITICAL | CLK_SET_RATE_PARENT),
|
||||
MUX_GATE(CLK_TOP_AUD_1_SEL, "aud_1_sel", aud_1_parents, 0x00a0, 24, 2, 31),
|
||||
/* CLK_CFG_7 */
|
||||
MUX_GATE(CLK_TOP_AUD_2_SEL, "aud_2_sel", aud_2_parents, 0x00b0, 0, 2, 7),
|
||||
MUX_GATE(CLK_TOP_MEM_MFG_IN_SEL, "mem_mfg_in_sel", mem_mfg_in_parents,
|
||||
0x00b0, 8, 2, 15),
|
||||
MUX_GATE(CLK_TOP_AXI_MFG_IN_SEL, "axi_mfg_in_sel", axi_mfg_in_parents,
|
||||
0x00b0, 16, 2, 23),
|
||||
MUX_GATE(CLK_TOP_SCAM_SEL, "scam_sel", scam_parents, 0x00b0, 24, 2, 31),
|
||||
/* CLK_CFG_12 */
|
||||
MUX_GATE(CLK_TOP_SPINFI_IFR_SEL, "spinfi_ifr_sel", spinfi_ifr_parents,
|
||||
0x00c0, 0, 3, 7),
|
||||
MUX_GATE(CLK_TOP_HDMI_SEL, "hdmi_sel", hdmi_parents, 0x00c0, 8, 2, 15),
|
||||
MUX_GATE(CLK_TOP_DPILVDS_SEL, "dpilvds_sel", dpilvds_parents,
|
||||
0x00c0, 24, 3, 31),
|
||||
/* CLK_CFG_13 */
|
||||
MUX_GATE(CLK_TOP_MSDC50_2_H_SEL, "msdc50_2_h_sel", msdc50_2_h_parents,
|
||||
0x00d0, 0, 3, 7),
|
||||
MUX_GATE(CLK_TOP_HDCP_SEL, "hdcp_sel", hdcp_parents, 0x00d0, 8, 2, 15),
|
||||
MUX_GATE(CLK_TOP_HDCP_24M_SEL, "hdcp_24m_sel", hdcp_24m_parents,
|
||||
0x00d0, 16, 2, 23),
|
||||
MUX_FLAGS(CLK_TOP_RTC_SEL, "rtc_sel", rtc_parents, 0x00d0, 24, 2,
|
||||
CLK_IS_CRITICAL | CLK_SET_RATE_PARENT),
|
||||
|
||||
DIV_GATE(CLK_TOP_APLL1_DIV0, "apll1_div0", "aud_1_sel", 0x12c, 8, 0x120, 4, 24),
|
||||
DIV_GATE(CLK_TOP_APLL1_DIV1, "apll1_div1", "aud_1_sel", 0x12c, 9, 0x124, 8, 0),
|
||||
DIV_GATE(CLK_TOP_APLL1_DIV2, "apll1_div2", "aud_1_sel", 0x12c, 10, 0x124, 8, 8),
|
||||
DIV_GATE(CLK_TOP_APLL1_DIV3, "apll1_div3", "aud_1_sel", 0x12c, 11, 0x124, 8, 16),
|
||||
DIV_GATE(CLK_TOP_APLL1_DIV4, "apll1_div4", "aud_1_sel", 0x12c, 12, 0x124, 8, 24),
|
||||
DIV_GATE(CLK_TOP_APLL1_DIV5, "apll1_div5", "apll1_div4", 0x12c, 13, 0x12c, 4, 0),
|
||||
|
||||
DIV_GATE(CLK_TOP_APLL2_DIV0, "apll2_div0", "aud_2_sel", 0x12c, 16, 0x120, 4, 28),
|
||||
DIV_GATE(CLK_TOP_APLL2_DIV1, "apll2_div1", "aud_2_sel", 0x12c, 17, 0x128, 8, 0),
|
||||
DIV_GATE(CLK_TOP_APLL2_DIV2, "apll2_div2", "aud_2_sel", 0x12c, 18, 0x128, 8, 8),
|
||||
DIV_GATE(CLK_TOP_APLL2_DIV3, "apll2_div3", "aud_2_sel", 0x12c, 19, 0x128, 8, 16),
|
||||
DIV_GATE(CLK_TOP_APLL2_DIV4, "apll2_div4", "aud_2_sel", 0x12c, 20, 0x128, 8, 24),
|
||||
DIV_GATE(CLK_TOP_APLL2_DIV5, "apll2_div5", "apll2_div4", 0x12c, 21, 0x12c, 4, 4),
|
||||
|
||||
MUX(CLK_TOP_I2S0_M_SEL, "i2s0_m_ck_sel", i2s0_m_ck_parents, 0x120, 4, 1),
|
||||
MUX(CLK_TOP_I2S1_M_SEL, "i2s1_m_ck_sel", i2s1_m_ck_parents, 0x120, 5, 1),
|
||||
MUX(CLK_TOP_I2S2_M_SEL, "i2s2_m_ck_sel", i2s2_m_ck_parents, 0x120, 6, 1),
|
||||
MUX(CLK_TOP_I2S3_M_SEL, "i2s3_m_ck_sel", i2s3_m_ck_parents, 0x120, 7, 1),
|
||||
MUX(CLK_TOP_I2S3_B_SEL, "i2s3_b_ck_sel", i2s3_b_ck_parents, 0x120, 8, 1),
|
||||
};
|
||||
|
||||
static const struct mtk_clk_desc topck_desc = {
|
||||
.fixed_clks = fixed_clks,
|
||||
.num_fixed_clks = ARRAY_SIZE(fixed_clks),
|
||||
.factor_clks = top_divs,
|
||||
.num_factor_clks = ARRAY_SIZE(top_divs),
|
||||
.composite_clks = top_muxes,
|
||||
.num_composite_clks = ARRAY_SIZE(top_muxes),
|
||||
.clk_lock = &mt8173_top_clk_lock,
|
||||
};
|
||||
|
||||
static const struct of_device_id of_match_clk_mt8173_topckgen[] = {
|
||||
{ .compatible = "mediatek,mt8173-topckgen", .data = &topck_desc },
|
||||
{ /* sentinel */ }
|
||||
};
|
||||
|
||||
static struct platform_driver clk_mt8173_topckgen_drv = {
|
||||
.driver = {
|
||||
.name = "clk-mt8173-topckgen",
|
||||
.of_match_table = of_match_clk_mt8173_topckgen,
|
||||
},
|
||||
.probe = mtk_clk_simple_probe,
|
||||
.remove = mtk_clk_simple_remove,
|
||||
};
|
||||
module_platform_driver(clk_mt8173_topckgen_drv);
|
||||
|
||||
MODULE_DESCRIPTION("MediaTek MT8173 topckgen clocks driver");
|
||||
MODULE_LICENSE("GPL");
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue