summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--firmware/target/arm/imx31/gigabeat-s/lcd-gigabeat-s.c9
-rw-r--r--firmware/target/arm/imx31/mc13783-imx31.c4
-rw-r--r--firmware/target/arm/imx31/spi-imx31.c59
-rw-r--r--firmware/target/arm/imx31/spi-imx31.h7
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
117static void lcd_enable_interface(bool enable) 117static 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
129static void lcd_set_power(bool powered) 122static 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
170bool mc13783_enable_event(enum mc13783_event_ids id) 170bool 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 */
358void spi_enable_module(const struct spi_node *node) 358void 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 */
376void 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 */
75void spi_init(void); 75void spi_init(void);
76 76
77/* Enable the specified module for the node */ 77/* Enable or disable the specified module for the node */
78void spi_enable_module(const struct spi_node *node); 78void spi_enable_module(const struct spi_node *node, bool enable);
79
80/* Disabled the specified module for the node */
81void 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) */
84bool spi_transfer(struct spi_transfer_desc *xfer); 81bool spi_transfer(struct spi_transfer_desc *xfer);