diff options
| -rw-r--r-- | drivers/clk/x86/Makefile | 3 | ||||
| -rw-r--r-- | drivers/clk/x86/clk-st.c | 77 | ||||
| -rw-r--r-- | include/linux/platform_data/clk-st.h | 17 |
3 files changed, 96 insertions, 1 deletions
diff --git a/drivers/clk/x86/Makefile b/drivers/clk/x86/Makefile index 1367afb03858..00303bc05415 100644 --- a/drivers/clk/x86/Makefile +++ b/drivers/clk/x86/Makefile | |||
| @@ -1,3 +1,4 @@ | |||
| 1 | obj-$(CONFIG_PMC_ATOM) += clk-pmc-atom.o | ||
| 2 | obj-$(CONFIG_X86_AMD_PLATFORM_DEVICE) += clk-st.o | ||
| 1 | clk-x86-lpss-objs := clk-lpt.o | 3 | clk-x86-lpss-objs := clk-lpt.o |
| 2 | obj-$(CONFIG_X86_INTEL_LPSS) += clk-x86-lpss.o | 4 | obj-$(CONFIG_X86_INTEL_LPSS) += clk-x86-lpss.o |
| 3 | obj-$(CONFIG_PMC_ATOM) += clk-pmc-atom.o | ||
diff --git a/drivers/clk/x86/clk-st.c b/drivers/clk/x86/clk-st.c new file mode 100644 index 000000000000..fb62f3938008 --- /dev/null +++ b/drivers/clk/x86/clk-st.c | |||
| @@ -0,0 +1,77 @@ | |||
| 1 | // SPDX-License-Identifier: MIT | ||
| 2 | /* | ||
| 3 | * clock framework for AMD Stoney based clocks | ||
| 4 | * | ||
| 5 | * Copyright 2018 Advanced Micro Devices, Inc. | ||
| 6 | */ | ||
| 7 | |||
| 8 | #include <linux/clk.h> | ||
| 9 | #include <linux/clkdev.h> | ||
| 10 | #include <linux/clk-provider.h> | ||
| 11 | #include <linux/platform_data/clk-st.h> | ||
| 12 | #include <linux/platform_device.h> | ||
| 13 | |||
| 14 | /* Clock Driving Strength 2 register */ | ||
| 15 | #define CLKDRVSTR2 0x28 | ||
| 16 | /* Clock Control 1 register */ | ||
| 17 | #define MISCCLKCNTL1 0x40 | ||
| 18 | /* Auxiliary clock1 enable bit */ | ||
| 19 | #define OSCCLKENB 2 | ||
| 20 | /* 25Mhz auxiliary output clock freq bit */ | ||
| 21 | #define OSCOUT1CLK25MHZ 16 | ||
| 22 | |||
| 23 | #define ST_CLK_48M 0 | ||
| 24 | #define ST_CLK_25M 1 | ||
| 25 | #define ST_CLK_MUX 2 | ||
| 26 | #define ST_CLK_GATE 3 | ||
| 27 | #define ST_MAX_CLKS 4 | ||
| 28 | |||
| 29 | static const char * const clk_oscout1_parents[] = { "clk48MHz", "clk25MHz" }; | ||
| 30 | static struct clk_hw *hws[ST_MAX_CLKS]; | ||
| 31 | |||
| 32 | static int st_clk_probe(struct platform_device *pdev) | ||
| 33 | { | ||
| 34 | struct st_clk_data *st_data; | ||
| 35 | |||
| 36 | st_data = dev_get_platdata(&pdev->dev); | ||
| 37 | if (!st_data || !st_data->base) | ||
| 38 | return -EINVAL; | ||
| 39 | |||
| 40 | hws[ST_CLK_48M] = clk_hw_register_fixed_rate(NULL, "clk48MHz", NULL, 0, | ||
| 41 | 48000000); | ||
| 42 | hws[ST_CLK_25M] = clk_hw_register_fixed_rate(NULL, "clk25MHz", NULL, 0, | ||
| 43 | 25000000); | ||
| 44 | |||
| 45 | hws[ST_CLK_MUX] = clk_hw_register_mux(NULL, "oscout1_mux", | ||
| 46 | clk_oscout1_parents, ARRAY_SIZE(clk_oscout1_parents), | ||
| 47 | 0, st_data->base + CLKDRVSTR2, OSCOUT1CLK25MHZ, 3, 0, NULL); | ||
| 48 | |||
| 49 | clk_set_parent(hws[ST_CLK_MUX]->clk, hws[ST_CLK_25M]->clk); | ||
| 50 | |||
| 51 | hws[ST_CLK_GATE] = clk_hw_register_gate(NULL, "oscout1", "oscout1_mux", | ||
| 52 | 0, st_data->base + MISCCLKCNTL1, OSCCLKENB, | ||
| 53 | CLK_GATE_SET_TO_DISABLE, NULL); | ||
| 54 | |||
| 55 | clk_hw_register_clkdev(hws[ST_CLK_GATE], "oscout1", NULL); | ||
| 56 | |||
| 57 | return 0; | ||
| 58 | } | ||
| 59 | |||
| 60 | static int st_clk_remove(struct platform_device *pdev) | ||
| 61 | { | ||
| 62 | int i; | ||
| 63 | |||
| 64 | for (i = 0; i < ST_MAX_CLKS; i++) | ||
| 65 | clk_hw_unregister(hws[i]); | ||
| 66 | return 0; | ||
| 67 | } | ||
| 68 | |||
| 69 | static struct platform_driver st_clk_driver = { | ||
| 70 | .driver = { | ||
| 71 | .name = "clk-st", | ||
| 72 | .suppress_bind_attrs = true, | ||
| 73 | }, | ||
| 74 | .probe = st_clk_probe, | ||
| 75 | .remove = st_clk_remove, | ||
| 76 | }; | ||
| 77 | builtin_platform_driver(st_clk_driver); | ||
diff --git a/include/linux/platform_data/clk-st.h b/include/linux/platform_data/clk-st.h new file mode 100644 index 000000000000..7cdb6a402b35 --- /dev/null +++ b/include/linux/platform_data/clk-st.h | |||
| @@ -0,0 +1,17 @@ | |||
| 1 | /* SPDX-License-Identifier: MIT */ | ||
| 2 | /* | ||
| 3 | * clock framework for AMD Stoney based clock | ||
| 4 | * | ||
| 5 | * Copyright 2018 Advanced Micro Devices, Inc. | ||
| 6 | */ | ||
| 7 | |||
| 8 | #ifndef __CLK_ST_H | ||
| 9 | #define __CLK_ST_H | ||
| 10 | |||
| 11 | #include <linux/compiler.h> | ||
| 12 | |||
| 13 | struct st_clk_data { | ||
| 14 | void __iomem *base; | ||
| 15 | }; | ||
| 16 | |||
| 17 | #endif /* __CLK_ST_H */ | ||
