Back to home page

OSCL-LXR

 
 

    


0001 // SPDX-License-Identifier: GPL-2.0
0002 /*
0003  * Copyright (c) 2001-2021, Huawei Tech. Co., Ltd.
0004  * Author: chenjun <chenjun14@huawei.com>
0005  *
0006  * Copyright (c) 2018, Linaro Ltd.
0007  * Author: Manivannan Sadhasivam <manivannan.sadhasivam@linaro.org>
0008  */
0009 
0010 #include <dt-bindings/clock/hi3670-clock.h>
0011 #include <linux/clk-provider.h>
0012 #include <linux/of_device.h>
0013 #include <linux/platform_device.h>
0014 #include "clk.h"
0015 
0016 static const struct hisi_fixed_rate_clock hi3670_fixed_rate_clks[] = {
0017     { HI3670_CLKIN_SYS, "clkin_sys", NULL, 0, 19200000, },
0018     { HI3670_CLKIN_REF, "clkin_ref", NULL, 0, 32764, },
0019     { HI3670_CLK_FLL_SRC, "clk_fll_src", NULL, 0, 134400000, },
0020     { HI3670_CLK_PPLL0, "clk_ppll0", NULL, 0, 1660000000, },
0021     { HI3670_CLK_PPLL1, "clk_ppll1", NULL, 0, 1866000000, },
0022     { HI3670_CLK_PPLL2, "clk_ppll2", NULL, 0, 1920000000, },
0023     { HI3670_CLK_PPLL3, "clk_ppll3", NULL, 0, 1200000000, },
0024     { HI3670_CLK_PPLL4, "clk_ppll4", NULL, 0, 900000000, },
0025     { HI3670_CLK_PPLL6, "clk_ppll6", NULL, 0, 393216000, },
0026     { HI3670_CLK_PPLL7, "clk_ppll7", NULL, 0, 1008000000, },
0027     { HI3670_CLK_PPLL_PCIE, "clk_ppll_pcie", NULL, 0, 100000000, },
0028     { HI3670_CLK_PCIEPLL_REV, "clk_pciepll_rev", NULL, 0, 100000000, },
0029     { HI3670_CLK_SCPLL, "clk_scpll", NULL, 0, 245760000, },
0030     { HI3670_PCLK, "pclk", NULL, 0, 20000000, },
0031     { HI3670_CLK_UART0_DBG, "clk_uart0_dbg", NULL, 0, 19200000, },
0032     { HI3670_CLK_UART6, "clk_uart6", NULL, 0, 19200000, },
0033     { HI3670_OSC32K, "osc32k", NULL, 0, 32764, },
0034     { HI3670_OSC19M, "osc19m", NULL, 0, 19200000, },
0035     { HI3670_CLK_480M, "clk_480m", NULL, 0, 480000000, },
0036     { HI3670_CLK_INVALID, "clk_invalid", NULL, 0, 10000000, },
0037 };
0038 
0039 /* crgctrl */
0040 static const struct hisi_fixed_factor_clock hi3670_crg_fixed_factor_clks[] = {
0041     { HI3670_CLK_DIV_SYSBUS, "clk_div_sysbus", "clk_mux_sysbus",
0042       1, 7, 0, },
0043     { HI3670_CLK_FACTOR_MMC, "clk_factor_mmc", "clkin_sys",
0044       1, 6, 0, },
0045     { HI3670_CLK_SD_SYS, "clk_sd_sys", "clk_sd_sys_gt",
0046       1, 6, 0, },
0047     { HI3670_CLK_SDIO_SYS, "clk_sdio_sys", "clk_sdio_sys_gt",
0048       1, 6, 0, },
0049     { HI3670_CLK_DIV_A53HPM, "clk_div_a53hpm", "clk_a53hpm_andgt",
0050       1, 4, 0, },
0051     { HI3670_CLK_DIV_320M, "clk_div_320m", "clk_320m_pll_gt",
0052       1, 5, 0, },
0053     { HI3670_PCLK_GATE_UART0, "pclk_gate_uart0", "clk_mux_uartl",
0054       1, 1, 0, },
0055     { HI3670_CLK_FACTOR_UART0, "clk_factor_uart0", "clk_mux_uart0",
0056       1, 1, 0, },
0057     { HI3670_CLK_FACTOR_USB3PHY_PLL, "clk_factor_usb3phy_pll", "clk_ppll0",
0058       1, 60, 0, },
0059     { HI3670_CLK_GATE_ABB_USB, "clk_gate_abb_usb", "clk_gate_usb_tcxo_en",
0060       1, 1, 0, },
0061     { HI3670_CLK_GATE_UFSPHY_REF, "clk_gate_ufsphy_ref", "clkin_sys",
0062       1, 1, 0, },
0063     { HI3670_ICS_VOLT_HIGH, "ics_volt_high", "peri_volt_hold",
0064       1, 1, 0, },
0065     { HI3670_ICS_VOLT_MIDDLE, "ics_volt_middle", "peri_volt_middle",
0066       1, 1, 0, },
0067     { HI3670_VENC_VOLT_HOLD, "venc_volt_hold", "peri_volt_hold",
0068       1, 1, 0, },
0069     { HI3670_VDEC_VOLT_HOLD, "vdec_volt_hold", "peri_volt_hold",
0070       1, 1, 0, },
0071     { HI3670_EDC_VOLT_HOLD, "edc_volt_hold", "peri_volt_hold",
0072       1, 1, 0, },
0073     { HI3670_CLK_ISP_SNCLK_FAC, "clk_isp_snclk_fac", "clk_isp_snclk_angt",
0074       1, 10, 0, },
0075     { HI3670_CLK_FACTOR_RXDPHY, "clk_factor_rxdphy", "clk_andgt_rxdphy",
0076       1, 6, 0, },
0077 };
0078 
0079 static const struct hisi_gate_clock hi3670_crgctrl_gate_sep_clks[] = {
0080     { HI3670_PPLL1_EN_ACPU, "ppll1_en_acpu", "clk_ppll1",
0081       CLK_SET_RATE_PARENT, 0x0, 0, 0, },
0082     { HI3670_PPLL2_EN_ACPU, "ppll2_en_acpu", "clk_ppll2",
0083       CLK_SET_RATE_PARENT, 0x0, 3, 0, },
0084     { HI3670_PPLL3_EN_ACPU, "ppll3_en_acpu", "clk_ppll3",
0085       CLK_SET_RATE_PARENT, 0x0, 27, 0, },
0086     { HI3670_PPLL1_GT_CPU, "ppll1_gt_cpu", "clk_ppll1",
0087       CLK_SET_RATE_PARENT, 0x460, 16, 0, },
0088     { HI3670_PPLL2_GT_CPU, "ppll2_gt_cpu", "clk_ppll2",
0089       CLK_SET_RATE_PARENT, 0x460, 18, 0, },
0090     { HI3670_PPLL3_GT_CPU, "ppll3_gt_cpu", "clk_ppll3",
0091       CLK_SET_RATE_PARENT, 0x460, 20, 0, },
0092     { HI3670_CLK_GATE_PPLL2_MEDIA, "clk_gate_ppll2_media", "clk_ppll2",
0093       CLK_SET_RATE_PARENT, 0x410, 27, 0, },
0094     { HI3670_CLK_GATE_PPLL3_MEDIA, "clk_gate_ppll3_media", "clk_ppll3",
0095       CLK_SET_RATE_PARENT, 0x410, 28, 0, },
0096     { HI3670_CLK_GATE_PPLL4_MEDIA, "clk_gate_ppll4_media", "clk_ppll4",
0097       CLK_SET_RATE_PARENT, 0x410, 26, 0, },
0098     { HI3670_CLK_GATE_PPLL6_MEDIA, "clk_gate_ppll6_media", "clk_ppll6",
0099       CLK_SET_RATE_PARENT, 0x410, 30, 0, },
0100     { HI3670_CLK_GATE_PPLL7_MEDIA, "clk_gate_ppll7_media", "clk_ppll7",
0101       CLK_SET_RATE_PARENT, 0x410, 29, 0, },
0102     { HI3670_PCLK_GPIO0, "pclk_gpio0", "clk_div_cfgbus",
0103       CLK_SET_RATE_PARENT, 0x10, 0, 0, },
0104     { HI3670_PCLK_GPIO1, "pclk_gpio1", "clk_div_cfgbus",
0105       CLK_SET_RATE_PARENT, 0x10, 1, 0, },
0106     { HI3670_PCLK_GPIO2, "pclk_gpio2", "clk_div_cfgbus",
0107       CLK_SET_RATE_PARENT, 0x10, 2, 0, },
0108     { HI3670_PCLK_GPIO3, "pclk_gpio3", "clk_div_cfgbus",
0109       CLK_SET_RATE_PARENT, 0x10, 3, 0, },
0110     { HI3670_PCLK_GPIO4, "pclk_gpio4", "clk_div_cfgbus",
0111       CLK_SET_RATE_PARENT, 0x10, 4, 0, },
0112     { HI3670_PCLK_GPIO5, "pclk_gpio5", "clk_div_cfgbus",
0113       CLK_SET_RATE_PARENT, 0x10, 5, 0, },
0114     { HI3670_PCLK_GPIO6, "pclk_gpio6", "clk_div_cfgbus",
0115       CLK_SET_RATE_PARENT, 0x10, 6, 0, },
0116     { HI3670_PCLK_GPIO7, "pclk_gpio7", "clk_div_cfgbus",
0117       CLK_SET_RATE_PARENT, 0x10, 7, 0, },
0118     { HI3670_PCLK_GPIO8, "pclk_gpio8", "clk_div_cfgbus",
0119       CLK_SET_RATE_PARENT, 0x10, 8, 0, },
0120     { HI3670_PCLK_GPIO9, "pclk_gpio9", "clk_div_cfgbus",
0121       CLK_SET_RATE_PARENT, 0x10, 9, 0, },
0122     { HI3670_PCLK_GPIO10, "pclk_gpio10", "clk_div_cfgbus",
0123       CLK_SET_RATE_PARENT, 0x10, 10, 0, },
0124     { HI3670_PCLK_GPIO11, "pclk_gpio11", "clk_div_cfgbus",
0125       CLK_SET_RATE_PARENT, 0x10, 11, 0, },
0126     { HI3670_PCLK_GPIO12, "pclk_gpio12", "clk_div_cfgbus",
0127       CLK_SET_RATE_PARENT, 0x10, 12, 0, },
0128     { HI3670_PCLK_GPIO13, "pclk_gpio13", "clk_div_cfgbus",
0129       CLK_SET_RATE_PARENT, 0x10, 13, 0, },
0130     { HI3670_PCLK_GPIO14, "pclk_gpio14", "clk_div_cfgbus",
0131       CLK_SET_RATE_PARENT, 0x10, 14, 0, },
0132     { HI3670_PCLK_GPIO15, "pclk_gpio15", "clk_div_cfgbus",
0133       CLK_SET_RATE_PARENT, 0x10, 15, 0, },
0134     { HI3670_PCLK_GPIO16, "pclk_gpio16", "clk_div_cfgbus",
0135       CLK_SET_RATE_PARENT, 0x10, 16, 0, },
0136     { HI3670_PCLK_GPIO17, "pclk_gpio17", "clk_div_cfgbus",
0137       CLK_SET_RATE_PARENT, 0x10, 17, 0, },
0138     { HI3670_PCLK_GPIO20, "pclk_gpio20", "clk_div_cfgbus",
0139       CLK_SET_RATE_PARENT, 0x10, 20, 0, },
0140     { HI3670_PCLK_GPIO21, "pclk_gpio21", "clk_div_cfgbus",
0141       CLK_SET_RATE_PARENT, 0x10, 21, 0, },
0142     { HI3670_PCLK_GATE_DSI0, "pclk_gate_dsi0", "clk_div_cfgbus",
0143       CLK_SET_RATE_PARENT, 0x50, 28, 0, },
0144     { HI3670_PCLK_GATE_DSI1, "pclk_gate_dsi1", "clk_div_cfgbus",
0145       CLK_SET_RATE_PARENT, 0x50, 29, 0, },
0146     { HI3670_HCLK_GATE_USB3OTG, "hclk_gate_usb3otg", "clk_div_sysbus",
0147       CLK_SET_RATE_PARENT, 0x0, 25, 0, },
0148     { HI3670_ACLK_GATE_USB3DVFS, "aclk_gate_usb3dvfs", "autodiv_emmc0bus",
0149       CLK_SET_RATE_PARENT, 0x40, 1, 0, },
0150     { HI3670_HCLK_GATE_SDIO, "hclk_gate_sdio", "clk_div_sysbus",
0151       CLK_SET_RATE_PARENT, 0x0, 21, 0, },
0152     { HI3670_PCLK_GATE_PCIE_SYS, "pclk_gate_pcie_sys", "clk_div_mmc1bus",
0153       CLK_SET_RATE_PARENT, 0x420, 7, 0, },
0154     { HI3670_PCLK_GATE_PCIE_PHY, "pclk_gate_pcie_phy", "pclk_gate_mmc1_pcie",
0155       CLK_SET_RATE_PARENT, 0x420, 9, 0, },
0156     { HI3670_PCLK_GATE_MMC1_PCIE, "pclk_gate_mmc1_pcie", "pclk_div_mmc1_pcie",
0157       CLK_SET_RATE_PARENT, 0x30, 12, 0, },
0158     { HI3670_PCLK_GATE_MMC0_IOC, "pclk_gate_mmc0_ioc", "clk_div_mmc0bus",
0159       CLK_SET_RATE_PARENT, 0x40, 13, 0, },
0160     { HI3670_PCLK_GATE_MMC1_IOC, "pclk_gate_mmc1_ioc", "clk_div_mmc1bus",
0161       CLK_SET_RATE_PARENT, 0x420, 21, 0, },
0162     { HI3670_CLK_GATE_DMAC, "clk_gate_dmac", "clk_div_sysbus",
0163       CLK_SET_RATE_PARENT, 0x30, 1, 0, },
0164     { HI3670_CLK_GATE_VCODECBUS2DDR, "clk_gate_vcodecbus2ddr", "clk_div_vcodecbus",
0165       CLK_SET_RATE_PARENT, 0x0, 5, 0, },
0166     { HI3670_CLK_CCI400_BYPASS, "clk_cci400_bypass", "clk_ddrc_freq",
0167       CLK_SET_RATE_PARENT, 0x22C, 28, 0, },
0168     { HI3670_CLK_GATE_CCI400, "clk_gate_cci400", "clk_ddrc_freq",
0169       CLK_SET_RATE_PARENT, 0x50, 14, 0, },
0170     { HI3670_CLK_GATE_SD, "clk_gate_sd", "clk_mux_sd_sys",
0171       CLK_SET_RATE_PARENT, 0x40, 17, 0, },
0172     { HI3670_HCLK_GATE_SD, "hclk_gate_sd", "clk_div_sysbus",
0173       CLK_SET_RATE_PARENT, 0x0, 30, 0, },
0174     { HI3670_CLK_GATE_SDIO, "clk_gate_sdio", "clk_mux_sdio_sys",
0175       CLK_SET_RATE_PARENT, 0x40, 19, 0, },
0176     { HI3670_CLK_GATE_A57HPM, "clk_gate_a57hpm", "clk_div_a53hpm",
0177       CLK_SET_RATE_PARENT, 0x050, 9, 0, },
0178     { HI3670_CLK_GATE_A53HPM, "clk_gate_a53hpm", "clk_div_a53hpm",
0179       CLK_SET_RATE_PARENT, 0x050, 13, 0, },
0180     { HI3670_CLK_GATE_PA_A53, "clk_gate_pa_a53", "clk_div_a53hpm",
0181       CLK_SET_RATE_PARENT, 0x480, 10, 0, },
0182     { HI3670_CLK_GATE_PA_A57, "clk_gate_pa_a57", "clk_div_a53hpm",
0183       CLK_SET_RATE_PARENT, 0x480, 9, 0, },
0184     { HI3670_CLK_GATE_PA_G3D, "clk_gate_pa_g3d", "clk_div_a53hpm",
0185       CLK_SET_RATE_PARENT, 0x480, 15, 0, },
0186     { HI3670_CLK_GATE_GPUHPM, "clk_gate_gpuhpm", "clk_div_a53hpm",
0187       CLK_SET_RATE_PARENT, 0x050, 15, 0, },
0188     { HI3670_CLK_GATE_PERIHPM, "clk_gate_perihpm", "clk_div_a53hpm",
0189       CLK_SET_RATE_PARENT, 0x050, 12, 0, },
0190     { HI3670_CLK_GATE_AOHPM, "clk_gate_aohpm", "clk_div_a53hpm",
0191       CLK_SET_RATE_PARENT, 0x050, 11, 0, },
0192     { HI3670_CLK_GATE_UART1, "clk_gate_uart1", "clk_mux_uarth",
0193       CLK_SET_RATE_PARENT, 0x20, 11, 0, },
0194     { HI3670_CLK_GATE_UART4, "clk_gate_uart4", "clk_mux_uarth",
0195       CLK_SET_RATE_PARENT, 0x20, 14, 0, },
0196     { HI3670_PCLK_GATE_UART1, "pclk_gate_uart1", "clk_mux_uarth",
0197       CLK_SET_RATE_PARENT, 0x20, 11, 0, },
0198     { HI3670_PCLK_GATE_UART4, "pclk_gate_uart4", "clk_mux_uarth",
0199       CLK_SET_RATE_PARENT, 0x20, 14, 0, },
0200     { HI3670_CLK_GATE_UART2, "clk_gate_uart2", "clk_mux_uartl",
0201       CLK_SET_RATE_PARENT, 0x20, 12, 0, },
0202     { HI3670_CLK_GATE_UART5, "clk_gate_uart5", "clk_mux_uartl",
0203       CLK_SET_RATE_PARENT, 0x20, 15, 0, },
0204     { HI3670_PCLK_GATE_UART2, "pclk_gate_uart2", "clk_mux_uartl",
0205       CLK_SET_RATE_PARENT, 0x20, 12, 0, },
0206     { HI3670_PCLK_GATE_UART5, "pclk_gate_uart5", "clk_mux_uartl",
0207       CLK_SET_RATE_PARENT, 0x20, 15, 0, },
0208     { HI3670_CLK_GATE_UART0, "clk_gate_uart0", "clk_mux_uart0",
0209       CLK_SET_RATE_PARENT, 0x20, 10, 0, },
0210     { HI3670_CLK_GATE_I2C3, "clk_gate_i2c3", "clk_mux_i2c",
0211       CLK_SET_RATE_PARENT, 0x20, 7, 0, },
0212     { HI3670_CLK_GATE_I2C4, "clk_gate_i2c4", "clk_mux_i2c",
0213       CLK_SET_RATE_PARENT, 0x20, 27, 0, },
0214     { HI3670_CLK_GATE_I2C7, "clk_gate_i2c7", "clk_mux_i2c",
0215       CLK_SET_RATE_PARENT, 0x10, 31, 0, },
0216     { HI3670_PCLK_GATE_I2C3, "pclk_gate_i2c3", "clk_mux_i2c",
0217       CLK_SET_RATE_PARENT, 0x20, 7, 0, },
0218     { HI3670_PCLK_GATE_I2C4, "pclk_gate_i2c4", "clk_mux_i2c",
0219       CLK_SET_RATE_PARENT, 0x20, 27, 0, },
0220     { HI3670_PCLK_GATE_I2C7, "pclk_gate_i2c7", "clk_mux_i2c",
0221       CLK_SET_RATE_PARENT, 0x10, 31, 0, },
0222     { HI3670_CLK_GATE_SPI1, "clk_gate_spi1", "clk_mux_spi",
0223       CLK_SET_RATE_PARENT, 0x20, 9, 0, },
0224     { HI3670_CLK_GATE_SPI4, "clk_gate_spi4", "clk_mux_spi",
0225       CLK_SET_RATE_PARENT, 0x40, 4, 0, },
0226     { HI3670_PCLK_GATE_SPI1, "pclk_gate_spi1", "clk_mux_spi",
0227       CLK_SET_RATE_PARENT, 0x20, 9, 0, },
0228     { HI3670_PCLK_GATE_SPI4, "pclk_gate_spi4", "clk_mux_spi",
0229       CLK_SET_RATE_PARENT, 0x40, 4, 0, },
0230     { HI3670_CLK_GATE_USB3OTG_REF, "clk_gate_usb3otg_ref", "clkin_sys",
0231       CLK_SET_RATE_PARENT, 0x40, 0, 0, },
0232     { HI3670_CLK_GATE_USB2PHY_REF, "clk_gate_usb2phy_ref", "clkin_sys",
0233       CLK_SET_RATE_PARENT, 0x410, 19, 0, },
0234     { HI3670_CLK_GATE_PCIEAUX, "clk_gate_pcieaux", "clkin_sys",
0235       CLK_SET_RATE_PARENT, 0x420, 8, 0, },
0236     { HI3670_ACLK_GATE_PCIE, "aclk_gate_pcie", "clk_gate_mmc1_pcieaxi",
0237       CLK_SET_RATE_PARENT, 0x420, 5, 0, },
0238     { HI3670_CLK_GATE_MMC1_PCIEAXI, "clk_gate_mmc1_pcieaxi", "clk_div_pcieaxi",
0239       CLK_SET_RATE_PARENT, 0x050, 4, 0, },
0240     { HI3670_CLK_GATE_PCIEPHY_REF, "clk_gate_pciephy_ref", "clk_ppll_pcie",
0241       CLK_SET_RATE_PARENT, 0x470, 14, 0, },
0242     { HI3670_CLK_GATE_PCIE_DEBOUNCE, "clk_gate_pcie_debounce", "clk_ppll_pcie",
0243       CLK_SET_RATE_PARENT, 0x470, 12, 0, },
0244     { HI3670_CLK_GATE_PCIEIO, "clk_gate_pcieio", "clk_ppll_pcie",
0245       CLK_SET_RATE_PARENT, 0x470, 13, 0, },
0246     { HI3670_CLK_GATE_PCIE_HP, "clk_gate_pcie_hp", "clk_ppll_pcie",
0247       CLK_SET_RATE_PARENT, 0x470, 15, 0, },
0248     { HI3670_CLK_GATE_AO_ASP, "clk_gate_ao_asp", "clk_div_ao_asp",
0249       CLK_SET_RATE_PARENT, 0x0, 26, 0, },
0250     { HI3670_PCLK_GATE_PCTRL, "pclk_gate_pctrl", "clk_div_ptp",
0251       CLK_SET_RATE_PARENT, 0x20, 31, 0, },
0252     { HI3670_CLK_CSI_TRANS_GT, "clk_csi_trans_gt", "clk_div_csi_trans",
0253       CLK_SET_RATE_PARENT, 0x30, 24, 0, },
0254     { HI3670_CLK_DSI_TRANS_GT, "clk_dsi_trans_gt", "clk_div_dsi_trans",
0255       CLK_SET_RATE_PARENT, 0x30, 25, 0, },
0256     { HI3670_CLK_GATE_PWM, "clk_gate_pwm", "clk_div_ptp",
0257       CLK_SET_RATE_PARENT, 0x20, 0, 0, },
0258     { HI3670_ABB_AUDIO_EN0, "abb_audio_en0", "clk_gate_abb_192",
0259       CLK_SET_RATE_PARENT, 0x30, 8, 0, },
0260     { HI3670_ABB_AUDIO_EN1, "abb_audio_en1", "clk_gate_abb_192",
0261       CLK_SET_RATE_PARENT, 0x30, 9, 0, },
0262     { HI3670_ABB_AUDIO_GT_EN0, "abb_audio_gt_en0", "abb_audio_en0",
0263       CLK_SET_RATE_PARENT, 0x30, 19, 0, },
0264     { HI3670_ABB_AUDIO_GT_EN1, "abb_audio_gt_en1", "abb_audio_en1",
0265       CLK_SET_RATE_PARENT, 0x40, 20, 0, },
0266     { HI3670_CLK_GATE_DP_AUDIO_PLL_AO, "clk_gate_dp_audio_pll_ao", "clkdiv_dp_audio_pll_ao",
0267       CLK_SET_RATE_PARENT, 0x00, 13, 0, },
0268     { HI3670_PERI_VOLT_HOLD, "peri_volt_hold", "clkin_sys",
0269       CLK_SET_RATE_PARENT, 0, 1, 0, },
0270     { HI3670_PERI_VOLT_MIDDLE, "peri_volt_middle", "clkin_sys",
0271       CLK_SET_RATE_PARENT, 0, 1, 0, },
0272     { HI3670_CLK_GATE_ISP_SNCLK0, "clk_gate_isp_snclk0", "clk_isp_snclk_mux0",
0273       CLK_SET_RATE_PARENT, 0x50, 16, 0, },
0274     { HI3670_CLK_GATE_ISP_SNCLK1, "clk_gate_isp_snclk1", "clk_isp_snclk_mux1",
0275       CLK_SET_RATE_PARENT, 0x50, 17, 0, },
0276     { HI3670_CLK_GATE_ISP_SNCLK2, "clk_gate_isp_snclk2", "clk_isp_snclk_mux2",
0277       CLK_SET_RATE_PARENT, 0x50, 18, 0, },
0278     { HI3670_CLK_GATE_RXDPHY0_CFG, "clk_gate_rxdphy0_cfg", "clk_mux_rxdphy_cfg",
0279       CLK_SET_RATE_PARENT, 0x030, 20, 0, },
0280     { HI3670_CLK_GATE_RXDPHY1_CFG, "clk_gate_rxdphy1_cfg", "clk_mux_rxdphy_cfg",
0281       CLK_SET_RATE_PARENT, 0x030, 21, 0, },
0282     { HI3670_CLK_GATE_RXDPHY2_CFG, "clk_gate_rxdphy2_cfg", "clk_mux_rxdphy_cfg",
0283       CLK_SET_RATE_PARENT, 0x030, 22, 0, },
0284     { HI3670_CLK_GATE_TXDPHY0_CFG, "clk_gate_txdphy0_cfg", "clkin_sys",
0285       CLK_SET_RATE_PARENT, 0x030, 28, 0, },
0286     { HI3670_CLK_GATE_TXDPHY0_REF, "clk_gate_txdphy0_ref", "clkin_sys",
0287       CLK_SET_RATE_PARENT, 0x030, 29, 0, },
0288     { HI3670_CLK_GATE_TXDPHY1_CFG, "clk_gate_txdphy1_cfg", "clkin_sys",
0289       CLK_SET_RATE_PARENT, 0x030, 30, 0, },
0290     { HI3670_CLK_GATE_TXDPHY1_REF, "clk_gate_txdphy1_ref", "clkin_sys",
0291       CLK_SET_RATE_PARENT, 0x030, 31, 0, },
0292     { HI3670_CLK_GATE_MEDIA_TCXO, "clk_gate_media_tcxo", "clkin_sys",
0293       CLK_SET_RATE_PARENT, 0x40, 6, 0, },
0294 };
0295 
0296 static const struct hisi_gate_clock hi3670_crgctrl_gate_clks[] = {
0297     { HI3670_AUTODIV_SYSBUS, "autodiv_sysbus", "clk_div_sysbus",
0298       CLK_SET_RATE_PARENT, 0x404, 5, CLK_GATE_HIWORD_MASK, },
0299     { HI3670_AUTODIV_EMMC0BUS, "autodiv_emmc0bus", "autodiv_sysbus",
0300       CLK_SET_RATE_PARENT, 0x404, 1, CLK_GATE_HIWORD_MASK, },
0301     { HI3670_PCLK_ANDGT_MMC1_PCIE, "pclk_andgt_mmc1_pcie", "clk_div_320m",
0302       CLK_SET_RATE_PARENT, 0xf8, 13, CLK_GATE_HIWORD_MASK, },
0303     { HI3670_CLK_GATE_VCODECBUS_GT, "clk_gate_vcodecbus_gt", "clk_mux_vcodecbus",
0304       CLK_SET_RATE_PARENT, 0x0F0, 8, CLK_GATE_HIWORD_MASK, },
0305     { HI3670_CLK_ANDGT_SD, "clk_andgt_sd", "clk_mux_sd_pll",
0306       CLK_SET_RATE_PARENT, 0xF4, 3, CLK_GATE_HIWORD_MASK, },
0307     { HI3670_CLK_SD_SYS_GT, "clk_sd_sys_gt", "clkin_sys",
0308       CLK_SET_RATE_PARENT, 0xF4, 5, CLK_GATE_HIWORD_MASK, },
0309     { HI3670_CLK_ANDGT_SDIO, "clk_andgt_sdio", "clk_mux_sdio_pll",
0310       CLK_SET_RATE_PARENT, 0xF4, 8, CLK_GATE_HIWORD_MASK, },
0311     { HI3670_CLK_SDIO_SYS_GT, "clk_sdio_sys_gt", "clkin_sys",
0312       CLK_SET_RATE_PARENT, 0xF4, 6, CLK_GATE_HIWORD_MASK, },
0313     { HI3670_CLK_A53HPM_ANDGT, "clk_a53hpm_andgt", "clk_mux_a53hpm",
0314       CLK_SET_RATE_PARENT, 0x0F4, 7, CLK_GATE_HIWORD_MASK, },
0315     { HI3670_CLK_320M_PLL_GT, "clk_320m_pll_gt", "clk_mux_320m",
0316       CLK_SET_RATE_PARENT, 0xF8, 10, CLK_GATE_HIWORD_MASK, },
0317     { HI3670_CLK_ANDGT_UARTH, "clk_andgt_uarth", "clk_div_320m",
0318       CLK_SET_RATE_PARENT, 0xF4, 11, CLK_GATE_HIWORD_MASK, },
0319     { HI3670_CLK_ANDGT_UARTL, "clk_andgt_uartl", "clk_div_320m",
0320       CLK_SET_RATE_PARENT, 0xF4, 10, CLK_GATE_HIWORD_MASK, },
0321     { HI3670_CLK_ANDGT_UART0, "clk_andgt_uart0", "clk_div_320m",
0322       CLK_SET_RATE_PARENT, 0xF4, 9, CLK_GATE_HIWORD_MASK, },
0323     { HI3670_CLK_ANDGT_SPI, "clk_andgt_spi", "clk_div_320m",
0324       CLK_SET_RATE_PARENT, 0xF4, 13, CLK_GATE_HIWORD_MASK, },
0325     { HI3670_CLK_ANDGT_PCIEAXI, "clk_andgt_pcieaxi", "clk_mux_pcieaxi",
0326       CLK_SET_RATE_PARENT, 0xfc, 15, CLK_GATE_HIWORD_MASK, },
0327     { HI3670_CLK_DIV_AO_ASP_GT, "clk_div_ao_asp_gt", "clk_mux_ao_asp",
0328       CLK_SET_RATE_PARENT, 0xF4, 4, CLK_GATE_HIWORD_MASK, },
0329     { HI3670_CLK_GATE_CSI_TRANS, "clk_gate_csi_trans", "clk_ppll2",
0330       CLK_SET_RATE_PARENT, 0xF4, 14, CLK_GATE_HIWORD_MASK, },
0331     { HI3670_CLK_GATE_DSI_TRANS, "clk_gate_dsi_trans", "clk_ppll2",
0332       CLK_SET_RATE_PARENT, 0xF4, 1, CLK_GATE_HIWORD_MASK, },
0333     { HI3670_CLK_ANDGT_PTP, "clk_andgt_ptp", "clk_div_320m",
0334       CLK_SET_RATE_PARENT, 0xF8, 5, CLK_GATE_HIWORD_MASK, },
0335     { HI3670_CLK_ANDGT_OUT0, "clk_andgt_out0", "clk_ppll0",
0336       CLK_SET_RATE_PARENT, 0xF0, 10, CLK_GATE_HIWORD_MASK, },
0337     { HI3670_CLK_ANDGT_OUT1, "clk_andgt_out1", "clk_ppll0",
0338       CLK_SET_RATE_PARENT, 0xF0, 11, CLK_GATE_HIWORD_MASK, },
0339     { HI3670_CLKGT_DP_AUDIO_PLL_AO, "clkgt_dp_audio_pll_ao", "clk_ppll6",
0340       CLK_SET_RATE_PARENT, 0xF8, 15, CLK_GATE_HIWORD_MASK, },
0341     { HI3670_CLK_ANDGT_VDEC, "clk_andgt_vdec", "clk_mux_vdec",
0342       CLK_SET_RATE_PARENT, 0xF0, 13, CLK_GATE_HIWORD_MASK, },
0343     { HI3670_CLK_ANDGT_VENC, "clk_andgt_venc", "clk_mux_venc",
0344       CLK_SET_RATE_PARENT, 0xF0, 9, CLK_GATE_HIWORD_MASK, },
0345     { HI3670_CLK_ISP_SNCLK_ANGT, "clk_isp_snclk_angt", "clk_div_a53hpm",
0346       CLK_SET_RATE_PARENT, 0x108, 2, CLK_GATE_HIWORD_MASK, },
0347     { HI3670_CLK_ANDGT_RXDPHY, "clk_andgt_rxdphy", "clk_div_a53hpm",
0348       CLK_SET_RATE_PARENT, 0x0F0, 12, CLK_GATE_HIWORD_MASK, },
0349     { HI3670_CLK_ANDGT_ICS, "clk_andgt_ics", "clk_mux_ics",
0350       CLK_SET_RATE_PARENT, 0xf0, 14, CLK_GATE_HIWORD_MASK, },
0351     { HI3670_AUTODIV_DMABUS, "autodiv_dmabus", "autodiv_sysbus",
0352       CLK_SET_RATE_PARENT, 0x404, 3, CLK_GATE_HIWORD_MASK, },
0353 };
0354 
0355 static const char *const
0356 clk_mux_sysbus_p[] = { "clk_ppll1", "clk_ppll0", };
0357 static const char *const
0358 clk_mux_vcodecbus_p[] = { "clk_invalid", "clk_ppll4", "clk_ppll0",
0359               "clk_invalid", "clk_ppll2", "clk_invalid",
0360               "clk_invalid", "clk_invalid", "clk_ppll3",
0361               "clk_invalid", "clk_invalid", "clk_invalid",
0362               "clk_invalid", "clk_invalid", "clk_invalid",
0363               "clk_invalid", };
0364 static const char *const
0365 clk_mux_sd_sys_p[] = { "clk_sd_sys", "clk_div_sd", };
0366 static const char *const
0367 clk_mux_sd_pll_p[] = { "clk_ppll0", "clk_ppll3", "clk_ppll2", "clk_ppll2", };
0368 static const char *const
0369 clk_mux_sdio_sys_p[] = { "clk_sdio_sys", "clk_div_sdio", };
0370 static const char *const
0371 clk_mux_sdio_pll_p[] = { "clk_ppll0", "clk_ppll3", "clk_ppll2", "clk_ppll2", };
0372 static const char *const
0373 clk_mux_a53hpm_p[] = { "clk_ppll0", "clk_ppll2", };
0374 static const char *const
0375 clk_mux_320m_p[] = { "clk_ppll2", "clk_ppll0", };
0376 static const char *const
0377 clk_mux_uarth_p[] = { "clkin_sys", "clk_div_uarth", };
0378 static const char *const
0379 clk_mux_uartl_p[] = { "clkin_sys", "clk_div_uartl", };
0380 static const char *const
0381 clk_mux_uart0_p[] = { "clkin_sys", "clk_div_uart0", };
0382 static const char *const
0383 clk_mux_i2c_p[] = { "clkin_sys", "clk_div_i2c", };
0384 static const char *const
0385 clk_mux_spi_p[] = { "clkin_sys", "clk_div_spi", };
0386 static const char *const
0387 clk_mux_pcieaxi_p[] = { "clkin_sys", "clk_ppll0", };
0388 static const char *const
0389 clk_mux_ao_asp_p[] = { "clk_ppll2", "clk_ppll3", };
0390 static const char *const
0391 clk_mux_vdec_p[] = { "clk_invalid", "clk_ppll4", "clk_ppll0", "clk_invalid",
0392              "clk_invalid", "clk_invalid", "clk_invalid", "clk_invalid",
0393              "clk_invalid", "clk_invalid", "clk_invalid", "clk_invalid",
0394              "clk_invalid", "clk_invalid", "clk_invalid",
0395              "clk_invalid", };
0396 static const char *const
0397 clk_mux_venc_p[] = { "clk_invalid", "clk_ppll4", "clk_ppll0", "clk_invalid",
0398              "clk_invalid", "clk_invalid", "clk_invalid", "clk_invalid",
0399              "clk_invalid", "clk_invalid", "clk_invalid", "clk_invalid",
0400              "clk_invalid", "clk_invalid", "clk_invalid",
0401              "clk_invalid", };
0402 static const char *const
0403 clk_isp_snclk_mux0_p[] = { "clkin_sys", "clk_isp_snclk_div0", };
0404 static const char *const
0405 clk_isp_snclk_mux1_p[] = { "clkin_sys", "clk_isp_snclk_div1", };
0406 static const char *const
0407 clk_isp_snclk_mux2_p[] = { "clkin_sys", "clk_isp_snclk_div2", };
0408 static const char *const
0409 clk_mux_rxdphy_cfg_p[] = { "clk_factor_rxdphy", "clkin_sys", };
0410 static const char *const
0411 clk_mux_ics_p[] = { "clk_invalid", "clk_ppll4", "clk_ppll0", "clk_invalid",
0412             "clk_ppll2", "clk_invalid", "clk_invalid", "clk_invalid",
0413             "clk_ppll3", "clk_invalid", "clk_invalid", "clk_invalid",
0414             "clk_invalid", "clk_invalid", "clk_invalid",
0415             "clk_invalid", };
0416 
0417 static const struct hisi_mux_clock hi3670_crgctrl_mux_clks[] = {
0418     { HI3670_CLK_MUX_SYSBUS, "clk_mux_sysbus", clk_mux_sysbus_p,
0419       ARRAY_SIZE(clk_mux_sysbus_p), CLK_SET_RATE_PARENT,
0420       0xAC, 0, 1, CLK_MUX_HIWORD_MASK, },
0421     { HI3670_CLK_MUX_VCODECBUS, "clk_mux_vcodecbus", clk_mux_vcodecbus_p,
0422       ARRAY_SIZE(clk_mux_vcodecbus_p), CLK_SET_RATE_PARENT,
0423       0x0C8, 0, 4, CLK_MUX_HIWORD_MASK, },
0424     { HI3670_CLK_MUX_SD_SYS, "clk_mux_sd_sys", clk_mux_sd_sys_p,
0425       ARRAY_SIZE(clk_mux_sd_sys_p), CLK_SET_RATE_PARENT,
0426       0x0B8, 6, 1, CLK_MUX_HIWORD_MASK, },
0427     { HI3670_CLK_MUX_SD_PLL, "clk_mux_sd_pll", clk_mux_sd_pll_p,
0428       ARRAY_SIZE(clk_mux_sd_pll_p), CLK_SET_RATE_PARENT,
0429       0x0B8, 4, 2, CLK_MUX_HIWORD_MASK, },
0430     { HI3670_CLK_MUX_SDIO_SYS, "clk_mux_sdio_sys", clk_mux_sdio_sys_p,
0431       ARRAY_SIZE(clk_mux_sdio_sys_p), CLK_SET_RATE_PARENT,
0432       0x0C0, 6, 1, CLK_MUX_HIWORD_MASK, },
0433     { HI3670_CLK_MUX_SDIO_PLL, "clk_mux_sdio_pll", clk_mux_sdio_pll_p,
0434       ARRAY_SIZE(clk_mux_sdio_pll_p), CLK_SET_RATE_PARENT,
0435       0x0C0, 4, 2, CLK_MUX_HIWORD_MASK, },
0436     { HI3670_CLK_MUX_A53HPM, "clk_mux_a53hpm", clk_mux_a53hpm_p,
0437       ARRAY_SIZE(clk_mux_a53hpm_p), CLK_SET_RATE_PARENT,
0438       0x0D4, 9, 1, CLK_MUX_HIWORD_MASK, },
0439     { HI3670_CLK_MUX_320M, "clk_mux_320m", clk_mux_320m_p,
0440       ARRAY_SIZE(clk_mux_320m_p), CLK_SET_RATE_PARENT,
0441       0x100, 0, 1, CLK_MUX_HIWORD_MASK, },
0442     { HI3670_CLK_MUX_UARTH, "clk_mux_uarth", clk_mux_uarth_p,
0443       ARRAY_SIZE(clk_mux_uarth_p), CLK_SET_RATE_PARENT,
0444       0xAC, 4, 1, CLK_MUX_HIWORD_MASK, },
0445     { HI3670_CLK_MUX_UARTL, "clk_mux_uartl", clk_mux_uartl_p,
0446       ARRAY_SIZE(clk_mux_uartl_p), CLK_SET_RATE_PARENT,
0447       0xAC, 3, 1, CLK_MUX_HIWORD_MASK, },
0448     { HI3670_CLK_MUX_UART0, "clk_mux_uart0", clk_mux_uart0_p,
0449       ARRAY_SIZE(clk_mux_uart0_p), CLK_SET_RATE_PARENT,
0450       0xAC, 2, 1, CLK_MUX_HIWORD_MASK, },
0451     { HI3670_CLK_MUX_I2C, "clk_mux_i2c", clk_mux_i2c_p,
0452       ARRAY_SIZE(clk_mux_i2c_p), CLK_SET_RATE_PARENT,
0453       0xAC, 13, 1, CLK_MUX_HIWORD_MASK, },
0454     { HI3670_CLK_MUX_SPI, "clk_mux_spi", clk_mux_spi_p,
0455       ARRAY_SIZE(clk_mux_spi_p), CLK_SET_RATE_PARENT,
0456       0xAC, 8, 1, CLK_MUX_HIWORD_MASK, },
0457     { HI3670_CLK_MUX_PCIEAXI, "clk_mux_pcieaxi", clk_mux_pcieaxi_p,
0458       ARRAY_SIZE(clk_mux_pcieaxi_p), CLK_SET_RATE_PARENT,
0459       0xb4, 5, 1, CLK_MUX_HIWORD_MASK, },
0460     { HI3670_CLK_MUX_AO_ASP, "clk_mux_ao_asp", clk_mux_ao_asp_p,
0461       ARRAY_SIZE(clk_mux_ao_asp_p), CLK_SET_RATE_PARENT,
0462       0x100, 6, 1, CLK_MUX_HIWORD_MASK, },
0463     { HI3670_CLK_MUX_VDEC, "clk_mux_vdec", clk_mux_vdec_p,
0464       ARRAY_SIZE(clk_mux_vdec_p), CLK_SET_RATE_PARENT,
0465       0xC8, 8, 4, CLK_MUX_HIWORD_MASK, },
0466     { HI3670_CLK_MUX_VENC, "clk_mux_venc", clk_mux_venc_p,
0467       ARRAY_SIZE(clk_mux_venc_p), CLK_SET_RATE_PARENT,
0468       0xC8, 4, 4, CLK_MUX_HIWORD_MASK, },
0469     { HI3670_CLK_ISP_SNCLK_MUX0, "clk_isp_snclk_mux0", clk_isp_snclk_mux0_p,
0470       ARRAY_SIZE(clk_isp_snclk_mux0_p), CLK_SET_RATE_PARENT,
0471       0x108, 3, 1, CLK_MUX_HIWORD_MASK, },
0472     { HI3670_CLK_ISP_SNCLK_MUX1, "clk_isp_snclk_mux1", clk_isp_snclk_mux1_p,
0473       ARRAY_SIZE(clk_isp_snclk_mux1_p), CLK_SET_RATE_PARENT,
0474       0x10C, 13, 1, CLK_MUX_HIWORD_MASK, },
0475     { HI3670_CLK_ISP_SNCLK_MUX2, "clk_isp_snclk_mux2", clk_isp_snclk_mux2_p,
0476       ARRAY_SIZE(clk_isp_snclk_mux2_p), CLK_SET_RATE_PARENT,
0477       0x10C, 10, 1, CLK_MUX_HIWORD_MASK, },
0478     { HI3670_CLK_MUX_RXDPHY_CFG, "clk_mux_rxdphy_cfg", clk_mux_rxdphy_cfg_p,
0479       ARRAY_SIZE(clk_mux_rxdphy_cfg_p), CLK_SET_RATE_PARENT,
0480       0x0C4, 8, 1, CLK_MUX_HIWORD_MASK, },
0481     { HI3670_CLK_MUX_ICS, "clk_mux_ics", clk_mux_ics_p,
0482       ARRAY_SIZE(clk_mux_ics_p), CLK_SET_RATE_PARENT,
0483       0xc8, 12, 4, CLK_MUX_HIWORD_MASK, },
0484 };
0485 
0486 static const struct hisi_divider_clock hi3670_crgctrl_divider_clks[] = {
0487     { HI3670_CLK_DIV_CFGBUS, "clk_div_cfgbus", "clk_div_sysbus",
0488       CLK_SET_RATE_PARENT, 0xEC, 0, 2, CLK_DIVIDER_HIWORD_MASK, },
0489     { HI3670_CLK_DIV_MMC0BUS, "clk_div_mmc0bus", "autodiv_emmc0bus",
0490       CLK_SET_RATE_PARENT, 0x0EC, 2, 1, CLK_DIVIDER_HIWORD_MASK, },
0491     { HI3670_CLK_DIV_MMC1BUS, "clk_div_mmc1bus", "clk_div_sysbus",
0492       CLK_SET_RATE_PARENT, 0x0EC, 3, 1, CLK_DIVIDER_HIWORD_MASK, },
0493     { HI3670_PCLK_DIV_MMC1_PCIE, "pclk_div_mmc1_pcie", "pclk_andgt_mmc1_pcie",
0494       CLK_SET_RATE_PARENT, 0xb4, 6, 4, CLK_DIVIDER_HIWORD_MASK, },
0495     { HI3670_CLK_DIV_VCODECBUS, "clk_div_vcodecbus", "clk_gate_vcodecbus_gt",
0496       CLK_SET_RATE_PARENT, 0x0BC, 0, 6, CLK_DIVIDER_HIWORD_MASK, },
0497     { HI3670_CLK_DIV_SD, "clk_div_sd", "clk_andgt_sd",
0498       CLK_SET_RATE_PARENT, 0xB8, 0, 4, CLK_DIVIDER_HIWORD_MASK, },
0499     { HI3670_CLK_DIV_SDIO, "clk_div_sdio", "clk_andgt_sdio",
0500       CLK_SET_RATE_PARENT, 0xC0, 0, 4, CLK_DIVIDER_HIWORD_MASK, },
0501     { HI3670_CLK_DIV_UARTH, "clk_div_uarth", "clk_andgt_uarth",
0502       CLK_SET_RATE_PARENT, 0xB0, 12, 4, CLK_DIVIDER_HIWORD_MASK, },
0503     { HI3670_CLK_DIV_UARTL, "clk_div_uartl", "clk_andgt_uartl",
0504       CLK_SET_RATE_PARENT, 0xB0, 8, 4, CLK_DIVIDER_HIWORD_MASK, },
0505     { HI3670_CLK_DIV_UART0, "clk_div_uart0", "clk_andgt_uart0",
0506       CLK_SET_RATE_PARENT, 0xB0, 4, 4, CLK_DIVIDER_HIWORD_MASK, },
0507     { HI3670_CLK_DIV_I2C, "clk_div_i2c", "clk_div_320m",
0508       CLK_SET_RATE_PARENT, 0xE8, 4, 4, CLK_DIVIDER_HIWORD_MASK, },
0509     { HI3670_CLK_DIV_SPI, "clk_div_spi", "clk_andgt_spi",
0510       CLK_SET_RATE_PARENT, 0xC4, 12, 4, CLK_DIVIDER_HIWORD_MASK, },
0511     { HI3670_CLK_DIV_PCIEAXI, "clk_div_pcieaxi", "clk_andgt_pcieaxi",
0512       CLK_SET_RATE_PARENT, 0xb4, 0, 5, CLK_DIVIDER_HIWORD_MASK, },
0513     { HI3670_CLK_DIV_AO_ASP, "clk_div_ao_asp", "clk_div_ao_asp_gt",
0514       CLK_SET_RATE_PARENT, 0x108, 6, 4, CLK_DIVIDER_HIWORD_MASK, },
0515     { HI3670_CLK_DIV_CSI_TRANS, "clk_div_csi_trans", "clk_gate_csi_trans",
0516       CLK_SET_RATE_PARENT, 0xD4, 0, 5, CLK_DIVIDER_HIWORD_MASK, },
0517     { HI3670_CLK_DIV_DSI_TRANS, "clk_div_dsi_trans", "clk_gate_dsi_trans",
0518       CLK_SET_RATE_PARENT, 0xD4, 10, 5, CLK_DIVIDER_HIWORD_MASK, },
0519     { HI3670_CLK_DIV_PTP, "clk_div_ptp", "clk_andgt_ptp",
0520       CLK_SET_RATE_PARENT, 0xD8, 0, 4, CLK_DIVIDER_HIWORD_MASK, },
0521     { HI3670_CLK_DIV_CLKOUT0_PLL, "clk_div_clkout0_pll", "clk_andgt_out0",
0522       CLK_SET_RATE_PARENT, 0xe0, 4, 6, CLK_DIVIDER_HIWORD_MASK, },
0523     { HI3670_CLK_DIV_CLKOUT1_PLL, "clk_div_clkout1_pll", "clk_andgt_out1",
0524       CLK_SET_RATE_PARENT, 0xe0, 10, 6, CLK_DIVIDER_HIWORD_MASK, },
0525     { HI3670_CLKDIV_DP_AUDIO_PLL_AO, "clkdiv_dp_audio_pll_ao", "clkgt_dp_audio_pll_ao",
0526       CLK_SET_RATE_PARENT, 0xBC, 11, 4, CLK_DIVIDER_HIWORD_MASK, },
0527     { HI3670_CLK_DIV_VDEC, "clk_div_vdec", "clk_andgt_vdec",
0528       CLK_SET_RATE_PARENT, 0xC4, 0, 6, CLK_DIVIDER_HIWORD_MASK, },
0529     { HI3670_CLK_DIV_VENC, "clk_div_venc", "clk_andgt_venc",
0530       CLK_SET_RATE_PARENT, 0xC0, 8, 6, CLK_DIVIDER_HIWORD_MASK, },
0531     { HI3670_CLK_ISP_SNCLK_DIV0, "clk_isp_snclk_div0", "clk_isp_snclk_fac",
0532       CLK_SET_RATE_PARENT, 0x108, 0, 2, CLK_DIVIDER_HIWORD_MASK, },
0533     { HI3670_CLK_ISP_SNCLK_DIV1, "clk_isp_snclk_div1", "clk_isp_snclk_fac",
0534       CLK_SET_RATE_PARENT, 0x10C, 14, 2, CLK_DIVIDER_HIWORD_MASK, },
0535     { HI3670_CLK_ISP_SNCLK_DIV2, "clk_isp_snclk_div2", "clk_isp_snclk_fac",
0536       CLK_SET_RATE_PARENT, 0x10C, 11, 2, CLK_DIVIDER_HIWORD_MASK, },
0537     { HI3670_CLK_DIV_ICS, "clk_div_ics", "clk_andgt_ics",
0538       CLK_SET_RATE_PARENT, 0xE4, 9, 6, CLK_DIVIDER_HIWORD_MASK, },
0539 };
0540 
0541 /* clk_pmuctrl */
0542 static const struct hisi_gate_clock hi3670_pmu_gate_clks[] = {
0543     { HI3670_GATE_ABB_192, "clk_gate_abb_192", "clkin_sys",
0544       CLK_SET_RATE_PARENT, (0x037 << 2), 0, 0, },
0545 };
0546 
0547 /* clk_pctrl */
0548 static const struct hisi_gate_clock hi3670_pctrl_gate_clks[] = {
0549     { HI3670_GATE_UFS_TCXO_EN, "clk_gate_ufs_tcxo_en", "clk_gate_abb_192",
0550       CLK_SET_RATE_PARENT, 0x10, 0, CLK_GATE_HIWORD_MASK, },
0551     { HI3670_GATE_USB_TCXO_EN, "clk_gate_usb_tcxo_en", "clk_gate_abb_192",
0552       CLK_SET_RATE_PARENT, 0x10, 1, CLK_GATE_HIWORD_MASK, },
0553 };
0554 
0555 /* clk_sctrl */
0556 static const struct hisi_gate_clock hi3670_sctrl_gate_sep_clks[] = {
0557     { HI3670_PPLL0_EN_ACPU, "ppll0_en_acpu", "clk_ppll0",
0558       CLK_SET_RATE_PARENT, 0x190, 26, 0, },
0559     { HI3670_PPLL0_GT_CPU, "ppll0_gt_cpu", "clk_ppll0",
0560       CLK_SET_RATE_PARENT, 0x190, 15, 0, },
0561     { HI3670_CLK_GATE_PPLL0_MEDIA, "clk_gate_ppll0_media", "clk_ppll0",
0562       CLK_SET_RATE_PARENT, 0x1b0, 6, 0, },
0563     { HI3670_PCLK_GPIO18, "pclk_gpio18", "clk_div_aobus",
0564       CLK_SET_RATE_PARENT, 0x1B0, 9, 0, },
0565     { HI3670_PCLK_GPIO19, "pclk_gpio19", "clk_div_aobus",
0566       CLK_SET_RATE_PARENT, 0x1B0, 8, 0, },
0567     { HI3670_CLK_GATE_SPI, "clk_gate_spi", "clk_div_ioperi",
0568       CLK_SET_RATE_PARENT, 0x1B0, 10, 0, },
0569     { HI3670_PCLK_GATE_SPI, "pclk_gate_spi", "clk_div_ioperi",
0570       CLK_SET_RATE_PARENT, 0x1B0, 10, 0, },
0571     { HI3670_CLK_GATE_UFS_SUBSYS, "clk_gate_ufs_subsys", "clk_div_ufs_subsys",
0572       CLK_SET_RATE_PARENT, 0x1B0, 14, 0, },
0573     { HI3670_CLK_GATE_UFSIO_REF, "clk_gate_ufsio_ref", "clkin_sys",
0574       CLK_SET_RATE_PARENT, 0x1b0, 12, 0, },
0575     { HI3670_PCLK_AO_GPIO0, "pclk_ao_gpio0", "clk_div_aobus",
0576       CLK_SET_RATE_PARENT, 0x160, 11, 0, },
0577     { HI3670_PCLK_AO_GPIO1, "pclk_ao_gpio1", "clk_div_aobus",
0578       CLK_SET_RATE_PARENT, 0x160, 12, 0, },
0579     { HI3670_PCLK_AO_GPIO2, "pclk_ao_gpio2", "clk_div_aobus",
0580       CLK_SET_RATE_PARENT, 0x160, 13, 0, },
0581     { HI3670_PCLK_AO_GPIO3, "pclk_ao_gpio3", "clk_div_aobus",
0582       CLK_SET_RATE_PARENT, 0x160, 14, 0, },
0583     { HI3670_PCLK_AO_GPIO4, "pclk_ao_gpio4", "clk_div_aobus",
0584       CLK_SET_RATE_PARENT, 0x160, 21, 0, },
0585     { HI3670_PCLK_AO_GPIO5, "pclk_ao_gpio5", "clk_div_aobus",
0586       CLK_SET_RATE_PARENT, 0x160, 22, 0, },
0587     { HI3670_PCLK_AO_GPIO6, "pclk_ao_gpio6", "clk_div_aobus",
0588       CLK_SET_RATE_PARENT, 0x160, 25, 0, },
0589     { HI3670_CLK_GATE_OUT0, "clk_gate_out0", "clk_mux_clkout0",
0590       CLK_SET_RATE_PARENT, 0x160, 16, 0, },
0591     { HI3670_CLK_GATE_OUT1, "clk_gate_out1", "clk_mux_clkout1",
0592       CLK_SET_RATE_PARENT, 0x160, 17, 0, },
0593     { HI3670_PCLK_GATE_SYSCNT, "pclk_gate_syscnt", "clk_div_aobus",
0594       CLK_SET_RATE_PARENT, 0x160, 19, 0, },
0595     { HI3670_CLK_GATE_SYSCNT, "clk_gate_syscnt", "clkin_sys",
0596       CLK_SET_RATE_PARENT, 0x160, 20, 0, },
0597     { HI3670_CLK_GATE_ASP_SUBSYS_PERI, "clk_gate_asp_subsys_peri",
0598       "clk_mux_asp_subsys_peri",
0599       CLK_SET_RATE_PARENT, 0x170, 6, 0, },
0600     { HI3670_CLK_GATE_ASP_SUBSYS, "clk_gate_asp_subsys", "clk_mux_asp_pll",
0601       CLK_SET_RATE_PARENT, 0x170, 4, 0, },
0602     { HI3670_CLK_GATE_ASP_TCXO, "clk_gate_asp_tcxo", "clkin_sys",
0603       CLK_SET_RATE_PARENT, 0x160, 27, 0, },
0604     { HI3670_CLK_GATE_DP_AUDIO_PLL, "clk_gate_dp_audio_pll",
0605       "clk_gate_dp_audio_pll_ao",
0606       CLK_SET_RATE_PARENT, 0x1B0, 7, 0, },
0607 };
0608 
0609 static const struct hisi_gate_clock hi3670_sctrl_gate_clks[] = {
0610     { HI3670_CLK_ANDGT_IOPERI, "clk_andgt_ioperi", "clk_ppll0",
0611       CLK_SET_RATE_PARENT, 0x270, 6, CLK_GATE_HIWORD_MASK, },
0612     { HI3670_CLKANDGT_ASP_SUBSYS_PERI, "clkandgt_asp_subsys_peri",
0613       "clk_ppll0",
0614       CLK_SET_RATE_PARENT, 0x268, 3, CLK_GATE_HIWORD_MASK, },
0615     { HI3670_CLK_ANGT_ASP_SUBSYS, "clk_angt_asp_subsys", "clk_ppll0",
0616       CLK_SET_RATE_PARENT, 0x258, 0, CLK_GATE_HIWORD_MASK, },
0617 };
0618 
0619 static const char *const
0620 clk_mux_ufs_subsys_p[] = { "clkin_sys", "clk_ppll0", };
0621 static const char *const
0622 clk_mux_clkout0_p[] = { "clkin_ref", "clk_div_clkout0_tcxo",
0623             "clk_div_clkout0_pll", "clk_div_clkout0_pll", };
0624 static const char *const
0625 clk_mux_clkout1_p[] = { "clkin_ref", "clk_div_clkout1_tcxo",
0626             "clk_div_clkout1_pll", "clk_div_clkout1_pll", };
0627 static const char *const
0628 clk_mux_asp_subsys_peri_p[] = { "clk_ppll0", "clk_fll_src", };
0629 static const char *const
0630 clk_mux_asp_pll_p[] = { "clk_ppll0", "clk_fll_src", "clk_gate_ao_asp",
0631             "clk_pciepll_rev", };
0632 
0633 static const struct hisi_mux_clock hi3670_sctrl_mux_clks[] = {
0634     { HI3670_CLK_MUX_UFS_SUBSYS, "clk_mux_ufs_subsys", clk_mux_ufs_subsys_p,
0635       ARRAY_SIZE(clk_mux_ufs_subsys_p), CLK_SET_RATE_PARENT,
0636       0x274, 8, 1, CLK_MUX_HIWORD_MASK, },
0637     { HI3670_CLK_MUX_CLKOUT0, "clk_mux_clkout0", clk_mux_clkout0_p,
0638       ARRAY_SIZE(clk_mux_clkout0_p), CLK_SET_RATE_PARENT,
0639       0x254, 12, 2, CLK_MUX_HIWORD_MASK, },
0640     { HI3670_CLK_MUX_CLKOUT1, "clk_mux_clkout1", clk_mux_clkout1_p,
0641       ARRAY_SIZE(clk_mux_clkout1_p), CLK_SET_RATE_PARENT,
0642       0x254, 14, 2, CLK_MUX_HIWORD_MASK, },
0643     { HI3670_CLK_MUX_ASP_SUBSYS_PERI, "clk_mux_asp_subsys_peri",
0644       clk_mux_asp_subsys_peri_p, ARRAY_SIZE(clk_mux_asp_subsys_peri_p),
0645       CLK_SET_RATE_PARENT, 0x268, 8, 1, CLK_MUX_HIWORD_MASK, },
0646     { HI3670_CLK_MUX_ASP_PLL, "clk_mux_asp_pll", clk_mux_asp_pll_p,
0647       ARRAY_SIZE(clk_mux_asp_pll_p), CLK_SET_RATE_PARENT,
0648       0x268, 9, 2, CLK_MUX_HIWORD_MASK, },
0649 };
0650 
0651 static const struct hisi_divider_clock hi3670_sctrl_divider_clks[] = {
0652     { HI3670_CLK_DIV_AOBUS, "clk_div_aobus", "clk_ppll0",
0653       CLK_SET_RATE_PARENT, 0x254, 0, 6, CLK_DIVIDER_HIWORD_MASK, },
0654     { HI3670_CLK_DIV_UFS_SUBSYS, "clk_div_ufs_subsys", "clk_mux_ufs_subsys",
0655       CLK_SET_RATE_PARENT, 0x274, 0, 6, CLK_DIVIDER_HIWORD_MASK, },
0656     { HI3670_CLK_DIV_IOPERI, "clk_div_ioperi", "clk_andgt_ioperi",
0657       CLK_SET_RATE_PARENT, 0x270, 0, 6, CLK_DIVIDER_HIWORD_MASK, },
0658     { HI3670_CLK_DIV_CLKOUT0_TCXO, "clk_div_clkout0_tcxo", "clkin_sys",
0659       CLK_SET_RATE_PARENT, 0x254, 6, 3, CLK_DIVIDER_HIWORD_MASK, },
0660     { HI3670_CLK_DIV_CLKOUT1_TCXO, "clk_div_clkout1_tcxo", "clkin_sys",
0661       CLK_SET_RATE_PARENT, 0x254, 9, 3, CLK_DIVIDER_HIWORD_MASK, },
0662     { HI3670_CLK_ASP_SUBSYS_PERI_DIV, "clk_asp_subsys_peri_div", "clkandgt_asp_subsys_peri",
0663       CLK_SET_RATE_PARENT, 0x268, 0, 3, CLK_DIVIDER_HIWORD_MASK, },
0664     { HI3670_CLK_DIV_ASP_SUBSYS, "clk_div_asp_subsys", "clk_angt_asp_subsys",
0665       CLK_SET_RATE_PARENT, 0x250, 0, 3, CLK_DIVIDER_HIWORD_MASK, },
0666 };
0667 
0668 /* clk_iomcu */
0669 static const struct hisi_fixed_factor_clock hi3670_iomcu_fixed_factor_clks[] = {
0670     { HI3670_CLK_GATE_I2C0, "clk_gate_i2c0", "clk_i2c0_gate_iomcu", 1, 4, 0, },
0671     { HI3670_CLK_GATE_I2C1, "clk_gate_i2c1", "clk_i2c1_gate_iomcu", 1, 4, 0, },
0672     { HI3670_CLK_GATE_I2C2, "clk_gate_i2c2", "clk_i2c2_gate_iomcu", 1, 4, 0, },
0673     { HI3670_CLK_GATE_SPI0, "clk_gate_spi0", "clk_spi0_gate_iomcu", 1, 1, 0, },
0674     { HI3670_CLK_GATE_SPI2, "clk_gate_spi2", "clk_spi2_gate_iomcu", 1, 1, 0, },
0675     { HI3670_CLK_GATE_UART3, "clk_gate_uart3", "clk_uart3_gate_iomcu", 1, 16, 0, },
0676 };
0677 
0678 static const struct hisi_gate_clock hi3670_iomcu_gate_sep_clks[] = {
0679     { HI3670_CLK_I2C0_GATE_IOMCU, "clk_i2c0_gate_iomcu", "clk_fll_src",
0680       CLK_SET_RATE_PARENT, 0x10, 3, 0, },
0681     { HI3670_CLK_I2C1_GATE_IOMCU, "clk_i2c1_gate_iomcu", "clk_fll_src",
0682       CLK_SET_RATE_PARENT, 0x10, 4, 0, },
0683     { HI3670_CLK_I2C2_GATE_IOMCU, "clk_i2c2_gate_iomcu", "clk_fll_src",
0684       CLK_SET_RATE_PARENT, 0x10, 5, 0, },
0685     { HI3670_CLK_SPI0_GATE_IOMCU, "clk_spi0_gate_iomcu", "clk_fll_src",
0686       CLK_SET_RATE_PARENT, 0x10, 10, 0, },
0687     { HI3670_CLK_SPI2_GATE_IOMCU, "clk_spi2_gate_iomcu", "clk_fll_src",
0688       CLK_SET_RATE_PARENT, 0x10, 30, 0, },
0689     { HI3670_CLK_UART3_GATE_IOMCU, "clk_uart3_gate_iomcu", "clk_gate_iomcu_peri0",
0690       CLK_SET_RATE_PARENT, 0x10, 11, 0, },
0691     { HI3670_CLK_GATE_PERI0_IOMCU, "clk_gate_iomcu_peri0", "clk_ppll0",
0692       CLK_SET_RATE_PARENT, 0x90, 0, 0, },
0693 };
0694 
0695 /* clk_media1 */
0696 static const struct hisi_gate_clock hi3670_media1_gate_sep_clks[] = {
0697     { HI3670_ACLK_GATE_NOC_DSS, "aclk_gate_noc_dss", "aclk_gate_disp_noc_subsys",
0698       CLK_SET_RATE_PARENT, 0x10, 21, 0, },
0699     { HI3670_PCLK_GATE_NOC_DSS_CFG, "pclk_gate_noc_dss_cfg", "pclk_gate_disp_noc_subsys",
0700       CLK_SET_RATE_PARENT, 0x10, 22, 0, },
0701     { HI3670_PCLK_GATE_MMBUF_CFG, "pclk_gate_mmbuf_cfg", "pclk_gate_disp_noc_subsys",
0702       CLK_SET_RATE_PARENT, 0x20, 5, 0, },
0703     { HI3670_PCLK_GATE_DISP_NOC_SUBSYS, "pclk_gate_disp_noc_subsys", "clk_div_sysbus",
0704       CLK_SET_RATE_PARENT, 0x10, 18, 0, },
0705     { HI3670_ACLK_GATE_DISP_NOC_SUBSYS, "aclk_gate_disp_noc_subsys", "clk_gate_vivobusfreq",
0706       CLK_SET_RATE_PARENT, 0x10, 17, 0, },
0707     { HI3670_PCLK_GATE_DSS, "pclk_gate_dss", "pclk_gate_disp_noc_subsys",
0708       CLK_SET_RATE_PARENT, 0x00, 14, 0, },
0709     { HI3670_ACLK_GATE_DSS, "aclk_gate_dss", "aclk_gate_disp_noc_subsys",
0710       CLK_SET_RATE_PARENT, 0x00, 19, 0, },
0711     { HI3670_CLK_GATE_VIVOBUSFREQ, "clk_gate_vivobusfreq", "clk_div_vivobus",
0712       CLK_SET_RATE_PARENT, 0x00, 18, 0, },
0713     { HI3670_CLK_GATE_EDC0, "clk_gate_edc0", "clk_div_edc0",
0714       CLK_SET_RATE_PARENT, 0x00, 15, 0, },
0715     { HI3670_CLK_GATE_LDI0, "clk_gate_ldi0", "clk_div_ldi0",
0716       CLK_SET_RATE_PARENT, 0x00, 16, 0, },
0717     { HI3670_CLK_GATE_LDI1FREQ, "clk_gate_ldi1freq", "clk_div_ldi1",
0718       CLK_SET_RATE_PARENT, 0x00, 17, 0, },
0719     { HI3670_CLK_GATE_BRG, "clk_gate_brg", "clk_media_common_div",
0720       CLK_SET_RATE_PARENT, 0x00, 29, 0, },
0721     { HI3670_ACLK_GATE_ASC, "aclk_gate_asc", "clk_gate_mmbuf",
0722       CLK_SET_RATE_PARENT, 0x20, 3, 0, },
0723     { HI3670_CLK_GATE_DSS_AXI_MM, "clk_gate_dss_axi_mm", "clk_gate_mmbuf",
0724       CLK_SET_RATE_PARENT, 0x20, 4, 0, },
0725     { HI3670_CLK_GATE_MMBUF, "clk_gate_mmbuf", "aclk_div_mmbuf",
0726       CLK_SET_RATE_PARENT, 0x20, 0, 0, },
0727     { HI3670_PCLK_GATE_MMBUF, "pclk_gate_mmbuf", "pclk_div_mmbuf",
0728       CLK_SET_RATE_PARENT, 0x20, 1, 0, },
0729     { HI3670_CLK_GATE_ATDIV_VIVO, "clk_gate_atdiv_vivo", "clk_div_vivobus",
0730       CLK_SET_RATE_PARENT, 0x010, 1, 0, },
0731 };
0732 
0733 static const struct hisi_gate_clock hi3670_media1_gate_clks[] = {
0734     { HI3670_CLK_GATE_VIVOBUS_ANDGT, "clk_gate_vivobus_andgt", "clk_mux_vivobus",
0735       CLK_SET_RATE_PARENT, 0x84, 3, CLK_GATE_HIWORD_MASK, },
0736     { HI3670_CLK_ANDGT_EDC0, "clk_andgt_edc0", "clk_mux_edc0",
0737       CLK_SET_RATE_PARENT, 0x84, 7, CLK_GATE_HIWORD_MASK, },
0738     { HI3670_CLK_ANDGT_LDI0, "clk_andgt_ldi0", "clk_mux_ldi0",
0739       CLK_SET_RATE_PARENT, 0x84, 9, CLK_GATE_HIWORD_MASK, },
0740     { HI3670_CLK_ANDGT_LDI1, "clk_andgt_ldi1", "clk_mux_ldi1",
0741       CLK_SET_RATE_PARENT, 0x84, 8, CLK_GATE_HIWORD_MASK, },
0742     { HI3670_CLK_MMBUF_PLL_ANDGT, "clk_mmbuf_pll_andgt", "clk_sw_mmbuf",
0743       CLK_SET_RATE_PARENT, 0x84, 14, CLK_GATE_HIWORD_MASK, },
0744     { HI3670_PCLK_MMBUF_ANDGT, "pclk_mmbuf_andgt", "aclk_div_mmbuf",
0745       CLK_SET_RATE_PARENT, 0x84, 15, CLK_GATE_HIWORD_MASK, },
0746 };
0747 
0748 static const char *const
0749 clk_mux_vivobus_p[] = { "clk_invalid", "clk_invalid", "clk_gate_ppll0_media",
0750             "clk_invalid", "clk_gate_ppll2_media", "clk_invalid",
0751             "clk_invalid", "clk_invalid", "clk_gate_ppll3_media",
0752             "clk_invalid", "clk_invalid", "clk_invalid",
0753             "clk_invalid", "clk_invalid", "clk_invalid",
0754             "clk_invalid", };
0755 static const char *const
0756 clk_mux_edc0_p[] = { "clk_invalid", "clk_invalid", "clk_gate_ppll0_media",
0757              "clk_invalid", "clk_gate_ppll2_media", "clk_invalid",
0758              "clk_invalid", "clk_invalid", "clk_gate_ppll3_media",
0759              "clk_invalid", "clk_invalid", "clk_invalid", "clk_invalid",
0760              "clk_invalid", "clk_invalid", "clk_invalid", };
0761 static const char *const
0762 clk_mux_ldi0_p[] = { "clk_invalid", "clk_gate_ppll7_media",
0763              "clk_gate_ppll0_media", "clk_invalid",
0764              "clk_gate_ppll2_media", "clk_invalid", "clk_invalid",
0765              "clk_invalid", "clk_gate_ppll3_media", "clk_invalid",
0766              "clk_invalid", "clk_invalid", "clk_invalid", "clk_invalid",
0767              "clk_invalid", "clk_invalid", };
0768 static const char *const
0769 clk_mux_ldi1_p[] = { "clk_invalid", "clk_gate_ppll7_media",
0770              "clk_gate_ppll0_media", "clk_invalid",
0771              "clk_gate_ppll2_media", "clk_invalid", "clk_invalid",
0772              "clk_invalid", "clk_gate_ppll3_media", "clk_invalid",
0773              "clk_invalid", "clk_invalid", "clk_invalid", "clk_invalid",
0774              "clk_invalid", "clk_invalid", };
0775 static const char *const
0776 clk_sw_mmbuf_p[] = { "clk_invalid", "clk_invalid", "clk_gate_ppll0_media",
0777              "clk_invalid", "clk_gate_ppll2_media", "clk_invalid",
0778              "clk_invalid", "clk_invalid", "clk_gate_ppll3_media",
0779              "clk_invalid", "clk_invalid", "clk_invalid", "clk_invalid",
0780              "clk_invalid", "clk_invalid", "clk_invalid", };
0781 
0782 static const struct hisi_mux_clock hi3670_media1_mux_clks[] = {
0783     { HI3670_CLK_MUX_VIVOBUS, "clk_mux_vivobus", clk_mux_vivobus_p,
0784       ARRAY_SIZE(clk_mux_vivobus_p), CLK_SET_RATE_PARENT,
0785       0x74, 6, 4, CLK_MUX_HIWORD_MASK, },
0786     { HI3670_CLK_MUX_EDC0, "clk_mux_edc0", clk_mux_edc0_p,
0787       ARRAY_SIZE(clk_mux_edc0_p), CLK_SET_RATE_PARENT,
0788       0x68, 6, 4, CLK_MUX_HIWORD_MASK, },
0789     { HI3670_CLK_MUX_LDI0, "clk_mux_ldi0", clk_mux_ldi0_p,
0790       ARRAY_SIZE(clk_mux_ldi0_p), CLK_SET_RATE_PARENT,
0791       0x60, 6, 4, CLK_MUX_HIWORD_MASK, },
0792     { HI3670_CLK_MUX_LDI1, "clk_mux_ldi1", clk_mux_ldi1_p,
0793       ARRAY_SIZE(clk_mux_ldi1_p), CLK_SET_RATE_PARENT,
0794       0x64, 6, 4, CLK_MUX_HIWORD_MASK, },
0795     { HI3670_CLK_SW_MMBUF, "clk_sw_mmbuf", clk_sw_mmbuf_p,
0796       ARRAY_SIZE(clk_sw_mmbuf_p), CLK_SET_RATE_PARENT,
0797       0x88, 0, 4, CLK_MUX_HIWORD_MASK, },
0798 };
0799 
0800 static const struct hisi_divider_clock hi3670_media1_divider_clks[] = {
0801     { HI3670_CLK_DIV_VIVOBUS, "clk_div_vivobus", "clk_gate_vivobus_andgt",
0802       CLK_SET_RATE_PARENT, 0x74, 0, 6, CLK_DIVIDER_HIWORD_MASK, },
0803     { HI3670_CLK_DIV_EDC0, "clk_div_edc0", "clk_andgt_edc0",
0804       CLK_SET_RATE_PARENT, 0x68, 0, 6, CLK_DIVIDER_HIWORD_MASK, },
0805     { HI3670_CLK_DIV_LDI0, "clk_div_ldi0", "clk_andgt_ldi0",
0806       CLK_SET_RATE_PARENT, 0x60, 0, 6, CLK_DIVIDER_HIWORD_MASK, },
0807     { HI3670_CLK_DIV_LDI1, "clk_div_ldi1", "clk_andgt_ldi1",
0808       CLK_SET_RATE_PARENT, 0x64, 0, 6, CLK_DIVIDER_HIWORD_MASK, },
0809     { HI3670_ACLK_DIV_MMBUF, "aclk_div_mmbuf", "clk_mmbuf_pll_andgt",
0810       CLK_SET_RATE_PARENT, 0x7C, 10, 6, CLK_DIVIDER_HIWORD_MASK, },
0811     { HI3670_PCLK_DIV_MMBUF, "pclk_div_mmbuf", "pclk_mmbuf_andgt",
0812       CLK_SET_RATE_PARENT, 0x78, 0, 2, CLK_DIVIDER_HIWORD_MASK, },
0813 };
0814 
0815 /* clk_media2 */
0816 static const struct hisi_gate_clock hi3670_media2_gate_sep_clks[] = {
0817     { HI3670_CLK_GATE_VDECFREQ, "clk_gate_vdecfreq", "clk_div_vdec",
0818       CLK_SET_RATE_PARENT, 0x00, 8, 0, },
0819     { HI3670_CLK_GATE_VENCFREQ, "clk_gate_vencfreq", "clk_div_venc",
0820       CLK_SET_RATE_PARENT, 0x00, 5, 0, },
0821     { HI3670_CLK_GATE_ICSFREQ, "clk_gate_icsfreq", "clk_div_ics",
0822       CLK_SET_RATE_PARENT, 0x00, 2, 0, },
0823 };
0824 
0825 static void hi3670_clk_crgctrl_init(struct device_node *np)
0826 {
0827     struct hisi_clock_data *clk_data;
0828 
0829     int nr = ARRAY_SIZE(hi3670_fixed_rate_clks) +
0830          ARRAY_SIZE(hi3670_crgctrl_gate_sep_clks) +
0831          ARRAY_SIZE(hi3670_crgctrl_gate_clks) +
0832          ARRAY_SIZE(hi3670_crgctrl_mux_clks) +
0833          ARRAY_SIZE(hi3670_crg_fixed_factor_clks) +
0834          ARRAY_SIZE(hi3670_crgctrl_divider_clks);
0835 
0836     clk_data = hisi_clk_init(np, nr);
0837     if (!clk_data)
0838         return;
0839 
0840     hisi_clk_register_fixed_rate(hi3670_fixed_rate_clks,
0841                      ARRAY_SIZE(hi3670_fixed_rate_clks),
0842                      clk_data);
0843     hisi_clk_register_gate_sep(hi3670_crgctrl_gate_sep_clks,
0844                    ARRAY_SIZE(hi3670_crgctrl_gate_sep_clks),
0845                    clk_data);
0846     hisi_clk_register_gate(hi3670_crgctrl_gate_clks,
0847                    ARRAY_SIZE(hi3670_crgctrl_gate_clks),
0848                    clk_data);
0849     hisi_clk_register_mux(hi3670_crgctrl_mux_clks,
0850                   ARRAY_SIZE(hi3670_crgctrl_mux_clks),
0851                   clk_data);
0852     hisi_clk_register_fixed_factor(hi3670_crg_fixed_factor_clks,
0853                        ARRAY_SIZE(hi3670_crg_fixed_factor_clks),
0854                        clk_data);
0855     hisi_clk_register_divider(hi3670_crgctrl_divider_clks,
0856                   ARRAY_SIZE(hi3670_crgctrl_divider_clks),
0857                   clk_data);
0858 }
0859 
0860 static void hi3670_clk_pctrl_init(struct device_node *np)
0861 {
0862     struct hisi_clock_data *clk_data;
0863     int nr = ARRAY_SIZE(hi3670_pctrl_gate_clks);
0864 
0865     clk_data = hisi_clk_init(np, nr);
0866     if (!clk_data)
0867         return;
0868     hisi_clk_register_gate(hi3670_pctrl_gate_clks,
0869                    ARRAY_SIZE(hi3670_pctrl_gate_clks), clk_data);
0870 }
0871 
0872 static void hi3670_clk_pmuctrl_init(struct device_node *np)
0873 {
0874     struct hisi_clock_data *clk_data;
0875     int nr = ARRAY_SIZE(hi3670_pmu_gate_clks);
0876 
0877     clk_data = hisi_clk_init(np, nr);
0878     if (!clk_data)
0879         return;
0880 
0881     hisi_clk_register_gate(hi3670_pmu_gate_clks,
0882                    ARRAY_SIZE(hi3670_pmu_gate_clks), clk_data);
0883 }
0884 
0885 static void hi3670_clk_sctrl_init(struct device_node *np)
0886 {
0887     struct hisi_clock_data *clk_data;
0888     int nr = ARRAY_SIZE(hi3670_sctrl_gate_sep_clks) +
0889          ARRAY_SIZE(hi3670_sctrl_gate_clks) +
0890          ARRAY_SIZE(hi3670_sctrl_mux_clks) +
0891          ARRAY_SIZE(hi3670_sctrl_divider_clks);
0892 
0893     clk_data = hisi_clk_init(np, nr);
0894     if (!clk_data)
0895         return;
0896 
0897     hisi_clk_register_gate_sep(hi3670_sctrl_gate_sep_clks,
0898                    ARRAY_SIZE(hi3670_sctrl_gate_sep_clks),
0899                    clk_data);
0900     hisi_clk_register_gate(hi3670_sctrl_gate_clks,
0901                    ARRAY_SIZE(hi3670_sctrl_gate_clks),
0902                    clk_data);
0903     hisi_clk_register_mux(hi3670_sctrl_mux_clks,
0904                   ARRAY_SIZE(hi3670_sctrl_mux_clks),
0905                   clk_data);
0906     hisi_clk_register_divider(hi3670_sctrl_divider_clks,
0907                   ARRAY_SIZE(hi3670_sctrl_divider_clks),
0908                   clk_data);
0909 }
0910 
0911 static void hi3670_clk_iomcu_init(struct device_node *np)
0912 {
0913     struct hisi_clock_data *clk_data;
0914     int nr = ARRAY_SIZE(hi3670_iomcu_gate_sep_clks) +
0915             ARRAY_SIZE(hi3670_iomcu_fixed_factor_clks);
0916 
0917     clk_data = hisi_clk_init(np, nr);
0918     if (!clk_data)
0919         return;
0920 
0921     hisi_clk_register_gate(hi3670_iomcu_gate_sep_clks,
0922                    ARRAY_SIZE(hi3670_iomcu_gate_sep_clks), clk_data);
0923 
0924     hisi_clk_register_fixed_factor(hi3670_iomcu_fixed_factor_clks,
0925                        ARRAY_SIZE(hi3670_iomcu_fixed_factor_clks),
0926                        clk_data);
0927 }
0928 
0929 static void hi3670_clk_media1_init(struct device_node *np)
0930 {
0931     struct hisi_clock_data *clk_data;
0932 
0933     int nr = ARRAY_SIZE(hi3670_media1_gate_sep_clks) +
0934          ARRAY_SIZE(hi3670_media1_gate_clks) +
0935          ARRAY_SIZE(hi3670_media1_mux_clks) +
0936          ARRAY_SIZE(hi3670_media1_divider_clks);
0937 
0938     clk_data = hisi_clk_init(np, nr);
0939     if (!clk_data)
0940         return;
0941 
0942     hisi_clk_register_gate_sep(hi3670_media1_gate_sep_clks,
0943                    ARRAY_SIZE(hi3670_media1_gate_sep_clks),
0944                    clk_data);
0945     hisi_clk_register_gate(hi3670_media1_gate_clks,
0946                    ARRAY_SIZE(hi3670_media1_gate_clks),
0947                    clk_data);
0948     hisi_clk_register_mux(hi3670_media1_mux_clks,
0949                   ARRAY_SIZE(hi3670_media1_mux_clks),
0950                   clk_data);
0951     hisi_clk_register_divider(hi3670_media1_divider_clks,
0952                   ARRAY_SIZE(hi3670_media1_divider_clks),
0953                   clk_data);
0954 }
0955 
0956 static void hi3670_clk_media2_init(struct device_node *np)
0957 {
0958     struct hisi_clock_data *clk_data;
0959 
0960     int nr = ARRAY_SIZE(hi3670_media2_gate_sep_clks);
0961 
0962     clk_data = hisi_clk_init(np, nr);
0963     if (!clk_data)
0964         return;
0965 
0966     hisi_clk_register_gate_sep(hi3670_media2_gate_sep_clks,
0967                    ARRAY_SIZE(hi3670_media2_gate_sep_clks),
0968                    clk_data);
0969 }
0970 
0971 static const struct of_device_id hi3670_clk_match_table[] = {
0972     { .compatible = "hisilicon,hi3670-crgctrl",
0973       .data = hi3670_clk_crgctrl_init },
0974     { .compatible = "hisilicon,hi3670-pctrl",
0975       .data = hi3670_clk_pctrl_init },
0976     { .compatible = "hisilicon,hi3670-pmuctrl",
0977       .data = hi3670_clk_pmuctrl_init },
0978     { .compatible = "hisilicon,hi3670-sctrl",
0979       .data = hi3670_clk_sctrl_init },
0980     { .compatible = "hisilicon,hi3670-iomcu",
0981       .data = hi3670_clk_iomcu_init },
0982     { .compatible = "hisilicon,hi3670-media1-crg",
0983       .data = hi3670_clk_media1_init },
0984     { .compatible = "hisilicon,hi3670-media2-crg",
0985       .data = hi3670_clk_media2_init },
0986     { }
0987 };
0988 
0989 static int hi3670_clk_probe(struct platform_device *pdev)
0990 {
0991     struct device *dev = &pdev->dev;
0992     struct device_node *np = pdev->dev.of_node;
0993     void (*init_func)(struct device_node *np);
0994 
0995     init_func = of_device_get_match_data(dev);
0996     if (!init_func)
0997         return -ENODEV;
0998 
0999     init_func(np);
1000 
1001     return 0;
1002 }
1003 
1004 static struct platform_driver hi3670_clk_driver = {
1005     .probe          = hi3670_clk_probe,
1006     .driver         = {
1007         .name   = "hi3670-clk",
1008         .of_match_table = hi3670_clk_match_table,
1009     },
1010 };
1011 
1012 static int __init hi3670_clk_init(void)
1013 {
1014     return platform_driver_register(&hi3670_clk_driver);
1015 }
1016 core_initcall(hi3670_clk_init);