Skip to content

Commit 04018d6

Browse files
Hieu Nguyenjhedberg
authored andcommitted
drivers: spi: Add SPI support for Renesas RZ/V2L, A3UL
Add SPI driver support for Renesas RZ/V2L, A3UL Signed-off-by: Hieu Nguyen <[email protected]> Signed-off-by: Nhut Nguyen <[email protected]>
1 parent f97eba5 commit 04018d6

File tree

1 file changed

+31
-20
lines changed

1 file changed

+31
-20
lines changed

drivers/spi/spi_renesas_rz_rspi.c

Lines changed: 31 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
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)
5353
void dmac_b_int_isr(void);
5454
void 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
101101
static 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

107108
static 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

113115
static 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

Comments
 (0)