diff options
Diffstat (limited to 'drivers/clk/meson/axg.c')
| -rw-r--r-- | drivers/clk/meson/axg.c | 69 |
1 files changed, 22 insertions, 47 deletions
diff --git a/drivers/clk/meson/axg.c b/drivers/clk/meson/axg.c index 792735d7e46e..7a8ef80e5f2c 100644 --- a/drivers/clk/meson/axg.c +++ b/drivers/clk/meson/axg.c | |||
| @@ -9,16 +9,17 @@ | |||
| 9 | * Author: Qiufang Dai <qiufang.dai@amlogic.com> | 9 | * Author: Qiufang Dai <qiufang.dai@amlogic.com> |
| 10 | */ | 10 | */ |
| 11 | 11 | ||
| 12 | #include <linux/clk.h> | ||
| 13 | #include <linux/clk-provider.h> | 12 | #include <linux/clk-provider.h> |
| 14 | #include <linux/init.h> | 13 | #include <linux/init.h> |
| 15 | #include <linux/of_device.h> | 14 | #include <linux/of_device.h> |
| 16 | #include <linux/mfd/syscon.h> | ||
| 17 | #include <linux/platform_device.h> | 15 | #include <linux/platform_device.h> |
| 18 | #include <linux/regmap.h> | ||
| 19 | 16 | ||
| 20 | #include "clkc.h" | 17 | #include "clk-input.h" |
| 18 | #include "clk-regmap.h" | ||
| 19 | #include "clk-pll.h" | ||
| 20 | #include "clk-mpll.h" | ||
| 21 | #include "axg.h" | 21 | #include "axg.h" |
| 22 | #include "meson-eeclk.h" | ||
| 22 | 23 | ||
| 23 | static DEFINE_SPINLOCK(meson_clk_lock); | 24 | static DEFINE_SPINLOCK(meson_clk_lock); |
| 24 | 25 | ||
| @@ -58,7 +59,7 @@ static struct clk_regmap axg_fixed_pll_dco = { | |||
| 58 | .hw.init = &(struct clk_init_data){ | 59 | .hw.init = &(struct clk_init_data){ |
| 59 | .name = "fixed_pll_dco", | 60 | .name = "fixed_pll_dco", |
| 60 | .ops = &meson_clk_pll_ro_ops, | 61 | .ops = &meson_clk_pll_ro_ops, |
| 61 | .parent_names = (const char *[]){ "xtal" }, | 62 | .parent_names = (const char *[]){ IN_PREFIX "xtal" }, |
| 62 | .num_parents = 1, | 63 | .num_parents = 1, |
| 63 | }, | 64 | }, |
| 64 | }; | 65 | }; |
| @@ -113,7 +114,7 @@ static struct clk_regmap axg_sys_pll_dco = { | |||
| 113 | .hw.init = &(struct clk_init_data){ | 114 | .hw.init = &(struct clk_init_data){ |
| 114 | .name = "sys_pll_dco", | 115 | .name = "sys_pll_dco", |
| 115 | .ops = &meson_clk_pll_ro_ops, | 116 | .ops = &meson_clk_pll_ro_ops, |
| 116 | .parent_names = (const char *[]){ "xtal" }, | 117 | .parent_names = (const char *[]){ IN_PREFIX "xtal" }, |
| 117 | .num_parents = 1, | 118 | .num_parents = 1, |
| 118 | }, | 119 | }, |
| 119 | }; | 120 | }; |
| @@ -214,7 +215,7 @@ static struct clk_regmap axg_gp0_pll_dco = { | |||
| 214 | .hw.init = &(struct clk_init_data){ | 215 | .hw.init = &(struct clk_init_data){ |
| 215 | .name = "gp0_pll_dco", | 216 | .name = "gp0_pll_dco", |
| 216 | .ops = &meson_clk_pll_ops, | 217 | .ops = &meson_clk_pll_ops, |
| 217 | .parent_names = (const char *[]){ "xtal" }, | 218 | .parent_names = (const char *[]){ IN_PREFIX "xtal" }, |
| 218 | .num_parents = 1, | 219 | .num_parents = 1, |
| 219 | }, | 220 | }, |
| 220 | }; | 221 | }; |
| @@ -283,7 +284,7 @@ static struct clk_regmap axg_hifi_pll_dco = { | |||
| 283 | .hw.init = &(struct clk_init_data){ | 284 | .hw.init = &(struct clk_init_data){ |
| 284 | .name = "hifi_pll_dco", | 285 | .name = "hifi_pll_dco", |
| 285 | .ops = &meson_clk_pll_ops, | 286 | .ops = &meson_clk_pll_ops, |
| 286 | .parent_names = (const char *[]){ "xtal" }, | 287 | .parent_names = (const char *[]){ IN_PREFIX "xtal" }, |
| 287 | .num_parents = 1, | 288 | .num_parents = 1, |
| 288 | }, | 289 | }, |
| 289 | }; | 290 | }; |
| @@ -701,7 +702,7 @@ static struct clk_regmap axg_pcie_pll_dco = { | |||
| 701 | .hw.init = &(struct clk_init_data){ | 702 | .hw.init = &(struct clk_init_data){ |
| 702 | .name = "pcie_pll_dco", | 703 | .name = "pcie_pll_dco", |
| 703 | .ops = &meson_clk_pll_ops, | 704 | .ops = &meson_clk_pll_ops, |
| 704 | .parent_names = (const char *[]){ "xtal" }, | 705 | .parent_names = (const char *[]){ IN_PREFIX "xtal" }, |
| 705 | .num_parents = 1, | 706 | .num_parents = 1, |
| 706 | }, | 707 | }, |
| 707 | }; | 708 | }; |
| @@ -803,7 +804,7 @@ static struct clk_regmap axg_pcie_cml_en1 = { | |||
| 803 | 804 | ||
| 804 | static u32 mux_table_clk81[] = { 0, 2, 3, 4, 5, 6, 7 }; | 805 | static u32 mux_table_clk81[] = { 0, 2, 3, 4, 5, 6, 7 }; |
| 805 | static const char * const clk81_parent_names[] = { | 806 | static const char * const clk81_parent_names[] = { |
| 806 | "xtal", "fclk_div7", "mpll1", "mpll2", "fclk_div4", | 807 | IN_PREFIX "xtal", "fclk_div7", "mpll1", "mpll2", "fclk_div4", |
| 807 | "fclk_div3", "fclk_div5" | 808 | "fclk_div3", "fclk_div5" |
| 808 | }; | 809 | }; |
| 809 | 810 | ||
| @@ -852,7 +853,7 @@ static struct clk_regmap axg_clk81 = { | |||
| 852 | }; | 853 | }; |
| 853 | 854 | ||
| 854 | static const char * const axg_sd_emmc_clk0_parent_names[] = { | 855 | static const char * const axg_sd_emmc_clk0_parent_names[] = { |
| 855 | "xtal", "fclk_div2", "fclk_div3", "fclk_div5", "fclk_div7", | 856 | IN_PREFIX "xtal", "fclk_div2", "fclk_div3", "fclk_div5", "fclk_div7", |
| 856 | 857 | ||
| 857 | /* | 858 | /* |
| 858 | * Following these parent clocks, we should also have had mpll2, mpll3 | 859 | * Following these parent clocks, we should also have had mpll2, mpll3 |
| @@ -957,7 +958,7 @@ static struct clk_regmap axg_sd_emmc_c_clk0 = { | |||
| 957 | static u32 mux_table_gen_clk[] = { 0, 4, 5, 6, 7, 8, | 958 | static u32 mux_table_gen_clk[] = { 0, 4, 5, 6, 7, 8, |
| 958 | 9, 10, 11, 13, 14, }; | 959 | 9, 10, 11, 13, 14, }; |
| 959 | static const char * const gen_clk_parent_names[] = { | 960 | static const char * const gen_clk_parent_names[] = { |
| 960 | "xtal", "hifi_pll", "mpll0", "mpll1", "mpll2", "mpll3", | 961 | IN_PREFIX "xtal", "hifi_pll", "mpll0", "mpll1", "mpll2", "mpll3", |
| 961 | "fclk_div4", "fclk_div3", "fclk_div5", "fclk_div7", "gp0_pll", | 962 | "fclk_div4", "fclk_div3", "fclk_div5", "fclk_div7", "gp0_pll", |
| 962 | }; | 963 | }; |
| 963 | 964 | ||
| @@ -1255,46 +1256,20 @@ static struct clk_regmap *const axg_clk_regmaps[] = { | |||
| 1255 | &axg_pcie_pll_od, | 1256 | &axg_pcie_pll_od, |
| 1256 | }; | 1257 | }; |
| 1257 | 1258 | ||
| 1259 | static const struct meson_eeclkc_data axg_clkc_data = { | ||
| 1260 | .regmap_clks = axg_clk_regmaps, | ||
| 1261 | .regmap_clk_num = ARRAY_SIZE(axg_clk_regmaps), | ||
| 1262 | .hw_onecell_data = &axg_hw_onecell_data, | ||
| 1263 | }; | ||
| 1264 | |||
| 1265 | |||
| 1258 | static const struct of_device_id clkc_match_table[] = { | 1266 | static const struct of_device_id clkc_match_table[] = { |
| 1259 | { .compatible = "amlogic,axg-clkc" }, | 1267 | { .compatible = "amlogic,axg-clkc", .data = &axg_clkc_data }, |
| 1260 | {} | 1268 | {} |
| 1261 | }; | 1269 | }; |
| 1262 | 1270 | ||
| 1263 | static int axg_clkc_probe(struct platform_device *pdev) | ||
| 1264 | { | ||
| 1265 | struct device *dev = &pdev->dev; | ||
| 1266 | struct regmap *map; | ||
| 1267 | int ret, i; | ||
| 1268 | |||
| 1269 | /* Get the hhi system controller node if available */ | ||
| 1270 | map = syscon_node_to_regmap(of_get_parent(dev->of_node)); | ||
| 1271 | if (IS_ERR(map)) { | ||
| 1272 | dev_err(dev, "failed to get HHI regmap\n"); | ||
| 1273 | return PTR_ERR(map); | ||
| 1274 | } | ||
| 1275 | |||
| 1276 | /* Populate regmap for the regmap backed clocks */ | ||
| 1277 | for (i = 0; i < ARRAY_SIZE(axg_clk_regmaps); i++) | ||
| 1278 | axg_clk_regmaps[i]->map = map; | ||
| 1279 | |||
| 1280 | for (i = 0; i < axg_hw_onecell_data.num; i++) { | ||
| 1281 | /* array might be sparse */ | ||
| 1282 | if (!axg_hw_onecell_data.hws[i]) | ||
| 1283 | continue; | ||
| 1284 | |||
| 1285 | ret = devm_clk_hw_register(dev, axg_hw_onecell_data.hws[i]); | ||
| 1286 | if (ret) { | ||
| 1287 | dev_err(dev, "Clock registration failed\n"); | ||
| 1288 | return ret; | ||
| 1289 | } | ||
| 1290 | } | ||
| 1291 | |||
| 1292 | return devm_of_clk_add_hw_provider(dev, of_clk_hw_onecell_get, | ||
| 1293 | &axg_hw_onecell_data); | ||
| 1294 | } | ||
| 1295 | |||
| 1296 | static struct platform_driver axg_driver = { | 1271 | static struct platform_driver axg_driver = { |
| 1297 | .probe = axg_clkc_probe, | 1272 | .probe = meson_eeclkc_probe, |
| 1298 | .driver = { | 1273 | .driver = { |
| 1299 | .name = "axg-clkc", | 1274 | .name = "axg-clkc", |
| 1300 | .of_match_table = clkc_match_table, | 1275 | .of_match_table = clkc_match_table, |
