Skip to content

Commit 0637ec4

Browse files
mariopajanashif
authored andcommitted
drivers: i2s: stm32 sai add mclk-divider property
This property enables the user to configure the Master Clock Divider. Signed-off-by: Mario Paja <mariopaja@hotmail.com>
1 parent 8365dd5 commit 0637ec4

File tree

3 files changed

+35
-13
lines changed

3 files changed

+35
-13
lines changed

drivers/i2s/i2s_stm32_sai.c

Lines changed: 16 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,12 @@
2525
#include <zephyr/irq.h>
2626
LOG_MODULE_REGISTER(i2s_stm32_sai, CONFIG_I2S_LOG_LEVEL);
2727

28+
enum mclk_divider {
29+
MCLK_NO_DIV,
30+
MCLK_DIV_256,
31+
MCLK_DIV_512
32+
};
33+
2834
struct queue_item {
2935
void *buffer;
3036
size_t size;
@@ -66,8 +72,8 @@ struct i2s_stm32_sai_cfg {
6672
size_t pclk_len;
6773
const struct pinctrl_dev_config *pcfg;
6874

69-
bool mclk_div_enable;
7075
bool mclk_enable;
76+
enum mclk_divider mclk_div;
7177
bool synchronous;
7278
};
7379

@@ -427,10 +433,15 @@ static int i2s_stm32_sai_configure(const struct device *dev, enum i2s_dir dir,
427433
hsai->Init.MckOutput = SAI_MCK_OUTPUT_DISABLE;
428434
}
429435

430-
if (cfg->mclk_div_enable) {
431-
hsai->Init.NoDivider = SAI_MASTERDIVIDER_ENABLE;
432-
} else {
436+
if (cfg->mclk_div == (enum mclk_divider)MCLK_NO_DIV) {
433437
hsai->Init.NoDivider = SAI_MASTERDIVIDER_DISABLED;
438+
} else {
439+
hsai->Init.NoDivider = SAI_MASTERDIVIDER_ENABLE;
440+
if (cfg->mclk_div == (enum mclk_divider)MCLK_DIV_256) {
441+
hsai->Init.MckOverSampling = SAI_MCK_OVERSAMPLING_DISABLE;
442+
} else {
443+
hsai->Init.MckOverSampling = SAI_MCK_OVERSAMPLING_ENABLE;
444+
}
434445
}
435446

436447
/* AudioFrequency */
@@ -761,7 +772,6 @@ static DEVICE_API(i2s, i2s_stm32_driver_api) = {
761772
.trigger = i2s_stm32_sai_trigger,
762773
.write = i2s_stm32_sai_write,
763774
.read = i2s_stm32_sai_read,
764-
765775
};
766776

767777
#define SAI_DMA_CHANNEL_INIT(index, dir, src_dev, dest_dev) \
@@ -806,7 +816,7 @@ static DEVICE_API(i2s, i2s_stm32_driver_api) = {
806816
.pclk_len = DT_INST_NUM_CLOCKS(index), \
807817
.pcfg = PINCTRL_DT_INST_DEV_CONFIG_GET(index), \
808818
.mclk_enable = DT_INST_PROP(index, mclk_enable), \
809-
.mclk_div_enable = DT_INST_PROP(index, mclk_div_enable), \
819+
.mclk_div = (enum mclk_divider)DT_ENUM_IDX(DT_DRV_INST(index), mclk_divider), \
810820
.synchronous = DT_INST_PROP(index, synchronous), \
811821
}; \
812822
\

dts/bindings/i2s/st,stm32-sai.yaml

Lines changed: 18 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -25,18 +25,30 @@ properties:
2525
pinctrl-names:
2626
required: true
2727

28-
mclk-div-enable:
29-
type: boolean
30-
description: |
31-
SAI NODIV property.
32-
When property is not present, oversampling is enabled @ 256.
33-
3428
mclk-enable:
3529
type: boolean
3630
description: |
3731
Master Clock Output function.
3832
An mck pin must be listed within pinctrl-0 when enabling this property.
3933
34+
mclk-divider:
35+
type: string
36+
default: "no-div"
37+
description: |
38+
Master Clock Divider Configuration.
39+
40+
When no-div property is present:
41+
- MCKDIV = SAI_CK_x / (FS * (FRL + 1))
42+
Otherwise:
43+
- MCKDIV = SAI_CK_x / (FS * (OSR + 1) * 256)
44+
45+
When div-256 is present OSR is set to 0.
46+
When div-512 is present OSR is set to 1.
47+
enum:
48+
- "no-div"
49+
- "div-256"
50+
- "div-512"
51+
4052
synchronous:
4153
type: boolean
4254
description: |

samples/drivers/i2s/output/boards/nucleo_u575zi_q.overlay

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,6 @@
2828
pinctrl-names = "default";
2929
status = "okay";
3030
mclk-enable;
31-
mclk-div-enable;
31+
mclk-divider = "div-256";
3232
dma-names = "tx";
3333
};

0 commit comments

Comments
 (0)