Skip to content

Commit dcdc8e8

Browse files
smalaekartben
authored andcommitted
drivers: i2s: siwx91x: I2S clock initialization for siwx91x
Clock driver changes required for initializing the I2S clock for the siwx91x driver Signed-off-by: Sai Santhosh Malae <Santhosh.Malae@silabs.com>
1 parent d95ca65 commit dcdc8e8

File tree

2 files changed

+66
-14
lines changed

2 files changed

+66
-14
lines changed

drivers/clock_control/clock_control_silabs_siwx91x.c

Lines changed: 49 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,9 +17,9 @@
1717
#include "clock_update.h"
1818
#include "sl_si91x_clock_manager.h"
1919

20-
#define DT_DRV_COMPAT silabs_siwx91x_clock
2120
#define DT_DRV_COMPAT silabs_siwx91x_clock
2221
#define LF_FSM_CLOCK_FREQUENCY 32768
22+
#define XTAL_FREQUENCY 40000000
2323

2424
LOG_MODULE_REGISTER(siwx91x_clock, CONFIG_CLOCK_CONTROL_LOG_LEVEL);
2525

@@ -89,6 +89,20 @@ static int siwx91x_clock_on(const struct device *dev, clock_control_subsys_t sys
8989
/* Already done in sl_calendar_init()*/
9090
RSI_PS_NpssPeriPowerUp(SLPSS_PWRGATE_ULP_MCURTC | SLPSS_PWRGATE_ULP_TIMEPERIOD);
9191
break;
92+
case SIWX91X_CLK_I2S0:
93+
RSI_PS_M4ssPeriPowerUp(M4SS_PWRGATE_ULP_EFUSE_PERI);
94+
break;
95+
case SIWX91X_CLK_STATIC_I2S0:
96+
MISC_CFG_MISC_CTRL1 |= (1 << 23);
97+
RSI_CLK_PeripheralClkEnable(M4CLK, I2SM_CLK, ENABLE_STATIC_CLK);
98+
break;
99+
case SIWX91X_CLK_ULP_I2S:
100+
RSI_PS_UlpssPeriPowerUp(ULPSS_PWRGATE_ULP_I2S);
101+
break;
102+
case SIWX91X_CLK_STATIC_ULP_I2S:
103+
ULPCLK->ULP_I2S_CLK_GEN_REG_b.ULP_I2S_MASTER_SLAVE_MODE_b = 1;
104+
RSI_ULPSS_PeripheralEnable(ULPCLK, ULP_I2S_CLK, ENABLE_STATIC_CLK);
105+
break;
92106
default:
93107
return -EINVAL;
94108
}
@@ -118,6 +132,12 @@ static int siwx91x_clock_off(const struct device *dev, clock_control_subsys_t sy
118132
case SIWX91X_CLK_DMA0:
119133
RSI_CLK_PeripheralClkDisable(M4CLK, UDMA_CLK);
120134
break;
135+
case SIWX91X_CLK_STATIC_I2S0:
136+
RSI_CLK_PeripheralClkDisable(M4CLK, I2SM_CLK);
137+
break;
138+
case SIWX91X_CLK_STATIC_ULP_I2S:
139+
RSI_ULPSS_PeripheralDisable(ULPCLK, ULP_I2S_CLK);
140+
break;
121141
case SIWX91X_CLK_ULP_UART:
122142
case SIWX91X_CLK_I2C0:
123143
case SIWX91X_CLK_I2C1:
@@ -162,6 +182,33 @@ static int siwx91x_clock_get_rate(const struct device *dev, clock_control_subsys
162182
}
163183
}
164184

