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