162306a36Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0+ 262306a36Sopenharmony_ci/* 362306a36Sopenharmony_ci * Copyright 2018-2021 NXP 462306a36Sopenharmony_ci * Dong Aisheng <aisheng.dong@nxp.com> 562306a36Sopenharmony_ci */ 662306a36Sopenharmony_ci 762306a36Sopenharmony_ci#include <linux/clk-provider.h> 862306a36Sopenharmony_ci#include <linux/err.h> 962306a36Sopenharmony_ci#include <linux/io.h> 1062306a36Sopenharmony_ci#include <linux/module.h> 1162306a36Sopenharmony_ci#include <linux/of.h> 1262306a36Sopenharmony_ci#include <linux/platform_device.h> 1362306a36Sopenharmony_ci#include <linux/slab.h> 1462306a36Sopenharmony_ci 1562306a36Sopenharmony_ci#include "clk-scu.h" 1662306a36Sopenharmony_ci 1762306a36Sopenharmony_ci#include <dt-bindings/firmware/imx/rsrc.h> 1862306a36Sopenharmony_ci 1962306a36Sopenharmony_cistatic const char *dc0_sels[] = { 2062306a36Sopenharmony_ci "clk_dummy", 2162306a36Sopenharmony_ci "clk_dummy", 2262306a36Sopenharmony_ci "dc0_pll0_clk", 2362306a36Sopenharmony_ci "dc0_pll1_clk", 2462306a36Sopenharmony_ci "dc0_bypass0_clk", 2562306a36Sopenharmony_ci}; 2662306a36Sopenharmony_ci 2762306a36Sopenharmony_cistatic const char * const dc1_sels[] = { 2862306a36Sopenharmony_ci "clk_dummy", 2962306a36Sopenharmony_ci "clk_dummy", 3062306a36Sopenharmony_ci "dc1_pll0_clk", 3162306a36Sopenharmony_ci "dc1_pll1_clk", 3262306a36Sopenharmony_ci "dc1_bypass0_clk", 3362306a36Sopenharmony_ci}; 3462306a36Sopenharmony_ci 3562306a36Sopenharmony_cistatic const char * const enet0_rgmii_txc_sels[] = { 3662306a36Sopenharmony_ci "enet0_ref_div", 3762306a36Sopenharmony_ci "clk_dummy", 3862306a36Sopenharmony_ci}; 3962306a36Sopenharmony_ci 4062306a36Sopenharmony_cistatic const char * const enet1_rgmii_txc_sels[] = { 4162306a36Sopenharmony_ci "enet1_ref_div", 4262306a36Sopenharmony_ci "clk_dummy", 4362306a36Sopenharmony_ci}; 4462306a36Sopenharmony_ci 4562306a36Sopenharmony_cistatic const char * const hdmi_sels[] = { 4662306a36Sopenharmony_ci "clk_dummy", 4762306a36Sopenharmony_ci "hdmi_dig_pll_clk", 4862306a36Sopenharmony_ci "clk_dummy", 4962306a36Sopenharmony_ci "clk_dummy", 5062306a36Sopenharmony_ci "hdmi_av_pll_clk", 5162306a36Sopenharmony_ci}; 5262306a36Sopenharmony_ci 5362306a36Sopenharmony_cistatic const char * const hdmi_rx_sels[] = { 5462306a36Sopenharmony_ci "clk_dummy", 5562306a36Sopenharmony_ci "hdmi_rx_dig_pll_clk", 5662306a36Sopenharmony_ci "clk_dummy", 5762306a36Sopenharmony_ci "clk_dummy", 5862306a36Sopenharmony_ci "hdmi_rx_bypass_clk", 5962306a36Sopenharmony_ci}; 6062306a36Sopenharmony_ci 6162306a36Sopenharmony_cistatic const char * const lcd_pxl_sels[] = { 6262306a36Sopenharmony_ci "clk_dummy", 6362306a36Sopenharmony_ci "clk_dummy", 6462306a36Sopenharmony_ci "clk_dummy", 6562306a36Sopenharmony_ci "clk_dummy", 6662306a36Sopenharmony_ci "lcd_pxl_bypass_div_clk", 6762306a36Sopenharmony_ci}; 6862306a36Sopenharmony_ci 6962306a36Sopenharmony_cistatic const char *const lvds0_sels[] = { 7062306a36Sopenharmony_ci "clk_dummy", 7162306a36Sopenharmony_ci "clk_dummy", 7262306a36Sopenharmony_ci "clk_dummy", 7362306a36Sopenharmony_ci "clk_dummy", 7462306a36Sopenharmony_ci "mipi0_lvds_bypass_clk", 7562306a36Sopenharmony_ci}; 7662306a36Sopenharmony_ci 7762306a36Sopenharmony_cistatic const char *const lvds1_sels[] = { 7862306a36Sopenharmony_ci "clk_dummy", 7962306a36Sopenharmony_ci "clk_dummy", 8062306a36Sopenharmony_ci "clk_dummy", 8162306a36Sopenharmony_ci "clk_dummy", 8262306a36Sopenharmony_ci "mipi1_lvds_bypass_clk", 8362306a36Sopenharmony_ci}; 8462306a36Sopenharmony_ci 8562306a36Sopenharmony_cistatic const char * const mipi_sels[] = { 8662306a36Sopenharmony_ci "clk_dummy", 8762306a36Sopenharmony_ci "clk_dummy", 8862306a36Sopenharmony_ci "mipi_pll_div2_clk", 8962306a36Sopenharmony_ci "clk_dummy", 9062306a36Sopenharmony_ci "clk_dummy", 9162306a36Sopenharmony_ci}; 9262306a36Sopenharmony_ci 9362306a36Sopenharmony_cistatic const char * const lcd_sels[] = { 9462306a36Sopenharmony_ci "clk_dummy", 9562306a36Sopenharmony_ci "clk_dummy", 9662306a36Sopenharmony_ci "clk_dummy", 9762306a36Sopenharmony_ci "clk_dummy", 9862306a36Sopenharmony_ci "elcdif_pll", 9962306a36Sopenharmony_ci}; 10062306a36Sopenharmony_ci 10162306a36Sopenharmony_cistatic const char * const pi_pll0_sels[] = { 10262306a36Sopenharmony_ci "clk_dummy", 10362306a36Sopenharmony_ci "pi_dpll_clk", 10462306a36Sopenharmony_ci "clk_dummy", 10562306a36Sopenharmony_ci "clk_dummy", 10662306a36Sopenharmony_ci "clk_dummy", 10762306a36Sopenharmony_ci}; 10862306a36Sopenharmony_ci 10962306a36Sopenharmony_cistatic int imx8qxp_clk_probe(struct platform_device *pdev) 11062306a36Sopenharmony_ci{ 11162306a36Sopenharmony_ci struct device_node *ccm_node = pdev->dev.of_node; 11262306a36Sopenharmony_ci const struct imx_clk_scu_rsrc_table *rsrc_table; 11362306a36Sopenharmony_ci int ret; 11462306a36Sopenharmony_ci 11562306a36Sopenharmony_ci rsrc_table = of_device_get_match_data(&pdev->dev); 11662306a36Sopenharmony_ci ret = imx_clk_scu_init(ccm_node, rsrc_table); 11762306a36Sopenharmony_ci if (ret) 11862306a36Sopenharmony_ci return ret; 11962306a36Sopenharmony_ci 12062306a36Sopenharmony_ci /* ARM core */ 12162306a36Sopenharmony_ci imx_clk_scu("a35_clk", IMX_SC_R_A35, IMX_SC_PM_CLK_CPU); 12262306a36Sopenharmony_ci imx_clk_scu("a53_clk", IMX_SC_R_A53, IMX_SC_PM_CLK_CPU); 12362306a36Sopenharmony_ci imx_clk_scu("a72_clk", IMX_SC_R_A72, IMX_SC_PM_CLK_CPU); 12462306a36Sopenharmony_ci 12562306a36Sopenharmony_ci /* LSIO SS */ 12662306a36Sopenharmony_ci imx_clk_scu("pwm0_clk", IMX_SC_R_PWM_0, IMX_SC_PM_CLK_PER); 12762306a36Sopenharmony_ci imx_clk_scu("pwm1_clk", IMX_SC_R_PWM_1, IMX_SC_PM_CLK_PER); 12862306a36Sopenharmony_ci imx_clk_scu("pwm2_clk", IMX_SC_R_PWM_2, IMX_SC_PM_CLK_PER); 12962306a36Sopenharmony_ci imx_clk_scu("pwm3_clk", IMX_SC_R_PWM_3, IMX_SC_PM_CLK_PER); 13062306a36Sopenharmony_ci imx_clk_scu("pwm4_clk", IMX_SC_R_PWM_4, IMX_SC_PM_CLK_PER); 13162306a36Sopenharmony_ci imx_clk_scu("pwm5_clk", IMX_SC_R_PWM_5, IMX_SC_PM_CLK_PER); 13262306a36Sopenharmony_ci imx_clk_scu("pwm6_clk", IMX_SC_R_PWM_6, IMX_SC_PM_CLK_PER); 13362306a36Sopenharmony_ci imx_clk_scu("pwm7_clk", IMX_SC_R_PWM_7, IMX_SC_PM_CLK_PER); 13462306a36Sopenharmony_ci imx_clk_scu("gpt0_clk", IMX_SC_R_GPT_0, IMX_SC_PM_CLK_PER); 13562306a36Sopenharmony_ci imx_clk_scu("gpt1_clk", IMX_SC_R_GPT_1, IMX_SC_PM_CLK_PER); 13662306a36Sopenharmony_ci imx_clk_scu("gpt2_clk", IMX_SC_R_GPT_2, IMX_SC_PM_CLK_PER); 13762306a36Sopenharmony_ci imx_clk_scu("gpt3_clk", IMX_SC_R_GPT_3, IMX_SC_PM_CLK_PER); 13862306a36Sopenharmony_ci imx_clk_scu("gpt4_clk", IMX_SC_R_GPT_4, IMX_SC_PM_CLK_PER); 13962306a36Sopenharmony_ci imx_clk_scu("fspi0_clk", IMX_SC_R_FSPI_0, IMX_SC_PM_CLK_PER); 14062306a36Sopenharmony_ci imx_clk_scu("fspi1_clk", IMX_SC_R_FSPI_1, IMX_SC_PM_CLK_PER); 14162306a36Sopenharmony_ci 14262306a36Sopenharmony_ci /* DMA SS */ 14362306a36Sopenharmony_ci imx_clk_scu("uart0_clk", IMX_SC_R_UART_0, IMX_SC_PM_CLK_PER); 14462306a36Sopenharmony_ci imx_clk_scu("uart1_clk", IMX_SC_R_UART_1, IMX_SC_PM_CLK_PER); 14562306a36Sopenharmony_ci imx_clk_scu("uart2_clk", IMX_SC_R_UART_2, IMX_SC_PM_CLK_PER); 14662306a36Sopenharmony_ci imx_clk_scu("uart3_clk", IMX_SC_R_UART_3, IMX_SC_PM_CLK_PER); 14762306a36Sopenharmony_ci imx_clk_scu("uart4_clk", IMX_SC_R_UART_4, IMX_SC_PM_CLK_PER); 14862306a36Sopenharmony_ci imx_clk_scu("sim0_clk", IMX_SC_R_EMVSIM_0, IMX_SC_PM_CLK_PER); 14962306a36Sopenharmony_ci imx_clk_scu("spi0_clk", IMX_SC_R_SPI_0, IMX_SC_PM_CLK_PER); 15062306a36Sopenharmony_ci imx_clk_scu("spi1_clk", IMX_SC_R_SPI_1, IMX_SC_PM_CLK_PER); 15162306a36Sopenharmony_ci imx_clk_scu("spi2_clk", IMX_SC_R_SPI_2, IMX_SC_PM_CLK_PER); 15262306a36Sopenharmony_ci imx_clk_scu("spi3_clk", IMX_SC_R_SPI_3, IMX_SC_PM_CLK_PER); 15362306a36Sopenharmony_ci imx_clk_scu("can0_clk", IMX_SC_R_CAN_0, IMX_SC_PM_CLK_PER); 15462306a36Sopenharmony_ci imx_clk_scu("can1_clk", IMX_SC_R_CAN_1, IMX_SC_PM_CLK_PER); 15562306a36Sopenharmony_ci imx_clk_scu("can2_clk", IMX_SC_R_CAN_2, IMX_SC_PM_CLK_PER); 15662306a36Sopenharmony_ci imx_clk_scu("i2c0_clk", IMX_SC_R_I2C_0, IMX_SC_PM_CLK_PER); 15762306a36Sopenharmony_ci imx_clk_scu("i2c1_clk", IMX_SC_R_I2C_1, IMX_SC_PM_CLK_PER); 15862306a36Sopenharmony_ci imx_clk_scu("i2c2_clk", IMX_SC_R_I2C_2, IMX_SC_PM_CLK_PER); 15962306a36Sopenharmony_ci imx_clk_scu("i2c3_clk", IMX_SC_R_I2C_3, IMX_SC_PM_CLK_PER); 16062306a36Sopenharmony_ci imx_clk_scu("i2c4_clk", IMX_SC_R_I2C_4, IMX_SC_PM_CLK_PER); 16162306a36Sopenharmony_ci imx_clk_scu("ftm0_clk", IMX_SC_R_FTM_0, IMX_SC_PM_CLK_PER); 16262306a36Sopenharmony_ci imx_clk_scu("ftm1_clk", IMX_SC_R_FTM_1, IMX_SC_PM_CLK_PER); 16362306a36Sopenharmony_ci imx_clk_scu("adc0_clk", IMX_SC_R_ADC_0, IMX_SC_PM_CLK_PER); 16462306a36Sopenharmony_ci imx_clk_scu("adc1_clk", IMX_SC_R_ADC_1, IMX_SC_PM_CLK_PER); 16562306a36Sopenharmony_ci imx_clk_scu("pwm_clk", IMX_SC_R_LCD_0_PWM_0, IMX_SC_PM_CLK_PER); 16662306a36Sopenharmony_ci imx_clk_scu("elcdif_pll", IMX_SC_R_ELCDIF_PLL, IMX_SC_PM_CLK_PLL); 16762306a36Sopenharmony_ci imx_clk_scu2("lcd_clk", lcd_sels, ARRAY_SIZE(lcd_sels), IMX_SC_R_LCD_0, IMX_SC_PM_CLK_PER); 16862306a36Sopenharmony_ci imx_clk_scu2("lcd_pxl_clk", lcd_pxl_sels, ARRAY_SIZE(lcd_pxl_sels), IMX_SC_R_LCD_0, IMX_SC_PM_CLK_MISC0); 16962306a36Sopenharmony_ci imx_clk_scu("lcd_pxl_bypass_div_clk", IMX_SC_R_LCD_0, IMX_SC_PM_CLK_BYPASS); 17062306a36Sopenharmony_ci 17162306a36Sopenharmony_ci /* Audio SS */ 17262306a36Sopenharmony_ci imx_clk_scu("audio_pll0_clk", IMX_SC_R_AUDIO_PLL_0, IMX_SC_PM_CLK_PLL); 17362306a36Sopenharmony_ci imx_clk_scu("audio_pll1_clk", IMX_SC_R_AUDIO_PLL_1, IMX_SC_PM_CLK_PLL); 17462306a36Sopenharmony_ci imx_clk_scu("audio_pll_div_clk0_clk", IMX_SC_R_AUDIO_PLL_0, IMX_SC_PM_CLK_MISC0); 17562306a36Sopenharmony_ci imx_clk_scu("audio_pll_div_clk1_clk", IMX_SC_R_AUDIO_PLL_1, IMX_SC_PM_CLK_MISC0); 17662306a36Sopenharmony_ci imx_clk_scu("audio_rec_clk0_clk", IMX_SC_R_AUDIO_PLL_0, IMX_SC_PM_CLK_MISC1); 17762306a36Sopenharmony_ci imx_clk_scu("audio_rec_clk1_clk", IMX_SC_R_AUDIO_PLL_1, IMX_SC_PM_CLK_MISC1); 17862306a36Sopenharmony_ci 17962306a36Sopenharmony_ci /* Connectivity */ 18062306a36Sopenharmony_ci imx_clk_scu("sdhc0_clk", IMX_SC_R_SDHC_0, IMX_SC_PM_CLK_PER); 18162306a36Sopenharmony_ci imx_clk_scu("sdhc1_clk", IMX_SC_R_SDHC_1, IMX_SC_PM_CLK_PER); 18262306a36Sopenharmony_ci imx_clk_scu("sdhc2_clk", IMX_SC_R_SDHC_2, IMX_SC_PM_CLK_PER); 18362306a36Sopenharmony_ci imx_clk_scu("enet0_root_clk", IMX_SC_R_ENET_0, IMX_SC_PM_CLK_PER); 18462306a36Sopenharmony_ci imx_clk_divider_gpr_scu("enet0_ref_div", "enet0_root_clk", IMX_SC_R_ENET_0, IMX_SC_C_CLKDIV); 18562306a36Sopenharmony_ci imx_clk_mux_gpr_scu("enet0_rgmii_txc_sel", enet0_rgmii_txc_sels, ARRAY_SIZE(enet0_rgmii_txc_sels), IMX_SC_R_ENET_0, IMX_SC_C_TXCLK); 18662306a36Sopenharmony_ci imx_clk_scu("enet0_bypass_clk", IMX_SC_R_ENET_0, IMX_SC_PM_CLK_BYPASS); 18762306a36Sopenharmony_ci imx_clk_gate_gpr_scu("enet0_ref_50_clk", "clk_dummy", IMX_SC_R_ENET_0, IMX_SC_C_DISABLE_50, true); 18862306a36Sopenharmony_ci imx_clk_scu("enet0_rgmii_rx_clk", IMX_SC_R_ENET_0, IMX_SC_PM_CLK_MISC0); 18962306a36Sopenharmony_ci imx_clk_scu("enet1_root_clk", IMX_SC_R_ENET_1, IMX_SC_PM_CLK_PER); 19062306a36Sopenharmony_ci imx_clk_divider_gpr_scu("enet1_ref_div", "enet1_root_clk", IMX_SC_R_ENET_1, IMX_SC_C_CLKDIV); 19162306a36Sopenharmony_ci imx_clk_mux_gpr_scu("enet1_rgmii_txc_sel", enet1_rgmii_txc_sels, ARRAY_SIZE(enet1_rgmii_txc_sels), IMX_SC_R_ENET_1, IMX_SC_C_TXCLK); 19262306a36Sopenharmony_ci imx_clk_scu("enet1_bypass_clk", IMX_SC_R_ENET_1, IMX_SC_PM_CLK_BYPASS); 19362306a36Sopenharmony_ci imx_clk_gate_gpr_scu("enet1_ref_50_clk", "clk_dummy", IMX_SC_R_ENET_1, IMX_SC_C_DISABLE_50, true); 19462306a36Sopenharmony_ci imx_clk_scu("enet1_rgmii_rx_clk", IMX_SC_R_ENET_1, IMX_SC_PM_CLK_MISC0); 19562306a36Sopenharmony_ci imx_clk_scu("gpmi_io_clk", IMX_SC_R_NAND, IMX_SC_PM_CLK_MST_BUS); 19662306a36Sopenharmony_ci imx_clk_scu("gpmi_bch_clk", IMX_SC_R_NAND, IMX_SC_PM_CLK_PER); 19762306a36Sopenharmony_ci imx_clk_scu("usb3_aclk_div", IMX_SC_R_USB_2, IMX_SC_PM_CLK_PER); 19862306a36Sopenharmony_ci imx_clk_scu("usb3_bus_div", IMX_SC_R_USB_2, IMX_SC_PM_CLK_MST_BUS); 19962306a36Sopenharmony_ci imx_clk_scu("usb3_lpm_div", IMX_SC_R_USB_2, IMX_SC_PM_CLK_MISC); 20062306a36Sopenharmony_ci 20162306a36Sopenharmony_ci /* Display controller SS */ 20262306a36Sopenharmony_ci imx_clk_scu2("dc0_disp0_clk", dc0_sels, ARRAY_SIZE(dc0_sels), IMX_SC_R_DC_0, IMX_SC_PM_CLK_MISC0); 20362306a36Sopenharmony_ci imx_clk_scu2("dc0_disp1_clk", dc0_sels, ARRAY_SIZE(dc0_sels), IMX_SC_R_DC_0, IMX_SC_PM_CLK_MISC1); 20462306a36Sopenharmony_ci imx_clk_scu("dc0_pll0_clk", IMX_SC_R_DC_0_PLL_0, IMX_SC_PM_CLK_PLL); 20562306a36Sopenharmony_ci imx_clk_scu("dc0_pll1_clk", IMX_SC_R_DC_0_PLL_1, IMX_SC_PM_CLK_PLL); 20662306a36Sopenharmony_ci imx_clk_scu("dc0_bypass0_clk", IMX_SC_R_DC_0_VIDEO0, IMX_SC_PM_CLK_BYPASS); 20762306a36Sopenharmony_ci imx_clk_scu("dc0_bypass1_clk", IMX_SC_R_DC_0_VIDEO1, IMX_SC_PM_CLK_BYPASS); 20862306a36Sopenharmony_ci 20962306a36Sopenharmony_ci imx_clk_scu2("dc1_disp0_clk", dc1_sels, ARRAY_SIZE(dc1_sels), IMX_SC_R_DC_1, IMX_SC_PM_CLK_MISC0); 21062306a36Sopenharmony_ci imx_clk_scu2("dc1_disp1_clk", dc1_sels, ARRAY_SIZE(dc1_sels), IMX_SC_R_DC_1, IMX_SC_PM_CLK_MISC1); 21162306a36Sopenharmony_ci imx_clk_scu("dc1_pll0_clk", IMX_SC_R_DC_1_PLL_0, IMX_SC_PM_CLK_PLL); 21262306a36Sopenharmony_ci imx_clk_scu("dc1_pll1_clk", IMX_SC_R_DC_1_PLL_1, IMX_SC_PM_CLK_PLL); 21362306a36Sopenharmony_ci imx_clk_scu("dc1_bypass0_clk", IMX_SC_R_DC_1_VIDEO0, IMX_SC_PM_CLK_BYPASS); 21462306a36Sopenharmony_ci imx_clk_scu("dc1_bypass1_clk", IMX_SC_R_DC_1_VIDEO1, IMX_SC_PM_CLK_BYPASS); 21562306a36Sopenharmony_ci 21662306a36Sopenharmony_ci /* MIPI-LVDS SS */ 21762306a36Sopenharmony_ci imx_clk_scu("mipi0_bypass_clk", IMX_SC_R_MIPI_0, IMX_SC_PM_CLK_BYPASS); 21862306a36Sopenharmony_ci imx_clk_scu("mipi0_pixel_clk", IMX_SC_R_MIPI_0, IMX_SC_PM_CLK_PER); 21962306a36Sopenharmony_ci imx_clk_scu("mipi0_lvds_bypass_clk", IMX_SC_R_LVDS_0, IMX_SC_PM_CLK_BYPASS); 22062306a36Sopenharmony_ci imx_clk_scu2("mipi0_lvds_pixel_clk", lvds0_sels, ARRAY_SIZE(lvds0_sels), IMX_SC_R_LVDS_0, IMX_SC_PM_CLK_MISC2); 22162306a36Sopenharmony_ci imx_clk_scu2("mipi0_lvds_phy_clk", lvds0_sels, ARRAY_SIZE(lvds0_sels), IMX_SC_R_LVDS_0, IMX_SC_PM_CLK_MISC3); 22262306a36Sopenharmony_ci imx_clk_scu2("mipi0_dsi_tx_esc_clk", mipi_sels, ARRAY_SIZE(mipi_sels), IMX_SC_R_MIPI_0, IMX_SC_PM_CLK_MST_BUS); 22362306a36Sopenharmony_ci imx_clk_scu2("mipi0_dsi_rx_esc_clk", mipi_sels, ARRAY_SIZE(mipi_sels), IMX_SC_R_MIPI_0, IMX_SC_PM_CLK_SLV_BUS); 22462306a36Sopenharmony_ci imx_clk_scu2("mipi0_dsi_phy_clk", mipi_sels, ARRAY_SIZE(mipi_sels), IMX_SC_R_MIPI_0, IMX_SC_PM_CLK_PHY); 22562306a36Sopenharmony_ci imx_clk_scu("mipi0_i2c0_clk", IMX_SC_R_MIPI_0_I2C_0, IMX_SC_PM_CLK_MISC2); 22662306a36Sopenharmony_ci imx_clk_scu("mipi0_i2c1_clk", IMX_SC_R_MIPI_0_I2C_1, IMX_SC_PM_CLK_MISC2); 22762306a36Sopenharmony_ci imx_clk_scu("mipi0_pwm0_clk", IMX_SC_R_MIPI_0_PWM_0, IMX_SC_PM_CLK_PER); 22862306a36Sopenharmony_ci 22962306a36Sopenharmony_ci imx_clk_scu("mipi1_bypass_clk", IMX_SC_R_MIPI_1, IMX_SC_PM_CLK_BYPASS); 23062306a36Sopenharmony_ci imx_clk_scu("mipi1_pixel_clk", IMX_SC_R_MIPI_1, IMX_SC_PM_CLK_PER); 23162306a36Sopenharmony_ci imx_clk_scu("mipi1_lvds_bypass_clk", IMX_SC_R_LVDS_1, IMX_SC_PM_CLK_BYPASS); 23262306a36Sopenharmony_ci imx_clk_scu2("mipi1_lvds_pixel_clk", lvds1_sels, ARRAY_SIZE(lvds1_sels), IMX_SC_R_LVDS_1, IMX_SC_PM_CLK_MISC2); 23362306a36Sopenharmony_ci imx_clk_scu2("mipi1_lvds_phy_clk", lvds1_sels, ARRAY_SIZE(lvds1_sels), IMX_SC_R_LVDS_1, IMX_SC_PM_CLK_MISC3); 23462306a36Sopenharmony_ci 23562306a36Sopenharmony_ci imx_clk_scu2("mipi1_dsi_tx_esc_clk", mipi_sels, ARRAY_SIZE(mipi_sels), IMX_SC_R_MIPI_1, IMX_SC_PM_CLK_MST_BUS); 23662306a36Sopenharmony_ci imx_clk_scu2("mipi1_dsi_rx_esc_clk", mipi_sels, ARRAY_SIZE(mipi_sels), IMX_SC_R_MIPI_1, IMX_SC_PM_CLK_SLV_BUS); 23762306a36Sopenharmony_ci imx_clk_scu2("mipi1_dsi_phy_clk", mipi_sels, ARRAY_SIZE(mipi_sels), IMX_SC_R_MIPI_1, IMX_SC_PM_CLK_PHY); 23862306a36Sopenharmony_ci imx_clk_scu("mipi1_i2c0_clk", IMX_SC_R_MIPI_1_I2C_0, IMX_SC_PM_CLK_MISC2); 23962306a36Sopenharmony_ci imx_clk_scu("mipi1_i2c1_clk", IMX_SC_R_MIPI_1_I2C_1, IMX_SC_PM_CLK_MISC2); 24062306a36Sopenharmony_ci imx_clk_scu("mipi1_pwm0_clk", IMX_SC_R_MIPI_1_PWM_0, IMX_SC_PM_CLK_PER); 24162306a36Sopenharmony_ci 24262306a36Sopenharmony_ci imx_clk_scu("lvds0_i2c0_clk", IMX_SC_R_LVDS_0_I2C_0, IMX_SC_PM_CLK_PER); 24362306a36Sopenharmony_ci imx_clk_scu("lvds0_i2c1_clk", IMX_SC_R_LVDS_0_I2C_1, IMX_SC_PM_CLK_PER); 24462306a36Sopenharmony_ci imx_clk_scu("lvds0_pwm0_clk", IMX_SC_R_LVDS_0_PWM_0, IMX_SC_PM_CLK_PER); 24562306a36Sopenharmony_ci 24662306a36Sopenharmony_ci imx_clk_scu("lvds1_i2c0_clk", IMX_SC_R_LVDS_1_I2C_0, IMX_SC_PM_CLK_PER); 24762306a36Sopenharmony_ci imx_clk_scu("lvds1_i2c1_clk", IMX_SC_R_LVDS_1_I2C_1, IMX_SC_PM_CLK_PER); 24862306a36Sopenharmony_ci imx_clk_scu("lvds1_pwm0_clk", IMX_SC_R_LVDS_1_PWM_0, IMX_SC_PM_CLK_PER); 24962306a36Sopenharmony_ci 25062306a36Sopenharmony_ci /* MIPI CSI SS */ 25162306a36Sopenharmony_ci imx_clk_scu("mipi_csi0_core_clk", IMX_SC_R_CSI_0, IMX_SC_PM_CLK_PER); 25262306a36Sopenharmony_ci imx_clk_scu("mipi_csi0_esc_clk", IMX_SC_R_CSI_0, IMX_SC_PM_CLK_MISC); 25362306a36Sopenharmony_ci imx_clk_scu("mipi_csi0_i2c0_clk", IMX_SC_R_CSI_0_I2C_0, IMX_SC_PM_CLK_PER); 25462306a36Sopenharmony_ci imx_clk_scu("mipi_csi0_pwm0_clk", IMX_SC_R_CSI_0_PWM_0, IMX_SC_PM_CLK_PER); 25562306a36Sopenharmony_ci imx_clk_scu("mipi_csi1_core_clk", IMX_SC_R_CSI_1, IMX_SC_PM_CLK_PER); 25662306a36Sopenharmony_ci imx_clk_scu("mipi_csi1_esc_clk", IMX_SC_R_CSI_1, IMX_SC_PM_CLK_MISC); 25762306a36Sopenharmony_ci imx_clk_scu("mipi_csi1_i2c0_clk", IMX_SC_R_CSI_1_I2C_0, IMX_SC_PM_CLK_PER); 25862306a36Sopenharmony_ci imx_clk_scu("mipi_csi1_pwm0_clk", IMX_SC_R_CSI_1_PWM_0, IMX_SC_PM_CLK_PER); 25962306a36Sopenharmony_ci 26062306a36Sopenharmony_ci /* Parallel Interface SS */ 26162306a36Sopenharmony_ci imx_clk_scu("pi_dpll_clk", IMX_SC_R_PI_0_PLL, IMX_SC_PM_CLK_PLL); 26262306a36Sopenharmony_ci imx_clk_scu2("pi_per_div_clk", pi_pll0_sels, ARRAY_SIZE(pi_pll0_sels), IMX_SC_R_PI_0, IMX_SC_PM_CLK_PER); 26362306a36Sopenharmony_ci imx_clk_scu("pi_mclk_div_clk", IMX_SC_R_PI_0, IMX_SC_PM_CLK_MISC0); 26462306a36Sopenharmony_ci imx_clk_scu("pi_i2c0_div_clk", IMX_SC_R_PI_0_I2C_0, IMX_SC_PM_CLK_PER); 26562306a36Sopenharmony_ci 26662306a36Sopenharmony_ci /* GPU SS */ 26762306a36Sopenharmony_ci imx_clk_scu("gpu_core0_clk", IMX_SC_R_GPU_0_PID0, IMX_SC_PM_CLK_PER); 26862306a36Sopenharmony_ci imx_clk_scu("gpu_shader0_clk", IMX_SC_R_GPU_0_PID0, IMX_SC_PM_CLK_MISC); 26962306a36Sopenharmony_ci 27062306a36Sopenharmony_ci imx_clk_scu("gpu_core1_clk", IMX_SC_R_GPU_1_PID0, IMX_SC_PM_CLK_PER); 27162306a36Sopenharmony_ci imx_clk_scu("gpu_shader1_clk", IMX_SC_R_GPU_1_PID0, IMX_SC_PM_CLK_MISC); 27262306a36Sopenharmony_ci 27362306a36Sopenharmony_ci /* CM40 SS */ 27462306a36Sopenharmony_ci imx_clk_scu("cm40_i2c_div", IMX_SC_R_M4_0_I2C, IMX_SC_PM_CLK_PER); 27562306a36Sopenharmony_ci imx_clk_scu("cm40_lpuart_div", IMX_SC_R_M4_0_UART, IMX_SC_PM_CLK_PER); 27662306a36Sopenharmony_ci 27762306a36Sopenharmony_ci /* CM41 SS */ 27862306a36Sopenharmony_ci imx_clk_scu("cm41_i2c_div", IMX_SC_R_M4_1_I2C, IMX_SC_PM_CLK_PER); 27962306a36Sopenharmony_ci 28062306a36Sopenharmony_ci /* HDMI TX SS */ 28162306a36Sopenharmony_ci imx_clk_scu("hdmi_dig_pll_clk", IMX_SC_R_HDMI_PLL_0, IMX_SC_PM_CLK_PLL); 28262306a36Sopenharmony_ci imx_clk_scu("hdmi_av_pll_clk", IMX_SC_R_HDMI_PLL_1, IMX_SC_PM_CLK_PLL); 28362306a36Sopenharmony_ci imx_clk_scu2("hdmi_pixel_mux_clk", hdmi_sels, ARRAY_SIZE(hdmi_sels), IMX_SC_R_HDMI, IMX_SC_PM_CLK_MISC0); 28462306a36Sopenharmony_ci imx_clk_scu2("hdmi_pixel_link_clk", hdmi_sels, ARRAY_SIZE(hdmi_sels), IMX_SC_R_HDMI, IMX_SC_PM_CLK_MISC1); 28562306a36Sopenharmony_ci imx_clk_scu("hdmi_ipg_clk", IMX_SC_R_HDMI, IMX_SC_PM_CLK_MISC4); 28662306a36Sopenharmony_ci imx_clk_scu("hdmi_i2c0_clk", IMX_SC_R_HDMI_I2C_0, IMX_SC_PM_CLK_MISC2); 28762306a36Sopenharmony_ci imx_clk_scu("hdmi_hdp_core_clk", IMX_SC_R_HDMI, IMX_SC_PM_CLK_MISC2); 28862306a36Sopenharmony_ci imx_clk_scu2("hdmi_pxl_clk", hdmi_sels, ARRAY_SIZE(hdmi_sels), IMX_SC_R_HDMI, IMX_SC_PM_CLK_MISC3); 28962306a36Sopenharmony_ci imx_clk_scu("hdmi_i2s_bypass_clk", IMX_SC_R_HDMI_I2S, IMX_SC_PM_CLK_BYPASS); 29062306a36Sopenharmony_ci imx_clk_scu("hdmi_i2s_clk", IMX_SC_R_HDMI_I2S, IMX_SC_PM_CLK_MISC0); 29162306a36Sopenharmony_ci 29262306a36Sopenharmony_ci /* HDMI RX SS */ 29362306a36Sopenharmony_ci imx_clk_scu("hdmi_rx_i2s_bypass_clk", IMX_SC_R_HDMI_RX_BYPASS, IMX_SC_PM_CLK_MISC0); 29462306a36Sopenharmony_ci imx_clk_scu("hdmi_rx_spdif_bypass_clk", IMX_SC_R_HDMI_RX_BYPASS, IMX_SC_PM_CLK_MISC1); 29562306a36Sopenharmony_ci imx_clk_scu("hdmi_rx_bypass_clk", IMX_SC_R_HDMI_RX_BYPASS, IMX_SC_PM_CLK_MISC2); 29662306a36Sopenharmony_ci imx_clk_scu("hdmi_rx_i2c0_clk", IMX_SC_R_HDMI_RX_I2C_0, IMX_SC_PM_CLK_MISC2); 29762306a36Sopenharmony_ci imx_clk_scu("hdmi_rx_pwm_clk", IMX_SC_R_HDMI_RX_PWM_0, IMX_SC_PM_CLK_MISC2); 29862306a36Sopenharmony_ci imx_clk_scu("hdmi_rx_spdif_clk", IMX_SC_R_HDMI_RX, IMX_SC_PM_CLK_MISC0); 29962306a36Sopenharmony_ci imx_clk_scu2("hdmi_rx_hd_ref_clk", hdmi_rx_sels, ARRAY_SIZE(hdmi_rx_sels), IMX_SC_R_HDMI_RX, IMX_SC_PM_CLK_MISC1); 30062306a36Sopenharmony_ci imx_clk_scu2("hdmi_rx_hd_core_clk", hdmi_rx_sels, ARRAY_SIZE(hdmi_rx_sels), IMX_SC_R_HDMI_RX, IMX_SC_PM_CLK_MISC2); 30162306a36Sopenharmony_ci imx_clk_scu2("hdmi_rx_pxl_clk", hdmi_rx_sels, ARRAY_SIZE(hdmi_rx_sels), IMX_SC_R_HDMI_RX, IMX_SC_PM_CLK_MISC3); 30262306a36Sopenharmony_ci imx_clk_scu("hdmi_rx_i2s_clk", IMX_SC_R_HDMI_RX, IMX_SC_PM_CLK_MISC4); 30362306a36Sopenharmony_ci 30462306a36Sopenharmony_ci ret = of_clk_add_hw_provider(ccm_node, imx_scu_of_clk_src_get, imx_scu_clks); 30562306a36Sopenharmony_ci if (ret) 30662306a36Sopenharmony_ci imx_clk_scu_unregister(); 30762306a36Sopenharmony_ci 30862306a36Sopenharmony_ci return ret; 30962306a36Sopenharmony_ci} 31062306a36Sopenharmony_ci 31162306a36Sopenharmony_cistatic const struct of_device_id imx8qxp_match[] = { 31262306a36Sopenharmony_ci { .compatible = "fsl,scu-clk", }, 31362306a36Sopenharmony_ci { .compatible = "fsl,imx8dxl-clk", &imx_clk_scu_rsrc_imx8dxl, }, 31462306a36Sopenharmony_ci { .compatible = "fsl,imx8qxp-clk", &imx_clk_scu_rsrc_imx8qxp, }, 31562306a36Sopenharmony_ci { .compatible = "fsl,imx8qm-clk", &imx_clk_scu_rsrc_imx8qm, }, 31662306a36Sopenharmony_ci { /* sentinel */ } 31762306a36Sopenharmony_ci}; 31862306a36Sopenharmony_ci 31962306a36Sopenharmony_cistatic struct platform_driver imx8qxp_clk_driver = { 32062306a36Sopenharmony_ci .driver = { 32162306a36Sopenharmony_ci .name = "imx8qxp-clk", 32262306a36Sopenharmony_ci .of_match_table = imx8qxp_match, 32362306a36Sopenharmony_ci .suppress_bind_attrs = true, 32462306a36Sopenharmony_ci }, 32562306a36Sopenharmony_ci .probe = imx8qxp_clk_probe, 32662306a36Sopenharmony_ci}; 32762306a36Sopenharmony_cimodule_platform_driver(imx8qxp_clk_driver); 32862306a36Sopenharmony_ci 32962306a36Sopenharmony_ciMODULE_AUTHOR("Aisheng Dong <aisheng.dong@nxp.com>"); 33062306a36Sopenharmony_ciMODULE_DESCRIPTION("NXP i.MX8QXP clock driver"); 33162306a36Sopenharmony_ciMODULE_LICENSE("GPL v2"); 332