185+
static int siwx91x_clock_set_rate(const struct device *dev, clock_control_subsys_t sys,
186+
clock_control_subsys_rate_t rate)
187+
{
188+
uintptr_t clockid = (uintptr_t)sys;
189+
ULP_I2S_CLK_SELECT_T ref_clk;
190+
uint32_t freq;
191+
int ret;
192+
193+
switch (clockid) {
194+
case SIWX91X_CLK_I2S0:
195+
RSI_CLK_SetI2sPllFreq(M4CLK, *((uint32_t *)rate), XTAL_FREQUENCY);
196+
RSI_CLK_I2sClkConfig(M4CLK, I2S_PLLCLK, 0);
197+
return 0;
198+
case SIWX91X_CLK_ULP_I2S:
199+
ref_clk = ULPCLK->ULP_I2S_CLK_GEN_REG_b.ULP_I2S_CLK_SEL_b;
200+
freq = RSI_CLK_GetBaseClock(ULPSS_I2S);
201+
ret = RSI_ULPSS_UlpI2sClkConfig(ULPCLK, ref_clk, freq / (*((uint32_t *)rate) / 2));
202+
if (ret) {
203+
return -EIO;
204+
}
205+
return 0;
206+
default:
207+
/* For now, no other driver need clock rate */
208+
return -EINVAL;
209+
}
210+
}
211+
165212
static enum clock_control_status siwx91x_clock_get_status(const struct device *dev,
166213
clock_control_subsys_t sys)
167214
{
@@ -209,6 +256,7 @@ static DEVICE_API(clock_control, siwx91x_clock_api) = {
209256
.on = siwx91x_clock_on,
210257
.off = siwx91x_clock_off,
211258
.get_rate = siwx91x_clock_get_rate,
259+
.set_rate = siwx91x_clock_set_rate,
212260
.get_status = siwx91x_clock_get_status,
213261
};
214262

include/zephyr/dt-bindings/clock/silabs/siwx91x-clock.h

Lines changed: 17 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -4,18 +4,22 @@
44
#ifndef ZEPHYR_INCLUDE_DT_BINDINGS_CLOCK_SILABS_SIWX91X_CLOCK_H_
55
#define ZEPHYR_INCLUDE_DT_BINDINGS_CLOCK_SILABS_SIWX91X_CLOCK_H_
66

7-
#define SIWX91X_CLK_ULP_UART 0
8-
#define SIWX91X_CLK_ULP_I2C 1
9-
#define SIWX91X_CLK_ULP_DMA 2
10-
#define SIWX91X_CLK_UART0 3
11-
#define SIWX91X_CLK_UART1 4
12-
#define SIWX91X_CLK_I2C0 5
13-
#define SIWX91X_CLK_I2C1 6
14-
#define SIWX91X_CLK_DMA0 7
15-
#define SIWX91X_CLK_WATCHDOG 8
16-
#define SIWX91X_CLK_PWM 9
17-
#define SIWX91X_CLK_GSPI 10
18-
#define SIWX91X_CLK_QSPI 11
19-
#define SIWX91X_CLK_RTC 12
7+
#define SIWX91X_CLK_ULP_UART 0
8+
#define SIWX91X_CLK_ULP_I2C 1
9+
#define SIWX91X_CLK_ULP_DMA 2
10+
#define SIWX91X_CLK_UART0 3
11+
#define SIWX91X_CLK_UART1 4
12+
#define SIWX91X_CLK_I2C0 5
13+
#define SIWX91X_CLK_I2C1 6
14+
#define SIWX91X_CLK_DMA0 7
15+
#define SIWX91X_CLK_WATCHDOG 8
16+
#define SIWX91X_CLK_PWM 9
17+
#define SIWX91X_CLK_GSPI 10
18+
#define SIWX91X_CLK_QSPI 11
19+
#define SIWX91X_CLK_RTC 12
20+
#define SIWX91X_CLK_I2S0 13
21+
#define SIWX91X_CLK_STATIC_I2S0 14
22+
#define SIWX91X_CLK_ULP_I2S 15
23+
#define SIWX91X_CLK_STATIC_ULP_I2S 16
2024

2125
#endif

0 commit comments

Comments
 (0)