Skip to content

Commit cca0a10

Browse files
drivers: spi: nxp_lpspi: implement deinit
Implement deinit op for NXP LPSPI device driver. Signed-off-by: Bjarki Arge Andreasen <bjarki.andreasen@nordicsemi.no>
1 parent 5d8497c commit cca0a10

File tree

3 files changed

+57
-4
lines changed

3 files changed

+57
-4
lines changed

drivers/spi/spi_nxp_lpspi/spi_nxp_lpspi.c

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -397,6 +397,11 @@ static int lpspi_init(const struct device *dev)
397397
return 0;
398398
}
399399

400+
static int lpspi_deinit(const struct device *dev)
401+
{
402+
return spi_nxp_deinit_common(dev);
403+
}
404+
400405
#define LPSPI_INIT(n) \
401406
SPI_NXP_LPSPI_COMMON_INIT(n) \
402407
SPI_LPSPI_CONFIG_INIT(n) \
@@ -408,9 +413,9 @@ static int lpspi_init(const struct device *dev)
408413
.driver_data = &lpspi_##n##_driver_data, \
409414
}; \
410415
\
411-
SPI_DEVICE_DT_INST_DEFINE(n, lpspi_init, NULL, &lpspi_data_##n, \
412-
&lpspi_config_##n, POST_KERNEL, CONFIG_SPI_INIT_PRIORITY, \
413-
&lpspi_driver_api);
416+
SPI_DEVICE_DT_INST_DEINIT_DEFINE(n, lpspi_init, lpspi_deinit, NULL, &lpspi_data_##n, \
417+
&lpspi_config_##n, POST_KERNEL, CONFIG_SPI_INIT_PRIORITY, \
418+
&lpspi_driver_api);
414419

415420
#define SPI_LPSPI_INIT_IF_DMA(n) IF_DISABLED(SPI_NXP_LPSPI_HAS_DMAS(n), (LPSPI_INIT(n)))
416421

drivers/spi/spi_nxp_lpspi/spi_nxp_lpspi_common.c

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -229,3 +229,23 @@ int spi_nxp_init_common(const struct device *dev)
229229

230230
return err;
231231
}
232+
233+
int spi_nxp_deinit_common(const struct device *dev)
234+
{
235+
LPSPI_Type *base = (LPSPI_Type *)DEVICE_MMIO_NAMED_GET(dev, reg_base);
236+
const struct lpspi_config *config = dev->config;
237+
238+
LPSPI_Reset(base);
239+
240+
#ifdef LPSPI_RSTS
241+
RESET_SetPeripheralReset(lpspi_get_reset(base));
242+
#endif
243+
244+
#ifdef LPSPI_CLOCKS
245+
CLOCK_DisableClock(lpspi_get_clock(base));
246+
#endif
247+
248+
config->irq_deinit_func(dev);
249+
250+
return 0;
251+
}

drivers/spi/spi_nxp_lpspi/spi_nxp_lpspi_priv.h

Lines changed: 29 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,7 @@ struct lpspi_config {
3434
const struct device *clock_dev;
3535
clock_control_subsys_t clock_subsys;
3636
void (*irq_config_func)(const struct device *dev);
37+
void (*irq_deinit_func)(const struct device *dev);
3738
uint32_t pcs_sck_delay;
3839
uint32_t sck_pcs_delay;
3940
uint32_t transfer_delay;
@@ -65,6 +66,13 @@ int spi_mcux_configure(const struct device *dev, const struct spi_config *spi_cf
6566
*/
6667
int spi_nxp_init_common(const struct device *dev);
6768

69+
/* Does these things:
70+
* Reset module
71+
* Disable clock if present
72+
* Clear or simply disable IRQ
73+
*/
74+
int spi_nxp_deinit_common(const struct device *dev);
75+
6876
/* common api function for now */
6977
int spi_lpspi_release(const struct device *dev, const struct spi_config *spi_cfg);
7078

@@ -87,12 +95,27 @@ void lpspi_wait_tx_fifo_empty(const struct device *dev);
8795
#define LPSPI_IRQN(n) COND_CODE_1(DT_NODE_HAS_COMPAT(DT_INST_PARENT(n), nxp_lp_flexcomm), \
8896
(DT_IRQN(DT_INST_PARENT(n))), (DT_INST_IRQN(n)))
8997

98+
#define SPI_LPSPI_IRQ_DEINIT_FUNC_LP_FLEXCOMM(n) \
99+
nxp_lp_flexcomm_clearirqhandler(DEVICE_DT_GET(DT_INST_PARENT(n)), \
100+
LP_FLEXCOMM_PERIPH_LPSPI);
101+
102+
#define SPI_LPSPI_IRQ_DEINIT_FUNC_DISTINCT(n) \
103+
irq_disable(DT_INST_IRQN(n));
104+
105+
#define SPI_LPSPI_IRQ_DEINIT_FUNC(n) \
106+
COND_CODE_1( \
107+
DT_NODE_HAS_COMPAT(DT_INST_PARENT(n), nxp_lp_flexcomm), \
108+
(SPI_LPSPI_IRQ_DEINIT_FUNC_LP_FLEXCOMM(n)), \
109+
(SPI_LPSPI_IRQ_DEINIT_FUNC_DISTINCT(n)) \
110+
)
111+
90112
#define SPI_LPSPI_CONFIG_INIT(n) \
91113
static const struct lpspi_config lpspi_config_##n = { \
92114
DEVICE_MMIO_NAMED_ROM_INIT(reg_base, DT_DRV_INST(n)), \
93115
.clock_dev = DEVICE_DT_GET(DT_INST_CLOCKS_CTLR(n)), \
94116
.clock_subsys = (clock_control_subsys_t)DT_INST_CLOCKS_CELL(n, name), \
95117
.irq_config_func = lpspi_config_func_##n, \
118+
.irq_deinit_func = lpspi_deinit_func_##n, \
96119
.pcs_sck_delay = UTIL_AND(DT_INST_NODE_HAS_PROP(n, pcs_sck_delay), \
97120
DT_INST_PROP(n, pcs_sck_delay)), \
98121
.sck_pcs_delay = UTIL_AND(DT_INST_NODE_HAS_PROP(n, sck_pcs_delay), \
@@ -112,7 +135,12 @@ void lpspi_wait_tx_fifo_empty(const struct device *dev);
112135
\
113136
static void lpspi_config_func_##n(const struct device *dev) \
114137
{ \
115-
SPI_LPSPI_IRQ_FUNC(n) \
138+
SPI_LPSPI_IRQ_FUNC(n) \
139+
} \
140+
\
141+
static void lpspi_deinit_func_##n(const struct device *dev) \
142+
{ \
143+
SPI_LPSPI_IRQ_DEINIT_FUNC(n) \
116144
}
117145

118146
#define SPI_NXP_LPSPI_COMMON_DATA_INIT(n) \

0 commit comments

Comments
 (0)