diff options
Diffstat (limited to 'firmware/target')
-rw-r--r-- | firmware/target/arm/imx31/gigabeat-s/lcd-gigabeat-s.c | 9 | ||||
-rw-r--r-- | firmware/target/arm/imx31/mc13783-imx31.c | 4 | ||||
-rw-r--r-- | firmware/target/arm/imx31/spi-imx31.c | 59 | ||||
-rw-r--r-- | firmware/target/arm/imx31/spi-imx31.h | 7 |
4 files changed, 34 insertions, 45 deletions
diff --git a/firmware/target/arm/imx31/gigabeat-s/lcd-gigabeat-s.c b/firmware/target/arm/imx31/gigabeat-s/lcd-gigabeat-s.c index f0a2764851..78d8ba16c3 100644 --- a/firmware/target/arm/imx31/gigabeat-s/lcd-gigabeat-s.c +++ b/firmware/target/arm/imx31/gigabeat-s/lcd-gigabeat-s.c | |||
@@ -116,14 +116,7 @@ static void lcd_write_reg(unsigned reg, unsigned val) | |||
116 | 116 | ||
117 | static void lcd_enable_interface(bool enable) | 117 | static void lcd_enable_interface(bool enable) |
118 | { | 118 | { |
119 | if (enable) | 119 | spi_enable_module(&lcd_spi_node, enable); |
120 | { | ||
121 | spi_enable_module(&lcd_spi_node); | ||
122 | } | ||
123 | else | ||
124 | { | ||
125 | spi_disable_module(&lcd_spi_node); | ||
126 | } | ||
127 | } | 120 | } |
128 | 121 | ||
129 | static void lcd_set_power(bool powered) | 122 | static void lcd_set_power(bool powered) |
diff --git a/firmware/target/arm/imx31/mc13783-imx31.c b/firmware/target/arm/imx31/mc13783-imx31.c index 268c33a549..94021ac049 100644 --- a/firmware/target/arm/imx31/mc13783-imx31.c +++ b/firmware/target/arm/imx31/mc13783-imx31.c | |||
@@ -139,7 +139,7 @@ void INIT_ATTR mc13783_init(void) | |||
139 | semaphore_init(&mc13783_svc_wake, 1, 0); | 139 | semaphore_init(&mc13783_svc_wake, 1, 0); |
140 | 140 | ||
141 | /* Enable the PMIC SPI module */ | 141 | /* Enable the PMIC SPI module */ |
142 | spi_enable_module(&mc13783_spi); | 142 | spi_enable_module(&mc13783_spi, true); |
143 | 143 | ||
144 | /* Mask any PMIC interrupts for now - modules will enable them as | 144 | /* Mask any PMIC interrupts for now - modules will enable them as |
145 | * required */ | 145 | * required */ |
@@ -164,7 +164,7 @@ void mc13783_close(void) | |||
164 | mc13783_thread_id = 0; | 164 | mc13783_thread_id = 0; |
165 | semaphore_release(&mc13783_svc_wake); | 165 | semaphore_release(&mc13783_svc_wake); |
166 | thread_wait(thread_id); | 166 | thread_wait(thread_id); |
167 | spi_disable_module(&mc13783_spi); | 167 | spi_enable_module(&mc13783_spi, false); |
168 | } | 168 | } |
169 | 169 | ||
170 | bool mc13783_enable_event(enum mc13783_event_ids id) | 170 | bool mc13783_enable_event(enum mc13783_event_ids id) |
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 | ||
diff --git a/firmware/target/arm/imx31/spi-imx31.h b/firmware/target/arm/imx31/spi-imx31.h index 35b7d514cf..215093733b 100644 --- a/firmware/target/arm/imx31/spi-imx31.h +++ b/firmware/target/arm/imx31/spi-imx31.h | |||
@@ -74,11 +74,8 @@ struct spi_transfer_desc | |||
74 | /* One-time init of SPI driver */ | 74 | /* One-time init of SPI driver */ |
75 | void spi_init(void); | 75 | void spi_init(void); |
76 | 76 | ||
77 | /* Enable the specified module for the node */ | 77 | /* Enable or disable the specified module for the node */ |
78 | void spi_enable_module(const struct spi_node *node); | 78 | void spi_enable_module(const struct spi_node *node, bool enable); |
79 | |||
80 | /* Disabled the specified module for the node */ | ||
81 | void spi_disable_module(const struct spi_node *node); | ||
82 | 79 | ||
83 | /* Send and/or receive data on the specified node (asychronous) */ | 80 | /* Send and/or receive data on the specified node (asychronous) */ |
84 | bool spi_transfer(struct spi_transfer_desc *xfer); | 81 | bool spi_transfer(struct spi_transfer_desc *xfer); |