--- linux-4.9.37/drivers/clk/goke/clk-gk7205v300.c 1970-01-01 03:00:00.000000000 +0300 +++ linux-4.9.y/drivers/clk/goke/clk-gk7205v300.c 2021-06-07 13:01:33.000000000 +0300 @@ -0,0 +1,233 @@ +/* + * Copyright (c) Hunan Goke,Chengdu Goke,Shandong Goke. 2021. All rights reserved. + */ + +#include +#include +#include +#include +#include +#include "clk.h" +#include "reset.h" + +static struct gk_fixed_rate_clock gk7205v300_fixed_rate_clks[] __initdata = { + { GK7205V300_FIXED_100K, "100k", NULL, 0, 100000, }, + { GK7205V300_FIXED_400K, "400k", NULL, 0, 400000, }, + { GK7205V300_FIXED_3M, "3m", NULL, 0, 3000000, }, + { GK7205V300_FIXED_6M, "6m", NULL, 0, 6000000, }, + { GK7205V300_FIXED_12M, "12m", NULL, 0, 12000000, }, + { GK7205V300_FIXED_24M, "24m", NULL, 0, 24000000, }, + { GK7205V300_FIXED_25M, "25m", NULL, 0, 25000000, }, + { GK7205V300_FIXED_50M, "50m", NULL, 0, 50000000, }, + { GK7205V300_FIXED_83P3M, "83.3m",NULL, 0, 83300000, }, + { GK7205V300_FIXED_90M, "90m", NULL, 0, 90000000, }, + { GK7205V300_FIXED_100M, "100m", NULL, 0, 100000000, }, + { GK7205V300_FIXED_112M, "112m", NULL, 0, 112000000, }, + { GK7205V300_FIXED_125M, "125m", NULL, 0, 125000000, }, + { GK7205V300_FIXED_150M, "150m", NULL, 0, 150000000, }, + { GK7205V300_FIXED_200M, "200m", NULL, 0, 200000000, }, + { GK7205V300_FIXED_250M, "250m", NULL, 0, 250000000, }, + { GK7205V300_FIXED_300M, "300m", NULL, 0, 300000000, }, + { GK7205V300_FIXED_324M, "324m", NULL, 0, 324000000, }, + { GK7205V300_FIXED_342M, "342m", NULL, 0, 342000000, }, + { GK7205V300_FIXED_342M, "375m", NULL, 0, 375000000, }, + { GK7205V300_FIXED_400M, "400m", NULL, 0, 400000000, }, + { GK7205V300_FIXED_448M, "448m", NULL, 0, 448000000, }, + { GK7205V300_FIXED_500M, "500m", NULL, 0, 500000000, }, + { GK7205V300_FIXED_540M, "540m", NULL, 0, 540000000, }, + { GK7205V300_FIXED_600M, "600m", NULL, 0, 600000000, }, + { GK7205V300_FIXED_750M, "750m", NULL, 0, 750000000, }, + { GK7205V300_FIXED_1000M, "1000m",NULL, 0, 1000000000, }, + { GK7205V300_FIXED_1500M, "1500m",NULL, 0, 1500000000UL, }, +}; + +static const char *sysaxi_mux_p[] __initconst = { + "24m", "200m" +}; +static const char *sysapb_mux_p[] __initconst = {"24m", "50m"}; +static const char *uart_mux_p[] __initconst = {"24m", "6m"}; +static const char *fmc_mux_p[] __initconst = {"24m", "100m", "150m", "200m", "300m", "360m"}; +static const char *mmc_mux_p[] __initdata = { + "100k", "400k", "25m", "50m", "90m", "112m", "150m" +}; +static const char *eth_mux_p[] __initconst = {"100m", "54m"}; +static const char *usb_mux_p[] __initdata = {"phy", "crg",}; + +static u32 sysaxi_mux_table[] = {0, 1}; +static u32 sysapb_mux_table[] = {0, 1}; +static u32 uart_mux_table[] = {0, 1}; +static u32 fmc_mux_table[] = {0, 1, 2, 3, 4, 5, 6, 7}; +static u32 mmc_mux_table[] = {0, 1, 2, 3, 4, 5, 6}; +static u32 eth_mux_table[] = {0, 1}; +static u32 usb_mux_table[] = {0, 1}; + +static struct gk_mux_clock gk7205v300_mux_clks[] __initdata = { + { + GK7205V300_SYSAXI_CLK, "sysaxi_mux", sysaxi_mux_p, + ARRAY_SIZE(sysaxi_mux_p), + CLK_SET_RATE_PARENT, 0x80, 6, 1, 0, sysaxi_mux_table, + }, + { + GK7205V300_SYSAPB_CLK, "sysapb_mux", sysapb_mux_p, + ARRAY_SIZE(sysapb_mux_p), + CLK_SET_RATE_PARENT, 0x80, 10, 1, 0, sysapb_mux_table, + }, + { + GK7205V300_FMC_MUX, "fmc_mux", fmc_mux_p, ARRAY_SIZE(fmc_mux_p), + CLK_SET_RATE_PARENT, 0x144, 2, 3, 0, fmc_mux_table, + }, + { + GK7205V300_MMC0_MUX, "mmc0_mux", mmc_mux_p, ARRAY_SIZE(mmc_mux_p), + CLK_SET_RATE_PARENT, 0x1f4, 24, 3, 0, mmc_mux_table, + }, + { + GK7205V300_MMC1_MUX, "mmc1_mux", mmc_mux_p, ARRAY_SIZE(mmc_mux_p), + CLK_SET_RATE_PARENT, 0x22c, 24, 3, 0, mmc_mux_table, + }, + { + GK7205V300_UART_MUX, "uart_mux0", uart_mux_p, + ARRAY_SIZE(uart_mux_p), + CLK_SET_RATE_PARENT, 0x1bc, 18, 1, 0, uart_mux_table, + }, + { + GK7205V300_UART_MUX, "uart_mux1", uart_mux_p, + ARRAY_SIZE(uart_mux_p), + CLK_SET_RATE_PARENT, 0x1bc, 19, 1, 0, uart_mux_table, + }, + { + GK7205V300_UART_MUX, "uart_mux2", uart_mux_p, + ARRAY_SIZE(uart_mux_p), + CLK_SET_RATE_PARENT, 0x1bc, 20, 1, 0, uart_mux_table, + }, + { + GK7205V300_ETH_MUX, "eth_mux", eth_mux_p, ARRAY_SIZE(eth_mux_p), + CLK_SET_RATE_PARENT, 0x16c, 7, 1, 0, eth_mux_table, + }, + { + GK7205V300_USB2_MUX, "usb2_mux", usb_mux_p, ARRAY_SIZE(usb_mux_p), + CLK_SET_RATE_PARENT, 0x140, 13, 0, 0, usb_mux_table + }, +}; + +static struct gk_fixed_factor_clock gk7205v300_fixed_factor_clks[] __initdata = { + { + GK7205V300_SYSAXI_CLK, "clk_sysaxi", "sysaxi_mux", 1, 4, + CLK_SET_RATE_PARENT + }, +}; + +static struct gk_gate_clock gk7205v300_gate_clks[] __initdata = { + /* fmc */ + { + GK7205V300_FMC_CLK, "clk_fmc", "fmc_mux", + CLK_SET_RATE_PARENT, 0x144, 1, 0, + }, + /* mmc */ + { + GK7205V300_MMC0_CLK, "clk_mmc0", "mmc0_mux", + CLK_SET_RATE_PARENT, 0x1f4, 28, 0, + }, + { + GK7205V300_MMC1_CLK, "clk_mmc1", "mmc1_mux", + CLK_SET_RATE_PARENT, 0x22c, 28, 0, + }, + /* uart */ + { + GK7205V300_UART0_CLK, "clk_uart0", "24m", + CLK_SET_RATE_PARENT, 0x1b8, 0, 0, + }, + { + GK7205V300_UART1_CLK, "clk_uart1", "24m", + CLK_SET_RATE_PARENT, 0x1b8, 1, 0, + }, + { + GK7205V300_UART2_CLK, "clk_uart2", "24m", + CLK_SET_RATE_PARENT, 0x1b8, 2, 0, + }, + /* spi */ + { + GK7205V300_SPI0_CLK, "clk_spi0", "100m", + CLK_SET_RATE_PARENT, 0x1bc, 12, 0, + }, + { + GK7205V300_SPI1_CLK, "clk_spi1", "100m", + CLK_SET_RATE_PARENT, 0x1bc, 13, 0, + }, + /* i2c */ + { + GK7205V300_I2C0_CLK, "clk_i2c0", "50m", + CLK_SET_RATE_PARENT, 0x1b8, 11, 0, + }, + { + GK7205V300_I2C1_CLK, "clk_i2c1", "50m", + CLK_SET_RATE_PARENT, 0x1b8, 12, 0, + }, + { + GK7205V300_I2C2_CLK, "clk_i2c2", "50m", + CLK_SET_RATE_PARENT, 0x1b8, 13, 0, + }, + /* ethernet mac */ + { + GK7205V300_ETH0_CLK, "clk_eth0", "eth_mux", + CLK_SET_RATE_PARENT, 0x16c, 1, 0, + }, + /* edmac */ + { + GK7205V300_EDMAC_AXICLK, "axi_clk_edmac", NULL, + CLK_SET_RATE_PARENT, 0x194, 2, 0, + }, + { + GK7205V300_EDMAC_CLK, "clk_edmac", NULL, + CLK_SET_RATE_PARENT, 0x194, 1, 0, + }, + /* usb */ + { + GK7205V300_USB2_BUS_CLK, "clk_usb2_bus", "usb2_mux", + CLK_SET_RATE_PARENT, 0x140, 8, 0, + }, + { + GK7205V300_USB2_REF_CLK, "clk_usb2_ref", "usb2_mux", + CLK_SET_RATE_PARENT, 0x140, 9, 0, + }, + { + GK7205V300_USB2_UTMI_CLK, "clk_usb2_utmi", "usb2_mux", + CLK_SET_RATE_PARENT, 0x140, 12, 0, + }, + { + GK7205V300_USB2_PHY_APB_CLK, "clk_u2phy_apb_ref",NULL, + CLK_SET_RATE_PARENT, 0x140, 11, 0, + }, + { + GK7205V300_USB2_PHY_PLL_CLK, "clk_u2phy_pll_ref",NULL, + CLK_SET_RATE_PARENT, 0x140, 4, 0, + }, + { + GK7205V300_USB2_PHY_XO_CLK, "clk_u2phy_xo_ref",NULL, + CLK_SET_RATE_PARENT, 0x140, 2, 0, + }, +}; + +static void __init gk7205v300_clk_init(struct device_node *np) +{ + struct gk_clock_data *clk_data; + + clk_data = gk_clk_init(np, GK7205V300_NR_CLKS); + if (!clk_data) + return; + if (IS_ENABLED(CONFIG_RESET_CONTROLLER)) + gk_reset_init(np, GK7205V300_NR_RSTS); + + gk_clk_register_fixed_rate(gk7205v300_fixed_rate_clks, + ARRAY_SIZE(gk7205v300_fixed_rate_clks), + clk_data); + gk_clk_register_mux(gk7205v300_mux_clks, ARRAY_SIZE(gk7205v300_mux_clks), + clk_data); + gk_clk_register_fixed_factor(gk7205v300_fixed_factor_clks, + ARRAY_SIZE(gk7205v300_fixed_factor_clks), clk_data); + gk_clk_register_gate(gk7205v300_gate_clks, + ARRAY_SIZE(gk7205v300_gate_clks), clk_data); + +} + +CLK_OF_DECLARE(gk7205v300_clk, "goke,gk7205v300-clock", gk7205v300_clk_init); +