Orange Pi5 kernel

Deprecated Linux kernel 5.10.110 for OrangePi 5/5B/5+ boards

3 Commits   0 Branches   0 Tags
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   1) // SPDX-License-Identifier: GPL-2.0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   2) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   3)  * Copyright (C) 2019, Intel Corporation
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   4)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   5) #include <linux/slab.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   6) #include <linux/clk-provider.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   7) #include <linux/of_device.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   8) #include <linux/of_address.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   9) #include <linux/platform_device.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  10) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  11) #include <dt-bindings/clock/agilex-clock.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  12) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  13) #include "stratix10-clk.h"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  14) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  15) static const struct clk_parent_data pll_mux[] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  16) 	{ .fw_name = "osc1",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  17) 	  .name = "osc1", },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  18) 	{ .fw_name = "cb-intosc-hs-div2-clk",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  19) 	  .name = "cb-intosc-hs-div2-clk", },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  20) 	{ .fw_name = "f2s-free-clk",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  21) 	  .name = "f2s-free-clk", },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  22) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  23) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  24) static const struct clk_parent_data boot_mux[] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  25) 	{ .fw_name = "osc1",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  26) 	  .name = "osc1", },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  27) 	{ .fw_name = "cb-intosc-hs-div2-clk",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  28) 	  .name = "cb-intosc-hs-div2-clk", },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  29) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  30) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  31) static const struct clk_parent_data mpu_free_mux[] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  32) 	{ .fw_name = "main_pll_c0",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  33) 	  .name = "main_pll_c0", },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  34) 	{ .fw_name = "peri_pll_c0",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  35) 	  .name = "peri_pll_c0", },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  36) 	{ .fw_name = "osc1",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  37) 	  .name = "osc1", },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  38) 	{ .fw_name = "cb-intosc-hs-div2-clk",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  39) 	  .name = "cb-intosc-hs-div2-clk", },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  40) 	{ .fw_name = "f2s-free-clk",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  41) 	  .name = "f2s-free-clk", },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  42) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  43) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  44) static const struct clk_parent_data noc_free_mux[] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  45) 	{ .fw_name = "main_pll_c1",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  46) 	  .name = "main_pll_c1", },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  47) 	{ .fw_name = "peri_pll_c1",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  48) 	  .name = "peri_pll_c1", },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  49) 	{ .fw_name = "osc1",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  50) 	  .name = "osc1", },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  51) 	{ .fw_name = "cb-intosc-hs-div2-clk",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  52) 	  .name = "cb-intosc-hs-div2-clk", },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  53) 	{ .fw_name = "f2s-free-clk",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  54) 	  .name = "f2s-free-clk", },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  55) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  56) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  57) static const struct clk_parent_data emaca_free_mux[] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  58) 	{ .fw_name = "main_pll_c2",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  59) 	  .name = "main_pll_c2", },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  60) 	{ .fw_name = "peri_pll_c2",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  61) 	  .name = "peri_pll_c2", },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  62) 	{ .fw_name = "osc1",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  63) 	  .name = "osc1", },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  64) 	{ .fw_name = "cb-intosc-hs-div2-clk",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  65) 	  .name = "cb-intosc-hs-div2-clk", },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  66) 	{ .fw_name = "f2s-free-clk",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  67) 	  .name = "f2s-free-clk", },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  68) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  69) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  70) static const struct clk_parent_data emacb_free_mux[] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  71) 	{ .fw_name = "main_pll_c3",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  72) 	  .name = "main_pll_c3", },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  73) 	{ .fw_name = "peri_pll_c3",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  74) 	  .name = "peri_pll_c3", },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  75) 	{ .fw_name = "osc1",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  76) 	  .name = "osc1", },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  77) 	{ .fw_name = "cb-intosc-hs-div2-clk",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  78) 	  .name = "cb-intosc-hs-div2-clk", },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  79) 	{ .fw_name = "f2s-free-clk",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  80) 	  .name = "f2s-free-clk", },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  81) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  82) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  83) static const struct clk_parent_data emac_ptp_free_mux[] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  84) 	{ .fw_name = "main_pll_c3",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  85) 	  .name = "main_pll_c3", },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  86) 	{ .fw_name = "peri_pll_c3",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  87) 	  .name = "peri_pll_c3", },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  88) 	{ .fw_name = "osc1",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  89) 	  .name = "osc1", },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  90) 	{ .fw_name = "cb-intosc-hs-div2-clk",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  91) 	  .name = "cb-intosc-hs-div2-clk", },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  92) 	{ .fw_name = "f2s-free-clk",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  93) 	  .name = "f2s-free-clk", },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  94) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  95) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  96) static const struct clk_parent_data gpio_db_free_mux[] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  97) 	{ .fw_name = "main_pll_c3",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  98) 	  .name = "main_pll_c3", },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  99) 	{ .fw_name = "peri_pll_c3",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 100) 	  .name = "peri_pll_c3", },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 101) 	{ .fw_name = "osc1",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 102) 	  .name = "osc1", },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 103) 	{ .fw_name = "cb-intosc-hs-div2-clk",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 104) 	  .name = "cb-intosc-hs-div2-clk", },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 105) 	{ .fw_name = "f2s-free-clk",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 106) 	  .name = "f2s-free-clk", },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 107) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 108) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 109) static const struct clk_parent_data psi_ref_free_mux[] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 110) 	{ .fw_name = "main_pll_c2",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 111) 	  .name = "main_pll_c2", },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 112) 	{ .fw_name = "peri_pll_c2",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 113) 	  .name = "peri_pll_c2", },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 114) 	{ .fw_name = "osc1",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 115) 	  .name = "osc1", },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 116) 	{ .fw_name = "cb-intosc-hs-div2-clk",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 117) 	  .name = "cb-intosc-hs-div2-clk", },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 118) 	{ .fw_name = "f2s-free-clk",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 119) 	  .name = "f2s-free-clk", },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 120) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 121) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 122) static const struct clk_parent_data sdmmc_free_mux[] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 123) 	{ .fw_name = "main_pll_c3",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 124) 	  .name = "main_pll_c3", },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 125) 	{ .fw_name = "peri_pll_c3",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 126) 	  .name = "peri_pll_c3", },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 127) 	{ .fw_name = "osc1",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 128) 	  .name = "osc1", },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 129) 	{ .fw_name = "cb-intosc-hs-div2-clk",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 130) 	  .name = "cb-intosc-hs-div2-clk", },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 131) 	{ .fw_name = "f2s-free-clk",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 132) 	  .name = "f2s-free-clk", },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 133) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 134) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 135) static const struct clk_parent_data s2f_usr0_free_mux[] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 136) 	{ .fw_name = "main_pll_c2",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 137) 	  .name = "main_pll_c2", },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 138) 	{ .fw_name = "peri_pll_c2",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 139) 	  .name = "peri_pll_c2", },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 140) 	{ .fw_name = "osc1",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 141) 	  .name = "osc1", },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 142) 	{ .fw_name = "cb-intosc-hs-div2-clk",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 143) 	  .name = "cb-intosc-hs-div2-clk", },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 144) 	{ .fw_name = "f2s-free-clk",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 145) 	  .name = "f2s-free-clk", },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 146) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 147) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 148) static const struct clk_parent_data s2f_usr1_free_mux[] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 149) 	{ .fw_name = "main_pll_c2",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 150) 	  .name = "main_pll_c2", },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 151) 	{ .fw_name = "peri_pll_c2",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 152) 	  .name = "peri_pll_c2", },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 153) 	{ .fw_name = "osc1",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 154) 	  .name = "osc1", },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 155) 	{ .fw_name = "cb-intosc-hs-div2-clk",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 156) 	  .name = "cb-intosc-hs-div2-clk", },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 157) 	{ .fw_name = "f2s-free-clk",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 158) 	  .name = "f2s-free-clk", },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 159) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 160) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 161) static const struct clk_parent_data mpu_mux[] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 162) 	{ .fw_name = "mpu_free_clk",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 163) 	  .name = "mpu_free_clk", },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 164) 	{ .fw_name = "boot_clk",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 165) 	  .name = "boot_clk", },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 166) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 167) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 168) static const struct clk_parent_data emac_mux[] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 169) 	{ .fw_name = "emaca_free_clk",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 170) 	  .name = "emaca_free_clk", },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 171) 	{ .fw_name = "emacb_free_clk",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 172) 	  .name = "emacb_free_clk", },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 173) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 174) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 175) static const struct clk_parent_data noc_mux[] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 176) 	{ .fw_name = "noc_free_clk",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 177) 	  .name = "noc_free_clk", },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 178) 	{ .fw_name = "boot_clk",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 179) 	  .name = "boot_clk", },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 180) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 181) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 182) static const struct clk_parent_data sdmmc_mux[] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 183) 	{ .fw_name = "sdmmc_free_clk",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 184) 	  .name = "sdmmc_free_clk", },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 185) 	{ .fw_name = "boot_clk",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 186) 	  .name = "boot_clk", },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 187) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 188) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 189) static const struct clk_parent_data s2f_user0_mux[] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 190) 	{ .fw_name = "s2f_user0_free_clk",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 191) 	  .name = "s2f_user0_free_clk", },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 192) 	{ .fw_name = "boot_clk",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 193) 	  .name = "boot_clk", },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 194) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 195) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 196) static const struct clk_parent_data s2f_user1_mux[] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 197) 	{ .fw_name = "s2f_user1_free_clk",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 198) 	  .name = "s2f_user1_free_clk", },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 199) 	{ .fw_name = "boot_clk",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 200) 	  .name = "boot_clk", },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 201) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 202) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 203) static const struct clk_parent_data psi_mux[] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 204) 	{ .fw_name = "psi_ref_free_clk",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 205) 	  .name = "psi_ref_free_clk", },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 206) 	{ .fw_name = "boot_clk",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 207) 	  .name = "boot_clk", },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 208) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 209) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 210) static const struct clk_parent_data gpio_db_mux[] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 211) 	{ .fw_name = "gpio_db_free_clk",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 212) 	  .name = "gpio_db_free_clk", },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 213) 	{ .fw_name = "boot_clk",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 214) 	  .name = "boot_clk", },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 215) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 216) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 217) static const struct clk_parent_data emac_ptp_mux[] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 218) 	{ .fw_name = "emac_ptp_free_clk",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 219) 	  .name = "emac_ptp_free_clk", },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 220) 	{ .fw_name = "boot_clk",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 221) 	  .name = "boot_clk", },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 222) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 223) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 224) /* clocks in AO (always on) controller */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 225) static const struct stratix10_pll_clock agilex_pll_clks[] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 226) 	{ AGILEX_BOOT_CLK, "boot_clk", boot_mux, ARRAY_SIZE(boot_mux), 0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 227) 	  0x0},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 228) 	{ AGILEX_MAIN_PLL_CLK, "main_pll", pll_mux, ARRAY_SIZE(pll_mux),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 229) 	  0, 0x48},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 230) 	{ AGILEX_PERIPH_PLL_CLK, "periph_pll", pll_mux, ARRAY_SIZE(pll_mux),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 231) 	  0, 0x9c},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 232) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 233) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 234) static const struct stratix10_perip_c_clock agilex_main_perip_c_clks[] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 235) 	{ AGILEX_MAIN_PLL_C0_CLK, "main_pll_c0", "main_pll", NULL, 1, 0, 0x58},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 236) 	{ AGILEX_MAIN_PLL_C1_CLK, "main_pll_c1", "main_pll", NULL, 1, 0, 0x5C},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 237) 	{ AGILEX_MAIN_PLL_C2_CLK, "main_pll_c2", "main_pll", NULL, 1, 0, 0x64},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 238) 	{ AGILEX_MAIN_PLL_C3_CLK, "main_pll_c3", "main_pll", NULL, 1, 0, 0x68},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 239) 	{ AGILEX_PERIPH_PLL_C0_CLK, "peri_pll_c0", "periph_pll", NULL, 1, 0, 0xAC},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 240) 	{ AGILEX_PERIPH_PLL_C1_CLK, "peri_pll_c1", "periph_pll", NULL, 1, 0, 0xB0},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 241) 	{ AGILEX_PERIPH_PLL_C2_CLK, "peri_pll_c2", "periph_pll", NULL, 1, 0, 0xB8},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 242) 	{ AGILEX_PERIPH_PLL_C3_CLK, "peri_pll_c3", "periph_pll", NULL, 1, 0, 0xBC},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 243) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 244) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 245) static const struct stratix10_perip_cnt_clock agilex_main_perip_cnt_clks[] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 246) 	{ AGILEX_MPU_FREE_CLK, "mpu_free_clk", NULL, mpu_free_mux, ARRAY_SIZE(mpu_free_mux),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 247) 	   0, 0x3C, 0, 0, 0},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 248) 	{ AGILEX_NOC_FREE_CLK, "noc_free_clk", NULL, noc_free_mux, ARRAY_SIZE(noc_free_mux),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 249) 	  0, 0x40, 0, 0, 0},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 250) 	{ AGILEX_L4_SYS_FREE_CLK, "l4_sys_free_clk", NULL, noc_mux, ARRAY_SIZE(noc_mux), 0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 251) 	  0, 4, 0x30, 1},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 252) 	{ AGILEX_EMAC_A_FREE_CLK, "emaca_free_clk", NULL, emaca_free_mux, ARRAY_SIZE(emaca_free_mux),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 253) 	  0, 0xD4, 0, 0x88, 0},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 254) 	{ AGILEX_EMAC_B_FREE_CLK, "emacb_free_clk", NULL, emacb_free_mux, ARRAY_SIZE(emacb_free_mux),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 255) 	  0, 0xD8, 0, 0x88, 1},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 256) 	{ AGILEX_EMAC_PTP_FREE_CLK, "emac_ptp_free_clk", NULL, emac_ptp_free_mux,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 257) 	  ARRAY_SIZE(emac_ptp_free_mux), 0, 0xDC, 0, 0x88, 2},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 258) 	{ AGILEX_GPIO_DB_FREE_CLK, "gpio_db_free_clk", NULL, gpio_db_free_mux,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 259) 	  ARRAY_SIZE(gpio_db_free_mux), 0, 0xE0, 0, 0x88, 3},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 260) 	{ AGILEX_SDMMC_FREE_CLK, "sdmmc_free_clk", NULL, sdmmc_free_mux,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 261) 	  ARRAY_SIZE(sdmmc_free_mux), 0, 0xE4, 0, 0, 0},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 262) 	{ AGILEX_S2F_USER0_FREE_CLK, "s2f_user0_free_clk", NULL, s2f_usr0_free_mux,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 263) 	  ARRAY_SIZE(s2f_usr0_free_mux), 0, 0xE8, 0, 0x30, 2},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 264) 	{ AGILEX_S2F_USER1_FREE_CLK, "s2f_user1_free_clk", NULL, s2f_usr1_free_mux,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 265) 	  ARRAY_SIZE(s2f_usr1_free_mux), 0, 0xEC, 0, 0x88, 5},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 266) 	{ AGILEX_PSI_REF_FREE_CLK, "psi_ref_free_clk", NULL, psi_ref_free_mux,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 267) 	  ARRAY_SIZE(psi_ref_free_mux), 0, 0xF0, 0, 0x88, 6},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 268) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 269) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 270) static const struct stratix10_gate_clock agilex_gate_clks[] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 271) 	{ AGILEX_MPU_CLK, "mpu_clk", NULL, mpu_mux, ARRAY_SIZE(mpu_mux), 0, 0x24,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 272) 	  0, 0, 0, 0, 0x30, 0, 0},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 273) 	{ AGILEX_MPU_PERIPH_CLK, "mpu_periph_clk", "mpu_clk", NULL, 1, 0, 0x24,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 274) 	  0, 0, 0, 0, 0, 0, 4},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 275) 	{ AGILEX_MPU_CCU_CLK, "mpu_ccu_clk", "mpu_clk", NULL, 1, 0, 0x24,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 276) 	  0, 0, 0, 0, 0, 0, 2},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 277) 	{ AGILEX_L4_MAIN_CLK, "l4_main_clk", NULL, noc_mux, ARRAY_SIZE(noc_mux), 0, 0x24,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 278) 	  1, 0x44, 0, 2, 0x30, 1, 0},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 279) 	{ AGILEX_L4_MP_CLK, "l4_mp_clk", NULL, noc_mux, ARRAY_SIZE(noc_mux), 0, 0x24,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 280) 	  2, 0x44, 8, 2, 0x30, 1, 0},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 281) 	/*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 282) 	 * The l4_sp_clk feeds a 100 MHz clock to various peripherals, one of them
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 283) 	 * being the SP timers, thus cannot get gated.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 284) 	 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 285) 	{ AGILEX_L4_SP_CLK, "l4_sp_clk", NULL, noc_mux, ARRAY_SIZE(noc_mux), CLK_IS_CRITICAL, 0x24,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 286) 	  3, 0x44, 16, 2, 0x30, 1, 0},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 287) 	{ AGILEX_CS_AT_CLK, "cs_at_clk", NULL, noc_mux, ARRAY_SIZE(noc_mux), 0, 0x24,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 288) 	  4, 0x44, 24, 2, 0x30, 1, 0},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 289) 	{ AGILEX_CS_TRACE_CLK, "cs_trace_clk", NULL, noc_mux, ARRAY_SIZE(noc_mux), 0, 0x24,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 290) 	  4, 0x44, 26, 2, 0x30, 1, 0},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 291) 	{ AGILEX_CS_PDBG_CLK, "cs_pdbg_clk", "cs_at_clk", NULL, 1, 0, 0x24,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 292) 	  4, 0x44, 28, 1, 0, 0, 0},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 293) 	{ AGILEX_CS_TIMER_CLK, "cs_timer_clk", NULL, noc_mux, ARRAY_SIZE(noc_mux), 0, 0x24,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 294) 	  5, 0, 0, 0, 0x30, 1, 0},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 295) 	{ AGILEX_EMAC0_CLK, "emac0_clk", NULL, emac_mux, ARRAY_SIZE(emac_mux), 0, 0x7C,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 296) 	  0, 0, 0, 0, 0x94, 26, 0},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 297) 	{ AGILEX_EMAC1_CLK, "emac1_clk", NULL, emac_mux, ARRAY_SIZE(emac_mux), 0, 0x7C,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 298) 	  1, 0, 0, 0, 0x94, 27, 0},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 299) 	{ AGILEX_EMAC2_CLK, "emac2_clk", NULL, emac_mux, ARRAY_SIZE(emac_mux), 0, 0x7C,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 300) 	  2, 0, 0, 0, 0x94, 28, 0},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 301) 	{ AGILEX_EMAC_PTP_CLK, "emac_ptp_clk", NULL, emac_ptp_mux, ARRAY_SIZE(emac_ptp_mux), 0, 0x7C,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 302) 	  3, 0, 0, 0, 0x88, 2, 0},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 303) 	{ AGILEX_GPIO_DB_CLK, "gpio_db_clk", NULL, gpio_db_mux, ARRAY_SIZE(gpio_db_mux), 0, 0x7C,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 304) 	  4, 0x98, 0, 16, 0x88, 3, 0},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 305) 	{ AGILEX_SDMMC_CLK, "sdmmc_clk", NULL, sdmmc_mux, ARRAY_SIZE(sdmmc_mux), 0, 0x7C,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 306) 	  5, 0, 0, 0, 0x88, 4, 4},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 307) 	{ AGILEX_S2F_USER0_CLK, "s2f_user0_clk", NULL, s2f_user0_mux, ARRAY_SIZE(s2f_user0_mux), 0, 0x24,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 308) 	  6, 0, 0, 0, 0x30, 2, 0},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 309) 	{ AGILEX_S2F_USER1_CLK, "s2f_user1_clk", NULL, s2f_user1_mux, ARRAY_SIZE(s2f_user1_mux), 0, 0x7C,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 310) 	  6, 0, 0, 0, 0x88, 5, 0},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 311) 	{ AGILEX_PSI_REF_CLK, "psi_ref_clk", NULL, psi_mux, ARRAY_SIZE(psi_mux), 0, 0x7C,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 312) 	  7, 0, 0, 0, 0x88, 6, 0},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 313) 	{ AGILEX_USB_CLK, "usb_clk", "l4_mp_clk", NULL, 1, 0, 0x7C,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 314) 	  8, 0, 0, 0, 0, 0, 0},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 315) 	{ AGILEX_SPI_M_CLK, "spi_m_clk", "l4_mp_clk", NULL, 1, 0, 0x7C,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 316) 	  9, 0, 0, 0, 0, 0, 0},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 317) 	{ AGILEX_NAND_X_CLK, "nand_x_clk", "l4_mp_clk", NULL, 1, 0, 0x7C,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 318) 	  10, 0, 0, 0, 0, 0, 0},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 319) 	{ AGILEX_NAND_CLK, "nand_clk", "nand_x_clk", NULL, 1, 0, 0x7C,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 320) 	  10, 0, 0, 0, 0, 0, 4},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 321) 	{ AGILEX_NAND_ECC_CLK, "nand_ecc_clk", "nand_x_clk", NULL, 1, 0, 0x7C,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 322) 	  10, 0, 0, 0, 0, 0, 4},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 323) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 324) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 325) static int agilex_clk_register_c_perip(const struct stratix10_perip_c_clock *clks,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 326) 				       int nums, struct stratix10_clock_data *data)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 327) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 328) 	struct clk *clk;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 329) 	void __iomem *base = data->base;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 330) 	int i;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 331) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 332) 	for (i = 0; i < nums; i++) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 333) 		clk = s10_register_periph(&clks[i], base);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 334) 		if (IS_ERR(clk)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 335) 			pr_err("%s: failed to register clock %s\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 336) 			       __func__, clks[i].name);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 337) 			continue;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 338) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 339) 		data->clk_data.clks[clks[i].id] = clk;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 340) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 341) 	return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 342) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 343) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 344) static int agilex_clk_register_cnt_perip(const struct stratix10_perip_cnt_clock *clks,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 345) 					 int nums, struct stratix10_clock_data *data)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 346) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 347) 	struct clk *clk;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 348) 	void __iomem *base = data->base;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 349) 	int i;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 350) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 351) 	for (i = 0; i < nums; i++) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 352) 		clk = s10_register_cnt_periph(&clks[i], base);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 353) 		if (IS_ERR(clk)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 354) 			pr_err("%s: failed to register clock %s\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 355) 			       __func__, clks[i].name);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 356) 			continue;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 357) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 358) 		data->clk_data.clks[clks[i].id] = clk;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 359) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 360) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 361) 	return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 362) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 363) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 364) static int agilex_clk_register_gate(const struct stratix10_gate_clock *clks,					    int nums, struct stratix10_clock_data *data)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 365) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 366) 	struct clk *clk;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 367) 	void __iomem *base = data->base;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 368) 	int i;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 369) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 370) 	for (i = 0; i < nums; i++) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 371) 		clk = s10_register_gate(&clks[i], base);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 372) 		if (IS_ERR(clk)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 373) 			pr_err("%s: failed to register clock %s\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 374) 			       __func__, clks[i].name);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 375) 			continue;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 376) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 377) 		data->clk_data.clks[clks[i].id] = clk;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 378) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 379) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 380) 	return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 381) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 382) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 383) static int agilex_clk_register_pll(const struct stratix10_pll_clock *clks,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 384) 				 int nums, struct stratix10_clock_data *data)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 385) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 386) 	struct clk *clk;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 387) 	void __iomem *base = data->base;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 388) 	int i;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 389) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 390) 	for (i = 0; i < nums; i++) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 391) 		clk = agilex_register_pll(&clks[i], base);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 392) 		if (IS_ERR(clk)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 393) 			pr_err("%s: failed to register clock %s\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 394) 			       __func__, clks[i].name);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 395) 			continue;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 396) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 397) 		data->clk_data.clks[clks[i].id] = clk;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 398) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 399) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 400) 	return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 401) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 402) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 403) static struct stratix10_clock_data *__socfpga_agilex_clk_init(struct platform_device *pdev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 404) 						    int nr_clks)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 405) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 406) 	struct device_node *np = pdev->dev.of_node;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 407) 	struct device *dev = &pdev->dev;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 408) 	struct stratix10_clock_data *clk_data;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 409) 	struct clk **clk_table;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 410) 	struct resource *res;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 411) 	void __iomem *base;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 412) 	int ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 413) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 414) 	res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 415) 	base = devm_ioremap_resource(dev, res);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 416) 	if (IS_ERR(base))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 417) 		return ERR_CAST(base);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 418) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 419) 	clk_data = devm_kzalloc(dev, sizeof(*clk_data), GFP_KERNEL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 420) 	if (!clk_data)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 421) 		return ERR_PTR(-ENOMEM);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 422) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 423) 	clk_data->base = base;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 424) 	clk_table = devm_kcalloc(dev, nr_clks, sizeof(*clk_table), GFP_KERNEL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 425) 	if (!clk_table)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 426) 		return ERR_PTR(-ENOMEM);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 427) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 428) 	clk_data->clk_data.clks = clk_table;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 429) 	clk_data->clk_data.clk_num = nr_clks;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 430) 	ret = of_clk_add_provider(np, of_clk_src_onecell_get, &clk_data->clk_data);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 431) 	if (ret)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 432) 		return ERR_PTR(ret);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 433) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 434) 	return clk_data;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 435) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 436) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 437) static int agilex_clkmgr_probe(struct platform_device *pdev)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 438) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 439) 	struct stratix10_clock_data *clk_data;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 440) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 441) 	clk_data = __socfpga_agilex_clk_init(pdev, AGILEX_NUM_CLKS);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 442) 	if (IS_ERR(clk_data))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 443) 		return PTR_ERR(clk_data);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 444) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 445) 	agilex_clk_register_pll(agilex_pll_clks, ARRAY_SIZE(agilex_pll_clks), clk_data);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 446) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 447) 	agilex_clk_register_c_perip(agilex_main_perip_c_clks,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 448) 				 ARRAY_SIZE(agilex_main_perip_c_clks), clk_data);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 449) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 450) 	agilex_clk_register_cnt_perip(agilex_main_perip_cnt_clks,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 451) 				   ARRAY_SIZE(agilex_main_perip_cnt_clks),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 452) 				   clk_data);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 453) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 454) 	agilex_clk_register_gate(agilex_gate_clks, ARRAY_SIZE(agilex_gate_clks),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 455) 			      clk_data);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 456) 	return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 457) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 458) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 459) static const struct of_device_id agilex_clkmgr_match_table[] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 460) 	{ .compatible = "intel,agilex-clkmgr",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 461) 	  .data = agilex_clkmgr_probe },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 462) 	{ }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 463) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 464) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 465) static struct platform_driver agilex_clkmgr_driver = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 466) 	.probe		= agilex_clkmgr_probe,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 467) 	.driver		= {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 468) 		.name	= "agilex-clkmgr",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 469) 		.suppress_bind_attrs = true,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 470) 		.of_match_table = agilex_clkmgr_match_table,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 471) 	},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 472) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 473) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 474) static int __init agilex_clk_init(void)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 475) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 476) 	return platform_driver_register(&agilex_clkmgr_driver);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 477) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 478) core_initcall(agilex_clk_init);