Skip to content

Commit 59d8fbc

Browse files
danieldegrassefabiobaltieri
authored andcommitted
drivers: mspi: mspi_dw: support newer IP revisions
Bitmask offsets for the MSPI_DW peripheral are incorrect for the 4.03a databook for the DW APB SSI. Add a "v2" compatible to handle these changed offsets. The compatible does not define new binding properties, just modifies the register offsets. Additionally, handle writing the DFS32 mask for v2 of this compatible, as newer IP supports a dataframe size up to 32 bits. Signed-off-by: Daniel DeGrasse <[email protected]>
1 parent 5dbaa86 commit 59d8fbc

File tree

2 files changed

+23
-8
lines changed

2 files changed

+23
-8
lines changed

drivers/mspi/mspi_dw.c

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -820,8 +820,9 @@ static int start_next_packet(const struct device *dev, k_timeout_t timeout)
820820
dev_data->dummy_bytes = 0;
821821
dev_data->bytes_to_discard = 0;
822822

823-
dev_data->ctrlr0 &= ~CTRLR0_TMOD_MASK
824-
& ~CTRLR0_DFS_MASK;
823+
dev_data->ctrlr0 &= ~(CTRLR0_TMOD_MASK)
824+
& ~(CTRLR0_DFS_MASK)
825+
& ~(CTRLR0_DFS32_MASK);
825826

826827
dev_data->spi_ctrlr0 &= ~SPI_CTRLR0_WAIT_CYCLES_MASK;
827828

@@ -830,16 +831,20 @@ static int start_next_packet(const struct device *dev, k_timeout_t timeout)
830831
dev_data->xfer.addr_length != 0)) {
831832
dev_data->bytes_per_frame_exp = 0;
832833
dev_data->ctrlr0 |= FIELD_PREP(CTRLR0_DFS_MASK, 7);
834+
dev_data->ctrlr0 |= FIELD_PREP(CTRLR0_DFS32_MASK, 7);
833835
} else {
834836
if ((packet->num_bytes % 4) == 0) {
835837
dev_data->bytes_per_frame_exp = 2;
836838
dev_data->ctrlr0 |= FIELD_PREP(CTRLR0_DFS_MASK, 31);
839+
dev_data->ctrlr0 |= FIELD_PREP(CTRLR0_DFS32_MASK, 31);
837840
} else if ((packet->num_bytes % 2) == 0) {
838841
dev_data->bytes_per_frame_exp = 1;
839842
dev_data->ctrlr0 |= FIELD_PREP(CTRLR0_DFS_MASK, 15);
843+
dev_data->ctrlr0 |= FIELD_PREP(CTRLR0_DFS32_MASK, 15);
840844
} else {
841845
dev_data->bytes_per_frame_exp = 0;
842846
dev_data->ctrlr0 |= FIELD_PREP(CTRLR0_DFS_MASK, 7);
847+
dev_data->ctrlr0 |= FIELD_PREP(CTRLR0_DFS32_MASK, 7);
843848
}
844849
}
845850

drivers/mspi/mspi_dw.h

Lines changed: 16 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,32 +1,42 @@
11
/*
22
* Copyright (c) 2024 Nordic Semiconductor ASA
3+
* Copyright (c) 2025 Tenstorrent AI ULC
34
*
45
* SPDX-License-Identifier: Apache-2.0
56
*/
67

8+
#if DT_HAS_COMPAT_STATUS_OKAY(snps_designware_ssi_v2)
9+
/*
10+
* Later versions of the SSI have different register offsets. Define a macro
11+
* to use these.
12+
*/
13+
#define SSI_VERSION_2 1
14+
#endif
15+
716
/*
817
* This header is part of mspi_dw.c extracted only for clarity.
918
* It is not supposed to be included by any file other than mspi_dw.c.
1019
*/
1120

1221
/* CTRLR0 - Control Register 0 */
13-
#define CTRLR0_SPI_FRF_MASK GENMASK(23, 22)
22+
#define CTRLR0_SPI_FRF_MASK COND_CODE_1(SSI_VERSION_2, GENMASK(22, 21), GENMASK(23, 22))
1423
#define CTRLR0_SPI_FRF_STANDARD 0UL
1524
#define CTRLR0_SPI_FRF_DUAL 1UL
1625
#define CTRLR0_SPI_FRF_QUAD 2UL
1726
#define CTRLR0_SPI_FRF_OCTAL 3UL
18-
#define CTRLR0_TMOD_MASK GENMASK(11, 10)
27+
#define CTRLR0_TMOD_MASK COND_CODE_1(SSI_VERSION_2, GENMASK(9, 8), GENMASK(11, 10))
1928
#define CTRLR0_TMOD_TX_RX 0UL
2029
#define CTRLR0_TMOD_TX 1UL
2130
#define CTRLR0_TMOD_RX 2UL
2231
#define CTRLR0_TMOD_EEPROM 3UL
23-
#define CTRLR0_SCPOL_BIT BIT(9)
24-
#define CTRLR0_SCPH_BIT BIT(8)
25-
#define CTRLR0_FRF_MASK GENMASK(7, 6)
32+
#define CTRLR0_SCPOL_BIT COND_CODE_1(SSI_VERSION_2, BIT(7), BIT(9))
33+
#define CTRLR0_SCPH_BIT COND_CODE_1(SSI_VERSION_2, BIT(6), BIT(8))
34+
#define CTRLR0_FRF_MASK COND_CODE_1(SSI_VERSION_2, GENMASK(5, 4), GENMASK(7, 6))
2635
#define CTRLR0_FRF_SPI 0UL
2736
#define CTRLR0_FRF_SSP 1UL
2837
#define CTRLR0_FRF_MICROWIRE 2UL
29-
#define CTRLR0_DFS_MASK GENMASK(4, 0)
38+
#define CTRLR0_DFS_MASK COND_CODE_1(SSI_VERSION_2, GENMASK(3, 0), GENMASK(4, 0))
39+
#define CTRLR0_DFS32_MASK COND_CODE_1(SSI_VERSION_2, GENMASK(20, 16), (0))
3040

3141
/* CTRLR1- Control Register 1 */
3242
#define CTRLR1_NDF_MASK GENMASK(15, 0)

0 commit comments

Comments
 (0)