diff options
Diffstat (limited to 'drivers')
-rw-r--r-- | drivers/st/clk/stm32mp1_clk.c | 10 | ||||
-rw-r--r-- | drivers/st/clk/stm32mp1_clkfunc.c | 167 | ||||
-rw-r--r-- | drivers/st/clk/stm32mp_clkfunc.c | 141 |
3 files changed, 150 insertions, 168 deletions
diff --git a/drivers/st/clk/stm32mp1_clk.c b/drivers/st/clk/stm32mp1_clk.c index eb2528727..e05a7ba45 100644 --- a/drivers/st/clk/stm32mp1_clk.c +++ b/drivers/st/clk/stm32mp1_clk.c @@ -20,7 +20,6 @@ #include <drivers/generic_delay_timer.h> #include <drivers/st/stm32mp_clkfunc.h> #include <drivers/st/stm32mp1_clk.h> -#include <drivers/st/stm32mp1_clkfunc.h> #include <drivers/st/stm32mp1_rcc.h> #include <dt-bindings/clock/stm32mp1-clksrc.h> #include <lib/mmio.h> @@ -40,6 +39,15 @@ #define HSIDIV_TIMEOUT TIMEOUT_US_200MS #define OSCRDY_TIMEOUT TIMEOUT_US_1S +const char *stm32mp_osc_node_label[NB_OSC] = { + [_LSI] = "clk-lsi", + [_LSE] = "clk-lse", + [_HSI] = "clk-hsi", + [_HSE] = "clk-hse", + [_CSI] = "clk-csi", + [_I2S_CKIN] = "i2s_ckin", +}; + enum stm32mp1_parent_id { /* Oscillators are defined in enum stm32mp_osc_id */ diff --git a/drivers/st/clk/stm32mp1_clkfunc.c b/drivers/st/clk/stm32mp1_clkfunc.c deleted file mode 100644 index 1aa05bf55..000000000 --- a/drivers/st/clk/stm32mp1_clkfunc.c +++ /dev/null @@ -1,167 +0,0 @@ -/* - * Copyright (c) 2017-2019, STMicroelectronics - All Rights Reserved - * - * SPDX-License-Identifier: BSD-3-Clause - */ - -#include <errno.h> - -#include <libfdt.h> - -#include <platform_def.h> - -#include <drivers/st/stm32_gpio.h> -#include <drivers/st/stm32mp_clkfunc.h> -#include <drivers/st/stm32mp1_clk.h> -#include <drivers/st/stm32mp1_clkfunc.h> -#include <dt-bindings/clock/stm32mp1-clksrc.h> - -const char *stm32mp_osc_node_label[NB_OSC] = { - [_LSI] = "clk-lsi", - [_LSE] = "clk-lse", - [_HSI] = "clk-hsi", - [_HSE] = "clk-hse", - [_CSI] = "clk-csi", - [_I2S_CKIN] = "i2s_ckin", -}; - -/* - * Get the frequency of an oscillator from its name in device tree. - * @param name: oscillator name - * @param freq: stores the frequency of the oscillator - * @return: 0 on success, and a negative FDT/ERRNO error code on failure. - */ -int fdt_osc_read_freq(const char *name, uint32_t *freq) -{ - int node, subnode; - void *fdt; - - if (fdt_get_address(&fdt) == 0) { - return -ENOENT; - } - - node = fdt_path_offset(fdt, "/clocks"); - if (node < 0) { - return -FDT_ERR_NOTFOUND; - } - - fdt_for_each_subnode(subnode, fdt, node) { - const char *cchar; - int ret; - - cchar = fdt_get_name(fdt, subnode, &ret); - if (cchar == NULL) { - return ret; - } - - if (strncmp(cchar, name, (size_t)ret) == 0) { - const fdt32_t *cuint; - - cuint = fdt_getprop(fdt, subnode, "clock-frequency", - &ret); - if (cuint == NULL) { - return ret; - } - - *freq = fdt32_to_cpu(*cuint); - - return 0; - } - } - - /* Oscillator not found, freq=0 */ - *freq = 0; - return 0; -} - -/* - * Check the presence of an oscillator property from its id. - * @param osc_id: oscillator ID - * @param prop_name: property name - * @return: true/false regarding search result. - */ -bool fdt_osc_read_bool(enum stm32mp_osc_id osc_id, const char *prop_name) -{ - int node, subnode; - void *fdt; - - if (fdt_get_address(&fdt) == 0) { - return false; - } - - if (osc_id >= NB_OSC) { - return false; - } - - node = fdt_path_offset(fdt, "/clocks"); - if (node < 0) { - return false; - } - - fdt_for_each_subnode(subnode, fdt, node) { - const char *cchar; - int ret; - - cchar = fdt_get_name(fdt, subnode, &ret); - if (cchar == NULL) { - return false; - } - - if (strncmp(cchar, stm32mp_osc_node_label[osc_id], - (size_t)ret) != 0) { - continue; - } - - if (fdt_getprop(fdt, subnode, prop_name, NULL) != NULL) { - return true; - } - } - - return false; -} - -/* - * Get the value of a oscillator property from its ID. - * @param osc_id: oscillator ID - * @param prop_name: property name - * @param dflt_value: default value - * @return oscillator value on success, default value if property not found. - */ -uint32_t fdt_osc_read_uint32_default(enum stm32mp_osc_id osc_id, - const char *prop_name, uint32_t dflt_value) -{ - int node, subnode; - void *fdt; - - if (fdt_get_address(&fdt) == 0) { - return dflt_value; - } - - if (osc_id >= NB_OSC) { - return dflt_value; - } - - node = fdt_path_offset(fdt, "/clocks"); - if (node < 0) { - return dflt_value; - } - - fdt_for_each_subnode(subnode, fdt, node) { - const char *cchar; - int ret; - - cchar = fdt_get_name(fdt, subnode, &ret); - if (cchar == NULL) { - return dflt_value; - } - - if (strncmp(cchar, stm32mp_osc_node_label[osc_id], - (size_t)ret) != 0) { - continue; - } - - return fdt_read_uint32_default(subnode, prop_name, dflt_value); - } - - return dflt_value; -} diff --git a/drivers/st/clk/stm32mp_clkfunc.c b/drivers/st/clk/stm32mp_clkfunc.c index 16acef07b..87c8e2b84 100644 --- a/drivers/st/clk/stm32mp_clkfunc.c +++ b/drivers/st/clk/stm32mp_clkfunc.c @@ -16,6 +16,147 @@ #define DT_STGEN_COMPAT "st,stm32-stgen" /* + * Get the frequency of an oscillator from its name in device tree. + * @param name: oscillator name + * @param freq: stores the frequency of the oscillator + * @return: 0 on success, and a negative FDT/ERRNO error code on failure. + */ +int fdt_osc_read_freq(const char *name, uint32_t *freq) +{ + int node, subnode; + void *fdt; + + if (fdt_get_address(&fdt) == 0) { + return -ENOENT; + } + + node = fdt_path_offset(fdt, "/clocks"); + if (node < 0) { + return -FDT_ERR_NOTFOUND; + } + + fdt_for_each_subnode(subnode, fdt, node) { + const char *cchar; + int ret; + + cchar = fdt_get_name(fdt, subnode, &ret); + if (cchar == NULL) { + return ret; + } + + if (strncmp(cchar, name, (size_t)ret) == 0) { + const fdt32_t *cuint; + + cuint = fdt_getprop(fdt, subnode, "clock-frequency", + &ret); + if (cuint == NULL) { + return ret; + } + + *freq = fdt32_to_cpu(*cuint); + + return 0; + } + } + + /* Oscillator not found, freq=0 */ + *freq = 0; + return 0; +} + +/* + * Check the presence of an oscillator property from its id. + * @param osc_id: oscillator ID + * @param prop_name: property name + * @return: true/false regarding search result. + */ +bool fdt_osc_read_bool(enum stm32mp_osc_id osc_id, const char *prop_name) +{ + int node, subnode; + void *fdt; + + if (fdt_get_address(&fdt) == 0) { + return false; + } + + if (osc_id >= NB_OSC) { + return false; + } + + node = fdt_path_offset(fdt, "/clocks"); + if (node < 0) { + return false; + } + + fdt_for_each_subnode(subnode, fdt, node) { + const char *cchar; + int ret; + + cchar = fdt_get_name(fdt, subnode, &ret); + if (cchar == NULL) { + return false; + } + + if (strncmp(cchar, stm32mp_osc_node_label[osc_id], + (size_t)ret) != 0) { + continue; + } + + if (fdt_getprop(fdt, subnode, prop_name, NULL) != NULL) { + return true; + } + } + + return false; +} + +/* + * Get the value of a oscillator property from its ID. + * @param osc_id: oscillator ID + * @param prop_name: property name + * @param dflt_value: default value + * @return oscillator value on success, default value if property not found. + */ +uint32_t fdt_osc_read_uint32_default(enum stm32mp_osc_id osc_id, + const char *prop_name, uint32_t dflt_value) +{ + int node, subnode; + void *fdt; + + if (fdt_get_address(&fdt) == 0) { + return dflt_value; + } + + if (osc_id >= NB_OSC) { + return dflt_value; + } + + node = fdt_path_offset(fdt, "/clocks"); + if (node < 0) { + return dflt_value; + } + + fdt_for_each_subnode(subnode, fdt, node) { + const char *cchar; + int ret; + + cchar = fdt_get_name(fdt, subnode, &ret); + if (cchar == NULL) { + return dflt_value; + } + + if (strncmp(cchar, stm32mp_osc_node_label[osc_id], + (size_t)ret) != 0) { + continue; + } + + return fdt_read_uint32_default(subnode, prop_name, dflt_value); + } + + return dflt_value; +} + +/* * Get the RCC node offset from the device tree * @param fdt: Device tree reference * @return: Node offset or a negative value on error |