xref: /rk3399_rockchip-uboot/include/clk.h (revision e70cc438311c753edc1f19214ffc090061e60880)
1f26c8a8eSSimon Glass /*
2f26c8a8eSSimon Glass  * Copyright (c) 2015 Google, Inc
3f26c8a8eSSimon Glass  * Written by Simon Glass <sjg@chromium.org>
4f26c8a8eSSimon Glass  *
5f26c8a8eSSimon Glass  * SPDX-License-Identifier:	GPL-2.0+
6f26c8a8eSSimon Glass  */
7f26c8a8eSSimon Glass 
808d0d6f3SMichal Simek #ifndef _CLK_H_
908d0d6f3SMichal Simek #define _CLK_H_
1008d0d6f3SMichal Simek 
11*e70cc438SSimon Glass #include <errno.h>
12ad1cf785SMasahiro Yamada #include <linux/types.h>
13ad1cf785SMasahiro Yamada 
14ad1cf785SMasahiro Yamada struct udevice;
15ad1cf785SMasahiro Yamada 
1608d0d6f3SMichal Simek int soc_clk_dump(void);
1708d0d6f3SMichal Simek 
18f26c8a8eSSimon Glass struct clk_ops {
19f26c8a8eSSimon Glass 	/**
20f26c8a8eSSimon Glass 	 * get_rate() - Get current clock rate
21f26c8a8eSSimon Glass 	 *
22f26c8a8eSSimon Glass 	 * @dev:	Device to check (UCLASS_CLK)
23f26c8a8eSSimon Glass 	 * @return clock rate in Hz, or -ve error code
24f26c8a8eSSimon Glass 	 */
25f26c8a8eSSimon Glass 	ulong (*get_rate)(struct udevice *dev);
26f26c8a8eSSimon Glass 
27f26c8a8eSSimon Glass 	/**
28f26c8a8eSSimon Glass 	 * set_rate() - Set current clock rate
29f26c8a8eSSimon Glass 	 *
30f26c8a8eSSimon Glass 	 * @dev:	Device to adjust
31f26c8a8eSSimon Glass 	 * @rate:	New clock rate in Hz
32f26c8a8eSSimon Glass 	 * @return new rate, or -ve error code
33f26c8a8eSSimon Glass 	 */
34f26c8a8eSSimon Glass 	ulong (*set_rate)(struct udevice *dev, ulong rate);
35f26c8a8eSSimon Glass 
36f26c8a8eSSimon Glass 	/**
37f0e07516SMasahiro Yamada 	 * enable() - Enable the clock for a peripheral
38f0e07516SMasahiro Yamada 	 *
39f0e07516SMasahiro Yamada 	 * @dev:	clock provider
40f0e07516SMasahiro Yamada 	 * @periph:	Peripheral ID to enable
41f0e07516SMasahiro Yamada 	 * @return zero on success, or -ve error code
42f0e07516SMasahiro Yamada 	 */
43f0e07516SMasahiro Yamada 	int (*enable)(struct udevice *dev, int periph);
44f0e07516SMasahiro Yamada 
45f0e07516SMasahiro Yamada 	/**
468bdf9cfdSMasahiro Yamada 	 * get_periph_rate() - Get clock rate for a peripheral
47f26c8a8eSSimon Glass 	 *
488bdf9cfdSMasahiro Yamada 	 * @dev:	Device to check (UCLASS_CLK)
498bdf9cfdSMasahiro Yamada 	 * @periph:	Peripheral ID to check
508bdf9cfdSMasahiro Yamada 	 * @return clock rate in Hz, or -ve error code
51f26c8a8eSSimon Glass 	 */
52f26c8a8eSSimon Glass 	ulong (*get_periph_rate)(struct udevice *dev, int periph);
53f26c8a8eSSimon Glass 
54f26c8a8eSSimon Glass 	/**
558bdf9cfdSMasahiro Yamada 	 * set_periph_rate() - Set current clock rate for a peripheral
56f26c8a8eSSimon Glass 	 *
57f26c8a8eSSimon Glass 	 * @dev:	Device to update (UCLASS_CLK)
588bdf9cfdSMasahiro Yamada 	 * @periph:	Peripheral ID to update
59f26c8a8eSSimon Glass 	 * @return new clock rate in Hz, or -ve error code
60f26c8a8eSSimon Glass 	 */
61f26c8a8eSSimon Glass 	ulong (*set_periph_rate)(struct udevice *dev, int periph, ulong rate);
62f26c8a8eSSimon Glass };
63f26c8a8eSSimon Glass 
64f26c8a8eSSimon Glass #define clk_get_ops(dev)	((struct clk_ops *)(dev)->driver->ops)
65f26c8a8eSSimon Glass 
66f26c8a8eSSimon Glass /**
67f26c8a8eSSimon Glass  * clk_get_rate() - Get current clock rate
68f26c8a8eSSimon Glass  *
69f26c8a8eSSimon Glass  * @dev:	Device to check (UCLASS_CLK)
70f26c8a8eSSimon Glass  * @return clock rate in Hz, or -ve error code
71f26c8a8eSSimon Glass  */
72f26c8a8eSSimon Glass ulong clk_get_rate(struct udevice *dev);
73f26c8a8eSSimon Glass 
74f26c8a8eSSimon Glass /**
758bdf9cfdSMasahiro Yamada  * clk_set_rate() - Set current clock rate
76f26c8a8eSSimon Glass  *
77f26c8a8eSSimon Glass  * @dev:	Device to adjust
78f26c8a8eSSimon Glass  * @rate:	New clock rate in Hz
79f26c8a8eSSimon Glass  * @return new rate, or -ve error code
80f26c8a8eSSimon Glass  */
81f26c8a8eSSimon Glass ulong clk_set_rate(struct udevice *dev, ulong rate);
82f26c8a8eSSimon Glass 
83f26c8a8eSSimon Glass /**
84f0e07516SMasahiro Yamada  * clk_enable() - Enable the clock for a peripheral
85f0e07516SMasahiro Yamada  *
86f0e07516SMasahiro Yamada  * @dev:	clock provider
87f0e07516SMasahiro Yamada  * @periph:	Peripheral ID to enable
88f0e07516SMasahiro Yamada  * @return zero on success, or -ve error code
89f0e07516SMasahiro Yamada  */
90f0e07516SMasahiro Yamada int clk_enable(struct udevice *dev, int periph);
91f0e07516SMasahiro Yamada 
92f0e07516SMasahiro Yamada /**
93f26c8a8eSSimon Glass  * clk_get_periph_rate() - Get current clock rate for a peripheral
94f26c8a8eSSimon Glass  *
95f26c8a8eSSimon Glass  * @dev:	Device to check (UCLASS_CLK)
96f26c8a8eSSimon Glass  * @return clock rate in Hz, -ve error code
97f26c8a8eSSimon Glass  */
98f26c8a8eSSimon Glass ulong clk_get_periph_rate(struct udevice *dev, int periph);
99f26c8a8eSSimon Glass 
100f26c8a8eSSimon Glass /**
101f26c8a8eSSimon Glass  * clk_set_periph_rate() - Set current clock rate for a peripheral
102f26c8a8eSSimon Glass  *
103f26c8a8eSSimon Glass  * @dev:	Device to update (UCLASS_CLK)
1048bdf9cfdSMasahiro Yamada  * @periph:	Peripheral ID to update
105f26c8a8eSSimon Glass  * @return new clock rate in Hz, or -ve error code
106f26c8a8eSSimon Glass  */
107f26c8a8eSSimon Glass ulong clk_set_periph_rate(struct udevice *dev, int periph, ulong rate);
108f26c8a8eSSimon Glass 
109*e70cc438SSimon Glass #if CONFIG_IS_ENABLED(OF_CONTROL)
110*e70cc438SSimon Glass /**
111*e70cc438SSimon Glass  * clk_get_by_index() - look up a clock referenced by a device
112*e70cc438SSimon Glass  *
113*e70cc438SSimon Glass  * Parse a device's 'clocks' list, returning information on the indexed clock,
114*e70cc438SSimon Glass  * ensuring that it is activated.
115*e70cc438SSimon Glass  *
116*e70cc438SSimon Glass  * @dev:	Device containing the clock reference
117*e70cc438SSimon Glass  * @index:	Clock index to return (0 = first)
118*e70cc438SSimon Glass  * @clk_devp:	Returns clock device
119*e70cc438SSimon Glass  * @return:	Peripheral ID for the device to control. This is the first
120*e70cc438SSimon Glass  *		argument after the clock node phandle. If there is no arguemnt,
121*e70cc438SSimon Glass  *		returns 0. Return -ve error code on any error
122*e70cc438SSimon Glass  */
123*e70cc438SSimon Glass int clk_get_by_index(struct udevice *dev, int index, struct udevice **clk_devp);
124*e70cc438SSimon Glass #else
125*e70cc438SSimon Glass static inline int clk_get_by_index(struct udevice *dev, int index,
126*e70cc438SSimon Glass 				   struct udevice **clk_devp)
127*e70cc438SSimon Glass {
128*e70cc438SSimon Glass 	return -ENOSYS;
129*e70cc438SSimon Glass }
130*e70cc438SSimon Glass #endif
131*e70cc438SSimon Glass 
13208d0d6f3SMichal Simek #endif /* _CLK_H_ */
133