xref: /rk3399_ARM-atf/drivers/clk/clk.c (revision a2c6016f927e4b9a23499005c63f3e46f48ff8a2)
1 /*
2  * Copyright (c) 2021, STMicroelectronics - All Rights Reserved
3  * Author(s): Ludovic Barre, <ludovic.barre@st.com> for STMicroelectronics.
4  *
5  * SPDX-License-Identifier: BSD-3-Clause
6  */
7 
8 #include <assert.h>
9 #include <errno.h>
10 #include <stdbool.h>
11 
12 #include <drivers/clk.h>
13 
14 static const struct clk_ops *ops;
15 
16 int clk_enable(unsigned long id)
17 {
18 	assert((ops != NULL) && (ops->enable != NULL));
19 
20 	return ops->enable(id);
21 }
22 
23 void clk_disable(unsigned long id)
24 {
25 	assert((ops != NULL) && (ops->disable != NULL));
26 
27 	ops->disable(id);
28 }
29 
30 unsigned long clk_get_rate(unsigned long id)
31 {
32 	assert((ops != NULL) && (ops->get_rate != NULL));
33 
34 	return ops->get_rate(id);
35 }
36 
37 int clk_get_parent(unsigned long id)
38 {
39 	assert((ops != NULL) && (ops->get_parent != NULL));
40 
41 	return ops->get_parent(id);
42 }
43 
44 int clk_set_parent(unsigned long id, unsigned long parent_id)
45 {
46 	assert((ops != NULL) && (ops->set_parent != NULL));
47 
48 	return ops->set_parent(id, parent_id);
49 }
50 
51 bool clk_is_enabled(unsigned long id)
52 {
53 	assert((ops != NULL) && (ops->is_enabled != NULL));
54 
55 	return ops->is_enabled(id);
56 }
57 
58 /*
59  * Initialize the clk. The fields in the provided clk
60  * ops pointer must be valid.
61  */
62 void clk_register(const struct clk_ops *ops_ptr)
63 {
64 	assert((ops_ptr != NULL) &&
65 	       (ops_ptr->enable != NULL) &&
66 	       (ops_ptr->disable != NULL) &&
67 	       (ops_ptr->get_rate != NULL) &&
68 	       (ops_ptr->get_parent != NULL) &&
69 	       (ops_ptr->is_enabled != NULL));
70 
71 	ops = ops_ptr;
72 }
73