diff options
Diffstat (limited to 'firmware/target/arm/imx31/spi-imx31.c')
-rw-r--r-- | firmware/target/arm/imx31/spi-imx31.c | 59 |
1 files changed, 29 insertions, 30 deletions
diff --git a/firmware/target/arm/imx31/spi-imx31.c b/firmware/target/arm/imx31/spi-imx31.c index ea3d2f8d77..076ce7cd7b 100644 --- a/firmware/target/arm/imx31/spi-imx31.c +++ b/firmware/target/arm/imx31/spi-imx31.c | |||
@@ -55,7 +55,7 @@ static struct spi_module_desc | |||
55 | const struct spi_node *last_node; /* Last node used for module */ | 55 | const struct spi_node *last_node; /* Last node used for module */ |
56 | void (* const handler)(void); /* Interrupt handler */ | 56 | void (* const handler)(void); /* Interrupt handler */ |
57 | int rxcount; /* Independent copy of txcount */ | 57 | int rxcount; /* Independent copy of txcount */ |
58 | int8_t enab; /* Enable count */ | 58 | int8_t enable; /* Enable count */ |
59 | int8_t byte_size; /* Size of transfers in bytes */ | 59 | int8_t byte_size; /* Size of transfers in bytes */ |
60 | const int8_t cg; /* Clock-gating value */ | 60 | const int8_t cg; /* Clock-gating value */ |
61 | const int8_t ints; /* AVIC vector number */ | 61 | const int8_t ints; /* AVIC vector number */ |
@@ -102,7 +102,7 @@ static bool spi_set_context(struct spi_module_desc *desc, | |||
102 | const struct spi_node * const node = xfer->node; | 102 | const struct spi_node * const node = xfer->node; |
103 | volatile unsigned long * const base = desc->base; | 103 | volatile unsigned long * const base = desc->base; |
104 | 104 | ||
105 | if (desc->enab == 0) | 105 | if (desc->enable == 0) |
106 | return false; | 106 | return false; |
107 | 107 | ||
108 | if (node == desc->last_node) | 108 | if (node == desc->last_node) |
@@ -354,43 +354,42 @@ void INIT_ATTR spi_init(void) | |||
354 | } | 354 | } |
355 | } | 355 | } |
356 | 356 | ||
357 | /* Enable the specified module for the node */ | 357 | /* Enable or disable the specified module for the node */ |
358 | void spi_enable_module(const struct spi_node *node) | 358 | void spi_enable_module(const struct spi_node *node, bool enable) |
359 | { | 359 | { |
360 | struct spi_module_desc * const desc = &spi_descs[node->num]; | 360 | struct spi_module_desc * const desc = &spi_descs[node->num]; |
361 | 361 | ||
362 | if (++desc->enab == 1) | 362 | if (enable) |
363 | { | 363 | { |
364 | /* Enable clock-gating register */ | 364 | if (++desc->enable == 1) |
365 | ccm_module_clock_gating(desc->cg, CGM_ON_RUN_WAIT); | 365 | { |
366 | /* Reset */ | 366 | /* Enable clock-gating register */ |
367 | spi_reset(desc); | 367 | ccm_module_clock_gating(desc->cg, CGM_ON_RUN_WAIT); |
368 | desc->last_node = NULL; | 368 | /* Reset */ |
369 | /* Enable interrupt at controller level */ | 369 | spi_reset(desc); |
370 | avic_enable_int(desc->ints, INT_TYPE_IRQ, INT_PRIO_DEFAULT, | 370 | desc->last_node = NULL; |
371 | desc->handler); | 371 | /* Enable interrupt at controller level */ |
372 | avic_enable_int(desc->ints, INT_TYPE_IRQ, INT_PRIO_DEFAULT, | ||
373 | desc->handler); | ||
374 | } | ||
372 | } | 375 | } |
373 | } | 376 | else |
374 | |||
375 | /* Disable the specified module for the node */ | ||
376 | void spi_disable_module(const struct spi_node *node) | ||
377 | { | ||
378 | struct spi_module_desc * const desc = &spi_descs[node->num]; | ||
379 | |||
380 | if (desc->enab > 0 && --desc->enab == 0) | ||
381 | { | 377 | { |
382 | /* Last enable for this module */ | 378 | if (desc->enable > 0 && --desc->enable == 0) |
383 | /* Wait for outstanding transactions */ | 379 | { |
384 | while (*(void ** volatile)&desc->head != NULL); | 380 | /* Last enable for this module */ |
381 | /* Wait for outstanding transactions */ | ||
382 | while (*(void ** volatile)&desc->head != NULL); | ||
385 | 383 | ||
386 | /* Disable interrupt at controller level */ | 384 | /* Disable interrupt at controller level */ |
387 | avic_disable_int(desc->ints); | 385 | avic_disable_int(desc->ints); |
388 | 386 | ||
389 | /* Disable interface */ | 387 | /* Disable interface */ |
390 | desc->base[CONREG] &= ~CSPI_CONREG_EN; | 388 | desc->base[CONREG] &= ~CSPI_CONREG_EN; |
391 | 389 | ||
392 | /* Disable interface clock */ | 390 | /* Disable interface clock */ |
393 | ccm_module_clock_gating(desc->cg, CGM_OFF); | 391 | ccm_module_clock_gating(desc->cg, CGM_OFF); |
392 | } | ||
394 | } | 393 | } |
395 | } | 394 | } |
396 | 395 | ||