Page Menu
Home
FreeBSD
Search
Configure Global Search
Log In
Files
F177559517
D60883.1794720037.diff
No One
Temporary
Actions
View File
Edit File
Delete File
View Transforms
Subscribe
Flag For Later
Award Token
Authored By
Unknown
Size
2 KB
Referenced Files
None
Subscribers
None
D60883.1794720037.diff
View Options
diff --git a/sys/dev/clk/clk.h b/sys/dev/clk/clk.h
--- a/sys/dev/clk/clk.h
+++ b/sys/dev/clk/clk.h
@@ -116,6 +116,8 @@
int enablecnt);
int clknode_test_freq(struct clknode *clknode, uint64_t freq, int flags,
int enablecnt, uint64_t *out_freq);
+int clknode_set_phase(struct clknode *clknode, int degrees);
+int clknode_get_phase(struct clknode *clknode, int *degrees);
int clknode_enable(struct clknode *clknode);
int clknode_disable(struct clknode *clknode);
int clknode_stop(struct clknode *clknode, int depth);
@@ -129,6 +131,8 @@
int clk_get_freq(clk_t clk, uint64_t *freq);
int clk_set_freq(clk_t clk, uint64_t freq, int flags);
int clk_test_freq(clk_t clk, uint64_t freq, int flags);
+int clk_set_phase(clk_t clk, int degrees);
+int clk_get_phase(clk_t clk, int *degrees);
int clk_enable(clk_t clk);
int clk_disable(clk_t clk);
int clk_stop(clk_t clk);
diff --git a/sys/dev/clk/clk.c b/sys/dev/clk/clk.c
--- a/sys/dev/clk/clk.c
+++ b/sys/dev/clk/clk.c
@@ -1228,6 +1228,64 @@
return (rv);
}
+int
+clknode_set_phase(struct clknode *clknode, int degrees)
+{
+ int rv;
+
+ CLK_TOPO_ASSERT();
+
+ CLKNODE_XLOCK(clknode);
+ rv = CLKNODE_SET_PHASE(clknode, degrees);
+ CLKNODE_UNLOCK(clknode);
+ return (rv);
+}
+
+int
+clknode_get_phase(struct clknode *clknode, int *degrees)
+{
+ int rv;
+
+ CLK_TOPO_ASSERT();
+
+ CLKNODE_XLOCK(clknode);
+ rv = CLKNODE_GET_PHASE(clknode, degrees);
+ CLKNODE_UNLOCK(clknode);
+ return (rv);
+}
+
+int
+clk_set_phase(clk_t clk, int degrees)
+{
+ int rv;
+ struct clknode *clknode;
+
+ clknode = clk->clknode;
+ KASSERT(clknode->ref_cnt > 0,
+ ("Attempt to access unreferenced clock: %s\n", clknode->name));
+
+ CLK_TOPO_XLOCK();
+ rv = clknode_set_phase(clknode, degrees);
+ CLK_TOPO_UNLOCK();
+ return (rv);
+}
+
+int
+clk_get_phase(clk_t clk, int *degrees)
+{
+ int rv;
+ struct clknode *clknode;
+
+ clknode = clk->clknode;
+ KASSERT(clknode->ref_cnt > 0,
+ ("Attempt to access unreferenced clock: %s\n", clknode->name));
+
+ CLK_TOPO_SLOCK();
+ rv = clknode_get_phase(clknode, degrees);
+ CLK_TOPO_UNLOCK();
+ return (rv);
+}
+
int
clk_get_parent(clk_t clk, clk_t *parent)
{
diff --git a/sys/dev/clk/clknode_if.m b/sys/dev/clk/clknode_if.m
--- a/sys/dev/clk/clknode_if.m
+++ b/sys/dev/clk/clknode_if.m
@@ -87,3 +87,23 @@
struct clknode *clk;
int idx;
};
+
+#
+# Set clock phase (in degrees)
+# Return: ENXIO - method is not implemented
+# 0 - success
+#
+METHOD int set_phase {
+ struct clknode *clk;
+ int degrees;
+};
+
+#
+# Get clock phase (in degrees)
+# Return: ENXIO - method is not implemented
+# 0 - success
+#
+METHOD int get_phase {
+ struct clknode *clk;
+ int *degrees;
+};
File Metadata
Details
Attached
Mime Type
text/plain
Expires
Sun, Nov 15, 5:20 AM (16 h, 35 m)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
41714522
Default Alt Text
D60883.1794720037.diff (2 KB)
Attached To
Mode
D60883: clk: Add a clknode method to get and set the phase
Attached
Detach File
Event Timeline