11/*
2- * Copyright (c) 2024 Renesas Electronics Corporation
2+ * Copyright (c) 2024-2025 Renesas Electronics Corporation
33 *
44 * SPDX-License-Identifier: Apache-2.0
55 */
@@ -46,9 +46,9 @@ struct spi_rz_rspi_data {
4646};
4747
4848#ifdef CONFIG_SPI_RENESAS_RZ_RSPI_INTERRUPT
49- void rspi_rxi_isr (void );
50- void rspi_txi_isr (void );
51- void rspi_eri_isr (void );
49+ void rspi_rxi_isr (void * irq );
50+ void rspi_txi_isr (void * irq );
51+ void rspi_eri_isr (void * irq );
5252#elif defined(CONFIG_SPI_RENESAS_RZ_RSPI_DMAC )
5353void dmac_b_int_isr (void );
5454void rspi_tx_dmac_callback (rspi_instance_ctrl_t * p_ctrl );
@@ -63,10 +63,10 @@ static bool spi_rz_rspi_transfer_ongoing(struct spi_rz_rspi_data *data)
6363#if defined(CONFIG_SPI_RENESAS_RZ_RSPI_INTERRUPT )
6464 return (spi_context_tx_on (& data -> ctx ) || spi_context_rx_on (& data -> ctx ));
6565#else
66- if (spi_context_total_tx_len (& data -> ctx ) < spi_context_total_rx_len (& data -> ctx )) {
67- return (spi_context_tx_on (& data -> ctx ) || spi_context_rx_on (& data -> ctx ));
68- } else {
66+ if (spi_context_total_tx_len (& data -> ctx ) == spi_context_total_rx_len (& data -> ctx )) {
6967 return (spi_context_tx_on (& data -> ctx ) && spi_context_rx_on (& data -> ctx ));
68+ } else {
69+ return (spi_context_tx_on (& data -> ctx ) || spi_context_rx_on (& data -> ctx ));
7070 }
7171#endif
7272}
@@ -100,20 +100,23 @@ static void spi_rz_rspi_retransmit(const struct device *dev)
100100#ifdef CONFIG_SPI_RENESAS_RZ_RSPI_INTERRUPT
101101static void spi_rz_rspi_rxi_isr (const struct device * dev )
102102{
103- ARG_UNUSED (dev );
104- rspi_rxi_isr ();
103+ struct spi_rz_rspi_data * data = dev -> data ;
104+
105+ rspi_rxi_isr ((void * )data -> fsp_config -> rxi_irq );
105106}
106107
107108static void spi_rz_rspi_txi_isr (const struct device * dev )
108109{
109- ARG_UNUSED (dev );
110- rspi_txi_isr ();
110+ struct spi_rz_rspi_data * data = dev -> data ;
111+
112+ rspi_txi_isr ((void * )data -> fsp_config -> txi_irq );
111113}
112114
113115static void spi_rz_rspi_eri_isr (const struct device * dev )
114116{
115- ARG_UNUSED (dev );
116- rspi_eri_isr ();
117+ struct spi_rz_rspi_data * data = dev -> data ;
118+
119+ rspi_eri_isr ((void * )data -> fsp_config -> eri_irq );
117120}
118121#endif /* CONFIG_SPI_RENESAS_RZ_RSPI_INTERRUPT */
119122
@@ -263,6 +266,7 @@ static int spi_rz_rspi_transceive_data(struct spi_rz_rspi_data *data)
263266{
264267 R_RSPI0_Type * p_spi_reg = (R_RSPI0_Type * )data -> fsp_ctrl -> p_regs ;
265268 uint32_t data_count = (p_spi_reg -> SPBFDR & R_RSPI0_SPBFDR_T_Msk ) >> R_RSPI0_SPBFDR_T_Pos ;
269+ uint32_t rx ;
266270
267271 data_count = 8 - data_count ;
268272
@@ -295,21 +299,28 @@ static int spi_rz_rspi_transceive_data(struct spi_rz_rspi_data *data)
295299 spi_context_update_tx (& data -> ctx , data -> dfs , 1 );
296300
297301 /* RX transfer */
298- if (spi_context_rx_on (& data -> ctx )) {
302+ while (!p_spi_reg -> SPSR_b .SPRF ) {
303+ }
299304
300- while (!p_spi_reg -> SPSR_b .SPRF ) {
301- }
305+ if (data -> dfs > 2 ) {
306+ rx = (uint32_t )p_spi_reg -> SPDR_b .SPD ;
307+ } else if (data -> dfs > 1 ) {
308+ rx = (uint16_t )p_spi_reg -> SPDR_hword .L ;
309+ } else {
310+ rx = (uint8_t )p_spi_reg -> SPDR_byte .LL ;
311+ }
302312
313+ if (spi_context_rx_buf_on (& data -> ctx )) {
303314 /* Read data from Data Register */
304315 if (data -> dfs > 2 ) {
305- UNALIGNED_PUT (p_spi_reg -> SPDR_b . SPD , (uint32_t * )data -> ctx .rx_buf );
316+ UNALIGNED_PUT (rx , (uint32_t * )data -> ctx .rx_buf );
306317 } else if (data -> dfs > 1 ) {
307- UNALIGNED_PUT (p_spi_reg -> SPDR_hword . L , (uint16_t * )data -> ctx .rx_buf );
318+ UNALIGNED_PUT (rx , (uint16_t * )data -> ctx .rx_buf );
308319 } else {
309- UNALIGNED_PUT (p_spi_reg -> SPDR_byte . LL , (uint8_t * )data -> ctx .rx_buf );
320+ UNALIGNED_PUT (rx , (uint8_t * )data -> ctx .rx_buf );
310321 }
311- spi_context_update_rx (& data -> ctx , data -> dfs , 1 );
312322 }
323+ spi_context_update_rx (& data -> ctx , data -> dfs , 1 );
313324 return 0 ;
314325}
315326#endif /* #if !defined(CONFIG_SPI_RENESAS_RZ_RSPI_INTERRUPT) */
0 commit comments