xref: /rk3399_rockchip-uboot/include/clk-uclass.h (revision 4686bbffedcc4cf265ce9eb5a7907ff6ac8869bf)
1135aa950SStephen Warren /*
2135aa950SStephen Warren  * Copyright (c) 2015 Google, Inc
3135aa950SStephen Warren  * Written by Simon Glass <sjg@chromium.org>
4135aa950SStephen Warren  * Copyright (c) 2016, NVIDIA CORPORATION.
5135aa950SStephen Warren  *
6135aa950SStephen Warren  * SPDX-License-Identifier:	GPL-2.0+
7135aa950SStephen Warren  */
8135aa950SStephen Warren 
9135aa950SStephen Warren #ifndef _CLK_UCLASS_H
10135aa950SStephen Warren #define _CLK_UCLASS_H
11135aa950SStephen Warren 
12135aa950SStephen Warren /* See clk.h for background documentation. */
13135aa950SStephen Warren 
14135aa950SStephen Warren #include <clk.h>
15a4e0ef50SSimon Glass 
16a4e0ef50SSimon Glass struct ofnode_phandle_args;
17135aa950SStephen Warren 
18135aa950SStephen Warren /**
19135aa950SStephen Warren  * struct clk_ops - The functions that a clock driver must implement.
20135aa950SStephen Warren  */
21135aa950SStephen Warren struct clk_ops {
22135aa950SStephen Warren 	/**
23135aa950SStephen Warren 	 * of_xlate - Translate a client's device-tree (OF) clock specifier.
24135aa950SStephen Warren 	 *
25135aa950SStephen Warren 	 * The clock core calls this function as the first step in implementing
26135aa950SStephen Warren 	 * a client's clk_get_by_*() call.
27135aa950SStephen Warren 	 *
28135aa950SStephen Warren 	 * If this function pointer is set to NULL, the clock core will use a
29135aa950SStephen Warren 	 * default implementation, which assumes #clock-cells = <1>, and that
30135aa950SStephen Warren 	 * the DT cell contains a simple integer clock ID.
31135aa950SStephen Warren 	 *
32135aa950SStephen Warren 	 * At present, the clock API solely supports device-tree. If this
33135aa950SStephen Warren 	 * changes, other xxx_xlate() functions may be added to support those
34135aa950SStephen Warren 	 * other mechanisms.
35135aa950SStephen Warren 	 *
36135aa950SStephen Warren 	 * @clock:	The clock struct to hold the translation result.
37135aa950SStephen Warren 	 * @args:	The clock specifier values from device tree.
38135aa950SStephen Warren 	 * @return 0 if OK, or a negative error code.
39135aa950SStephen Warren 	 */
40135aa950SStephen Warren 	int (*of_xlate)(struct clk *clock,
41a4e0ef50SSimon Glass 			struct ofnode_phandle_args *args);
42135aa950SStephen Warren 	/**
43135aa950SStephen Warren 	 * request - Request a translated clock.
44135aa950SStephen Warren 	 *
45135aa950SStephen Warren 	 * The clock core calls this function as the second step in
46135aa950SStephen Warren 	 * implementing a client's clk_get_by_*() call, following a successful
47135aa950SStephen Warren 	 * xxx_xlate() call, or as the only step in implementing a client's
48135aa950SStephen Warren 	 * clk_request() call.
49135aa950SStephen Warren 	 *
50135aa950SStephen Warren 	 * @clock:	The clock struct to request; this has been fille in by
51135aa950SStephen Warren 	 *		a previoux xxx_xlate() function call, or by the caller
52135aa950SStephen Warren 	 *		of clk_request().
53135aa950SStephen Warren 	 * @return 0 if OK, or a negative error code.
54135aa950SStephen Warren 	 */
55135aa950SStephen Warren 	int (*request)(struct clk *clock);
56135aa950SStephen Warren 	/**
57135aa950SStephen Warren 	 * free - Free a previously requested clock.
58135aa950SStephen Warren 	 *
59135aa950SStephen Warren 	 * This is the implementation of the client clk_free() API.
60135aa950SStephen Warren 	 *
61135aa950SStephen Warren 	 * @clock:	The clock to free.
62135aa950SStephen Warren 	 * @return 0 if OK, or a negative error code.
63135aa950SStephen Warren 	 */
64135aa950SStephen Warren 	int (*free)(struct clk *clock);
65135aa950SStephen Warren 	/**
66135aa950SStephen Warren 	 * get_rate() - Get current clock rate.
67135aa950SStephen Warren 	 *
68135aa950SStephen Warren 	 * @clk:	The clock to query.
69135aa950SStephen Warren 	 * @return clock rate in Hz, or -ve error code
70135aa950SStephen Warren 	 */
71135aa950SStephen Warren 	ulong (*get_rate)(struct clk *clk);
72135aa950SStephen Warren 	/**
73135aa950SStephen Warren 	 * set_rate() - Set current clock rate.
74135aa950SStephen Warren 	 *
75135aa950SStephen Warren 	 * @clk:	The clock to manipulate.
76135aa950SStephen Warren 	 * @rate:	New clock rate in Hz.
77135aa950SStephen Warren 	 * @return new rate, or -ve error code.
78135aa950SStephen Warren 	 */
79135aa950SStephen Warren 	ulong (*set_rate)(struct clk *clk, ulong rate);
80135aa950SStephen Warren 	/**
81724f9587SZiyuan Xu 	 * clk_get_phase() - Get the phase shift of a clock signal.
82724f9587SZiyuan Xu 	 *
83724f9587SZiyuan Xu 	 * @clk:	The clock to manipulate.
84724f9587SZiyuan Xu 	 * @return the phase shift of a clock node in degrees,
85724f9587SZiyuan Xu 	 *		otherwise returns -ve error code.
86724f9587SZiyuan Xu 	 */
87724f9587SZiyuan Xu 	int (*get_phase)(struct clk *clk);
88724f9587SZiyuan Xu 
89724f9587SZiyuan Xu 	/**
90724f9587SZiyuan Xu 	 * clk_set_rate() - Adjust the phase shift of a clock signal.
91724f9587SZiyuan Xu 	 *
92724f9587SZiyuan Xu 	 * @clk:	The clock to manipulate.
93724f9587SZiyuan Xu 	 * @degrees:	Numberof degrees the signal is shifted.
94724f9587SZiyuan Xu 	 * @return 0 on success, or -ve error code.
95724f9587SZiyuan Xu 	 */
96724f9587SZiyuan Xu 	int (*set_phase)(struct clk *clk, int degrees);
97724f9587SZiyuan Xu 	/**
98*4686bbffSPhilipp Tomsich 	 * set_parent() - Set current clock parent
99*4686bbffSPhilipp Tomsich 	 *
100*4686bbffSPhilipp Tomsich 	 * @clk:        The clock to manipulate.
101*4686bbffSPhilipp Tomsich 	 * @parent:     New clock parent.
102*4686bbffSPhilipp Tomsich 	 * @return zero on success, or -ve error code.
103*4686bbffSPhilipp Tomsich 	 */
104*4686bbffSPhilipp Tomsich 	int (*set_parent)(struct clk *clk, struct clk *parent);
105*4686bbffSPhilipp Tomsich 	/**
106135aa950SStephen Warren 	 * enable() - Enable a clock.
107135aa950SStephen Warren 	 *
108135aa950SStephen Warren 	 * @clk:	The clock to manipulate.
109135aa950SStephen Warren 	 * @return zero on success, or -ve error code.
110135aa950SStephen Warren 	 */
111135aa950SStephen Warren 	int (*enable)(struct clk *clk);
112135aa950SStephen Warren 	/**
113135aa950SStephen Warren 	 * disable() - Disable a clock.
114135aa950SStephen Warren 	 *
115135aa950SStephen Warren 	 * @clk:	The clock to manipulate.
116135aa950SStephen Warren 	 * @return zero on success, or -ve error code.
117135aa950SStephen Warren 	 */
118135aa950SStephen Warren 	int (*disable)(struct clk *clk);
119135aa950SStephen Warren };
120135aa950SStephen Warren 
121135aa950SStephen Warren #endif
122