mirror of https://github.com/OpenIPC/firmware.git
237 lines
7.4 KiB
Diff
237 lines
7.4 KiB
Diff
--- linux-4.9.37/drivers/clk/goke/clk-gk7202v300.c 1970-01-01 03:00:00.000000000 +0300
|
|
+++ linux-4.9.y/drivers/clk/goke/clk-gk7202v300.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 <dt-bindings/clock/gk7202v300-clock.h>
|
|
+#include <linux/clk-provider.h>
|
|
+#include <linux/module.h>
|
|
+#include <linux/of_device.h>
|
|
+#include <linux/platform_device.h>
|
|
+#include "clk.h"
|
|
+#include "reset.h"
|
|
+
|
|
+static struct gk_fixed_rate_clock gk7202v300_fixed_rate_clks[] __initdata = {
|
|
+ { GK7202V300_FIXED_100K, "100k", NULL, 0, 100000, },
|
|
+ { GK7202V300_FIXED_400K, "400k", NULL, 0, 400000, },
|
|
+ { GK7202V300_FIXED_3M, "3m", NULL, 0, 3000000, },
|
|
+ { GK7202V300_FIXED_6M, "6m", NULL, 0, 6000000, },
|
|
+ { GK7202V300_FIXED_12M, "12m", NULL, 0, 12000000, },
|
|
+ { GK7202V300_FIXED_24M, "24m", NULL, 0, 24000000, },
|
|
+ { GK7202V300_FIXED_25M, "25m", NULL, 0, 25000000, },
|
|
+ { GK7202V300_FIXED_50M, "50m", NULL, 0, 50000000, },
|
|
+ { GK7202V300_FIXED_83P3M, "83.3m",NULL, 0, 83300000, },
|
|
+ { GK7202V300_FIXED_90M, "90m", NULL, 0, 90000000, },
|
|
+ { GK7202V300_FIXED_100M, "100m", NULL, 0, 100000000, },
|
|
+ { GK7202V300_FIXED_112M, "112m", NULL, 0, 112000000, },
|
|
+ { GK7202V300_FIXED_125M, "125m", NULL, 0, 125000000, },
|
|
+ { GK7202V300_FIXED_150M, "150m", NULL, 0, 150000000, },
|
|
+ { GK7202V300_FIXED_200M, "200m", NULL, 0, 200000000, },
|
|
+ { GK7202V300_FIXED_250M, "250m", NULL, 0, 250000000, },
|
|
+ { GK7202V300_FIXED_300M, "300m", NULL, 0, 300000000, },
|
|
+ { GK7202V300_FIXED_324M, "324m", NULL, 0, 324000000, },
|
|
+ { GK7202V300_FIXED_342M, "342m", NULL, 0, 342000000, },
|
|
+ { GK7202V300_FIXED_342M, "375m", NULL, 0, 375000000, },
|
|
+ { GK7202V300_FIXED_400M, "400m", NULL, 0, 400000000, },
|
|
+ { GK7202V300_FIXED_448M, "448m", NULL, 0, 448000000, },
|
|
+ { GK7202V300_FIXED_500M, "500m", NULL, 0, 500000000, },
|
|
+ { GK7202V300_FIXED_540M, "540m", NULL, 0, 540000000, },
|
|
+ { GK7202V300_FIXED_600M, "600m", NULL, 0, 600000000, },
|
|
+ { GK7202V300_FIXED_750M, "750m", NULL, 0, 750000000, },
|
|
+ { GK7202V300_FIXED_1000M, "1000m",NULL, 0, 1000000000, },
|
|
+ { GK7202V300_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 gk7202v300_mux_clks[] __initdata = {
|
|
+ {
|
|
+ GK7202V300_SYSAXI_CLK, "sysaxi_mux", sysaxi_mux_p,
|
|
+ ARRAY_SIZE(sysaxi_mux_p),
|
|
+ CLK_SET_RATE_PARENT, 0x80, 6, 1, 0, sysaxi_mux_table,
|
|
+ },
|
|
+ {
|
|
+ GK7202V300_SYSAPB_CLK, "sysapb_mux", sysapb_mux_p,
|
|
+ ARRAY_SIZE(sysapb_mux_p),
|
|
+ CLK_SET_RATE_PARENT, 0x80, 10, 1, 0, sysapb_mux_table,
|
|
+ },
|
|
+ {
|
|
+ GK7202V300_FMC_MUX, "fmc_mux", fmc_mux_p, ARRAY_SIZE(fmc_mux_p),
|
|
+ CLK_SET_RATE_PARENT, 0x144, 2, 3, 0, fmc_mux_table,
|
|
+ },
|
|
+ {
|
|
+ GK7202V300_MMC0_MUX, "mmc0_mux", mmc_mux_p, ARRAY_SIZE(mmc_mux_p),
|
|
+ CLK_SET_RATE_PARENT, 0x1f4, 24, 3, 0, mmc_mux_table,
|
|
+ },
|
|
+ {
|
|
+ GK7202V300_MMC1_MUX, "mmc1_mux", mmc_mux_p, ARRAY_SIZE(mmc_mux_p),
|
|
+ CLK_SET_RATE_PARENT, 0x22c, 24, 3, 0, mmc_mux_table,
|
|
+ },
|
|
+ {
|
|
+ GK7202V300_UART_MUX, "uart_mux0", uart_mux_p,
|
|
+ ARRAY_SIZE(uart_mux_p),
|
|
+ CLK_SET_RATE_PARENT, 0x1bc, 18, 1, 0, uart_mux_table,
|
|
+ },
|
|
+ {
|
|
+ GK7202V300_UART_MUX, "uart_mux1", uart_mux_p,
|
|
+ ARRAY_SIZE(uart_mux_p),
|
|
+ CLK_SET_RATE_PARENT, 0x1bc, 19, 1, 0, uart_mux_table,
|
|
+ },
|
|
+ {
|
|
+ GK7202V300_UART_MUX, "uart_mux2", uart_mux_p,
|
|
+ ARRAY_SIZE(uart_mux_p),
|
|
+ CLK_SET_RATE_PARENT, 0x1bc, 20, 1, 0, uart_mux_table,
|
|
+ },
|
|
+ {
|
|
+ GK7202V300_ETH_MUX, "eth_mux", eth_mux_p, ARRAY_SIZE(eth_mux_p),
|
|
+ CLK_SET_RATE_PARENT, 0x16c, 7, 1, 0, eth_mux_table,
|
|
+ },
|
|
+ {
|
|
+ GK7202V300_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 gk7202v300_fixed_factor_clks[] __initdata = {
|
|
+ {
|
|
+ GK7202V300_SYSAXI_CLK, "clk_sysaxi", "sysaxi_mux", 1, 4,
|
|
+ CLK_SET_RATE_PARENT
|
|
+ },
|
|
+};
|
|
+
|
|
+static struct gk_gate_clock gk7202v300_gate_clks[] __initdata = {
|
|
+ /* fmc */
|
|
+ {
|
|
+ GK7202V300_FMC_CLK, "clk_fmc", "fmc_mux",
|
|
+ CLK_SET_RATE_PARENT, 0x144, 1, 0,
|
|
+ },
|
|
+ /* mmc */
|
|
+ {
|
|
+ GK7202V300_MMC0_CLK, "clk_mmc0", "mmc0_mux",
|
|
+ CLK_SET_RATE_PARENT, 0x1f4, 28, 0,
|
|
+ },
|
|
+ {
|
|
+ GK7202V300_MMC1_CLK, "clk_mmc1", "mmc1_mux",
|
|
+ CLK_SET_RATE_PARENT, 0x22c, 28, 0,
|
|
+ },
|
|
+ /* uart */
|
|
+ {
|
|
+ GK7202V300_UART0_CLK, "clk_uart0", "24m",
|
|
+ CLK_SET_RATE_PARENT, 0x1b8, 0, 0,
|
|
+ },
|
|
+ {
|
|
+ GK7202V300_UART1_CLK, "clk_uart1", "24m",
|
|
+ CLK_SET_RATE_PARENT, 0x1b8, 1, 0,
|
|
+ },
|
|
+ {
|
|
+ GK7202V300_UART2_CLK, "clk_uart2", "24m",
|
|
+ CLK_SET_RATE_PARENT, 0x1b8, 2, 0,
|
|
+ },
|
|
+ /* spi */
|
|
+ {
|
|
+ GK7202V300_SPI0_CLK, "clk_spi0", "100m",
|
|
+ CLK_SET_RATE_PARENT, 0x1bc, 12, 0,
|
|
+ },
|
|
+ {
|
|
+ GK7202V300_SPI1_CLK, "clk_spi1", "100m",
|
|
+ CLK_SET_RATE_PARENT, 0x1bc, 13, 0,
|
|
+ },
|
|
+ /* i2c */
|
|
+ {
|
|
+ GK7202V300_I2C0_CLK, "clk_i2c0", "50m",
|
|
+ CLK_SET_RATE_PARENT, 0x1b8, 11, 0,
|
|
+ },
|
|
+ {
|
|
+ GK7202V300_I2C1_CLK, "clk_i2c1", "50m",
|
|
+ CLK_SET_RATE_PARENT, 0x1b8, 12, 0,
|
|
+ },
|
|
+ {
|
|
+ GK7202V300_I2C2_CLK, "clk_i2c2", "50m",
|
|
+ CLK_SET_RATE_PARENT, 0x1b8, 13, 0,
|
|
+ },
|
|
+ /* ethernet mac */
|
|
+ {
|
|
+ GK7202V300_ETH0_CLK, "clk_eth0", "eth_mux",
|
|
+ CLK_SET_RATE_PARENT, 0x16c, 1, 0,
|
|
+ },
|
|
+ /* edmac */
|
|
+ {
|
|
+ GK7202V300_EDMAC_AXICLK, "axi_clk_edmac", NULL,
|
|
+ CLK_SET_RATE_PARENT, 0x194, 2, 0,
|
|
+ },
|
|
+ {
|
|
+ GK7202V300_EDMAC_CLK, "clk_edmac", NULL,
|
|
+ CLK_SET_RATE_PARENT, 0x194, 1, 0,
|
|
+ },
|
|
+ /* usb */
|
|
+ {
|
|
+ GK7202V300_USB2_BUS_CLK, "clk_usb2_bus", "usb2_mux",
|
|
+ CLK_SET_RATE_PARENT, 0x140, 8, 0,
|
|
+ },
|
|
+ {
|
|
+ GK7202V300_USB2_REF_CLK, "clk_usb2_ref", "usb2_mux",
|
|
+ CLK_SET_RATE_PARENT, 0x140, 9, 0,
|
|
+ },
|
|
+ {
|
|
+ GK7202V300_USB2_UTMI_CLK, "clk_usb2_utmi", "usb2_mux",
|
|
+ CLK_SET_RATE_PARENT, 0x140, 12, 0,
|
|
+ },
|
|
+ {
|
|
+ GK7202V300_USB2_PHY_APB_CLK, "clk_u2phy_apb_ref",NULL,
|
|
+ CLK_SET_RATE_PARENT, 0x140, 11, 0,
|
|
+ },
|
|
+ {
|
|
+ GK7202V300_USB2_PHY_PLL_CLK, "clk_u2phy_pll_ref",NULL,
|
|
+ CLK_SET_RATE_PARENT, 0x140, 4, 0,
|
|
+ },
|
|
+ {
|
|
+ GK7202V300_USB2_PHY_XO_CLK, "clk_u2phy_xo_ref",NULL,
|
|
+ CLK_SET_RATE_PARENT, 0x140, 2, 0,
|
|
+ },
|
|
+};
|
|
+
|
|
+static void __init gk7202v300_clk_init(struct device_node *np)
|
|
+{
|
|
+ struct gk_clock_data *clk_data;
|
|
+
|
|
+ clk_data = gk_clk_init(np, GK7202V300_NR_CLKS);
|
|
+ if (!clk_data)
|
|
+ return;
|
|
+ if (IS_ENABLED(CONFIG_RESET_CONTROLLER))
|
|
+ gk_reset_init(np, GK7202V300_NR_RSTS);
|
|
+
|
|
+ gk_clk_register_fixed_rate(gk7202v300_fixed_rate_clks,
|
|
+ ARRAY_SIZE(gk7202v300_fixed_rate_clks),
|
|
+ clk_data);
|
|
+ gk_clk_register_mux(gk7202v300_mux_clks, ARRAY_SIZE(gk7202v300_mux_clks),
|
|
+ clk_data);
|
|
+ gk_clk_register_fixed_factor(gk7202v300_fixed_factor_clks,
|
|
+ ARRAY_SIZE(gk7202v300_fixed_factor_clks), clk_data);
|
|
+ gk_clk_register_gate(gk7202v300_gate_clks,
|
|
+ ARRAY_SIZE(gk7202v300_gate_clks), clk_data);
|
|
+
|
|
+}
|
|
+
|
|
+CLK_OF_DECLARE(gk7202v300_clk, "goke,gk7202v300-clock", gk7202v300_clk_init);
|
|
+
|