Skip to content

Commit 421bf6a

Browse files
Akshu Agrawalrafaeljw
authored andcommitted
clk: x86: Add ST oscout platform clock
Stoney SoC provides oscout clock. This clock can support 25Mhz and 48Mhz of frequency. The clock is available for general system use. Signed-off-by: Akshu Agrawal <akshu.agrawal@amd.com> Reviewed-by: Daniel Kurtz <djkurtz@chromium.org> Reviewed-by: Stephen Boyd <sboyd@kernel.org> Signed-off-by: Rafael J. Wysocki <rafael.j.wysocki@intel.com>
1 parent c975e47 commit 421bf6a

File tree

3 files changed

+96
-1
lines changed

3 files changed

+96
-1
lines changed

drivers/clk/x86/Makefile

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
obj-$(CONFIG_PMC_ATOM) += clk-pmc-atom.o
2+
obj-$(CONFIG_X86_AMD_PLATFORM_DEVICE) += clk-st.o
13
clk-x86-lpss-objs := clk-lpt.o
24
obj-$(CONFIG_X86_INTEL_LPSS) += clk-x86-lpss.o
3-
obj-$(CONFIG_PMC_ATOM) += clk-pmc-atom.o

drivers/clk/x86/clk-st.c

Lines changed: 77 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -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);

include/linux/platform_data/clk-st.h

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -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 */

0 commit comments

Comments
 (0)