Skip to content

Commit c889ab0

Browse files
committed
soc: imx95: a55: add netc power and clock init in soc.c
Power up NETCMIX and configure netc clock in soc_init(). Signed-off-by: Jiafei Pan <Jiafei.Pan@nxp.com>
1 parent fe47b20 commit c889ab0

File tree

1 file changed

+64
-2
lines changed
  • soc/nxp/imx/imx9/imx95/a55

1 file changed

+64
-2
lines changed

soc/nxp/imx/imx9/imx95/a55/soc.c

Lines changed: 64 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,12 +9,18 @@
99
#include <zephyr/kernel.h>
1010
#include <zephyr/device.h>
1111
#include <zephyr/drivers/firmware/scmi/clk.h>
12+
#include <zephyr/drivers/firmware/scmi/power.h>
1213
#include <zephyr/dt-bindings/clock/imx95_clock.h>
14+
#include <zephyr/dt-bindings/power/imx95_power.h>
1315
#include <soc.h>
1416

1517
#define FREQ_24M_HZ 24000000 /* 24 MHz */
1618

17-
static int soc_clk_init(void)
19+
/* SCMI power domain states */
20+
#define POWER_DOMAIN_STATE_ON 0x00000000
21+
#define POWER_DOMAIN_STATE_OFF 0x40000000
22+
23+
static int lpuart_clk_init(void)
1824
{
1925
#if DT_NODE_HAS_STATUS(DT_NODELABEL(lpuart1), okay) || \
2026
DT_NODE_HAS_STATUS(DT_NODELABEL(lpuart3), okay)
@@ -57,9 +63,65 @@ static int soc_clk_init(void)
5763
return 0;
5864
}
5965

66+
static int netc_init(void)
67+
{
68+
#if defined(CONFIG_ETH_NXP_IMX_NETC) && (DT_CHILD_NUM_STATUS_OKAY(DT_NODELABEL(netc)) != 0)
69+
const struct device *clk_dev = DEVICE_DT_GET(DT_NODELABEL(scmi_clk));
70+
struct scmi_protocol *proto = clk_dev->data;
71+
struct scmi_clock_rate_config clk_cfg = {0};
72+
struct scmi_power_state_config pwr_cfg = {0};
73+
uint32_t power_state = POWER_DOMAIN_STATE_OFF;
74+
uint64_t enetref_clk = 250000000; /* 250 MHz*/
75+
int ret;
76+
77+
/* Power up NETCMIX */
78+
pwr_cfg.domain_id = IMX95_PD_NETC;
79+
pwr_cfg.power_state = POWER_DOMAIN_STATE_ON;
80+
81+
ret = scmi_power_state_set(&pwr_cfg);
82+
if (ret) {
83+
return ret;
84+
}
85+
86+
while (power_state != POWER_DOMAIN_STATE_ON) {
87+
ret = scmi_power_state_get(IMX95_PD_NETC, &power_state);
88+
if (ret) {
89+
return ret;
90+
}
91+
}
92+
93+
/* ENETREF clock init */
94+
ret = scmi_clock_parent_set(proto, IMX95_CLK_ENETREF, IMX95_CLK_SYSPLL1_PFD0);
95+
if (ret) {
96+
return ret;
97+
}
98+
99+
clk_cfg.flags = SCMI_CLK_RATE_SET_FLAGS_ROUNDS_AUTO;
100+
clk_cfg.clk_id = IMX95_CLK_ENETREF;
101+
clk_cfg.rate[0] = enetref_clk & 0xffffffff;
102+
clk_cfg.rate[1] = (enetref_clk >> 32) & 0xffffffff;
103+
104+
ret = scmi_clock_rate_set(proto, &clk_cfg);
105+
if (ret) {
106+
return ret;
107+
}
108+
#endif
109+
110+
return 0;
111+
}
112+
60113
static int soc_init(void)
61114
{
62-
return soc_clk_init();
115+
int ret;
116+
117+
ret = lpuart_clk_init();
118+
if (ret) {
119+
return ret;
120+
}
121+
122+
ret = netc_init();
123+
124+
return ret;
63125
}
64126
/*
65127
* Because platform is using ARM SCMI, drivers like scmi, mbox etc are

0 commit comments

Comments
 (0)