1 /*
2  * Copyright 2023 NXP
3  *
4  * Based on clock_control_mcux_scg.c, which is:
5  * Copyright (c) 2019-2021 Vestas Wind Systems A/S
6  * Copyright (c) 2017, NXP
7  *
8  * SPDX-License-Identifier: Apache-2.0
9  */
10 
11 #define DT_DRV_COMPAT nxp_scg_k4
12 
13 #include <zephyr/drivers/clock_control.h>
14 #include <zephyr/dt-bindings/clock/scg_k4.h>
15 #include <soc.h>
16 #include <fsl_clock.h>
17 
18 #define LOG_LEVEL CONFIG_CLOCK_CONTROL_LOG_LEVEL
19 #include <zephyr/logging/log.h>
20 LOG_MODULE_REGISTER(clock_control_scg);
21 
22 #define MCUX_SCG_CLOCK_NODE(name) DT_INST_CHILD(0, name)
23 
mcux_scg_k4_on(const struct device * dev,clock_control_subsys_t sub_system)24 static int mcux_scg_k4_on(const struct device *dev, clock_control_subsys_t sub_system)
25 {
26 	return 0;
27 }
28 
mcux_scg_k4_off(const struct device * dev,clock_control_subsys_t sub_system)29 static int mcux_scg_k4_off(const struct device *dev, clock_control_subsys_t sub_system)
30 {
31 	return 0;
32 }
33 
mcux_scg_k4_get_rate(const struct device * dev,clock_control_subsys_t sub_system,uint32_t * rate)34 static int mcux_scg_k4_get_rate(const struct device *dev, clock_control_subsys_t sub_system,
35 				uint32_t *rate)
36 {
37 	clock_name_t clock_name;
38 
39 	switch ((uint32_t)sub_system) {
40 	case SCG_K4_CORESYS_CLK:
41 		clock_name = kCLOCK_CoreSysClk;
42 		break;
43 	case SCG_K4_SLOW_CLK:
44 		clock_name = kCLOCK_SlowClk;
45 		break;
46 	case SCG_K4_PLAT_CLK:
47 		clock_name = kCLOCK_PlatClk;
48 		break;
49 	case SCG_K4_SYS_CLK:
50 		clock_name = kCLOCK_SysClk;
51 		break;
52 	case SCG_K4_BUS_CLK:
53 		clock_name = kCLOCK_BusClk;
54 		break;
55 	case SCG_K4_SYSOSC_CLK:
56 		clock_name = kCLOCK_ScgSysOscClk;
57 		break;
58 	case SCG_K4_SIRC_CLK:
59 		clock_name = kCLOCK_ScgSircClk;
60 		break;
61 	case SCG_K4_FIRC_CLK:
62 		clock_name = kCLOCK_ScgFircClk;
63 		break;
64 	case SCG_K4_RTCOSC_CLK:
65 		clock_name = kCLOCK_RtcOscClk;
66 		break;
67 	default:
68 		LOG_ERR("Unsupported clock name");
69 		return -EINVAL;
70 	}
71 
72 	*rate = CLOCK_GetFreq(clock_name);
73 	return 0;
74 }
75 
76 static DEVICE_API(clock_control, mcux_scg_driver_api) = {
77 	.on = mcux_scg_k4_on,
78 	.off = mcux_scg_k4_off,
79 	.get_rate = mcux_scg_k4_get_rate,
80 };
81 
82 DEVICE_DT_INST_DEFINE(0, NULL, NULL, NULL, NULL, PRE_KERNEL_1,
83 		      CONFIG_CLOCK_CONTROL_INIT_PRIORITY, &mcux_scg_driver_api);
84