^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1) // SPDX-License-Identifier: GPL-2.0-only
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3) * Copyright 2014 Linaro Ltd.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4) * Copyright (C) 2014 ZTE Corporation.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7) #include <linux/clk-provider.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8) #include <linux/of_address.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9) #include <dt-bindings/clock/zx296702-clock.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10) #include "clk.h"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12) static DEFINE_SPINLOCK(reg_lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 13)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 14) static void __iomem *topcrm_base;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 15) static void __iomem *lsp0crpm_base;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 16) static void __iomem *lsp1crpm_base;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 17)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 18) static struct clk *topclk[ZX296702_TOPCLK_END];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 19) static struct clk *lsp0clk[ZX296702_LSP0CLK_END];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 20) static struct clk *lsp1clk[ZX296702_LSP1CLK_END];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 21)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 22) static struct clk_onecell_data topclk_data;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 23) static struct clk_onecell_data lsp0clk_data;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 24) static struct clk_onecell_data lsp1clk_data;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 25)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 26) #define CLK_MUX (topcrm_base + 0x04)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 27) #define CLK_DIV (topcrm_base + 0x08)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 28) #define CLK_EN0 (topcrm_base + 0x0c)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 29) #define CLK_EN1 (topcrm_base + 0x10)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 30) #define VOU_LOCAL_CLKEN (topcrm_base + 0x68)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 31) #define VOU_LOCAL_CLKSEL (topcrm_base + 0x70)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 32) #define VOU_LOCAL_DIV2_SET (topcrm_base + 0x74)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 33) #define CLK_MUX1 (topcrm_base + 0x8c)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 34)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 35) #define CLK_SDMMC1 (lsp0crpm_base + 0x0c)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 36) #define CLK_GPIO (lsp0crpm_base + 0x2c)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 37) #define CLK_SPDIF0 (lsp0crpm_base + 0x10)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 38) #define SPDIF0_DIV (lsp0crpm_base + 0x14)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 39) #define CLK_I2S0 (lsp0crpm_base + 0x18)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 40) #define I2S0_DIV (lsp0crpm_base + 0x1c)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 41) #define CLK_I2S1 (lsp0crpm_base + 0x20)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 42) #define I2S1_DIV (lsp0crpm_base + 0x24)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 43) #define CLK_I2S2 (lsp0crpm_base + 0x34)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 44) #define I2S2_DIV (lsp0crpm_base + 0x38)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 45)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 46) #define CLK_UART0 (lsp1crpm_base + 0x20)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 47) #define CLK_UART1 (lsp1crpm_base + 0x24)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 48) #define CLK_SDMMC0 (lsp1crpm_base + 0x2c)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 49) #define CLK_SPDIF1 (lsp1crpm_base + 0x30)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 50) #define SPDIF1_DIV (lsp1crpm_base + 0x34)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 51)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 52) static const struct zx_pll_config pll_a9_config[] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 53) { .rate = 700000000, .cfg0 = 0x800405d1, .cfg1 = 0x04555555 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 54) { .rate = 800000000, .cfg0 = 0x80040691, .cfg1 = 0x04aaaaaa },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 55) { .rate = 900000000, .cfg0 = 0x80040791, .cfg1 = 0x04000000 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 56) { .rate = 1000000000, .cfg0 = 0x80040851, .cfg1 = 0x04555555 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 57) { .rate = 1100000000, .cfg0 = 0x80040911, .cfg1 = 0x04aaaaaa },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 58) { .rate = 1200000000, .cfg0 = 0x80040a11, .cfg1 = 0x04000000 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 59) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 60)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 61) static const struct clk_div_table main_hlk_div[] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 62) { .val = 1, .div = 2, },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 63) { .val = 3, .div = 4, },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 64) { /* sentinel */ }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 65) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 66)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 67) static const struct clk_div_table a9_as1_aclk_divider[] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 68) { .val = 0, .div = 1, },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 69) { .val = 1, .div = 2, },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 70) { .val = 3, .div = 4, },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 71) { /* sentinel */ }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 72) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 73)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 74) static const struct clk_div_table sec_wclk_divider[] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 75) { .val = 0, .div = 1, },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 76) { .val = 1, .div = 2, },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 77) { .val = 3, .div = 4, },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 78) { .val = 5, .div = 6, },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 79) { .val = 7, .div = 8, },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 80) { /* sentinel */ }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 81) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 82)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 83) static const char * const matrix_aclk_sel[] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 84) "pll_mm0_198M",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 85) "osc",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 86) "clk_148M5",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 87) "pll_lsp_104M",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 88) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 89)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 90) static const char * const a9_wclk_sel[] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 91) "pll_a9",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 92) "osc",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 93) "clk_500",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 94) "clk_250",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 95) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 96)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 97) static const char * const a9_as1_aclk_sel[] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 98) "clk_250",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 99) "osc",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 100) "pll_mm0_396M",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 101) "pll_mac_333M",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 102) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 103)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 104) static const char * const a9_trace_clkin_sel[] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 105) "clk_74M25",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 106) "pll_mm1_108M",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 107) "clk_125",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 108) "clk_148M5",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 109) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 110)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 111) static const char * const decppu_aclk_sel[] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 112) "clk_250",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 113) "pll_mm0_198M",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 114) "pll_lsp_104M",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 115) "pll_audio_294M912",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 116) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 117)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 118) static const char * const vou_main_wclk_sel[] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 119) "clk_148M5",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 120) "clk_74M25",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 121) "clk_27",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 122) "pll_mm1_54M",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 123) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 124)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 125) static const char * const vou_scaler_wclk_sel[] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 126) "clk_250",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 127) "pll_mac_333M",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 128) "pll_audio_294M912",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 129) "pll_mm0_198M",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 130) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 131)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 132) static const char * const r2d_wclk_sel[] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 133) "pll_audio_294M912",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 134) "pll_mac_333M",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 135) "pll_a9_350M",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 136) "pll_mm0_396M",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 137) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 138)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 139) static const char * const ddr_wclk_sel[] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 140) "pll_mac_333M",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 141) "pll_ddr_266M",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 142) "pll_audio_294M912",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 143) "pll_mm0_198M",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 144) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 145)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 146) static const char * const nand_wclk_sel[] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 147) "pll_lsp_104M",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 148) "osc",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 149) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 150)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 151) static const char * const lsp_26_wclk_sel[] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 152) "pll_lsp_26M",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 153) "osc",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 154) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 155)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 156) static const char * const vl0_sel[] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 157) "vou_main_channel_div",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 158) "vou_aux_channel_div",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 159) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 160)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 161) static const char * const hdmi_sel[] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 162) "vou_main_channel_wclk",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 163) "vou_aux_channel_wclk",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 164) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 165)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 166) static const char * const sdmmc0_wclk_sel[] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 167) "lsp1_104M_wclk",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 168) "lsp1_26M_wclk",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 169) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 170)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 171) static const char * const sdmmc1_wclk_sel[] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 172) "lsp0_104M_wclk",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 173) "lsp0_26M_wclk",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 174) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 175)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 176) static const char * const uart_wclk_sel[] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 177) "lsp1_104M_wclk",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 178) "lsp1_26M_wclk",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 179) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 180)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 181) static const char * const spdif0_wclk_sel[] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 182) "lsp0_104M_wclk",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 183) "lsp0_26M_wclk",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 184) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 185)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 186) static const char * const spdif1_wclk_sel[] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 187) "lsp1_104M_wclk",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 188) "lsp1_26M_wclk",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 189) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 190)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 191) static const char * const i2s_wclk_sel[] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 192) "lsp0_104M_wclk",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 193) "lsp0_26M_wclk",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 194) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 195)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 196) static inline struct clk *zx_divtbl(const char *name, const char *parent,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 197) void __iomem *reg, u8 shift, u8 width,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 198) const struct clk_div_table *table)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 199) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 200) return clk_register_divider_table(NULL, name, parent, 0, reg, shift,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 201) width, 0, table, ®_lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 202) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 203)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 204) static inline struct clk *zx_div(const char *name, const char *parent,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 205) void __iomem *reg, u8 shift, u8 width)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 206) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 207) return clk_register_divider(NULL, name, parent, 0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 208) reg, shift, width, 0, ®_lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 209) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 210)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 211) static inline struct clk *zx_mux(const char *name, const char * const *parents,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 212) int num_parents, void __iomem *reg, u8 shift, u8 width)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 213) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 214) return clk_register_mux(NULL, name, parents, num_parents,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 215) 0, reg, shift, width, 0, ®_lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 216) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 217)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 218) static inline struct clk *zx_gate(const char *name, const char *parent,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 219) void __iomem *reg, u8 shift)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 220) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 221) return clk_register_gate(NULL, name, parent, CLK_IGNORE_UNUSED,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 222) reg, shift, CLK_SET_RATE_PARENT, ®_lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 223) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 224)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 225) static void __init zx296702_top_clocks_init(struct device_node *np)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 226) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 227) struct clk **clk = topclk;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 228) int i;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 229)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 230) topcrm_base = of_iomap(np, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 231) WARN_ON(!topcrm_base);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 232)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 233) clk[ZX296702_OSC] =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 234) clk_register_fixed_rate(NULL, "osc", NULL, 0, 30000000);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 235) clk[ZX296702_PLL_A9] =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 236) clk_register_zx_pll("pll_a9", "osc", 0, topcrm_base
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 237) + 0x01c, pll_a9_config,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 238) ARRAY_SIZE(pll_a9_config), ®_lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 239)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 240) /* TODO: pll_a9_350M look like changeble follow a9 pll */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 241) clk[ZX296702_PLL_A9_350M] =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 242) clk_register_fixed_rate(NULL, "pll_a9_350M", "osc", 0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 243) 350000000);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 244) clk[ZX296702_PLL_MAC_1000M] =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 245) clk_register_fixed_rate(NULL, "pll_mac_1000M", "osc", 0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 246) 1000000000);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 247) clk[ZX296702_PLL_MAC_333M] =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 248) clk_register_fixed_rate(NULL, "pll_mac_333M", "osc", 0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 249) 333000000);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 250) clk[ZX296702_PLL_MM0_1188M] =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 251) clk_register_fixed_rate(NULL, "pll_mm0_1188M", "osc", 0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 252) 1188000000);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 253) clk[ZX296702_PLL_MM0_396M] =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 254) clk_register_fixed_rate(NULL, "pll_mm0_396M", "osc", 0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 255) 396000000);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 256) clk[ZX296702_PLL_MM0_198M] =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 257) clk_register_fixed_rate(NULL, "pll_mm0_198M", "osc", 0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 258) 198000000);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 259) clk[ZX296702_PLL_MM1_108M] =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 260) clk_register_fixed_rate(NULL, "pll_mm1_108M", "osc", 0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 261) 108000000);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 262) clk[ZX296702_PLL_MM1_72M] =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 263) clk_register_fixed_rate(NULL, "pll_mm1_72M", "osc", 0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 264) 72000000);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 265) clk[ZX296702_PLL_MM1_54M] =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 266) clk_register_fixed_rate(NULL, "pll_mm1_54M", "osc", 0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 267) 54000000);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 268) clk[ZX296702_PLL_LSP_104M] =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 269) clk_register_fixed_rate(NULL, "pll_lsp_104M", "osc", 0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 270) 104000000);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 271) clk[ZX296702_PLL_LSP_26M] =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 272) clk_register_fixed_rate(NULL, "pll_lsp_26M", "osc", 0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 273) 26000000);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 274) clk[ZX296702_PLL_DDR_266M] =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 275) clk_register_fixed_rate(NULL, "pll_ddr_266M", "osc", 0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 276) 266000000);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 277) clk[ZX296702_PLL_AUDIO_294M912] =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 278) clk_register_fixed_rate(NULL, "pll_audio_294M912", "osc", 0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 279) 294912000);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 280)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 281) /* bus clock */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 282) clk[ZX296702_MATRIX_ACLK] =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 283) zx_mux("matrix_aclk", matrix_aclk_sel,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 284) ARRAY_SIZE(matrix_aclk_sel), CLK_MUX, 2, 2);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 285) clk[ZX296702_MAIN_HCLK] =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 286) zx_divtbl("main_hclk", "matrix_aclk", CLK_DIV, 0, 2,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 287) main_hlk_div);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 288) clk[ZX296702_MAIN_PCLK] =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 289) zx_divtbl("main_pclk", "matrix_aclk", CLK_DIV, 2, 2,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 290) main_hlk_div);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 291)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 292) /* cpu clock */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 293) clk[ZX296702_CLK_500] =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 294) clk_register_fixed_factor(NULL, "clk_500", "pll_mac_1000M", 0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 295) 1, 2);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 296) clk[ZX296702_CLK_250] =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 297) clk_register_fixed_factor(NULL, "clk_250", "pll_mac_1000M", 0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 298) 1, 4);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 299) clk[ZX296702_CLK_125] =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 300) clk_register_fixed_factor(NULL, "clk_125", "clk_250", 0, 1, 2);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 301) clk[ZX296702_CLK_148M5] =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 302) clk_register_fixed_factor(NULL, "clk_148M5", "pll_mm0_1188M", 0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 303) 1, 8);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 304) clk[ZX296702_CLK_74M25] =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 305) clk_register_fixed_factor(NULL, "clk_74M25", "pll_mm0_1188M", 0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 306) 1, 16);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 307) clk[ZX296702_A9_WCLK] =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 308) zx_mux("a9_wclk", a9_wclk_sel, ARRAY_SIZE(a9_wclk_sel), CLK_MUX,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 309) 0, 2);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 310) clk[ZX296702_A9_AS1_ACLK_MUX] =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 311) zx_mux("a9_as1_aclk_mux", a9_as1_aclk_sel,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 312) ARRAY_SIZE(a9_as1_aclk_sel), CLK_MUX, 4, 2);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 313) clk[ZX296702_A9_TRACE_CLKIN_MUX] =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 314) zx_mux("a9_trace_clkin_mux", a9_trace_clkin_sel,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 315) ARRAY_SIZE(a9_trace_clkin_sel), CLK_MUX1, 0, 2);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 316) clk[ZX296702_A9_AS1_ACLK_DIV] =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 317) zx_divtbl("a9_as1_aclk_div", "a9_as1_aclk_mux", CLK_DIV, 4, 2,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 318) a9_as1_aclk_divider);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 319)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 320) /* multi-media clock */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 321) clk[ZX296702_CLK_2] =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 322) clk_register_fixed_factor(NULL, "clk_2", "pll_mm1_72M", 0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 323) 1, 36);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 324) clk[ZX296702_CLK_27] =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 325) clk_register_fixed_factor(NULL, "clk_27", "pll_mm1_54M", 0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 326) 1, 2);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 327) clk[ZX296702_DECPPU_ACLK_MUX] =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 328) zx_mux("decppu_aclk_mux", decppu_aclk_sel,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 329) ARRAY_SIZE(decppu_aclk_sel), CLK_MUX, 6, 2);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 330) clk[ZX296702_PPU_ACLK_MUX] =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 331) zx_mux("ppu_aclk_mux", decppu_aclk_sel,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 332) ARRAY_SIZE(decppu_aclk_sel), CLK_MUX, 8, 2);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 333) clk[ZX296702_MALI400_ACLK_MUX] =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 334) zx_mux("mali400_aclk_mux", decppu_aclk_sel,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 335) ARRAY_SIZE(decppu_aclk_sel), CLK_MUX, 12, 2);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 336) clk[ZX296702_VOU_ACLK_MUX] =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 337) zx_mux("vou_aclk_mux", decppu_aclk_sel,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 338) ARRAY_SIZE(decppu_aclk_sel), CLK_MUX, 10, 2);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 339) clk[ZX296702_VOU_MAIN_WCLK_MUX] =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 340) zx_mux("vou_main_wclk_mux", vou_main_wclk_sel,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 341) ARRAY_SIZE(vou_main_wclk_sel), CLK_MUX, 14, 2);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 342) clk[ZX296702_VOU_AUX_WCLK_MUX] =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 343) zx_mux("vou_aux_wclk_mux", vou_main_wclk_sel,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 344) ARRAY_SIZE(vou_main_wclk_sel), CLK_MUX, 16, 2);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 345) clk[ZX296702_VOU_SCALER_WCLK_MUX] =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 346) zx_mux("vou_scaler_wclk_mux", vou_scaler_wclk_sel,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 347) ARRAY_SIZE(vou_scaler_wclk_sel), CLK_MUX,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 348) 18, 2);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 349) clk[ZX296702_R2D_ACLK_MUX] =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 350) zx_mux("r2d_aclk_mux", decppu_aclk_sel,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 351) ARRAY_SIZE(decppu_aclk_sel), CLK_MUX, 20, 2);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 352) clk[ZX296702_R2D_WCLK_MUX] =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 353) zx_mux("r2d_wclk_mux", r2d_wclk_sel,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 354) ARRAY_SIZE(r2d_wclk_sel), CLK_MUX, 22, 2);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 355)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 356) /* other clock */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 357) clk[ZX296702_CLK_50] =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 358) clk_register_fixed_factor(NULL, "clk_50", "pll_mac_1000M",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 359) 0, 1, 20);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 360) clk[ZX296702_CLK_25] =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 361) clk_register_fixed_factor(NULL, "clk_25", "pll_mac_1000M",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 362) 0, 1, 40);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 363) clk[ZX296702_CLK_12] =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 364) clk_register_fixed_factor(NULL, "clk_12", "pll_mm1_72M",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 365) 0, 1, 6);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 366) clk[ZX296702_CLK_16M384] =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 367) clk_register_fixed_factor(NULL, "clk_16M384",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 368) "pll_audio_294M912", 0, 1, 18);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 369) clk[ZX296702_CLK_32K768] =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 370) clk_register_fixed_factor(NULL, "clk_32K768", "clk_16M384",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 371) 0, 1, 500);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 372) clk[ZX296702_SEC_WCLK_DIV] =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 373) zx_divtbl("sec_wclk_div", "pll_lsp_104M", CLK_DIV, 6, 3,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 374) sec_wclk_divider);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 375) clk[ZX296702_DDR_WCLK_MUX] =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 376) zx_mux("ddr_wclk_mux", ddr_wclk_sel,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 377) ARRAY_SIZE(ddr_wclk_sel), CLK_MUX, 24, 2);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 378) clk[ZX296702_NAND_WCLK_MUX] =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 379) zx_mux("nand_wclk_mux", nand_wclk_sel,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 380) ARRAY_SIZE(nand_wclk_sel), CLK_MUX, 24, 2);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 381) clk[ZX296702_LSP_26_WCLK_MUX] =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 382) zx_mux("lsp_26_wclk_mux", lsp_26_wclk_sel,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 383) ARRAY_SIZE(lsp_26_wclk_sel), CLK_MUX, 27, 1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 384)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 385) /* gates */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 386) clk[ZX296702_A9_AS0_ACLK] =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 387) zx_gate("a9_as0_aclk", "matrix_aclk", CLK_EN0, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 388) clk[ZX296702_A9_AS1_ACLK] =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 389) zx_gate("a9_as1_aclk", "a9_as1_aclk_div", CLK_EN0, 1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 390) clk[ZX296702_A9_TRACE_CLKIN] =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 391) zx_gate("a9_trace_clkin", "a9_trace_clkin_mux", CLK_EN0, 2);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 392) clk[ZX296702_DECPPU_AXI_M_ACLK] =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 393) zx_gate("decppu_axi_m_aclk", "decppu_aclk_mux", CLK_EN0, 3);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 394) clk[ZX296702_DECPPU_AHB_S_HCLK] =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 395) zx_gate("decppu_ahb_s_hclk", "main_hclk", CLK_EN0, 4);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 396) clk[ZX296702_PPU_AXI_M_ACLK] =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 397) zx_gate("ppu_axi_m_aclk", "ppu_aclk_mux", CLK_EN0, 5);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 398) clk[ZX296702_PPU_AHB_S_HCLK] =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 399) zx_gate("ppu_ahb_s_hclk", "main_hclk", CLK_EN0, 6);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 400) clk[ZX296702_VOU_AXI_M_ACLK] =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 401) zx_gate("vou_axi_m_aclk", "vou_aclk_mux", CLK_EN0, 7);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 402) clk[ZX296702_VOU_APB_PCLK] =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 403) zx_gate("vou_apb_pclk", "main_pclk", CLK_EN0, 8);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 404) clk[ZX296702_VOU_MAIN_CHANNEL_WCLK] =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 405) zx_gate("vou_main_channel_wclk", "vou_main_wclk_mux",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 406) CLK_EN0, 9);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 407) clk[ZX296702_VOU_AUX_CHANNEL_WCLK] =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 408) zx_gate("vou_aux_channel_wclk", "vou_aux_wclk_mux",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 409) CLK_EN0, 10);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 410) clk[ZX296702_VOU_HDMI_OSCLK_CEC] =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 411) zx_gate("vou_hdmi_osclk_cec", "clk_2", CLK_EN0, 11);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 412) clk[ZX296702_VOU_SCALER_WCLK] =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 413) zx_gate("vou_scaler_wclk", "vou_scaler_wclk_mux", CLK_EN0, 12);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 414) clk[ZX296702_MALI400_AXI_M_ACLK] =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 415) zx_gate("mali400_axi_m_aclk", "mali400_aclk_mux", CLK_EN0, 13);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 416) clk[ZX296702_MALI400_APB_PCLK] =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 417) zx_gate("mali400_apb_pclk", "main_pclk", CLK_EN0, 14);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 418) clk[ZX296702_R2D_WCLK] =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 419) zx_gate("r2d_wclk", "r2d_wclk_mux", CLK_EN0, 15);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 420) clk[ZX296702_R2D_AXI_M_ACLK] =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 421) zx_gate("r2d_axi_m_aclk", "r2d_aclk_mux", CLK_EN0, 16);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 422) clk[ZX296702_R2D_AHB_HCLK] =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 423) zx_gate("r2d_ahb_hclk", "main_hclk", CLK_EN0, 17);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 424) clk[ZX296702_DDR3_AXI_S0_ACLK] =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 425) zx_gate("ddr3_axi_s0_aclk", "matrix_aclk", CLK_EN0, 18);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 426) clk[ZX296702_DDR3_APB_PCLK] =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 427) zx_gate("ddr3_apb_pclk", "main_pclk", CLK_EN0, 19);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 428) clk[ZX296702_DDR3_WCLK] =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 429) zx_gate("ddr3_wclk", "ddr_wclk_mux", CLK_EN0, 20);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 430) clk[ZX296702_USB20_0_AHB_HCLK] =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 431) zx_gate("usb20_0_ahb_hclk", "main_hclk", CLK_EN0, 21);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 432) clk[ZX296702_USB20_0_EXTREFCLK] =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 433) zx_gate("usb20_0_extrefclk", "clk_12", CLK_EN0, 22);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 434) clk[ZX296702_USB20_1_AHB_HCLK] =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 435) zx_gate("usb20_1_ahb_hclk", "main_hclk", CLK_EN0, 23);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 436) clk[ZX296702_USB20_1_EXTREFCLK] =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 437) zx_gate("usb20_1_extrefclk", "clk_12", CLK_EN0, 24);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 438) clk[ZX296702_USB20_2_AHB_HCLK] =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 439) zx_gate("usb20_2_ahb_hclk", "main_hclk", CLK_EN0, 25);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 440) clk[ZX296702_USB20_2_EXTREFCLK] =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 441) zx_gate("usb20_2_extrefclk", "clk_12", CLK_EN0, 26);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 442) clk[ZX296702_GMAC_AXI_M_ACLK] =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 443) zx_gate("gmac_axi_m_aclk", "matrix_aclk", CLK_EN0, 27);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 444) clk[ZX296702_GMAC_APB_PCLK] =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 445) zx_gate("gmac_apb_pclk", "main_pclk", CLK_EN0, 28);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 446) clk[ZX296702_GMAC_125_CLKIN] =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 447) zx_gate("gmac_125_clkin", "clk_125", CLK_EN0, 29);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 448) clk[ZX296702_GMAC_RMII_CLKIN] =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 449) zx_gate("gmac_rmii_clkin", "clk_50", CLK_EN0, 30);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 450) clk[ZX296702_GMAC_25M_CLK] =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 451) zx_gate("gmac_25M_clk", "clk_25", CLK_EN0, 31);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 452) clk[ZX296702_NANDFLASH_AHB_HCLK] =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 453) zx_gate("nandflash_ahb_hclk", "main_hclk", CLK_EN1, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 454) clk[ZX296702_NANDFLASH_WCLK] =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 455) zx_gate("nandflash_wclk", "nand_wclk_mux", CLK_EN1, 1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 456) clk[ZX296702_LSP0_APB_PCLK] =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 457) zx_gate("lsp0_apb_pclk", "main_pclk", CLK_EN1, 2);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 458) clk[ZX296702_LSP0_AHB_HCLK] =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 459) zx_gate("lsp0_ahb_hclk", "main_hclk", CLK_EN1, 3);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 460) clk[ZX296702_LSP0_26M_WCLK] =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 461) zx_gate("lsp0_26M_wclk", "lsp_26_wclk_mux", CLK_EN1, 4);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 462) clk[ZX296702_LSP0_104M_WCLK] =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 463) zx_gate("lsp0_104M_wclk", "pll_lsp_104M", CLK_EN1, 5);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 464) clk[ZX296702_LSP0_16M384_WCLK] =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 465) zx_gate("lsp0_16M384_wclk", "clk_16M384", CLK_EN1, 6);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 466) clk[ZX296702_LSP1_APB_PCLK] =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 467) zx_gate("lsp1_apb_pclk", "main_pclk", CLK_EN1, 7);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 468) /* FIXME: wclk enable bit is bit8. We hack it as reserved 31 for
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 469) * UART does not work after parent clk is disabled/enabled */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 470) clk[ZX296702_LSP1_26M_WCLK] =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 471) zx_gate("lsp1_26M_wclk", "lsp_26_wclk_mux", CLK_EN1, 31);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 472) clk[ZX296702_LSP1_104M_WCLK] =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 473) zx_gate("lsp1_104M_wclk", "pll_lsp_104M", CLK_EN1, 9);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 474) clk[ZX296702_LSP1_32K_CLK] =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 475) zx_gate("lsp1_32K_clk", "clk_32K768", CLK_EN1, 10);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 476) clk[ZX296702_AON_HCLK] =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 477) zx_gate("aon_hclk", "main_hclk", CLK_EN1, 11);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 478) clk[ZX296702_SYS_CTRL_PCLK] =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 479) zx_gate("sys_ctrl_pclk", "main_pclk", CLK_EN1, 12);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 480) clk[ZX296702_DMA_PCLK] =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 481) zx_gate("dma_pclk", "main_pclk", CLK_EN1, 13);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 482) clk[ZX296702_DMA_ACLK] =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 483) zx_gate("dma_aclk", "matrix_aclk", CLK_EN1, 14);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 484) clk[ZX296702_SEC_HCLK] =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 485) zx_gate("sec_hclk", "main_hclk", CLK_EN1, 15);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 486) clk[ZX296702_AES_WCLK] =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 487) zx_gate("aes_wclk", "sec_wclk_div", CLK_EN1, 16);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 488) clk[ZX296702_DES_WCLK] =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 489) zx_gate("des_wclk", "sec_wclk_div", CLK_EN1, 17);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 490) clk[ZX296702_IRAM_ACLK] =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 491) zx_gate("iram_aclk", "matrix_aclk", CLK_EN1, 18);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 492) clk[ZX296702_IROM_ACLK] =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 493) zx_gate("irom_aclk", "matrix_aclk", CLK_EN1, 19);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 494) clk[ZX296702_BOOT_CTRL_HCLK] =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 495) zx_gate("boot_ctrl_hclk", "main_hclk", CLK_EN1, 20);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 496) clk[ZX296702_EFUSE_CLK_30] =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 497) zx_gate("efuse_clk_30", "osc", CLK_EN1, 21);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 498)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 499) /* TODO: add VOU Local clocks */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 500) clk[ZX296702_VOU_MAIN_CHANNEL_DIV] =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 501) zx_div("vou_main_channel_div", "vou_main_channel_wclk",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 502) VOU_LOCAL_DIV2_SET, 1, 1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 503) clk[ZX296702_VOU_AUX_CHANNEL_DIV] =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 504) zx_div("vou_aux_channel_div", "vou_aux_channel_wclk",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 505) VOU_LOCAL_DIV2_SET, 0, 1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 506) clk[ZX296702_VOU_TV_ENC_HD_DIV] =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 507) zx_div("vou_tv_enc_hd_div", "vou_tv_enc_hd_mux",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 508) VOU_LOCAL_DIV2_SET, 3, 1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 509) clk[ZX296702_VOU_TV_ENC_SD_DIV] =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 510) zx_div("vou_tv_enc_sd_div", "vou_tv_enc_sd_mux",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 511) VOU_LOCAL_DIV2_SET, 2, 1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 512) clk[ZX296702_VL0_MUX] =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 513) zx_mux("vl0_mux", vl0_sel, ARRAY_SIZE(vl0_sel),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 514) VOU_LOCAL_CLKSEL, 8, 1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 515) clk[ZX296702_VL1_MUX] =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 516) zx_mux("vl1_mux", vl0_sel, ARRAY_SIZE(vl0_sel),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 517) VOU_LOCAL_CLKSEL, 9, 1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 518) clk[ZX296702_VL2_MUX] =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 519) zx_mux("vl2_mux", vl0_sel, ARRAY_SIZE(vl0_sel),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 520) VOU_LOCAL_CLKSEL, 10, 1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 521) clk[ZX296702_GL0_MUX] =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 522) zx_mux("gl0_mux", vl0_sel, ARRAY_SIZE(vl0_sel),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 523) VOU_LOCAL_CLKSEL, 5, 1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 524) clk[ZX296702_GL1_MUX] =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 525) zx_mux("gl1_mux", vl0_sel, ARRAY_SIZE(vl0_sel),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 526) VOU_LOCAL_CLKSEL, 6, 1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 527) clk[ZX296702_GL2_MUX] =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 528) zx_mux("gl2_mux", vl0_sel, ARRAY_SIZE(vl0_sel),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 529) VOU_LOCAL_CLKSEL, 7, 1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 530) clk[ZX296702_WB_MUX] =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 531) zx_mux("wb_mux", vl0_sel, ARRAY_SIZE(vl0_sel),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 532) VOU_LOCAL_CLKSEL, 11, 1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 533) clk[ZX296702_HDMI_MUX] =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 534) zx_mux("hdmi_mux", hdmi_sel, ARRAY_SIZE(hdmi_sel),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 535) VOU_LOCAL_CLKSEL, 4, 1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 536) clk[ZX296702_VOU_TV_ENC_HD_MUX] =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 537) zx_mux("vou_tv_enc_hd_mux", hdmi_sel, ARRAY_SIZE(hdmi_sel),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 538) VOU_LOCAL_CLKSEL, 3, 1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 539) clk[ZX296702_VOU_TV_ENC_SD_MUX] =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 540) zx_mux("vou_tv_enc_sd_mux", hdmi_sel, ARRAY_SIZE(hdmi_sel),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 541) VOU_LOCAL_CLKSEL, 2, 1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 542) clk[ZX296702_VL0_CLK] =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 543) zx_gate("vl0_clk", "vl0_mux", VOU_LOCAL_CLKEN, 8);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 544) clk[ZX296702_VL1_CLK] =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 545) zx_gate("vl1_clk", "vl1_mux", VOU_LOCAL_CLKEN, 9);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 546) clk[ZX296702_VL2_CLK] =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 547) zx_gate("vl2_clk", "vl2_mux", VOU_LOCAL_CLKEN, 10);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 548) clk[ZX296702_GL0_CLK] =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 549) zx_gate("gl0_clk", "gl0_mux", VOU_LOCAL_CLKEN, 5);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 550) clk[ZX296702_GL1_CLK] =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 551) zx_gate("gl1_clk", "gl1_mux", VOU_LOCAL_CLKEN, 6);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 552) clk[ZX296702_GL2_CLK] =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 553) zx_gate("gl2_clk", "gl2_mux", VOU_LOCAL_CLKEN, 7);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 554) clk[ZX296702_WB_CLK] =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 555) zx_gate("wb_clk", "wb_mux", VOU_LOCAL_CLKEN, 11);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 556) clk[ZX296702_CL_CLK] =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 557) zx_gate("cl_clk", "vou_main_channel_div", VOU_LOCAL_CLKEN, 12);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 558) clk[ZX296702_MAIN_MIX_CLK] =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 559) zx_gate("main_mix_clk", "vou_main_channel_div",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 560) VOU_LOCAL_CLKEN, 4);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 561) clk[ZX296702_AUX_MIX_CLK] =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 562) zx_gate("aux_mix_clk", "vou_aux_channel_div",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 563) VOU_LOCAL_CLKEN, 3);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 564) clk[ZX296702_HDMI_CLK] =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 565) zx_gate("hdmi_clk", "hdmi_mux", VOU_LOCAL_CLKEN, 2);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 566) clk[ZX296702_VOU_TV_ENC_HD_DAC_CLK] =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 567) zx_gate("vou_tv_enc_hd_dac_clk", "vou_tv_enc_hd_div",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 568) VOU_LOCAL_CLKEN, 1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 569) clk[ZX296702_VOU_TV_ENC_SD_DAC_CLK] =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 570) zx_gate("vou_tv_enc_sd_dac_clk", "vou_tv_enc_sd_div",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 571) VOU_LOCAL_CLKEN, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 572)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 573) /* CA9 PERIPHCLK = a9_wclk / 2 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 574) clk[ZX296702_A9_PERIPHCLK] =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 575) clk_register_fixed_factor(NULL, "a9_periphclk", "a9_wclk",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 576) 0, 1, 2);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 577)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 578) for (i = 0; i < ARRAY_SIZE(topclk); i++) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 579) if (IS_ERR(clk[i])) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 580) pr_err("zx296702 clk %d: register failed with %ld\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 581) i, PTR_ERR(clk[i]));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 582) return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 583) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 584) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 585)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 586) topclk_data.clks = topclk;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 587) topclk_data.clk_num = ARRAY_SIZE(topclk);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 588) of_clk_add_provider(np, of_clk_src_onecell_get, &topclk_data);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 589) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 590) CLK_OF_DECLARE(zx296702_top_clk, "zte,zx296702-topcrm-clk",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 591) zx296702_top_clocks_init);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 592)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 593) static void __init zx296702_lsp0_clocks_init(struct device_node *np)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 594) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 595) struct clk **clk = lsp0clk;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 596) int i;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 597)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 598) lsp0crpm_base = of_iomap(np, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 599) WARN_ON(!lsp0crpm_base);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 600)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 601) /* SDMMC1 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 602) clk[ZX296702_SDMMC1_WCLK_MUX] =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 603) zx_mux("sdmmc1_wclk_mux", sdmmc1_wclk_sel,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 604) ARRAY_SIZE(sdmmc1_wclk_sel), CLK_SDMMC1, 4, 1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 605) clk[ZX296702_SDMMC1_WCLK_DIV] =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 606) zx_div("sdmmc1_wclk_div", "sdmmc1_wclk_mux", CLK_SDMMC1, 12, 4);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 607) clk[ZX296702_SDMMC1_WCLK] =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 608) zx_gate("sdmmc1_wclk", "sdmmc1_wclk_div", CLK_SDMMC1, 1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 609) clk[ZX296702_SDMMC1_PCLK] =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 610) zx_gate("sdmmc1_pclk", "lsp0_apb_pclk", CLK_SDMMC1, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 611)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 612) clk[ZX296702_GPIO_CLK] =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 613) zx_gate("gpio_clk", "lsp0_apb_pclk", CLK_GPIO, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 614)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 615) /* SPDIF */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 616) clk[ZX296702_SPDIF0_WCLK_MUX] =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 617) zx_mux("spdif0_wclk_mux", spdif0_wclk_sel,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 618) ARRAY_SIZE(spdif0_wclk_sel), CLK_SPDIF0, 4, 1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 619) clk[ZX296702_SPDIF0_WCLK] =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 620) zx_gate("spdif0_wclk", "spdif0_wclk_mux", CLK_SPDIF0, 1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 621) clk[ZX296702_SPDIF0_PCLK] =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 622) zx_gate("spdif0_pclk", "lsp0_apb_pclk", CLK_SPDIF0, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 623)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 624) clk[ZX296702_SPDIF0_DIV] =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 625) clk_register_zx_audio("spdif0_div", "spdif0_wclk", 0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 626) SPDIF0_DIV);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 627)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 628) /* I2S */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 629) clk[ZX296702_I2S0_WCLK_MUX] =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 630) zx_mux("i2s0_wclk_mux", i2s_wclk_sel,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 631) ARRAY_SIZE(i2s_wclk_sel), CLK_I2S0, 4, 1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 632) clk[ZX296702_I2S0_WCLK] =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 633) zx_gate("i2s0_wclk", "i2s0_wclk_mux", CLK_I2S0, 1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 634) clk[ZX296702_I2S0_PCLK] =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 635) zx_gate("i2s0_pclk", "lsp0_apb_pclk", CLK_I2S0, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 636)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 637) clk[ZX296702_I2S0_DIV] =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 638) clk_register_zx_audio("i2s0_div", "i2s0_wclk", 0, I2S0_DIV);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 639)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 640) clk[ZX296702_I2S1_WCLK_MUX] =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 641) zx_mux("i2s1_wclk_mux", i2s_wclk_sel,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 642) ARRAY_SIZE(i2s_wclk_sel), CLK_I2S1, 4, 1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 643) clk[ZX296702_I2S1_WCLK] =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 644) zx_gate("i2s1_wclk", "i2s1_wclk_mux", CLK_I2S1, 1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 645) clk[ZX296702_I2S1_PCLK] =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 646) zx_gate("i2s1_pclk", "lsp0_apb_pclk", CLK_I2S1, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 647)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 648) clk[ZX296702_I2S1_DIV] =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 649) clk_register_zx_audio("i2s1_div", "i2s1_wclk", 0, I2S1_DIV);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 650)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 651) clk[ZX296702_I2S2_WCLK_MUX] =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 652) zx_mux("i2s2_wclk_mux", i2s_wclk_sel,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 653) ARRAY_SIZE(i2s_wclk_sel), CLK_I2S2, 4, 1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 654) clk[ZX296702_I2S2_WCLK] =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 655) zx_gate("i2s2_wclk", "i2s2_wclk_mux", CLK_I2S2, 1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 656) clk[ZX296702_I2S2_PCLK] =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 657) zx_gate("i2s2_pclk", "lsp0_apb_pclk", CLK_I2S2, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 658)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 659) clk[ZX296702_I2S2_DIV] =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 660) clk_register_zx_audio("i2s2_div", "i2s2_wclk", 0, I2S2_DIV);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 661)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 662) for (i = 0; i < ARRAY_SIZE(lsp0clk); i++) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 663) if (IS_ERR(clk[i])) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 664) pr_err("zx296702 clk %d: register failed with %ld\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 665) i, PTR_ERR(clk[i]));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 666) return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 667) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 668) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 669)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 670) lsp0clk_data.clks = lsp0clk;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 671) lsp0clk_data.clk_num = ARRAY_SIZE(lsp0clk);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 672) of_clk_add_provider(np, of_clk_src_onecell_get, &lsp0clk_data);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 673) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 674) CLK_OF_DECLARE(zx296702_lsp0_clk, "zte,zx296702-lsp0crpm-clk",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 675) zx296702_lsp0_clocks_init);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 676)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 677) static void __init zx296702_lsp1_clocks_init(struct device_node *np)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 678) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 679) struct clk **clk = lsp1clk;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 680) int i;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 681)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 682) lsp1crpm_base = of_iomap(np, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 683) WARN_ON(!lsp1crpm_base);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 684)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 685) /* UART0 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 686) clk[ZX296702_UART0_WCLK_MUX] =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 687) zx_mux("uart0_wclk_mux", uart_wclk_sel,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 688) ARRAY_SIZE(uart_wclk_sel), CLK_UART0, 4, 1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 689) /* FIXME: uart wclk enable bit is bit1 in. We hack it as reserved 31 for
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 690) * UART does not work after parent clk is disabled/enabled */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 691) clk[ZX296702_UART0_WCLK] =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 692) zx_gate("uart0_wclk", "uart0_wclk_mux", CLK_UART0, 31);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 693) clk[ZX296702_UART0_PCLK] =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 694) zx_gate("uart0_pclk", "lsp1_apb_pclk", CLK_UART0, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 695)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 696) /* UART1 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 697) clk[ZX296702_UART1_WCLK_MUX] =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 698) zx_mux("uart1_wclk_mux", uart_wclk_sel,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 699) ARRAY_SIZE(uart_wclk_sel), CLK_UART1, 4, 1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 700) clk[ZX296702_UART1_WCLK] =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 701) zx_gate("uart1_wclk", "uart1_wclk_mux", CLK_UART1, 1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 702) clk[ZX296702_UART1_PCLK] =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 703) zx_gate("uart1_pclk", "lsp1_apb_pclk", CLK_UART1, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 704)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 705) /* SDMMC0 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 706) clk[ZX296702_SDMMC0_WCLK_MUX] =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 707) zx_mux("sdmmc0_wclk_mux", sdmmc0_wclk_sel,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 708) ARRAY_SIZE(sdmmc0_wclk_sel), CLK_SDMMC0, 4, 1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 709) clk[ZX296702_SDMMC0_WCLK_DIV] =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 710) zx_div("sdmmc0_wclk_div", "sdmmc0_wclk_mux", CLK_SDMMC0, 12, 4);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 711) clk[ZX296702_SDMMC0_WCLK] =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 712) zx_gate("sdmmc0_wclk", "sdmmc0_wclk_div", CLK_SDMMC0, 1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 713) clk[ZX296702_SDMMC0_PCLK] =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 714) zx_gate("sdmmc0_pclk", "lsp1_apb_pclk", CLK_SDMMC0, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 715)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 716) clk[ZX296702_SPDIF1_WCLK_MUX] =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 717) zx_mux("spdif1_wclk_mux", spdif1_wclk_sel,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 718) ARRAY_SIZE(spdif1_wclk_sel), CLK_SPDIF1, 4, 1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 719) clk[ZX296702_SPDIF1_WCLK] =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 720) zx_gate("spdif1_wclk", "spdif1_wclk_mux", CLK_SPDIF1, 1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 721) clk[ZX296702_SPDIF1_PCLK] =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 722) zx_gate("spdif1_pclk", "lsp1_apb_pclk", CLK_SPDIF1, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 723)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 724) clk[ZX296702_SPDIF1_DIV] =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 725) clk_register_zx_audio("spdif1_div", "spdif1_wclk", 0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 726) SPDIF1_DIV);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 727)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 728) for (i = 0; i < ARRAY_SIZE(lsp1clk); i++) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 729) if (IS_ERR(clk[i])) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 730) pr_err("zx296702 clk %d: register failed with %ld\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 731) i, PTR_ERR(clk[i]));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 732) return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 733) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 734) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 735)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 736) lsp1clk_data.clks = lsp1clk;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 737) lsp1clk_data.clk_num = ARRAY_SIZE(lsp1clk);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 738) of_clk_add_provider(np, of_clk_src_onecell_get, &lsp1clk_data);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 739) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 740) CLK_OF_DECLARE(zx296702_lsp1_clk, "zte,zx296702-lsp1crpm-clk",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 741) zx296702_lsp1_clocks_init);